Regole per la composizione della file_location rule o per la composizione di chiavi concatenate

Introduzione

Il presente documento descrive le regole per mezzo delle quali possono essere assunte parti di elementi o attributi da un'unità informativa e con essi costituire, a seconda dei casi, regole di dislocazione dei files XML ovvero regole di composizione di chiavi articolate. In questo secondo caso è ammesso combinare solo valori di attributi appartenenti allo stesso elemento.

La tecnica adottata si è evoluta nell'arco del tempo ed i cambiamenti hanno evidenziato, nel corso del tempo, le limitazioni della sintassi inizialmente scelta. Nononstante questo, le evoluzioni non hanno ancora condotto ad una rivoluzione di questa sintassi che vedremo nel dettaglio nei paragrafi seguenti.

In realtà le due sintassi sono decisamente diverse ma hanno molteplici punti in comune, in particolare in materia di Modificatori delle regole di composizione.

Si rimanda, per ulteriore documentazione, alle schede 0011660, 0016305 e 0016577 dell'applicazione RightWay.

La regola di composizione nomi file

La regola di composizione dei nomi di files si applica nel momento in cui, dovendo configurare un nuovo archivio, si intende assegnare ad esso una distribuzione delle unità informative in files XML distinti raggruppandole ove possibile per teme, data, classificazione o per qualsiasi altra caratteristica considerata degna di raggruppare tali dati.

E' possibile dichiarare una regola di composizione dei nomi di files che abbia valenza per tutte le tipologie di unità informative così come si può altresì dichiarare una regola specifica per ognuna di esse. Di seguito il documento riterrà che il lettore abbia dimesticezza col formato dei files nomearchivio.conf.xml.

Nel file di configurazione, quindi, può essere introdotto un elemento file_location come elemento figlio dell'elemento xway_cfg che funge da radice dell'intero file. Se così si opera, tale regola di composizione file vale per tutte le unità informative o, quanto meno, per quelle nelle quali non sia stata esplicitata una regola. Lo stesso elemento file_location può troare posto come figlio dell'elemento primary_node fungendo quindi da dichiarazione esplicita dedicata ad una tipologia di unità informativa ed a nessun'altra.

La regola di composizione dei nomi di files, qualora omessa, sarà considerata single, come verrà meglio indicato in seguito.

La distribuzione dei files può avvenire sulla base di regole predefinite o sulla base di una regola definita dell'amministratore dell'archivio. Quanto detto si confuigura agendo sull'attributo mode dell'elemento file_location. I valori possibili sono:

Nel caso l'attributo mode assuma il valore rule si deve prendere in esame il contenuto dell'attributo rule la cui sintassi è il vero obiettivo di questa documentazione.
A prima vista una regola composta da più regole distinte e, per ognuna, da più componenti, risulta particolarmente complessa da interpretare. Per frazionarla opportunamente si devono identificare tutte le sue parti.

In primo luogo la regola complessiva può essere espressa da una singola regola o da una sequenza di regole. Se esistono più regole esse sono separate dal carattere ; il quale divide in più regole distinte la regola complessiva.
Le regole vengono interpretate da sinistra verso destra. Non appena una di esse è soddisfatta, ovvero tutte le componenti in essa citate sono presenti e valide nel documento in esame, la regola viene considerata valida e non si prosegue oltre. Se, per contro, ogni regola identificata risulta mancate di qualche componente, l'ultima, quindi quella più a destra, viene considerata comunque valida. Sarà cura di chi configura queste regole garantirsi che il nome di file che da essa deriva sia un nome sempre valido.

Ora che abbiamo chiarito come si identifica una singola regola e come esse vengano interpretate in un dato ordine, vediamo come si compone una regola e e quali caratteristiche essa debba avere per essere considerata soddisfatta.
Innanzitutto ogni regola distinta è rappresentata da una stringa composta da parti fisse e parti variabili, derivate dal contenuto del documento in esame, dette appunto componenti. Tali componenti sono di fatto composte dal valore di un elemento o attributo del documento in esame più eventuali altri parti fisse ma condizionate alla sua presenza.

