Che cos’è?

JDBC è l’acronimo di Java Database Connectivity. È un componente Java storico, importante e ampiamente utilizzato. Semplifica l’interrogazione e la modifica dei dati tra diversi programmi.

La nostra attuale implementazione JDBC consente solo di interrogare i dati dall’Intranet.

L’aggiornamento dei dati tramite questo strumento è un argomento complesso. Dobbiamo gestire i permessi degli utenti e la validazione dei dati che non sono descritti a livello di database, ma direttamente all’interno del codice dell’Intranet. È necessario un nuovo approccio da parte nostra per evitare di duplicare il codice.

Diagram
Figure 1. Diagramma di sequenza durante l’esecuzione di una query senza errori

Dove interrogare i dati con questo driver?

Finora sono stati testati solo 3 programmi software con questo driver:

Programma Introspezione? Interrogazione? Aggiornamento? Inserimento?

LibreOffice 7.3

Solo elenco tabelle

Sì

No

No

dBeaver

Sì

Sì

Non ancora

Non ancora

Intellij

Sì

Sì

Non ancora

Non ancora

L'introspezione aiuta durante la scrittura delle query grazie all'autocompletamento. Durante la digitazione della query, il programma mostrerà le tabelle e i campi disponibili.

Ci sono 2 modalità di lavoro per analizzare i dati:

  • Scrivere e testare la query in un software che supporta l'introspezione;

  • Poi, in alternativa:

    • Utilizzare la query digitata direttamente in LibreOffice

    • Oppure lavorare con un'estrazione CSV e importarla in qualsiasi software (incluso Office)

Realizzerò più avanti dei video su come configurare il driver con questi programmi.

Query TQL

La differenza principale tra un normale driver JDBC e il nostro è il linguaggio di interrogazione.

Abbiamo sviluppato TQL (Taack Query Language); ecco alcuni vantaggi:

  • Sicuro: verifichiamo la query digitata prima di inviarla al database reale

  • Sintassi semplice:

    • Minore necessità di join

    • Accesso ai campi referenziati (vedere Esempio base di TQL punto (2))

  • Indipendente dal database

Struttura delle query di base

Esempio base di TQL
select                              (1)
    l.client.firstName,             (2)
    l.rep.username                  (2)
from Lead l                         (3)
where l.dateCreated > '2022-01-01'  (4)
1 Clausola Select, che consente di selezionare le colonne;
2 Campi dereferenziati: se la colonna è essa stessa un oggetto, è possibile accedere ricorsivamente ai campi dell’oggetto. Qui rep è un oggetto User che contiene a sua volta dei campi (come username);
3 Clausola From, che consente di scegliere le tabelle; qui usiamo un alias l
4 Clausola Where, che consente di filtrare i dati.

Query di base con formule

È possibile aggiungere formule aritmetiche nella clausola select.

Esempio base di TQL con formule
select
    ll.lead.name,
    ll.qty * ll.salePrice as totalWoTaxes   (1)
from LeadLine ll
where ll.qty * ll.salePrice > 100           (2)
1 La clausola Select supporta sia gli alias di colonna sia le operazioni aritmetiche
2 Anche la clausola Where supporta l’aritmetica
Il nome dell’alias di colonna deve iniziare con una lettera minuscola e appartenere esclusivamente al set di caratteri ASCII7.
Table 1. Risultati dell’esempio base con formule
lead.name totalWoTaxes

Balisage pylône SFR site 240087 (Hivory)

250.00000000

Balisage pylône SFR site 240087 (Hivory)

340.00000000

Balisage pylône SFR site 240087 (Hivory)

3410.00000000

EL BJORN low intensity IR AWL system

2700.00000000

Query con raggruppamento

La clausola di raggruppamento aggiunge la capacità di aggregare i dati. L'Esempio base di TQL con formule non presenta una riga per offerta, ma per riga d’offerta. È possibile utilizzare il raggruppamento per ottenere una riga per offerta, come nell’esempio seguente:

