Author: michiel
Date: 2010-04-19 14:08:55 +0200 (Mon, 19 Apr 2010)
New Revision: 41953

Modified:
   
mmbase/branches/MMBase-1_9/contributions/lucene/src/main/java/org/mmbase/module/lucene/MMBaseEntry.java
Log:
LUCENE-22

Modified: 
mmbase/branches/MMBase-1_9/contributions/lucene/src/main/java/org/mmbase/module/lucene/MMBaseEntry.java
===================================================================
--- 
mmbase/branches/MMBase-1_9/contributions/lucene/src/main/java/org/mmbase/module/lucene/MMBaseEntry.java
     2010-04-19 11:48:43 UTC (rev 41952)
+++ 
mmbase/branches/MMBase-1_9/contributions/lucene/src/main/java/org/mmbase/module/lucene/MMBaseEntry.java
     2010-04-19 12:08:55 UTC (rev 41953)
@@ -76,23 +76,49 @@
         return getIdentifier();
     }
 
-    protected void addStandardKeys(Document document) {
+    /**
+     * Adds the standard keys 'number', 'owner', 'builder' and returns a set 
of the steps which still needs adding to the
+     * document. The set contains 'null' if this is not a multilevel or the 
main step needs adding.
+     */
+    protected  Set<String> addStandardKeys(Document document) {
+
         log.debug("Adding standard keys");
         // always add the 'element' number first, because that ensures that 
document.get("number") returns 'the' node
-        String id = getIdentifier();
-        document.add(new Field("number",   id,  Field.Store.YES, 
Field.Index.NOT_ANALYZED));
+        final String id = getIdentifier();
+        boolean elementAdded = false;
+        if (! Arrays.asList(document.getValues("number")).contains(id)) {
+            document.add(new Field("number",   id,  Field.Store.YES, 
Field.Index.NOT_ANALYZED));
+            elementAdded = true;
+        }
+        final Set<String> result = new HashSet<String>();
+
         if (multiLevel) {
             document.add(new Field("builder", elementManager.getName(),    
Field.Store.YES, Field.Index.NOT_ANALYZED)); // keyword
-            log.debug("added builder as " + elementManager.getName());
-            //for (org.mmbase.bridge.Field field : 
node.getNodeManager().getFields()) {
-            for (FieldIterator i = 
node.getNodeManager().getFields().fieldIterator(); i.hasNext();) {
-                org.mmbase.bridge.Field field = i.nextField();
-                if (field.getName().indexOf(".") >= 0 ) continue;
-                if (id.equals(field.getName())) continue; // was added already
+            log.debug("added builder as " + elementManager.getName() + " now 
checking " + node.getNodeManager().getFields());
+            for (org.mmbase.bridge.Field field : 
node.getNodeManager().getFields()) {
+                if (field.getName().indexOf(".") >= 0 ) {
+                    continue;
+                }
+
                try {
                    Node subNode = node.getNodeValue(field.getName());
-                   document.add(new Field("number",  "" + subNode.getNumber(), 
Field.Store.YES, Field.Index.NOT_ANALYZED)); // keyword
-                   document.add(new Field("owner",  
subNode.getStringValue("owner"), Field.Store.YES, Field.Index.NOT_ANALYZED));
+                    String number = "" + subNode.getNumber();
+                    if ((elementAdded && number.equals(id)) ||
+                        
(!Arrays.asList(document.getValues("number")).contains(number))) {
+                        document.add(new Field("number",  "" + 
subNode.getNumber(), Field.Store.YES, Field.Index.NOT_ANALYZED)); // keyword
+                        document.add(new Field("owner",  
subNode.getStringValue("owner"), Field.Store.YES, Field.Index.NOT_ANALYZED));
+                    } else {
+                        log.debug("Ignoring " + number + " because already 
indexed for this document");
+                        // ignore
+                    }
+                    String fieldKey = number + ":" + field;
+                    if 
(!Arrays.asList(document.getValues("indexed_fields")).contains(fieldKey)) {
+                        document.add(new Field("indexed_fields",  fieldKey, 
Field.Store.YES, Field.Index.NOT_ANALYZED)); // keyword
+                        result.add(field.getName());
+                    } else {
+                        log.debug("Ignoring " + fieldKey + " because already 
indexed for this document");
+                    }
+
                } catch (Exception e) {
                    log.warn("Failed to load " + field.getName() + "from " + 
node + " as a node value, continuing...");
                }
@@ -101,21 +127,44 @@
             document.add(new Field("builder",  
node.getNodeManager().getName(),    Field.Store.YES, 
Field.Index.NOT_ANALYZED)); // keyword
             log.debug("added builder as " + node.getNodeManager().getName());
             document.add(new Field("owner",  node.getStringValue("owner"), 
Field.Store.YES, Field.Index.NOT_ANALYZED));
+            result.add(null);
         }
 
+        return result;
+
     }
 
 
     public void index(Document document) {
-        Map<String, Object> data = new HashMap<String, Object>();
+        final Map<String, Object> data = new HashMap<String, Object>();
         if (log.isTraceEnabled()) {
-            log.trace("Indexing " + getIdentifier() + "(" + 
node.getNodeManager().getName() + ")");
+            log.trace("Indexing " + getIdentifier() + " (" + 
node.getNodeManager().getName() + ")");
         }
         storeData(data);
-        addStandardKeys(document);
+        Set<String> prefixes = addStandardKeys(document);
+        if (log.isDebugEnabled()) {
+            log.debug("Found prefixes " + prefixes + " data " + data);
+        }
         for (IndexFieldDefinition fieldDefinition : fields) {
             String fieldName = fieldDefinition.alias;
-            if (fieldName == null)  fieldName = fieldDefinition.fieldName;
+            if (fieldName == null)  {
+                fieldName = fieldDefinition.fieldName;
+            }
+            {
+                String[] fieldNameParts = 
fieldDefinition.fieldName.split("\\.", 2);
+                if (fieldNameParts.length == 1) {
+                    if (!prefixes.contains(null)) {
+                        log.debug("Skipping fields " + 
fieldDefinition.fieldName + " (" + fieldName + ")");
+                        continue;
+                    }
+                } else {
+                    if (!prefixes.contains(fieldNameParts[0])) {
+                        log.debug("Skipping fields " + 
fieldDefinition.fieldName + " (" + fieldName + ")");
+                        continue;
+                    }
+                }
+            }
+            log.debug(fieldName);
             if (document.getField(fieldName) == null || 
!fieldDefinition.keyWord) {
                 String value = getFieldDataAsString(data, fieldName);
                 if (fieldDefinition.escaper != null) {
@@ -225,11 +274,14 @@
      */
     @SuppressWarnings("fallthrough")
     protected void storeData(Map<String, Object> map) {
+
         Cloud cloud = elementManager.getCloud();
         for (IndexFieldDefinition fieldDefinition : fields) {
             String fieldName = fieldDefinition.fieldName;
             String alias = fieldDefinition.alias;
-            if (alias == null)  alias = fieldDefinition.fieldName;
+            if (alias == null)  {
+                alias = fieldDefinition.fieldName;
+            }
             String decryptionPassword = fieldDefinition.decryptionPassword;
             if (shouldIndex(fieldDefinition)) {
                 // some hackery

_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to