Ogni componente è riconoscibile in quanto inizia e termina col carattere $. Al suo interno può quindi trovarsi una o due parti fisse condizionate (che vedremo poi negli esempi) e l'identificazione della parte del documento, elemento o attributo, iniziata e terminata a sua volta dal carattere @. A questa parte del documento possono poi essere applicati dei modificatori (Vds. Modificatori delle regole di composizione) che si trovano sempre entro i due caratteri @ ma sono separati dall'identificatore della parte del documento dal carattere |.

Se il risultato dell'acquisizione del valore dell'elemento o dell'attributo indicato e la successiva applicazione dei modificatori danno un risultato vuoto, la regola si considera non soddisfatta e si procede con l'interpretazione della regola successiva. Come detto in precedenza, questo non vale per l'ultima regola la quale, anche se il valore ottenuto risulta vuoto, dev'essere considerata soddisfacente comunque.

L'identificatore della parte di documento interessata deve prevedere un percorso XML completo (anche se è possibile, per quando sconsigliabile, indicarlo relativo) prefissato da XML,

Poiché un buon esempio vale più di mille parole si invita, dopo aver letto la parte sui modificatori, a consultare gli Esempi di composizione nomi files

La regola di composizione chiavi articolate

L'esigenza di poter produrre delle chiavi composite sulla base dei dati contenuti in un documento è subito stata avvertita, sin dalle primissime applicazioni. L'esperienza fatta in tale frangente, ed anche nei periodi successivi di crescita del progetto eXtraWay, ha mostrato come nella maggioranza dei casi sia particolarmente utile comporre chiavi sulla base della combinazione degli attributi di un elemento. In seguito si sono verificate casistiche in cui anche la combinazione del valore di più elmenti sarebbe risultata utile ma tale implementazione, per quanto prevista, non è ancora stata effettuata.

Concentriamoci quindi sulla composizione di chiavi per mezzo della combinazione degli attributi di un elemento poiché tali regole, attualmente, possono essere applicate esclusivamente alla configurazione di questi ultimi. In origine erano state concepite forme molto semplici di concatenazzione con o senza spazi che si sono rapidamente rivelate inadeguate e sono state quindi abolite lasciando il posto alla sintassi di composizione che andremo rapidamente a vedere.

Ogni regola è una composizione di una o più regole (sino ad un massimo stabilito che non si ritiene di dover documentare in questa sede essendo potenzialmente soggetto a variazioni che non interessano la sintassi della regola).
Ogni regola distinta è riconoscibile in quanto inizia con la seguenza...

#<nomeregola>: 

...e termina quando la stringa stessa ha termine o quando si incontra una nuova regola di composizione. Dopo aver identificato il nome della regola essa si compone in modo sostanzialmente simile alla regola di composizione dei nomi di files.
In altre parole essa è composta da parti fisse (costanti) e componenti che sono rappresentate dal valore degli attributi. Le componenti sono identificabili perché hanno inizio e fine col carattere $. Al loro interno posson essere presenti ulteriori costanti condizionate e l'indicazione del vero e proprio nome dell'attributo che ha inizio e fine col carattere @.
Sempre all'interno di questi delimitatori, separati dal nome dell'attributo per mezzo del carattere |, trovano posto i modificatori applicati al contenuto dell'attributo.

Poiché un buon esempio vale più di mille parole si invita, dopo aver letto la parte sui modificatori, a consultare gli Esempi di composizione chiavi articolate

Modificatori delle regole di composizione

Come annunciato nei paragrafi precedenti, ad ogni componente una nome di file o una chiave articolata, possono essere applicati dei modificatori. Solitamente un modificatore è rappresentato da un carattere che ne identifica il tipo e, di seguito, caratteri cifre e simboli il cui significato dipendono dal tipo di modificatore espresso col primo carattere. I vari modificatori, separati tra loro dal carattere virgola, vengono applicati da sinistra verso destra applicandosi sul risultato dei modificatori applicati sino a quel momento.
Dal momento che la virgola assume un significato particolare, come separatore dei diversi modificatori, se essa appare in almeno una delle regole come parametro essa dev'essere escapata preponendole il carattere \.

Per mezzo di questi modificatori si possono frammentare e ricomporre in modo piuttosto articolato i valori contenuti in elementi ed attributi a patto di conoscere, quanto meno in modo sommario, la conformazione che tali contenuti avranno.

Vediamo nel dettaglio i modificatori ricordando che anche i valori numerici vengono trattati come stringhe:

Gli esempi delle sezioni successive chiariranno meglio l'uso di queste sintassi.

Esempi di composizione nomi files

Di seguito alcuni esempi particolarmente ricchi.

Partiamo da un esempio proveniente dall'applicazione DocWay. La regola di composizione del nome di file che ospita i vari documenti protocollati è la seguente:

<file_location mode="rule" rule="$@XML,/doc/storia/creazione/@data|p0-4@$/$@XML,/doc/@cod_amm_aoo@/$$@XML,/doc/@bozza|caesi?bozze:@$;$@XML,/doc/rif_interni/rif/@cod_fasc|p0-4@$/$@XML,/doc/rif_interni/rif/@cod_fasc|p5-7@$/fascicoli/$@XML,/doc/rif_interni/rif/@cod_fasc|p13-99,tl.,s\/_@$/$@XML,/doc/rif_interni/rif/@cod_fasc|p0-4@$-$@XML,/doc/rif_interni/rif/@cod_fasc|p13-99,tl.,s\/_@$.$@XML,/doc/rif_interni/rif/@cod_fasc|Tl.,tl.@$;$@XML,/doc/@anno@$/$@XML,/doc/@cod_amm_aoo@$/repertori/$@XML,/doc/repertorio/@cod@$/$@XML,/doc/@cod_amm_aoo@$-$@XML,/doc/@anno@$-$@XML,/doc/repertorio/@cod@$;$@XML,/doc/@anno@$/$@XML,/doc/@cod_amm_aoo@$/documenti/$@XML,/doc/classif/@cod|s\/_@$/$@XML,/doc/@anno@$-$@XML,/doc/classif/@cod|s\/_@$" move_always="yes"/>

Vista così risulta particolarmente complessa ma se osseviamo meglio ci rendiamo conto che essa è la composizione di diverse regole distinte che sono...

$@XML,/doc/storia/creazione/@data|p0-4@$/$@XML,/doc/@cod_amm_aoo@/$$@XML,/doc/@bozza|caesi?bozze:@$

$@XML,/doc/rif_interni/rif/@cod_fasc|p0-4@$/$@XML,/doc/rif_interni/rif/@cod_fasc|p5-7@$/fascicoli/$@XML,/doc/rif_interni/rif/@cod_fasc|p13-99,tl.,s\/_@$/$@XML,/doc/rif_interni/rif/@cod_fasc|p0-4@$-$@XML,/doc/rif_interni/rif/@cod_fasc|p13-99,tl.,s\/_@$.$@XML,/doc/rif_interni/rif/@cod_fasc|Tl.,tl.@$

$@XML,/doc/@anno@$/$@XML,/doc/@cod_amm_aoo@$/repertori/$@XML,/doc/repertorio/@cod@$/$@XML,/doc/@cod_amm_aoo@$-$@XML,/doc/@anno@$-$@XML,/doc/repertorio/@cod@$

$@XML,/doc/@anno@$/$@XML,/doc/@cod_amm_aoo@$/documenti/$@XML,/doc/classif/@cod|s\/_@$/$@XML,/doc/@anno@$-$@XML,/doc/classif/@cod|s\/_@$

Abbiamo quindi 4 regole distinte. La seconda verrà presa in esame solo se la prima non è soddisfatta, così la terza se neanche la seconda viene soddisfatta ed in fine la quarta se tutte le precedenti falliscono. Vediamo ora nel dettaglio la prima regola...

$@XML,/doc/storia/creazione/@data|p0-4@$/$@XML,/doc/@cod_amm_aoo@/$$@XML,/doc/@bozza|caesi?bozze:@$

Essa si compone di tre distinte componenti ed una costante...

$@XML,/doc/storia/creazione/@data|p0-4@$
/
$@XML,/doc/@cod_amm_aoo@/$
$@XML,/doc/@bozza|caesi?bozze:@$