Esempio TQL con raggruppamento e formule
select
    ll.lead.rep.mainSubsidiary as salesmanSubsidiary,   (1)
    count(ll.id),                                       (2)
    sum(ll.qty * ll.salePrice)                          (2)
from LeadLine ll
group by ll.lead.rep.mainSubsidiary                     (1)
1 Campo standard, deve essere elencato nella clausola Group by;
2 È possibile utilizzare le funzioni di aggregazione count o sum.
Gli alias di colonna non sono supportati sulle colonne aggregate
salesmanSubsidiary count(ll.id) sum(ll.qty * ll.salePrice)

CITEL_2CP

118605

212619001943.17760000

CITEL_GMBH

37336

261342488.98760000

CITEL_INC

25172

319681146.49190000

CITEL_INDIA

24868

1122541659.94000000

CITEL_OOO

10382

3990221200.80740000

CITEL_SH

269

552810.59000000

OBSTA

46151

2762758463.12580000

Query con Inner Join

A volte una colonna punta a più di una riga.

Questa è chiamata relazione molti-a-molti (many-to-many). Non possiamo utilizzare direttamente i campi referenziati, ma dobbiamo usare quelle che vengono chiamate join …​ (suona molto anni '70, ma non dipende da me).

Nell’esempio seguente, gli Items contengono molti Values e i Values possono essere utilizzati da più di un Item. Se vogliamo elencare Items e Values nella stessa tabella, abbiamo bisogno di una sorta di prodotto cartesiano tra 2 insiemi di dati.

La cardinalità del prodotto cartesiano di 2 insiemi è M x N; è necessario utilizzare la clausola Where per ridurre il numero di risultati.
Join semplice in TQL
select
    i.name,
    i.ref,
    v.valueString,
    v.associatedProperty.valueKind as kind,
    v.associatedProperty.kindOfCharacteristic as typeOfChar,
    v.associatedProperty.nameAlias as nameAlias
from Item i, Value v                                    (1)
where v in elements(i.values) and i.range.name = 'DVM'  (2)
1 Elenchiamo 2 tabelle in modo indipendente
2 DOBBIAMO limitare il numero di risultati con l’espressione v in elements(i.values)
Table 2. Risultati
name ref valueString kind typeOfChar nameAlias

DVM-230-16A

3589015

NULL

dico

BULLET_POINTS

bulletPoints

DVM-230-16A

3589015

IP20

string

MECA

NULL

DVM-230-16A

3589015

-40/+85°C

string

MECA

NULL

DVM-230-16A

3589015

NULL

dico

NULL

description

DVM-230-16A

3589015

NULL

dico

NULL

subFamily

DVM-230-16A

3589015

NULL

dico

MECA

NULL

DVM-230-16A

3589015

NULL

dico

NORMES

NULL

DVM-230-16A

3589015

voir schéma

dico

MECA

NULL

DVM-230-16A

3589015

NULL

dico

MECA

NULL

DVM-230-16A

3589015

NULL

dico

MECA

NULL

DVM-230-16A

3589015

NULL

dico

MECA

NULL

DVM-230-16A

3589015

16 A

string

ELEC

NULL

DVM-230-16A

3589015

NULL

dico

ELEC

NULL

DVM-230-16A

3589015

0.0305 kg

string

MECA

NULL

DVM-230-16A

3589015

NULL

dico

NULL

family

DVM-230-16A

3589015

230 V monophasé

dico

ELEC

NULL

DVM-230-16A

3589015

PTFE

string

MECA

NULL

DVM-230-16A

3589015

NULL

bool

NULL

NULL

Limitazioni attuali del driver

  • Non sarà possibile dereferenziare i campi lingua (v.valueMap['fr'] fallirà, così come v.valueMap).

  • Supportiamo solo Inner join, non outer join. La nostra attuale implementazione di join è lenta; possiamo migliorarla, ma è più complesso.