r718 - trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr
Author: bpoussin Date: 2011-02-21 18:49:33 +0100 (Mon, 21 Feb 2011) New Revision: 718 Url: http://nuiton.org/repositories/revision/wikitty/718 Log: Anomalie #1351: Bug in reindexation with new SolR indexation implementation when syncSearchEngine Modified: trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/AttachmentInTree.java trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java Modified: trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/AttachmentInTree.java =================================================================== --- trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/AttachmentInTree.java 2011-02-21 17:45:43 UTC (rev 717) +++ trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/AttachmentInTree.java 2011-02-21 17:49:33 UTC (rev 718) @@ -145,8 +145,10 @@ } /** + * Ajout les attachment du TreeNode passe en parametre via son Id + * * @param id TreeNode id - * @param ids attachment id + * @param attId attachment id */ public void add(String id, Collection<String> attId) { if (attId != null && !attId.isEmpty()) { @@ -155,7 +157,21 @@ } } + /** + * Ajout l'attachment du TreeNode passe en parametre via son Id + * + * @param id TreeNode id + * @param attId attachment id + */ + public void add(String id, String attId) { + if (attId != null) { + attachmentAddedInTree.get(id).add(attId); + allAttachmentToIndex.add(attId); + } + } + /** + * Ajout les attachment du TreeNode passe en parametre sous forme de doc Solr * @param doc TreeNode document representation */ public void add(SolrDocument doc) { @@ -168,8 +184,31 @@ } /** + * Ajout les attachment du TreeNode passe en parametre sous forme de doc Solr + * Mais seulement si l'attachment est aussi dans la liste restriction + * * @param doc TreeNode document representation + * @param restriction la liste accepte de wikitty a ajouter */ + public void add(SolrDocument doc, Set<String> restriction) { + String id = (String)doc.getFieldValue(WikittySolrConstant.SOLR_ID); + + Collection att = doc.getFieldValues(SolrUtil.getSolrFieldName( + WikittyTreeNode.FQ_FIELD_WIKITTYTREENODE_ATTACHMENT, + TYPE.WIKITTY)); + if (att != null) { + for (Object attId : att) { + if (restriction.contains(attId)) { + add(id, (String)attId); + } + } + } + } + + /** + * Ajout les attachment du TreeNode passe en parametre sous forme de doc Solr + * @param doc TreeNode document representation + */ public void add(SolrInputDocument doc) { String id = (String)doc.getFieldValue(WikittySolrConstant.SOLR_ID); @@ -180,6 +219,7 @@ } /** + * Ajout les attachment du TreeNode passe en parametre sous forme de Wikitty * @param doc TreeNode document representation */ public void add(Wikitty w) { Modified: trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java =================================================================== --- trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-02-21 17:45:43 UTC (rev 717) +++ trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-02-21 17:49:33 UTC (rev 718) @@ -161,6 +161,9 @@ Map<String, Wikitty> allWikitties = new HashMap<String, Wikitty>(); // les ids des wikitties en parametre reellement modifier (a reindexer) Set<String> dirtyObject = new HashSet<String>(); + // les ids des wikitties qui n'appartiennent pas a un TreeNode passé en + // parametre, mais qui pourrait appartenir a un treenode deja indexe + Set<String> possibleAttachment = new HashSet<String>(); // les ids des TreeNodes dont le champs parent a change (est aussi // contenu dans dirtyObject Set<String> dirtyParent = new HashSet<String>(); @@ -176,8 +179,8 @@ // s'il y a au moins un champs a reindexer ou que l'objet // n'a jamais ete sauve (1 > version) dirtyObject.add(w.getId()); - if (WikittyTreeNodeHelper.hasExtension(w) && - (w.getDirty().contains(WikittyTreeNode.FQ_FIELD_WIKITTYTREENODE_PARENT) + if (WikittyTreeNodeHelper.hasExtension(w) && (force + ||w.getDirty().contains(WikittyTreeNode.FQ_FIELD_WIKITTYTREENODE_PARENT) || null == WikittyTreeNodeHelper.getParent(w))) { // si le pere a change // ou qu'il est null (creation d'un nouvel arbre) @@ -205,16 +208,21 @@ // // Phase 1: on indexe les objets passe en paremetre, on copie si - // besoin #tree.attached et #tree.* des TreeNode dont - // leur champs parent n'a pas ete modifie, et dans ce cas - // on collecte les modif d'attachments des TreeNode + // besoin #tree.attached des wikitties et #tree.* des + // TreeNode dont leur champs parent n'a pas ete modifie, et + // dans ce cas on collecte les modif d'attachments des TreeNode // for(String id : dirtyObject) { Wikitty w = allWikitties.get(id); SolrDocument oldDoc = dirtyObjectDoc.get(id); SolrInputDocument doc = createIndexDocument(w); - if (oldDoc != null) { + if (oldDoc == null) { + // Le document n'existait pas, mais peut-etre qu'il etait + // dans la liste des attachments d'un TreeNode. Il faudra + // donc rechercher si c'est le cas et l'indexer convenablement + possibleAttachment.add(id); + } else { // copy des champs #tree.attached SolrUtil.copySolrDocument(oldDoc, doc, TREENODE_ATTACHED + ".*"); if (WikittyTreeNodeHelper.hasExtension(w) @@ -315,9 +323,15 @@ // Phase 3: on reindexe les attachments qui en ont besoin // - // on passe null pour tree, car tous les noeuds doivent etre dans - // solrResource - addTreeIndexField(solrResource, null, attachmentInTree); + // on ajoute les attachment au TreeNode qui ont ete store, sans + // leurs attachments (ni en base, ni dans le meme store) + Map<String, SolrDocument> tree = + SolrUtil.findAllByAttachment(solrServer, possibleAttachment); + for (SolrDocument doc : tree.values()) { + attachmentInTree.add(doc, possibleAttachment); + } + + addTreeIndexField(solrResource, tree, attachmentInTree); } catch (Exception eee) { throw new WikittyException("Can't store wikitty", eee); } @@ -369,6 +383,10 @@ attachmentInTree.remove(doc); } // recherche tous les noeuds sur lequel est attache cet objet + + // TODO poussin 20110217 optimiser cette requete pour la faire + // hors de la boucle et pour tous les doc a supprimer en meme + // temps (donc 1 seul requete au lieu de N) Set<String> treeNodeIds = SolrUtil.getAttachedTreeNode(doc); treeNodeAttachmentRemovedId.addAll(treeNodeIds); @@ -528,12 +546,12 @@ } /** - * Update attaced extra field on all objects passed in argument allAttachmentToIndex + * Update attached extra field on all objects passed in argument + * allAttachmentToIndex * * @param solrResource must contains reindexed TreeNode, that contains attachment - * @param allAttachmentToIndex id of object to update - * @param attachmentRemovedInTree index to remove - * @param attachmentAddedInTree index to add + * @param tree solr document for some TreeNode (used when TreeNode not find in solrResource) + * @param attachmentInTree attachment added and removed from TreeNode */ protected void addTreeIndexField(SolrResource solrResource, Map<String, SolrDocument> tree, AttachmentInTree attachmentInTree) { @@ -566,18 +584,29 @@ log.error("SolR doc not found in Transaction or in tree." + "This is a bug !!!"); } + // add tree indexation on all attachments for this treeNodeId for (String attId : attachmentInTree.getAdded().get(treeNodeId)) { SolrDocument oldDoc = attachments.get(attId); SolrInputDocument doc = solrResource.getAddedDoc(attId); - if (doc == null) { - doc = new SolrInputDocument(); - SolrUtil.copySolrDocument(oldDoc, doc); - solrResource.addDoc(attId, doc); + // il faut que oldDoc ou doc soit different de null pour + // pouvoir ajouter l'indexation d'arbre. Le cas on les deux + // sont nuls arrivent lorsqu'on demande la sauvegarde d'un + // TreeNode alors qu'on a pas encore sauve les attachments + // (ex: durant un syncSearchEngine ou l'on demande une + // reindexation totale). Ceci n'est pas un probleme car + // les attachments seront convenablement indexes lorsqu'ils + // seront ajoutes + if (oldDoc != null || doc != null) { + if (doc == null) { + doc = new SolrInputDocument(); + SolrUtil.copySolrDocument(oldDoc, doc); + solrResource.addDoc(attId, doc); + } + doc.removeField(TREENODE_ATTACHED + treeNodeId); + for (Object id : treeNodeParents) { + doc.addField(TREENODE_ATTACHED + treeNodeId, id); + } } - doc.removeField(TREENODE_ATTACHED + treeNodeId); - for (Object id : treeNodeParents) { - doc.addField(TREENODE_ATTACHED + treeNodeId, id); - } } } }
participants (1)
-
bpoussin@users.nuiton.org