You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by al...@apache.org on 2012/10/22 13:50:40 UTC

svn commit: r1400843 - /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SharedFieldCache.java

Author: alexparvulescu
Date: Mon Oct 22 11:50:40 2012
New Revision: 1400843

URL: http://svn.apache.org/viewvc?rev=1400843&view=rev
Log:
JCR-3450 Reduce memory usage of SharedFieldCache.ValueIndex

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SharedFieldCache.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SharedFieldCache.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SharedFieldCache.java?rev=1400843&r1=1400842&r2=1400843&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SharedFieldCache.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/SharedFieldCache.java Mon Oct 22 11:50:40 2012
@@ -228,7 +228,9 @@ public class SharedFieldCache {
         ValueIndex ret = lookup(reader, field, prefix);
         if (ret == null) {
             final int maxDocs = reader.maxDoc();
-            ComparableArray[] retArray = new ComparableArray[maxDocs];
+            Comparable<?>[] retArray = new Comparable<?>[maxDocs];
+            Map<Integer, Integer> positions = new HashMap<Integer, Integer>();
+            boolean usingSimpleComparable = true;
             int setValues = 0;
             if (maxDocs > 0) {
                 IndexFormatVersion version = IndexFormatVersion.getVersion(reader);
@@ -268,11 +270,34 @@ public class SharedFieldCache {
                             setValues++;
                             Comparable<?> v = getValue(value, type);
                             int doc = termDocs.doc();
-                            ComparableArray ca = retArray[doc];
+                            Comparable<?> ca = retArray[doc];
                             if (ca == null) {
-                                retArray[doc] = new ComparableArray(v, termPosition);
+                                if (usingSimpleComparable) {
+                                    // put simple value on the queue
+                                    positions.put(doc, termPosition);
+                                    retArray[doc] = v;
+                                } else {
+                                    retArray[doc] = new ComparableArray(v,
+                                            termPosition);
+                                }
                             } else {
-                                retArray[doc] = ca.insert(v, termPosition);
+                                if (ca instanceof ComparableArray) {
+                                    ((ComparableArray) ca).insert(v,
+                                            termPosition);
+                                } else {
+                                    // transform all of the existing values from
+                                    // Comparable to ComparableArray
+                                    for (int pos : positions.keySet()) {
+                                        retArray[pos] = new ComparableArray(
+                                                retArray[pos],
+                                                positions.get(pos));
+                                    }
+                                    positions = null;
+                                    usingSimpleComparable = false;
+                                    ComparableArray caNew = (ComparableArray) retArray[doc];
+                                    retArray[doc] = caNew.insert(v,
+                                            termPosition);
+                                }
                             }
                         }
                     } while (termEnum.next());