Come dovrei passare un filtro generico per le interrogazioni del database?

-1

Ho un'interfaccia DataStore , che fornisce l'accesso a un archivio dati generico, ad es. un database locale, server web, ecc. Voglio fornire un modo per filtrare i risultati direttamente nella query. Come devo passare i filtri per la query?

Ho pensato ad una mappa che viene passata con il nome del campo come chiave e il valore desiderato come elemento.

Esempio:

class Foo {
    String firstProperty;
    int secondProperty;
    boolean thirdProperty;
}

Filtro:

{
    "firstProperty": "desired value",
    "secondProperty": 123
}

Il datastore quindi filtra i valori restituiti (ad esempio, una query sql potrebbe farlo in modo più efficiente del mio codice Java)

O sarebbe meglio lasciare che l'utente di DataStore filtri i risultati?

    
posta Martin Fink 31.08.2017 - 11:40
fonte

2 risposte

0

Nella maggior parte dei casi, dovresti desiderare che l'archivio dati filtri i risultati. Potrebbe risparmiare un sacco di I / O tra l'applicazione e l'archivio dati (I / O di rete), nonché all'interno dell'archivio dati stesso (I / O del disco).

In genere, il filtro dovrebbe esprimere relazioni più complesse di un semplice "uguale a". Dovresti essere in grado di esprimere condizioni come maggiore di, minore di, tra, non null ecc.

Personalmente, rinuncerei ad averlo generico (a meno di fornire un componente generico è un vero obiettivo aziendale) e creerei un livello di accesso ai dati che fornisca risposte a domande specifiche rilevanti per la mia applicazione. Ogni metodo accetta una classe Criteria creata appositamente per il metodo pertinente (il metodo QuerySales accetta un oggetto SalesCriteria, il metodo FindCustomers accetta un oggetto CustomersCriteria).

Se insisti su una soluzione generica:

Un modo sarebbe passare una mappa dove le chiavi sono i nomi delle proprietà, ei valori mappati contengono sia la Relazione (o Operatore) sia il rispettivo valore o valore (uno per operazioni binarie come "maggiore di", due per operazioni trenarie come "tra"). Per i filtri più complessi avrai bisogno di qualcosa come gli alberi delle espressioni come menzionato in precedenza.

Un altro modo sarebbe passare una stringa di query in un linguaggio di query e utilizzare un parser di linguaggio di query.

    
risposta data 31.08.2017 - 11:56
fonte
1

La tua soluzione non tiene conto degli operatori, essendo quindi molto limitata fin dall'inizio. Alcune lingue hanno strutture dati per la costruzione di alberi di espressione che possono essere utilizzati dal framework DAL per filtrare o ordinare. Se la lingua che stai utilizzando non li supporta, dovresti pensare a creare un motore ad albero per un'espressione semplice o trovarne uno esistente.

Se si consente all'utente di filtrare i risultati, a seconda della strategia di accesso ai dati, si rischia di caricare più dati del necessario. Agli utenti dovrebbe essere consentito solo di creare l'espressione del filtro e passarla all'origine dati.

    
risposta data 31.08.2017 - 11:52
fonte

Leggi altre domande sui tag