blob: 0059ee2d2be1e951fd36d5bf52efe5454a8e7302 [file] [log] [blame]
Index: lucene/join/src/java/org/apache/lucene/search/join/JoinUtil.java
===================================================================
--- lucene/join/src/java/org/apache/lucene/search/join/JoinUtil.java (revision 1716343)
+++ lucene/join/src/java/org/apache/lucene/search/join/JoinUtil.java (working copy)
@@ -76,7 +76,7 @@
case None:
TermsCollector termsCollector = TermsCollector.create(fromField, multipleValuesPerDocument);
fromSearcher.search(fromQuery, termsCollector);
- return new TermsQuery(toField, fromQuery, termsCollector.getCollectorTerms());
+ return new TermsQuery(toField, fromQuery, termsCollector.getCollectorTerms());
case Total:
case Max:
case Min:
Index: lucene/join/src/java/org/apache/lucene/search/join/TermsCollector.java
===================================================================
--- lucene/join/src/java/org/apache/lucene/search/join/TermsCollector.java (revision 1716343)
+++ lucene/join/src/java/org/apache/lucene/search/join/TermsCollector.java (working copy)
@@ -20,12 +20,18 @@
import java.io.IOException;
import org.apache.lucene.index.LeafReaderContext;
+import org.apache.lucene.index.NumericDocValues;
import org.apache.lucene.index.BinaryDocValues;
import org.apache.lucene.index.DocValues;
+import org.apache.lucene.index.DocValuesType;
+import org.apache.lucene.index.FieldInfo;
+import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.SortedSetDocValues;
import org.apache.lucene.search.SimpleCollector;
import org.apache.lucene.util.BytesRef;
+import org.apache.lucene.util.BytesRefBuilder;
import org.apache.lucene.util.BytesRefHash;
+import org.apache.lucene.util.NumericUtils;
/**
* A collector that collects all terms from a specified field matching the query.
@@ -86,20 +92,38 @@
final BytesRef spare = new BytesRef();
private BinaryDocValues fromDocTerms;
-
+ private NumericDocValues fromDocTermsNum;
SV(String field) {
super(field);
}
@Override
public void collect(int doc) throws IOException {
+ if(fromDocTermsNum!= null) {
+ collectorTerms.add(getTermFromNum (fromDocTermsNum.get(doc)));
+ } else {
final BytesRef term = fromDocTerms.get(doc);
- collectorTerms.add(term);
+ collectorTerms.add(term);
+ }
+ fromDocTerms = null; fromDocTermsNum = null;
}
+ private BytesRef getTermFromNum(long l) {
+ int i = (int)l;
+ BytesRefBuilder bytes = new BytesRefBuilder();
+ NumericUtils.intToPrefixCoded(i, 0, bytes);
+ return bytes.get();
+ }
+
@Override
protected void doSetNextReader(LeafReaderContext context) throws IOException {
- fromDocTerms = DocValues.getBinary(context.reader(), field);
+ LeafReader reader = context.reader();
+ FieldInfo info = reader.getFieldInfos().fieldInfo(field);
+ if(info != null && DocValuesType.NUMERIC == info.getDocValuesType()) {
+ fromDocTermsNum = DocValues.getNumeric(reader, field);
+ } else {
+ fromDocTerms = DocValues.getBinary(reader, field);
+ }
}
}
Index: lucene/join/src/java/org/apache/lucene/search/join/TermsQuery.java
===================================================================
--- lucene/join/src/java/org/apache/lucene/search/join/TermsQuery.java (revision 1716343)
+++ lucene/join/src/java/org/apache/lucene/search/join/TermsQuery.java (working copy)
@@ -28,6 +28,7 @@
import java.io.IOException;
import java.util.Comparator;
+import java.util.List;
/**
* A query that has an array of terms from a specific field. This query will match documents have one or more terms in
Index: lucene/join/src/test/org/apache/lucene/search/join/TestJoinUtilInt.java
===================================================================
--- lucene/join/src/test/org/apache/lucene/search/join/TestJoinUtilInt.java (revision 0)
+++ lucene/join/src/test/org/apache/lucene/search/join/TestJoinUtilInt.java (working copy)
@@ -0,0 +1,188 @@
+package org.apache.lucene.search.join;
+
+import com.carrotsearch.randomizedtesting.generators.RandomInts;
+import com.carrotsearch.randomizedtesting.generators.RandomPicks;
+
+import org.apache.lucene.analysis.MockAnalyzer;
+import org.apache.lucene.analysis.MockTokenizer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.document.FieldType;
+import org.apache.lucene.document.IntField;
+import org.apache.lucene.document.NumericDocValuesField;
+import org.apache.lucene.document.SortedDocValuesField;
+import org.apache.lucene.document.SortedSetDocValuesField;
+import org.apache.lucene.document.StringField;
+import org.apache.lucene.document.TextField;
+import org.apache.lucene.index.BinaryDocValues;
+import org.apache.lucene.index.DirectoryReader;
+import org.apache.lucene.index.DocValues;
+import org.apache.lucene.index.DocValuesType;
+import org.apache.lucene.index.IndexOptions;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.LeafReader;
+import org.apache.lucene.index.LeafReaderContext;
+import org.apache.lucene.index.MultiDocValues;
+import org.apache.lucene.index.MultiDocValues.OrdinalMap;
+import org.apache.lucene.index.MultiFields;
+import org.apache.lucene.index.NoMergePolicy;
+import org.apache.lucene.index.NumericDocValues;
+import org.apache.lucene.index.PostingsEnum;
+import org.apache.lucene.index.RandomIndexWriter;
+import org.apache.lucene.index.SlowCompositeReaderWrapper;
+import org.apache.lucene.index.SortedDocValues;
+import org.apache.lucene.index.SortedSetDocValues;
+import org.apache.lucene.index.StorableField;
+import org.apache.lucene.index.StoredDocument;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.index.Terms;
+import org.apache.lucene.index.TermsEnum;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.DocIdSetIterator;
+import org.apache.lucene.search.Explanation;
+import org.apache.lucene.search.FieldValueQuery;
+import org.apache.lucene.search.FilterScorer;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.MatchAllDocsQuery;
+import org.apache.lucene.search.MatchNoDocsQuery;
+import org.apache.lucene.search.MultiCollector;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.ScoreDoc;
+import org.apache.lucene.search.Scorer;
+import org.apache.lucene.search.SimpleCollector;
+import org.apache.lucene.search.TermQuery;
+import org.apache.lucene.search.TopDocs;
+import org.apache.lucene.search.TopScoreDocCollector;
+import org.apache.lucene.search.TotalHitCountCollector;
+import org.apache.lucene.search.Weight;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.BitSet;
+import org.apache.lucene.util.BitSetIterator;
+import org.apache.lucene.util.Bits;
+import org.apache.lucene.util.BytesRef;
+import org.apache.lucene.util.FixedBitSet;
+import org.apache.lucene.util.LuceneTestCase;
+import org.apache.lucene.util.TestUtil;
+import org.apache.lucene.util.packed.PackedInts;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+public class TestJoinUtilInt extends LuceneTestCase {
+ private static final FieldType INT_FIELD_TYPE_STORED_SORTED = new FieldType();
+ static {
+ INT_FIELD_TYPE_STORED_SORTED.setTokenized(true);
+ INT_FIELD_TYPE_STORED_SORTED.setOmitNorms(true);
+ INT_FIELD_TYPE_STORED_SORTED.setIndexOptions(IndexOptions.DOCS);
+ INT_FIELD_TYPE_STORED_SORTED
+ .setNumericType(FieldType.NumericType.INT);
+ INT_FIELD_TYPE_STORED_SORTED.setStored(true);
+ INT_FIELD_TYPE_STORED_SORTED.setDocValuesType(DocValuesType.NUMERIC);
+ INT_FIELD_TYPE_STORED_SORTED.freeze();
+ }
+
+ public void testSimpleInt() throws Exception {
+ final String idField = "id";
+ final String toField = "productId";
+ final String productGroup = "productGroup";
+ Directory dir = newDirectory();
+ RandomIndexWriter w = new RandomIndexWriter(
+ random(),
+ dir,
+ newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(newLogMergePolicy()));
+
+ // 0
+ Document doc = new Document();
+ doc.add(new TextField("description", "random text", Field.Store.NO));
+ doc.add(new TextField("name", "name1", Field.Store.NO));
+ doc.add(new IntField(productGroup, 1, INT_FIELD_TYPE_STORED_SORTED));
+ doc.add(new TextField(idField, "1", Field.Store.NO));
+// doc.add(new SortedDocValuesField(idField, new BytesRef("1")));
+ w.addDocument(doc);
+
+ // 1
+ doc = new Document();
+ doc.add(new TextField("price", "10.0", Field.Store.NO));
+ doc.add(new TextField(idField, "2", Field.Store.NO));
+ doc.add(new SortedDocValuesField(idField, new BytesRef("2")));
+ doc.add(new IntField(toField, 1, INT_FIELD_TYPE_STORED_SORTED));
+// doc.add(new SortedDocValuesField(toField, new BytesRef("1")));
+ w.addDocument(doc);
+
+ // 2
+ doc = new Document();
+ doc.add(new TextField("price", "20.0", Field.Store.NO));
+ doc.add(new TextField(idField, "3", Field.Store.NO));
+ doc.add(new SortedDocValuesField(idField, new BytesRef("3")));
+ doc.add(new IntField(toField, 1, INT_FIELD_TYPE_STORED_SORTED));
+// doc.add(new SortedDocValuesField(toField, new BytesRef("1")));
+ w.addDocument(doc);
+
+ // 3
+ doc = new Document();
+ doc.add(new TextField("description", "more random text", Field.Store.NO));
+ doc.add(new TextField("name", "name2", Field.Store.NO));
+ doc.add(new IntField(productGroup, 4, INT_FIELD_TYPE_STORED_SORTED));
+ doc.add(new TextField(idField, "4", Field.Store.NO));
+// doc.add(new SortedDocValuesField(idField, new BytesRef("4")));
+ w.addDocument(doc);
+ w.commit();
+
+ // 4
+ doc = new Document();
+ doc.add(new TextField("price", "10.0", Field.Store.YES));
+ doc.add(new TextField(idField, "5", Field.Store.YES));
+ doc.add(new SortedDocValuesField(idField, new BytesRef("5")));
+ doc.add(new IntField(toField, 4, INT_FIELD_TYPE_STORED_SORTED));
+// doc.add(new SortedDocValuesField(toField, new BytesRef("4")));
+ w.addDocument(doc);
+
+ // 5
+ doc = new Document();
+ doc.add(new TextField("price", "20.0", Field.Store.YES));
+ doc.add(new TextField(idField, "6", Field.Store.YES));
+ doc.add(new SortedDocValuesField(idField, new BytesRef("6")));
+ doc.add(new IntField(toField, 4, INT_FIELD_TYPE_STORED_SORTED));
+// doc.add(new SortedDocValuesField(toField, new BytesRef("4")));
+ w.addDocument(doc);
+
+ IndexSearcher indexSearcher = new IndexSearcher(w.getReader());
+ w.close();
+
+ // Search for product
+ Query joinQuery =
+ JoinUtil.createJoinQuery(productGroup, false, toField, new TermQuery(new Term("name", "name2")), indexSearcher, ScoreMode.None);
+
+ TopDocs result = indexSearcher.search(joinQuery, 10);
+ assertEquals(2, result.totalHits);
+ assertEquals(4, result.scoreDocs[0].doc);
+ assertEquals(5, result.scoreDocs[1].doc);
+
+ joinQuery = JoinUtil.createJoinQuery(productGroup, false, toField, new TermQuery(new Term("name", "name1")), indexSearcher, ScoreMode.None);
+ result = indexSearcher.search(joinQuery, 10);
+ assertEquals(2, result.totalHits);
+ assertEquals(1, result.scoreDocs[0].doc);
+ assertEquals(2, result.scoreDocs[1].doc);
+
+ // Search for offer
+ joinQuery = JoinUtil.createJoinQuery(toField, false, productGroup, new TermQuery(new Term("id", "5")), indexSearcher, ScoreMode.None);
+ result = indexSearcher.search(joinQuery, 10);
+ assertEquals(1, result.totalHits);
+ assertEquals(3, result.scoreDocs[0].doc);
+
+ indexSearcher.getIndexReader().close();
+ dir.close();
+ }
+
+}