La prima componente identifica l'attributo data preso dall'elemento creazione. Della data in esame, intesa presumibilmente nel fomato YYYYMMDD, si prendono 4 caratteri a partire dalla posizione 0, quindi, in breve, i primi 4 caratteri. Ad essi si accoda la costante '/' e poi il valore, non modificato, dell'attributo cod_amm_aoo.
La terza componente è un test sul contenuto dell'attrubito bozza. Il test viene effettuato per uguaglianza alfanumerica. Se contiene quindi la stringa si il valore assegnato è la stringa bozze, altrimenti è una stringa vuota. La stringa vuota, se non si tratta di una bozza, comporta che la regola risulti non soddisfatta e si passi al trattamento della successiva...

$@XML,/doc/rif_interni/rif/@cod_fasc|p0-4@$/$@XML,/doc/rif_interni/rif/@cod_fasc|p5-7@$/fascicoli/$@XML,/doc/rif_interni/rif/@cod_fasc|p13-99,tl.,s\/_@$/$@XML,/doc/rif_interni/rif/@cod_fasc|p0-4@$-$@XML,/doc/rif_interni/rif/@cod_fasc|p13-99,tl.,s\/_@$.$@XML,/doc/rif_interni/rif/@cod_fasc|Tl.,tl.@$

Anche questa va frazionata in varie parti...

$@XML,/doc/rif_interni/rif/@cod_fasc|p0-4@$
/
$@XML,/doc/rif_interni/rif/@cod_fasc|p5-7@$
/fascicoli/
$@XML,/doc/rif_interni/rif/@cod_fasc|p13-99,tl.,s\/_@$
/
$@XML,/doc/rif_interni/rif/@cod_fasc|p0-4@$
-
$@XML,/doc/rif_interni/rif/@cod_fasc|p13-99,tl.,s\/_@$
.
$@XML,/doc/rif_interni/rif/@cod_fasc|Tl.,tl.@$

Questa regola è decisamente più complessa della precedente. Ci dice che vengono presi i primi 4 caratteri dell'attributo cod_fasc, ad essi viene accodato uno '/' e di seguito altri 7 caratteri a dopo averne saltati 5. Alla stringa ottenuta viene accodata la costante '/fascicoli/' a sua volta seguita da un'altra parte dell'attributo cod_fasc. Per isolare questa parte si satlano i primi 13 caratteri e se ne prendono 99, allo scopo di acquisire tutto il contenuto rimanente. Da essi si prende la prima parte, da sinistra, sino al primo punto. di seguito si sostituisce il carattere '/', preceduto da un escape di sicurezza, con il carattere '_'. L'attributo cod_fasc viene utilizzato ancora nelle due componenti successive in modo simile alle precedenti sempre intercalando con alcune costanti ed in fine si richiede di acquisire sempre il valore del codice fascicolo, isolare la parte iniziale sino al primo punto e scartarla, poi acquisire, della restante parte, privata comunque del punto identificato precedentemente, della restante parte, dicevamo, acquisire, sempre da sinistra, la parte sino al punto.
La dove il documento non appartenesse ad alcun fascicolo questa regola non sarebbe soddisfatta in alcun modo e sarebbe quindi necessario passare all'interpretazione della terza che mostriamo direttamente frazionata

$@XML,/doc/@anno@$
/
$@XML,/doc/@cod_amm_aoo@$
/repertori/
$@XML,/doc/repertorio/@cod@$
/
$@XML,/doc/@cod_amm_aoo@$
-
$@XML,/doc/@anno@$
-
$@XML,/doc/repertorio/@cod@$

Questa regola non presenta modificatori e si tratta quindi della mera unione dei valori degli attributi indicati. Se però il documento non appartiene ad un repertorio si giunge in fine alla quarta regola, anch'essa già frazionata...

$@XML,/doc/@anno@$
/
$@XML,/doc/@cod_amm_aoo@$
/documenti/
$@XML,/doc/classif/@cod|s\/_@$
/
$@XML,/doc/@anno@$
-
$@XML,/doc/classif/@cod|s\/_@$

In questa regola si notano esclusivamente delle sostituzioni.

In tutti gli esempi portati sino ad ora le componenti da utilizzare non prevedevano al loro interno delle costanti condizionate. Prendiamo quindi l'ultima regola indicata. Le costanti espresse tra una componente e l'altra, vengono inserite nel risultato finale indipendentemente dal valore delle singole componenti, quindi, se pe esempio l'attributo cod_amm_oo risultasse non valorizzato un documento del 2005 avrebbe un file nella forma...

2005//documenti/...

ponendo una doppia barra nel nome del file. Evidentemente chi ha configurato questa regola è ragionevolmente certo che tale attributo sia sempre valorizzato ma se così non fosse la parte della regola rappresentata da...

...
/
$@XML,/doc/@cod_amm_aoo@$
/documenti/
...

potrebbe essere invece espressa come...

...
$/@XML,/doc/@cod_amm_aoo@$
/documenti/
...

Come si può notare il carattere '/' trova ora posto tra i simboli $ ma ovviamente al di fuori dei simboli @ che isolano la componente XML del documento. Ponendo delle costanti entro i simboli $ esse vengono considerate condizionate al valore della componente XML in esame. Se quindi cod_amm_aoo non risulta valorizzato (o l'applicazione si di esso dei modificatori conduce ad un valor vuoto) la costante condizionata non viene aggiunta alla regola e il nome file risulterebbe...

2005/documenti/...

Immaginiamo di avere un elemento il cui valore, non ben identificato, può essere ricondotto ad una data e che si voglia inserire i documenti che hanno un simile elemento in un file corrispondente al mese in esame. La regola portebbe apparire come...

$@XML,/doc/verb_date|b,d,fn8,p0-6@$

richiedendo l'eliminazione degli spazi in testa ed in coda, il trattamento di quanto rimasto come data, la formattazione a sinistra per 8 caratteri e l'acquisizione dei primi 6 che dovrebbero corrispondere all'anno ed al mese in formato YYYYMM. Non essendo certi del formato verboso, dopo il trattamento del valore come data si compie la formattazione ad 8 cifre per avere materiale sufficiente, anche a costo di avere soli zeri se non fosse stato possibile isolare una data valida.

Esempi di composizione chiavi articolate

Di seguito alcuni esempi su come comporre chivi articolate.

Vediamo un esempio di chiave articolata prodotta nell'applicazione DocWay. Essa appare come ...

  <key name="XML,/doc/rif_interni/rif" instance="yes" attr_collate="#dirittonomeuff:$@diritto@$$|^| @nome_uff@$#dirittonomepersona:$@diritto@$$|^| @nome_persona@$#dirittocodpersonacodfasc:$@diritto@$|$@cod_persona@$|$@cod_fasc@$#dirittocoduffcodfasc:$@diritto@$|$@cod_uff@$|$@cod_fasc@$#dirittocoduffscartato:$@diritto@$|$@cod_uff@$|$@scartato@$#dirittocodpersonascartato:$@diritto@$|$@cod_persona@$|$@scartato@$"/>

Gaurdando meglio la regola ci si rende conto che essa è la combinazione di più regole e quindi di più chiavi distinte. Esse sono...

#dirittonomeuff:$@diritto@$$|^| @nome_uff@$
#dirittonomepersona:$@diritto@$$|^| @nome_persona@$
#dirittocodpersonacodfasc:$@diritto@$|$@cod_persona@$|$@cod_fasc@$
#dirittocoduffcodfasc:$@diritto@$|$@cod_uff@$|$@cod_fasc@$
#dirittocoduffscartato:$@diritto@$|$@cod_uff@$|$@scartato@$
#dirittocodpersonascartato:$@diritto@$|$@cod_persona@$|$@scartato@$

Diversamente dalle regole di composizione nomi file è necessario indicare esclusivamente il nome dell'attributo in quanto la regola sottintende l'elemento al quale appartengono gli attributi indicati.

Nell'archivio civile, avremo invece...

<key name="XML,/civile" attr_collate="#asn:$@datdec|d,p0-4,fn4@$$@numdec|p-5-5,fn5@$"/>

che ci mostra la regola...

#asn:$@datdec|d,p0-4,fn4@$$@numdec|p-5-5,fn5@$"/>

Questa richiede che l'attributo datdec venga trattat come data, ne vengano acquisiti i primi 4 caratteri e siano formattati a 4 cifre (per compensare il caso che non ve ne siano abbastanza disponibili). A questo valore vengono accodati gli ultimi 5 caratteri dell'attributo numdec (5 caratteri a partire da offset -5) anch'essi formattati a 5 caratteri qualora non ve ne fossero a sufficienza. Si ottiene quindi un codice di 4+5=9 caratteri. Per contro la regola...

<key name="XML,/civile/rnc" attr_collate="#snorm:$@gen@$$ @reg@$$ @min@$$ @naz@$$ @dat@$$ @num@$$ @al@$$ @art@$$ @com@$$ @ln@$" instance="yes"/>

mostra una semplice sequenza di attributi che vengono concatenati ponendo tra essi uno spazio. Si fa notare che lo spazio si trova all'interno dei caratteri $ di delimitazione così da essere condizionato dall'effettiva valorizzazione dell'attributo: se l'attributo manca o ha valor vuoto non viene inserito lo spazio considerato inutile.

Regole di concatenazione composita

Per Regole di Concatenazione Composita si indica la possibilità di creare chiavi che si compongono in modo dinamico per mezzo di attributi ed elementi sparsi un po' ovunque nell'intera unità informativa. Questo comporta che le chiavi prodotte sono il prodotto cartesiano di tutte le combinazioni possibili delle componenti indicate.

La dichiarazione della regola composita differisce dallo stile adottato sino ad ora per le concatenazioni degli attributi di un elemento in quanto non ci sono regole da applicare ad un percorso XML corrispondente ad un elemento bensì bisogna inventare letteralmente un percorso di chiave e ad esso associare la regola che lo compone. Nel denominare tale percorso si suggerisce di fare uso del carattere '#' come primo caratere dell'ultima parte del percorso al fine di distinguere questo canale di ricerca da qualsiasi altro canale reale.

Veniamo quindi a descrivere come si dichiara una simile chiave con l'ausilio di alcuni esempi. Bisogna sapere che:
a) La sintassi con la quale si dichiara la regola è identica a quella utilizzata per le regole espresse in attr_collate ma indicando l'intero percorso XML e non semplicemente il nome dell'attributo. Valgono quindi tutti gli stessi modificatori.
b) La sintassi di cui al punto 'a' dev'essere indicata nell'attributo collate_rule di un elemento key che può anche essere di fantasia. In tal caso si suggerisce, per quanto non sia obbligatorio, che il nome finale del percorso che descrive la chiave sia prefissato dal carattere '#' come avviene per le altre chiavi speciali.
c) Tutti i percorsi XML citati nella regola espressa nell'attributo collate_attr devono essere dichiarati in un apposito elemento key, essi non possono essere sottintesi e possono anche essere skippati ovvero da non indicizzare in quanto a valore pierno.
d) Le chiavi prodotte non possono essere cercate in adiacenza in quanto ad esse viene associata una iword non rapportabile al documento.

Un esempio di dichiarazione di una simile chiave può essere il seguente...

<key name="XML,/NewsML/NewsEnvelope/#AgiNotizia" key_style="one" collate_rule="$@/NewsML/NewsItem/Identification/NewsIdentifier/NewsItemId|tl-,fn4@$"/>

...oppure, in un caso ancora più evidente...

<key name="XML,/NewsML/NewsEnvelope/#AgiDate" key_style="one" value_type="date" collate_rule="$@/NewsML/NewsEnvelope/DateAndTime|p0-8,d@$"/>
<key name="XML,/NewsML/NewsEnvelope/#AgiTime" key_style="one" value_type="num" collate_rule="$@/NewsML/NewsEnvelope/DateAndTime|p9-6,fn-6@$"/>
<key name="XML,/NewsML/NewsEnvelope/DateAndTime" key_style="skip"/>

...ove l'elemento DateAndTime non è richiesto come indice a se stante ma da esso si producono due distinti indici. Negli esempi portati si fa uso di un solo canale nella regola ma ne possono essere usati vari senza limitazioni come nel caso di regole applicate agli attributi di un elemento.

Autore:
Tirabassi Roberto
Date
2008/02/05 11:45:50

Torna a Indice delle voci


HighWay/eXtraWay Project - Frequently Asked Questions (Doxygen 1.6.1)