Project

General

Profile

Intersection de vues Lavoisier

Added by FORESTIER Flavien over 10 years ago

Bonjour,

Je souhaiterais obtenir une vue Lavoisier qui soit une sorte d'intersection de 2 vues Lavoisier.
Si vous avez du temps pour me conseiller cela me serait d'une grande aide.
Je vous explique le problème:
J'ai une 1ère vue Lavoisier white_list_ce_rate path-template="/{1}/{2}/{3}" qui à partir d'un connector sql
me génère un flux XML ayant 3 colonnes HOST, PATH, RATE.
J'ai une 2nde vue Lavoisier white_list_last_n_tests path-template="/{1}/{2}" qui à partir d'un connector sql
me génère un flux XML ayant 3 colonnes HOST, PATH, NB_TESTS_OK.
Je souhaiterais construire une 3ème vue white_list_ce path-template="/{1}/{2}/{3}/{4}/{5}" qui appellerait les
2 vues précédentes et qui à partir de leurs 2 flux XML génèrerait un flux XML résultant de l'intersection de ces 2 flux:
c'est à dire un flux xml ayant 4 colonnes: HOST, PATH, RATE, NB_TESTS_OK dont les lignes seraient celles
des 2 vues sources ayant les champs HOST et PATH en communs.

Pourriez-vous m'indiquer comment faire ?

Par avance, merci,
Flavien Forestier,
Projet VAPOR


Replies (9)

RE: Intersection de vues Lavoisier - Added by Lequeux Olivier over 10 years ago

Salut,

En supposant que tu as 2 vues A et B du type :

<VA>
  <item host="hvalue1" path="pvalue1"/>
  <item host="hvalue2" path="pvalue2"/>
</VA>

Tu peux faire ça avec pixtl comme ci-dessous (ou en XSL si tu veux si tes données tienennt en mémoire, pixtl faisant du streaming)

<view name="VAB">
        <connector type="XMLConnector">
            <parameter name="content" eval="view('VA')"/>
        </connector>
        <processors>
            <for nodes="/VA/item">
                <connector type="content" >
                    <parameter name="content" eval="view('VB')"/>
                </connector>
                <processors>
                    <select nodes="/VB/item[@host = current()/@host and @path = current()/@path]"/>
                </processors>

            </for>
        </processors>
    </view>

RE: Intersection de vues Lavoisier - Added by FORESTIER Flavien over 10 years ago

Salut,

Merci beaucoup pour ta réponse, cela m'a permis d'avancer.
J'arrive à générer les 2 flux XML à partir de 2 vues différentes
dans une 3ème vue. Par contre je bloque au niveau de la commande
<select nodes="???"/>
je n'arrive pas à trouver la bonne expression.
Voici l'allure de mes 2 flux sources:

flux VA:

<result>
<row>
<HOST>h1</HOST>
<PATH>p1</PATH>
<RATE>r1</RATE>
</row>
<row>
<HOST>h2</HOST>
<PATH>p2</PATH>
<RATE>r2</RATE>
</row>
</result>

flux VB:

<result>
<row>
<HOST>h1</HOST>
<PATH>p1</PATH>
<NB>n1</NB>
</row>
<row>
<HOST>h3</HOST>
<PATH>p3</PATH>
<NB>n3</NB>
</row>
</result>

Je souhaiterais obtenir en sortie

<result>
<row>
<HOST>h1</HOST>
<PATH>p1</PATH>
<RATE>r1</RATE>
<NB>n1</NB>
</row>
</result>

J'ai pensé pour le tag <for>:
<for nodes="/result/row">
dans le 1er processor.

Pour le tag select du 2ème processor, j'ai essayé plusieurs
façons mais je n'ai pas réussi.

Pourrais-tu m'indiquer ce que je dois metttre dans le tag select?

par avance, merci,
Flavien

RE: Intersection de vues Lavoisier - Added by Lequeux Olivier over 10 years ago

Salut,

En fait il faut que tu fasses une troisième vue (VAB) qui se branche à VA par example par l'intermédiaire de son connector et à VB par l'intermédiare du connector du for.
Le for en fait permet de browser la vue en cour en injectant des parties de xml de l'autre vue.

