IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Saxon - Définition de son prope next() possible?


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 173
    Par défaut Saxon - Définition de son prope next() possible?
    Salut à tous,
    Je n'arrive pas à définir mon prope next() pour l'itérateur de saxon. Je m'explique:
    A partir d'une première query, je récupère un itérateur sur la liste résultat. Je souhaite ensuite itérer dans une autre requête jusqu'à ce qu'une condition soit atteinte.

    Voici un exemple de fichier xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <balise1>
    		<requete1 name="result">
    			(
    				doc('monDoc')/A
    			)
    		</requete1>
     
    		<requete2>
    			<stream>
    				requête 2 (avec une boucle "for $i in $result")		
    			</stream>			
    		</requete2>
    </balise1>
    Après exécution de la première requête, j'obtiens un itérateur sur les noeuds A.

    J'ai écris une classe qui implémente net.sf.saxon.om.SequenceIterator et dans laquelle je redéfinie ma méthode next() de manière à ce que ca itère que jusqu'à ma condition.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    public class SequenceIteratorWrapper implements
        SequenceIterator {
     
      private final List<NodeInfo> distinctResultList;
     
      private int NbNodeTreated;
     
      private final SequenceIterator sequenceIterator;
     
      private final FormSettings mySettings;
     
      public SequenceIteratorWrapper(final SequenceIterator aseqIt,
          final FormSettings settings) {
        sequenceIterator = aseqIt;
        MySettings = settings;
        distinctResultList = new ArrayList<NodeInfo>();
        NbNodeTreated = 0;
      }
     
      @Override
      public Item current() {
        return sequenceIterator.current();
      }
     
      public boolean existInDistinctResultList(final NodeInfo nodeInfo) {
         for (final NodeInfo nodeInformation : distinctResultList) {
          if (nodeInformation.isSameNodeInfo(nodeInfo)) {
            return true;
          }
        }
        return false;
      }
     
      @Override
      public SequenceIterator getAnother() throws XPathException {
        return sequenceIterator.getAnother();
      }
     
      public List<NodeInfo> getDistinctResultList() {
        return distinctResultList;
      }
     
      @Override
      public int getProperties() {
        return sequenceIterator.getProperties();
      }
     
      @Override
      public Item next() throws XPathException {
        Item result = null;
        final boolean continueCondition = 
           (distinctResultList.size() <= mySettings.getMaxResultNumberDisplay())
              || (NbNodeTreated <= mySettings.getMaxResultNumber()); 
        if (continueCondition) {
          result = sequenceIterator.next();
        }
        NbNodeTreated++;
        return result;
      }
     
      @Override
      public int position() {
        return sequenceIterator.position();
      }
    }
    J'exécute ensuite la deuxième requête avec Saxon en lui passant comme paramètre correspondant à "result" mon itérateur (de manière à ce qu'il fasse le "for $i in $result" jusqu'à ma condition).

    Dans la XQuery, j'appelle à un moment une fonction java dans laquelle je passe le $result en paramètre. Cependant, le type ne correspond pas au type que j'ai défini et passé en paramètre de la requête (j'ai un net.sf.saxon.query.XQueryExpression$ProgressIterator au lieu du SequenceIteratorWrapper que j'ai défini). De plus, saxon ne passe jamais dans le next() que j'ai redéfinie dans ma classe SequenceIteratorWrapper.

    Ai-je mal fait quelque chose? Est-il possible de définir un itérateur utilisable par saxon avec son propre next() de cette manière ou d'une autre?

    Je vous remercie d'avance pour vos réponses.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Je n'ai pas l'habitude d'appeler Saxon de cette manière, mais mon premier réflexe serait plutôt de :
    - prendre les items que je veux garder de l'itérateur de départ, et oublier les autres,
    - les mettre dans un nouvel itérateur, un itérateur normal fourni par Saxon.

    Ça évite de se demander si on va pas se planter dans la mécanique complexe essayée. Au prix d'une copie d'une séquence d'éléments dans une autre séquence.

    Mais si vraiment c'est pas envisageable, je m'intéresserais d'abord à la méthode getAnother(). En toute logique elle devrait être utilisée, et il faudrait donc qu'elle produise un itérateur de même taille que le tien.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 173
    Par défaut
    Merci pour ta réponse.
    En fait, on doit avoir un certain nombre de lignes à l'affichage (ex: 100). Le problème c'est que la deuxième query retourne des données doublons issues de noeuds différents (des lignes doublons à l'affichage). Il doit donc y avoir un traitement à faire dessus au fur et à mesure qu'on itère dessus pour voir si c'est un doublon ou non (code java appelé dans la xquery où on passe en paramètre l'itérateur qui conient l'intélligence pour continuer si nécessaire en fonction de si la condition du next() est vrai ou pas). On itère ainsi jusqu'à avoir 100 lignes distincte.

    Je ne sais pas si c'est très clair mais c'est pour cela qu'on ne peut faire ce que vous dites:
    - prendre les items que je veux garder de l'itérateur de départ, et oublier les autres,
    - les mettre dans un nouvel itérateur, un itérateur normal fourni par Saxon.

    Avant nous utilisions un ListIterator mais nous souhaitons maintenant avoir, si possible, un itérateur "maison" qui contient une intelligence pour savoir si on continue d'itérer ou non en fonction d'une certaine condition à l'appel au next().

    Qu'entends-tu par s'intéresser à getAnother()?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par philou44300 Voir le message
    Je ne sais pas si c'est très clair
    Pas du tout. Je te propose de faire un traitement en amont, et tu me parles de plusieurs choses, dont aucune ne peut pas être faite en amont.

    ... Mais bon, c'est pas comme si je comprenais quel est le problème avec distinct-values() ou subsequence()
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 173
    Par défaut
    Suite à la réponse de thelvin j'ai cherché du côté du getAnother() et effectivement c'était ceci. Dans saxon, il y avait des appel au getAnother() de mon iérateur. Je retourne donc une nouvelle instance de mon itérateur avec en paramètre du constructeur les éléments que je souhaite conserver (une liste par exemple).

    Merci .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 50
    Dernier message: 17/08/2011, 12h50
  2. [1.x] Comment ajouter son prope Helper.
    Par jotatan dans le forum Symfony
    Réponses: 4
    Dernier message: 11/03/2011, 12h19
  3. Réponses: 3
    Dernier message: 14/03/2009, 09h15
  4. Jouer un son, est-ce possible
    Par eZula dans le forum VBScript
    Réponses: 6
    Dernier message: 01/12/2008, 17h42
  5. [Audio] Mettre de la musique sur son appli possible ? simple ?
    Par Baptiste Wicht dans le forum Multimédia
    Réponses: 23
    Dernier message: 04/08/2008, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo