Advertisement
Guest User

ToParentBlockJoinQuery_bug

a guest
Jul 2nd, 2019
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.49 KB | None | 0 0
  1. import static org.junit.jupiter.api.Assertions.assertEquals;
  2. import static org.junit.jupiter.api.Assertions.assertFalse;
  3. import static org.junit.jupiter.api.Assertions.assertTrue;
  4.  
  5. import java.io.IOException;
  6. import java.nio.file.Path;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import java.util.Set;
  10. import java.util.TreeSet;
  11.  
  12. import org.apache.lucene.analysis.Analyzer;
  13. import org.apache.lucene.analysis.TokenFilter;
  14. import org.apache.lucene.analysis.TokenStream;
  15. import org.apache.lucene.analysis.core.WhitespaceTokenizer;
  16. import org.apache.lucene.document.BinaryDocValuesField;
  17. import org.apache.lucene.document.Field;
  18. import org.apache.lucene.document.StringField;
  19. import org.apache.lucene.index.BinaryDocValues;
  20. import org.apache.lucene.index.IndexWriter;
  21. import org.apache.lucene.index.IndexWriterConfig;
  22. import org.apache.lucene.index.KeepOnlyLastCommitDeletionPolicy;
  23. import org.apache.lucene.index.LeafReaderContext;
  24. import org.apache.lucene.index.SnapshotDeletionPolicy;
  25. import org.apache.lucene.index.Term;
  26. import org.apache.lucene.search.Collector;
  27. import org.apache.lucene.search.IndexSearcher;
  28. import org.apache.lucene.search.LeafCollector;
  29. import org.apache.lucene.search.Query;
  30. import org.apache.lucene.search.Scorable;
  31. import org.apache.lucene.search.SearcherManager;
  32. import org.apache.lucene.search.TermInSetQuery;
  33. import org.apache.lucene.search.TermQuery;
  34. import org.apache.lucene.search.WildcardQuery;
  35. import org.apache.lucene.search.join.BitSetProducer;
  36. import org.apache.lucene.search.join.QueryBitSetProducer;
  37. import org.apache.lucene.search.join.ScoreMode;
  38. import org.apache.lucene.search.join.ToParentBlockJoinQuery;
  39. import org.apache.lucene.store.FSDirectory;
  40. import org.apache.lucene.util.BytesRef;
  41. import org.junit.Rule;
  42. import org.junit.jupiter.api.AfterAll;
  43. import org.junit.jupiter.api.AfterEach;
  44. import org.junit.jupiter.api.BeforeAll;
  45. import org.junit.jupiter.api.BeforeEach;
  46. import org.junit.jupiter.api.Test;
  47. import org.junit.rules.TemporaryFolder;
  48.  
  49.  
  50. class ParentChildTest {
  51.  
  52.     @Rule
  53.     public TemporaryFolder dir = new TemporaryFolder();
  54.  
  55.     SearcherManager manager = null;
  56.     IndexSearcher searcher = null;
  57.  
  58.  
  59.     @BeforeAll
  60.     static void setUpBeforeClass() throws Exception {
  61.     }
  62.  
  63.     @AfterAll
  64.     static void tearDownAfterClass() throws Exception {
  65.     }
  66.  
  67.     @BeforeEach
  68.     void setUp() throws Exception {
  69.         if (manager == null) {
  70.             IndexWriterConfig config = new IndexWriterConfig(analyzer);
  71.             config.setIndexDeletionPolicy(new SnapshotDeletionPolicy(new KeepOnlyLastCommitDeletionPolicy()));
  72.             config.setCommitOnClose(true);
  73.             dir.create();
  74.             Path path = dir.newFolder().toPath();
  75.             try (IndexWriter indexWriter = new IndexWriter(FSDirectory.open(path), config)) {
  76.                 for (int i = 0; i < 6; i++) {
  77.                     List<org.apache.lucene.document.Document> docs = new ArrayList<>();
  78.                     org.apache.lucene.document.Document parent = new org.apache.lucene.document.Document();
  79.                     String id = String.format("id%05d", i);
  80.                     parent.add(new StringField("id", id, Field.Store.YES));
  81.                     parent.add(new BinaryDocValuesField("idBinary", new BytesRef(id)));
  82.                     switch (i % 3) {
  83.                     case 2: {
  84.                         org.apache.lucene.document.Document doc = new org.apache.lucene.document.Document();
  85.                         doc.add(new StringField("program", "P2", Field.Store.YES));
  86.                         docs.add(doc);
  87.                     }
  88.                         //$FALL-THROUGH$
  89.                     case 1: {
  90.                         org.apache.lucene.document.Document doc = new org.apache.lucene.document.Document();
  91.                         doc.add(new StringField("program", "P1", Field.Store.YES));
  92.                         docs.add(doc);
  93.                     }
  94.                         //$FALL-THROUGH$
  95.                     default:
  96.                         break;
  97.                     }
  98.                     docs.add(parent);
  99.                     indexWriter.updateDocuments(new Term("id", id), docs);
  100.                 }
  101.                 indexWriter.commit();
  102.             }
  103.             manager = new SearcherManager(FSDirectory.open(path), null);
  104.         }
  105.         searcher = manager.acquire();
  106.     }
  107.  
  108.     @AfterEach
  109.     void tearDown() throws Exception {
  110.         if (searcher != null) {
  111.             manager.release(searcher);
  112.         }
  113.     }
  114.  
  115.     Set<BytesRef> toSet(String ... val) {
  116.         Set<BytesRef> filter = new TreeSet<BytesRef>();
  117.         for (String v : val) {
  118.             filter.add(new BytesRef(v));
  119.         }
  120.         return filter;
  121.     }
  122.    
  123.     @Test
  124.     void testParentChild() throws IOException {
  125.         SimpleCollector collector = new SimpleCollector();
  126.         BitSetProducer parentSet = new QueryBitSetProducer(new TermInSetQuery("id", toSet("id00000", "id00001", "id00002", "id00003", "id00004", "id00005")));
  127.         Query q = new ToParentBlockJoinQuery(new TermInSetQuery("program", toSet("P1", "P2")), parentSet, ScoreMode.None);
  128.         searcher.search(q, collector);
  129.         assertEquals(4, collector.results.size());
  130.         assertFalse(collector.results.contains("id00000"), collector.results.toString());
  131.         assertFalse(collector.results.contains("id00003"), collector.results.toString());
  132.     }
  133.    
  134.     @Test
  135.     void testParentChildWildcard() throws IOException {
  136.         SimpleCollector collector = new SimpleCollector();
  137.         BitSetProducer parentSet = new QueryBitSetProducer(new WildcardQuery(new Term("id", "*")));
  138.         Query q = new ToParentBlockJoinQuery(new WildcardQuery(new Term("program", "*")), parentSet, ScoreMode.None);
  139.         searcher.search(q, collector);
  140.         assertFalse(collector.results.contains("id00000"), collector.results.toString());
  141.         assertFalse(collector.results.contains("id00003"), collector.results.toString());
  142.         assertEquals(4, collector.results.size());
  143.     }
  144.  
  145.     @Test
  146.     void testChildWildcardMatch() throws IOException {
  147.         SimpleCollector collector = new SimpleCollector();
  148.         BitSetProducer parentSet = new QueryBitSetProducer(new TermInSetQuery("id", toSet("id00000", "id00001", "id00002", "id00003", "id00004", "id00005")));
  149.         Query q = new ToParentBlockJoinQuery(new WildcardQuery(new Term("program", "*")), parentSet, ScoreMode.None);
  150.         searcher.search(q, collector);
  151.         assertEquals(4, collector.results.size());
  152.         assertFalse(collector.results.contains("id00000"), collector.results.toString());
  153.         assertFalse(collector.results.contains("id00003"), collector.results.toString());
  154.     }
  155.  
  156.  
  157.     @Test
  158.     void testChildWildcardNoMatch() throws IOException {
  159.         SimpleCollector collector = new SimpleCollector();
  160.         BitSetProducer parentSet = new QueryBitSetProducer(new TermInSetQuery("id", toSet("id00000", "id00001", "id00003")));
  161.         Query q = new ToParentBlockJoinQuery(new WildcardQuery(new Term("program", "*")), parentSet, org.apache.lucene.search.join.ScoreMode.None);
  162.         searcher.search(q, collector);
  163.         //assertEquals(1, collector.results.size());
  164.         assertFalse(collector.results.contains("id00000"), collector.results.toString());
  165.         assertTrue(collector.results.contains("id00001"), collector.results.toString());
  166.         assertFalse(collector.results.contains("id00003"), collector.results.toString());
  167.     }
  168.  
  169.     @Test
  170.     void testChildWildcardNoMatch2() throws IOException {
  171.         SimpleCollector collector = new SimpleCollector();
  172.         BitSetProducer parentSet = new QueryBitSetProducer(new TermQuery(new Term("id", "id00003")));
  173.         Query q = new ToParentBlockJoinQuery(new WildcardQuery(new Term("program", "*")), parentSet, org.apache.lucene.search.join.ScoreMode.None);
  174.         searcher.search(q, collector);
  175.         //assertEquals(1, collector.results.size());
  176.         assertFalse(collector.results.contains("id00003"), collector.results.toString());
  177.     }
  178.  
  179.     @Test
  180.     void testChildWildcardMatch2() throws IOException {
  181.         SimpleCollector collector = new SimpleCollector();
  182.         BitSetProducer parentSet = new QueryBitSetProducer(new TermInSetQuery("id", toSet( "id00003", "id00002")));
  183.         Query q = new ToParentBlockJoinQuery(new WildcardQuery(new Term("program", "*")), parentSet, org.apache.lucene.search.join.ScoreMode.None);
  184.         searcher.search(q, collector);
  185.         assertEquals(1, collector.results.size());
  186.         assertFalse(collector.results.contains("id00003"), collector.results.toString());
  187.         assertTrue(collector.results.contains("id00002"), collector.results.toString());
  188.     }
  189.  
  190.     @Test
  191.     void testChildQueryOnly() throws IOException {
  192.         //assertEquals(4, searcher.count(new WildcardQuery(new Term("program", "*"))));
  193.         //assertEquals(4, searcher.count(new TermRangeQuery("program", new BytesRef("*"), new BytesRef("*"), true, true)));
  194.         assertEquals(4, searcher.count(new TermQuery(new Term("program", "P1"))));
  195.         assertEquals(2, searcher.count(new TermQuery(new Term("program", "P2"))));
  196.     }
  197.  
  198.     static class SimpleCollector implements Collector, LeafCollector {
  199.         BinaryDocValues ids = null;
  200.         Set<String> results = new TreeSet<>();
  201.        
  202.        
  203.         @Override
  204.         public void collect(int arg0) throws IOException {
  205.             this.ids.advanceExact(arg0);
  206.             results.add(this.ids.binaryValue().utf8ToString());
  207.         }
  208.  
  209.         @Override
  210.         public void setScorer(Scorable arg0) throws IOException {
  211.         }
  212.  
  213.         @Override
  214.         public LeafCollector getLeafCollector(LeafReaderContext leafContext) throws IOException {
  215.             this.ids = leafContext.reader().getBinaryDocValues("idBinary");
  216.             return this;
  217.         }
  218.  
  219.         @Override
  220.         public org.apache.lucene.search.ScoreMode scoreMode() {
  221.             return org.apache.lucene.search.ScoreMode.COMPLETE_NO_SCORES;
  222.         }
  223.        
  224.     }
  225.    
  226.     private static Analyzer analyzer = new Analyzer() {
  227.  
  228.         class StandardFilter extends TokenFilter {
  229.  
  230.             /** Sole constructor */
  231.             public StandardFilter(TokenStream in) {
  232.                 super(in);
  233.             }
  234.  
  235.             @Override
  236.             public final boolean incrementToken() throws IOException {
  237.                 return input.incrementToken(); // TODO: add some niceties for the new grammar
  238.             }
  239.         }
  240.  
  241.         @Override
  242.         protected TokenStreamComponents createComponents(final String fieldName) {
  243.             final WhitespaceTokenizer src = new WhitespaceTokenizer();
  244.             return new TokenStreamComponents(src, new StandardFilter(src));
  245.         }
  246.     };
  247. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement