Index: engine/src/main/java/org/hippoecm/repository/SetDocIdSetBuilder.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- engine/src/main/java/org/hippoecm/repository/SetDocIdSetBuilder.java	(revision )
+++ engine/src/main/java/org/hippoecm/repository/SetDocIdSetBuilder.java	(revision )
@@ -0,0 +1,83 @@
+/*
+ *  Copyright 2008-2013 Hippo B.V. (http://www.onehippo.com)
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.hippoecm.repository;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.lucene.search.DocIdSet;
+import org.apache.lucene.search.DocIdSetIterator;
+import org.apache.lucene.util.OpenBitSet;
+
+public class SetDocIdSetBuilder {
+
+    private final List<DocIdSet> docIdSets = new ArrayList<DocIdSet>();
+
+    public void add(DocIdSet docIdSet) {
+        docIdSets.add(docIdSet);
+    }
+
+    public OpenBitSet toBitSet() throws IOException {
+        final int size = docIdSets.size();
+        boolean[] current = new boolean[size];
+        DocIdSetIterator[] iterators = new DocIdSetIterator[size];
+        for (int i = 0; i < size; i++) {
+            iterators[i] = docIdSets.get(i).iterator();
+            current[i] = true;
+        }
+
+        OpenBitSet bitSet = new OpenBitSet();
+        if (size == 0) {
+            return bitSet;
+        }
+
+        while (true) {
+            for (int i = 0; i < size; i++) {
+                if (current[i]) {
+                    iterators[i].nextDoc();
+                    current[i] = false;
+                }
+            }
+            int max = -1;
+            for (int i = 0; i < size; i++) {
+                int docId = iterators[i].docID();
+                if (docId == DocIdSetIterator.NO_MORE_DOCS) {
+                    return bitSet;
+                }
+                max = docId > max ? docId : max;
+            }
+            boolean matchAll = true;
+            for (int i = 0; i < size; i++) {
+                final DocIdSetIterator iterator = iterators[i];
+                int docId = iterator.docID();
+                if (docId < max) {
+                    iterator.advance(max);
+                    docId = iterator.docID();
+                }
+                if (docId == max) {
+                    current[i] = true;
+                } else {
+                    matchAll = false;
+                }
+            }
+            if (matchAll) {
+                bitSet.set(max);
+            }
+        }
+    }
+
+}
\ No newline at end of file
Index: engine/src/test/java/org/hippoecm/repository/DocIdSetTest.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- engine/src/test/java/org/hippoecm/repository/DocIdSetTest.java	(revision )
+++ engine/src/test/java/org/hippoecm/repository/DocIdSetTest.java	(revision )
@@ -0,0 +1,79 @@
+/*
+ *  Copyright 2008-2013 Hippo B.V. (http://www.onehippo.com)
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.hippoecm.repository;
+
+import java.io.IOException;
+import java.util.Random;
+
+import org.apache.lucene.search.DocIdSetIterator;
+import org.apache.lucene.util.OpenBitSet;
+import org.junit.Test;
+
+public class DocIdSetTest {
+
+    @Test
+    public void testCombineBigDocIdSets() throws IOException {
+        Random rand = new Random();
+        int nBitsets = 10;
+        OpenBitSet[] bitSets = new OpenBitSet[nBitsets];
+        for (int i = 0; i < nBitsets; i++) {
+            OpenBitSet bitSet = new OpenBitSet();
+            for (int j = 0; j < 10 * 1000 * 1000; j++) {
+                if (rand.nextInt(i / 2 + 1) == 0) {
+                    bitSet.set(j);
+                }
+            }
+            bitSets[i] = bitSet;
+        }
+
+        {
+            long start = System.currentTimeMillis();
+            SetDocIdSetBuilder builder = new SetDocIdSetBuilder();
+            for (int i = 1; i < 10; i++) {
+                builder.add(bitSets[i]);
+            }
+            final OpenBitSet result = builder.toBitSet();
+            System.out.println("docidsetbuilder time: " + (System.currentTimeMillis() - start) + ", cardinality: " + result.cardinality());
+        }
+
+        {
+            long start = System.currentTimeMillis();
+            OpenBitSet bitSet = (OpenBitSet) bitSets[0].clone();
+            for (int i = 1; i < 10; i++) {
+                OpenBitSet clone = new OpenBitSet();
+                final DocIdSetIterator iterator = bitSets[i].iterator();
+                while (true) {
+                    iterator.nextDoc();
+                    int docId = iterator.docID();
+                    if (docId == DocIdSetIterator.NO_MORE_DOCS) {
+                        break;
+                    }
+                    clone.set(docId);
+                }
+                bitSet.and(clone);
+            }
+            System.out.println("to bitset + bitset#and time: " + (System.currentTimeMillis() - start));
+        }
+
+        {
+            OpenBitSet bitSet = (OpenBitSet) bitSets[0].clone();
+            for (int i = 1; i < 10; i++) {
+                bitSet.and((OpenBitSet) bitSets[i].clone());
+            }
+            System.out.println("cardinality: " + bitSet.cardinality());
+        }
+    }
+}
Index: engine/src/main/java/org/hippoecm/repository/FacetedNavigationEngineImpl.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- engine/src/main/java/org/hippoecm/repository/FacetedNavigationEngineImpl.java	(revision 40101)
+++ engine/src/main/java/org/hippoecm/repository/FacetedNavigationEngineImpl.java	(revision )
@@ -17,7 +17,6 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.BitSet;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -25,7 +24,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.TreeSet;
 
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
@@ -40,7 +38,6 @@
 import org.apache.jackrabbit.core.query.lucene.JackrabbitQueryParser;
 import org.apache.jackrabbit.core.query.lucene.LuceneQueryBuilder;
 import org.apache.jackrabbit.core.query.lucene.NamespaceMappings;
-import org.apache.jackrabbit.core.query.lucene.SharedFieldComparatorSource;
 import org.apache.jackrabbit.core.query.lucene.Util;
 import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.Path;
@@ -63,7 +60,6 @@
 import org.apache.lucene.search.BooleanClause.Occur;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.search.DocIdSet;
-import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.search.Filter;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.MatchAllDocsQuery;
@@ -73,6 +69,7 @@
 import org.apache.lucene.search.SortField;
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.search.TopDocs;
+import org.apache.lucene.util.OpenBitSet;
 import org.hippoecm.repository.jackrabbit.HippoSharedItemStateManager;
 import org.hippoecm.repository.jackrabbit.InternalHippoSession;
 import org.hippoecm.repository.query.lucene.AuthorizationQuery;
@@ -239,9 +236,9 @@
 
     private static class DocIdSetFilter extends Filter {
 
-        private final SetDocIdSet docIdSet;
+        private final OpenBitSet docIdSet;
 
-        private DocIdSetFilter(SetDocIdSet docIdSet) throws IOException {
+        private DocIdSetFilter(OpenBitSet docIdSet) throws IOException {
             this.docIdSet = docIdSet;
         }
 
@@ -329,13 +326,32 @@
         return facetValueCountMapCacheSize;
     }
 
-    public Result view(String queryName, QueryImpl initialQuery, ContextImpl contextImpl,
-            List<KeyValue<String, String>> facetsQueryList, List<FacetRange> rangeQuery, QueryImpl openQuery,
-            Map<String, Map<String, Count>> resultset, Map<String, String> inheritedFilter, HitsRequested hitsRequested)
+    public Result view(String queryName, QueryImpl initialQuery,
+                       ContextImpl contextImpl,
+                       List<KeyValue<String, String>> facetsQueryList,
+                       List<FacetRange> rangeQuery, QueryImpl openQuery,
+                       Map<String, Map<String, Count>> resultset,
+                       Map<String, String> inheritedFilter, HitsRequested hitsRequested)
             throws UnsupportedOperationException, IllegalArgumentException {
 
-        NamespaceMappings nsMappings = getNamespaceMappings();
+        long start = System.currentTimeMillis();
+        try {
+            return doView(queryName, initialQuery, contextImpl,
+                    facetsQueryList, rangeQuery, openQuery, resultset,
+                    inheritedFilter, hitsRequested);
+        } finally {
+            log.debug("Faceted Navigation Engine VIEW took {} ms to complete.", (System.currentTimeMillis() - start));
+        }
+    }
 
+    public Result doView(String queryName, QueryImpl initialQuery,
+                         ContextImpl contextImpl,
+                         List<KeyValue<String, String>>
+                                 facetsQueryList, List<FacetRange> rangeQuery, QueryImpl openQuery,
+                         Map<String, Map<String, Count>> resultset,
+                         Map<String, String> inheritedFilter, HitsRequested hitsRequested)
+            throws UnsupportedOperationException, IllegalArgumentException {
+        NamespaceMappings nsMappings = getNamespaceMappings();
         IndexReader indexReader = null;
         try {
             indexReader = getIndexReader();
@@ -346,13 +362,13 @@
             IndexSearcher searcher =  cacheAndSearcher.getSearcher();
 
             BooleanQuery facetsQuery = new FacetsQuery(facetsQueryList, nsMappings).getQuery();
-            SetDocIdSet matchingDocs = filterDocIdSet(facetsQuery, null, cache, indexReader);
+            SetDocIdSetBuilder matchingDocsSetBuilder = filterDocIdSet(facetsQuery, null, cache, indexReader);
 
             BooleanQuery facetRangeQuery = new FacetRangeQuery(rangeQuery, nsMappings, this).getQuery();
-            matchingDocs = filterDocIdSet(facetRangeQuery, matchingDocs, cache, indexReader);
+            matchingDocsSetBuilder = filterDocIdSet(facetRangeQuery, matchingDocsSetBuilder, cache, indexReader);
 
             BooleanQuery inheritedFilterQuery = new InheritedFilterQuery(inheritedFilter, nsMappings).getQuery();
-            matchingDocs = filterDocIdSet(inheritedFilterQuery, matchingDocs, cache, indexReader);
+            matchingDocsSetBuilder = filterDocIdSet(inheritedFilterQuery, matchingDocsSetBuilder, cache, indexReader);
 
             org.apache.lucene.search.Query initialLuceneQuery = null;
             if (initialQuery != null && initialQuery.scopes != null && initialQuery.scopes.length > 0) {
@@ -365,7 +381,7 @@
                     }
                 }
             }
-            matchingDocs = filterDocIdSet(initialLuceneQuery, matchingDocs, cache, indexReader);
+            matchingDocsSetBuilder = filterDocIdSet(initialLuceneQuery, matchingDocsSetBuilder, cache, indexReader);
 
             FacetFiltersQuery facetFiltersQuery = null;
             if (initialQuery != null && initialQuery.facetFilters != null) {
@@ -374,7 +390,7 @@
 
             final BooleanQuery authorizationQuery = contextImpl.getAuthorizationQuery();
             if (authorizationQuery != null) {
-                matchingDocs = filterDocIdSet(authorizationQuery, matchingDocs, cache, indexReader);
+                matchingDocsSetBuilder = filterDocIdSet(authorizationQuery, matchingDocsSetBuilder, cache, indexReader);
             }
 
             if (resultset != null) {
@@ -383,19 +399,23 @@
                    log.error("The resultset cannot contain multiple facets");
                    return new ResultImpl(0, null);
                }
-               
+
+                int cardinality = 0;
-               for (String namespacedFacet : resultset.keySet()) {
+                for (String namespacedFacet : resultset.keySet()) {
 
-                   // Not a search involving scoring, thus compute bitsets for facetFiltersQuery & freeSearchInjectedSort
-                   if (facetFiltersQuery != null) {
+                    // Not a search involving scoring, thus compute bitsets for facetFiltersQuery & freeSearchInjectedSort
+                    if (facetFiltersQuery != null) {
-                       matchingDocs = filterDocIdSet(facetFiltersQuery.getQuery(), matchingDocs, cache, indexReader);
+                        matchingDocsSetBuilder = filterDocIdSet(facetFiltersQuery.getQuery(), matchingDocsSetBuilder, cache, indexReader);
-                   }
+                    }
 
-                   if (openQuery != null) {
-                       QueryAndSort queryAndSort = openQuery.getLuceneQueryAndSort(contextImpl);
+                    if (openQuery != null) {
+                        QueryAndSort queryAndSort = openQuery.getLuceneQueryAndSort(contextImpl);
-                       matchingDocs = filterDocIdSet(queryAndSort.query, matchingDocs, cache, indexReader);
+                        matchingDocsSetBuilder = filterDocIdSet(queryAndSort.query, matchingDocsSetBuilder, cache, indexReader);
-                   }
+                    }
 
+                    OpenBitSet matchingDocs = matchingDocsSetBuilder.toBitSet();
+                    cardinality = (int) matchingDocs.cardinality();
+
                     /*
                      * Nodes not having this facet, still should be counted if they are a hit
                      * in the query without this facet. Therefor, first get the count query without
@@ -404,7 +424,7 @@
                     int numHits = 0;
                     if (hitsRequested.isFixedDrillPath()) {
                         // only in the case of the fixed drillpath we use the count where the facet does not need to exist
-                        numHits = matchingDocs.cardinality();
+                        numHits = (int) matchingDocs.cardinality();
                     }
 
                     ParsedFacet parsedFacet;
@@ -422,7 +442,7 @@
                      * facetPropExists: the node must have the property as facet
                      */
 
-                   matchingDocs = filterDocIdSet(new FacetPropExistsQuery(propertyName).getQuery(), matchingDocs, cache, indexReader);
+                    matchingDocsSetBuilder = filterDocIdSet(new FacetPropExistsQuery(propertyName).getQuery(), matchingDocsSetBuilder, cache, indexReader);
 
                     // this method populates the facetValueCountMap for the current facet
                     Object[] keyObjects = {matchingDocs,propertyName,parsedFacet};
@@ -431,7 +451,7 @@
                     Map<String, Count> facetValueCountMap = cache.getFacetValueCountMap(feKey);
                     if(facetValueCountMap == null) { 
                         facetValueCountMap =  new HashMap<String, Count>();
-                        populateFacetValueCountMap(propertyName, parsedFacet, facetValueCountMap, matchingDocs, indexReader);
+                        populateFacetValueCountMap(propertyName, parsedFacet, facetValueCountMap, matchingDocsSetBuilder.toBitSet(), indexReader);
                         cache.putFacetValueCountMap(feKey, facetValueCountMap);
                     } 
                     
@@ -444,22 +464,22 @@
                     }
                 }
 
-                return new ResultImpl(matchingDocs.cardinality(), null);
+                return new ResultImpl(cardinality, null);
 
             } else {
                 // resultset is null, so search for HippoNodeType.HIPPO_RESULTSET
                 if (!hitsRequested.isResultRequested()) {
                     // No search with SCORING involved, this everything can be done with BitSet's
                     if (facetFiltersQuery != null && facetFiltersQuery.getQuery().clauses().size() > 0) {
-                        matchingDocs = filterDocIdSet(facetFiltersQuery.getQuery(), matchingDocs, cache, indexReader);
+                        matchingDocsSetBuilder = filterDocIdSet(facetFiltersQuery.getQuery(), matchingDocsSetBuilder, cache, indexReader);
                     }
                     
                     if (openQuery != null) {
                         QueryAndSort queryAndSort = openQuery.getLuceneQueryAndSort(contextImpl);
-                        matchingDocs = filterDocIdSet(queryAndSort.query, matchingDocs, cache, indexReader);
+                        matchingDocsSetBuilder = filterDocIdSet(queryAndSort.query, matchingDocsSetBuilder, cache, indexReader);
                     }
 
-                    int size = matchingDocs.cardinality();
+                    int size = (int) matchingDocsSetBuilder.toBitSet().cardinality();
                     return new ResultImpl(size, null);
                     
                 } else {
@@ -534,24 +554,24 @@
                      
                     if (sort == null) {
                         // when sort == null, use this search without search as is more efficient
-                        Filter filterToApply = new DocIdSetFilter(matchingDocs);
+                        Filter filterToApply = new DocIdSetFilter(matchingDocsSetBuilder.toBitSet());
                         tfDocs = searcher.search(query, filterToApply, fetchTotal);
                     } else {
                         if(sortScoreAscending) {
                             // we need the entire searchQuery because scoring is involved
-                            Filter filterToApply = new DocIdSetFilter(matchingDocs);
+                            Filter filterToApply = new DocIdSetFilter(matchingDocsSetBuilder.toBitSet());
                             tfDocs = searcher.search(query, filterToApply, fetchTotal, sort);
                         } else {
                             // because we have at least one explicit sort, scoring can be skipped. We can use cached bitsets combined with a match all query
                             if (facetFiltersQuery != null) {
-                                matchingDocs = filterDocIdSet(facetFiltersQuery.getQuery(), matchingDocs, cache, indexReader);
+                                matchingDocsSetBuilder = filterDocIdSet(facetFiltersQuery.getQuery(), matchingDocsSetBuilder, cache, indexReader);
                             }
                             if (openQuery != null) {
                                 QueryAndSort queryAndSort = openQuery.getLuceneQueryAndSort(contextImpl);
-                                matchingDocs = filterDocIdSet(queryAndSort.query, matchingDocs, cache, indexReader);
+                                matchingDocsSetBuilder = filterDocIdSet(queryAndSort.query, matchingDocsSetBuilder, cache, indexReader);
                             }
 
-                            Filter filterToApply = new DocIdSetFilter(matchingDocs);
+                            Filter filterToApply = new DocIdSetFilter(matchingDocsSetBuilder.toBitSet());
                             // set query to MatchAllDocsQuery because we have everything as filter now
                             query = new MatchAllDocsQuery();
                             tfDocs = searcher.search(query, filterToApply, fetchTotal, sort);
@@ -659,7 +679,7 @@
     }
 
     private void populateFacetValueCountMap(String propertyName, ParsedFacet parsedFacet,
-            Map<String, Count> facetValueCountMap, SetDocIdSet matchingDocs, IndexReader indexReader) throws IOException {
+            Map<String, Count> facetValueCountMap, OpenBitSet matchingDocs, IndexReader indexReader) throws IOException {
 
         long start = 0;
         if(log.isDebugEnabled()) {
@@ -691,7 +711,7 @@
 
                         if (rangeFields.begin == null && rangeFields.end == null) {
                             // short cut: begin and end are open, thus all hits apply. Therefor this short cut is possible
-                            counter.count = matchingDocs.cardinality();
+                            counter.count = (int) matchingDocs.cardinality();
                         } else {
                             TermEnum termEnum = indexReader.terms(new Term(rangeFields.internalFacetName,
                                     rangeFields.begin == null ? "" : rangeFields.begin));
@@ -705,7 +725,7 @@
                                         }
                                         termDocs.seek(term);
                                         while (termDocs.next()) {
-                                            if (matchingDocs.contains(termDocs.doc())) {
+                                            if (matchingDocs.get(termDocs.doc())) {
                                                 counter.count++;
                                             }
                                         }
@@ -746,7 +766,7 @@
 
                             termDocs.seek(term);
                             while (termDocs.next()) {
-                                if (matchingDocs.contains(termDocs.doc())) {
+                                if (matchingDocs.get(termDocs.doc())) {
                                     count++;
                                 }
                             }
@@ -776,10 +796,7 @@
         }
     }
 
-    private SetDocIdSet filterDocIdSet(org.apache.lucene.search.Query query, SetDocIdSet docIdSet, FacetedEngineCache cache, IndexReader indexReader) throws IOException {
-        if (docIdSet != null && docIdSet.cardinality() == 0) {
-            return docIdSet;
-        }
+    private SetDocIdSetBuilder filterDocIdSet(org.apache.lucene.search.Query query, SetDocIdSetBuilder docIdSet, FacetedEngineCache cache, IndexReader indexReader) throws IOException {
         if (!(query instanceof BooleanQuery) || ((BooleanQuery)query).clauses().size() > 0) {
             String key = query.toString();
             DocIdSet queryDocIdSet = cache.getDocIdSet(key);
@@ -789,10 +806,9 @@
                 cache.putDocIdSet(key, queryDocIdSet);
             }
             if (docIdSet == null) {
-                docIdSet = new SetDocIdSet(queryDocIdSet);
-            } else {
-                docIdSet = docIdSet.and(queryDocIdSet);
+                docIdSet = new SetDocIdSetBuilder();
             }
+            docIdSet.add(queryDocIdSet);
         }
         return docIdSet;
     }
@@ -814,91 +830,6 @@
         }
     }
 
-    private static class SetDocIdSet extends DocIdSet {
 
-        private final TreeSet<Integer> docIds = new TreeSet<Integer>();
-
-        private SetDocIdSet(DocIdSet docIdSet) throws IOException {
-            final DocIdSetIterator iterator = docIdSet.iterator();
-            if (iterator != null) {
-                int doc;
-                while ((doc = iterator.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
-                    docIds.add(doc);
-                }
-            }
-        }
-
-        @Override
-        public DocIdSetIterator iterator() {
-
-            return new DocIdSetIterator() {
-
-                private final Iterator<Integer> docIdsIterator = docIds.iterator();
-                private int currentDocId = -1;
-
-                @Override
-                public int docID() {
-                    return currentDocId;
-                }
-
-                @Override
-                public int nextDoc() throws IOException {
-                    if (docIdsIterator.hasNext()) {
-                        currentDocId = docIdsIterator.next();
-                    } else {
-                        currentDocId = NO_MORE_DOCS;
-                    }
-                    return currentDocId;
-                }
-
-                @Override
-                public int advance(final int target) throws IOException {
-                    while (currentDocId < target && nextDoc() != NO_MORE_DOCS) {}
-                    return currentDocId;
-                }
-            };
-        }
-
-        private int cardinality() {
-            return docIds.size();
-        }
-
-        private SetDocIdSet and(final DocIdSet filter) throws IOException {
-            final DocIdSetIterator filterIter = filter.iterator();
-            if (filterIter == null) {
-                docIds.clear();
-            }
-            final Iterator<Integer> thisIter = docIds.iterator();
-            int filterId = -1;
-            while (thisIter.hasNext()) {
-                final int docId = thisIter.next();
-                if (filterId < docId) {
-                    filterId = filterIter.advance(docId);
-                }
-                if (filterId > docId) {
-                    thisIter.remove();
-                }
-            }
-            return this;
-        }
-
-        private boolean contains(Integer doc) {
-            return docIds.contains(doc);
-        }
-
-        @Override
-        public int hashCode() {
-            return docIds.hashCode();
-        }
-
-        @Override
-        public boolean equals(final Object obj) {
-            if (obj instanceof SetDocIdSet) {
-                SetDocIdSet other = (SetDocIdSet) obj;
-                return other.docIds.equals(docIds);
-            }
-            return false;
-        }
-    }
 
 }