La version finale du flux que tu désire nécessitera des transormations après, mais qui sont triviales.
Il faut que tu retouches l'example pour modifier l'expression xpath car la structure que j'ai mis en example ne correspond pas exactement à la tienne. Il est d'ailleurs préférable d'avoir des attributs, c'est plus pratique avec pixtle, donc n'hésite pas à transformer ton flux avant de faire le croisement si besoin.

RE: Intersection de vues Lavoisier - Added by Michel Franck over 10 years ago

Salut Olivier, on a avancé là-dessus, on génère maintenant bien l'intersection (je suis en train de faire une autre vue et j'ai le même besoin), et on se débrouille ensuite pour nettoyer les entrées insérées avec le namespace entries.

On a voulu utilisé le paramètre single_node du processeur <select nodes=... >, cela rend une erreur de parsing. Il n'est plus ou pas encore supporté ? Il a été renommé ?

Merci.
Franck.

RE: Intersection de vues Lavoisier - Added by Reynaud Sylvain over 10 years ago

Ce paramètre existe toujours sous ce nom dans le plug-in SelectProcessor, mais les attributs des fonctions PiXTL n’ont pas forcément le même nom que les paramètres du plug-in correspondant puisque leur raison d’exister est d’être des notations raccourcies. C’est le cas ici, le paramètre « single_node » du plug-in SelectProcessor correspond à l’attribut @single de la fonction <select>.

Pour le cas particulier des 10 fonctions PiXTL, il faut donc se référer à cette doc (ou à l'auto-completion si ton éditeur le permet) plutôt qu'aux noms des paramètres des plug-ins correspondant.

Petite astuce: pour le nettoyage des entrées, la fonction <remove> en spécifiant la profondeur (@depth) est parfois plus intéressante que le <select>, ça dépend des cas...

Sylvain

RE: Intersection de vues Lavoisier - Added by Reynaud Sylvain over 10 years ago

Bonjour,

Je viens de rédiger un petit chapitre basé sur l'exemple de Flavien, auquel j'ai ajouté une ligne pour traiter le cas plus général d'une jointure 1-N: Join 2 data views with <for>

J'attire votre attention sur le fait que la première solution (celle que vous avez choisie) est la plus simple mais également une des moins performantes. Je vous recommande plutôt:
  • soit la solution 2 avec une vue VB qui génère dynamiquement sa requête SQL pour ne récupérer que les lignes nécessaires (grâce au paramètre 'parameters' du SQLConnector, ou bien grâce au traducteur XPath/SQL).
  • soit la solution 4 si votre vue VB est assez petite pour tenir en mémoire (cette solution sera opérationnelle dans la journée car il manque le support d'un paramètre "select" dans le plug-in AppendXmlProcessor: voir ticket #4930).

Pour comprendre le fonctionnement des différentes solutions proposées, je vous conseille de copier les fonctions PiXTL une par une et d'observer le résultat à chaque étape.

Sylvain

RE: Intersection de vues Lavoisier - Added by Michel Franck over 10 years ago

Ok merci Sylvain, on va regarder ça attentivement.

Franck.

RE: Intersection de vues Lavoisier - Added by Michel Franck over 10 years ago

Salut,

J'ai plusieurs soucis selon les essais que je fais avec la solution 2. Ca semble lié à un problème de version :

Dans un cas:
Caused by: org.xml.sax.SAXParseException; cvc-complex-type.3.2.2 : L'attribut 'nodes' n'est pas autorisÚ dans l'ÚlÚment 'insert'

Dans l'autre cas, j'enlève le insert/node et je remplace par un autre select, mais cette fois j'ai cela :
Caused by: org.dom4j.XPathException: Exception occurred evaluting XPath: view('bdii_find_se_all', concat('/services/se[@id=', quot
e(current()/@id)),']'). Exception: No Such Function quote

J'utilise la version lavoisier-package-1.9-20130822.102119-126-bin.

Franck.

RE: Intersection de vues Lavoisier - Added by Reynaud Sylvain over 10 years ago

Salut,

L'élément <insert> prend un attribut @context au lieu de @nodes. L'auto-complétion te serait vraiment utile pour t'éviter de t'embêter avec ce genre de détail!

Là aussi l'auto-complétion t'aurait évité ce soucis: la fonction s'appelle "quot()" au lieu de "quote()" (ca fait référence à ", et de même il y a une fonction apos() pour ').

Sylvain

    (1-9/9)