@Test public void testSpanNot() throws Exception { this.addDocuments(this.generateDocuments(2000)); NodeSpanQuery term1 = new NodeSpanQuery(ntq("eight").getQuery()); NodeSpanQuery term2 = new NodeSpanQuery(ntq("one").getQuery()); NearSpanQuery near = new NearSpanQuery(new SpanQuery[]{term1, term2}, 4, true); NodeSpanQuery term3 = new NodeSpanQuery(ntq("forty").getQuery()); SpanQuery query = new NotSpanQuery(near, term3); checkHits(query, new int[]{801, 821, 831, 851, 861, 871, 881, 891, 1801, 1821, 1831, 1851, 1861, 1871, 1881, 1891}); }
@Override public Query rewrite(final IndexReader reader) throws IOException { NodeSpanQuery clone = null; NodeQuery rewritten = (NodeQuery) this.query.rewrite(reader); if (rewritten != this.query) { clone = this.clone(); // transfer constraints rewritten.setNodeConstraint(lowerBound, upperBound); rewritten.setLevelConstraint(levelConstraint); // transfer ancestor pointer rewritten.setAncestorPointer(ancestor); clone.query = rewritten; } if (clone != null) { return clone; // some clauses rewrote } else { return this; // no clauses rewrote } }
@Test public void testSetAncestorPointer() { NodeSpanQuery term1 = new NodeSpanQuery(ntq("aaa").getQuery()); final TwigQuery twig = new TwigQuery(); term1.setAncestorPointer(twig); assertSame(twig, term1.getAncestorPointer()); // inner query must have been updated assertSame(twig, term1.getQuery().getAncestorPointer()); }
@Test public void testSetLevelConstraint() { NodeSpanQuery term1 = new NodeSpanQuery(ntq("aaa").getQuery()); term1.setLevelConstraint(3); assertEquals(3, term1.getLevelConstraint()); // Level constraint must have been transferred to the inner query assertEquals(3, term1.getQuery().getLevelConstraint()); }
@Test public void testEquality() throws Exception { NodeSpanQuery term1 = new NodeSpanQuery(ntq("aaa").getQuery()); NodeSpanQuery term2 = new NodeSpanQuery(ntq("aaa").getQuery()); assertEquals(term1, term2); NodeSpanQuery term3 = new NodeSpanQuery(ntq("aaa").getQuery()); term3.setLevelConstraint(3); assertNotEquals(term1, term3); NodeSpanQuery term4 = new NodeSpanQuery(ntq("aaa").getQuery()); term4.setNodeConstraint(5); assertNotEquals(term1, term4); }
@Test public void testSetAncestorPointer() { NodeSpanQuery term1 = new NodeSpanQuery(ntq("aaa").getQuery()); NodeSpanQuery term2 = new NodeSpanQuery(ntq("bbb").getQuery()); OrSpanQuery or1 = new OrSpanQuery(new SpanQuery[] {term1, term2}); final TwigQuery twig = new TwigQuery(); or1.setAncestorPointer(twig); assertSame(twig, or1.getAncestorPointer()); // clauses must have been updated assertSame(twig, term1.getAncestorPointer()); NodeSpanQuery term3 = new NodeSpanQuery(ntq("aaa").getQuery()); or1.addClause(term3); // new clause must have been updated assertSame(twig, term3.getAncestorPointer()); }
@Test public void testLevelAndNodeConstraintPropagation() throws IOException { final TwigQuery tq1 = new TwigQuery(2); tq1.addDescendant(2, new NodeTermQuery(new Term("field", "aaa")), NodeBooleanClause.Occur.MUST); tq1.setNodeConstraint(1,2); final TwigQuery tq2 = new TwigQuery(2); tq2.addChild(new NodeTermQuery(new Term("field", "bbb")), NodeBooleanClause.Occur.MUST); final BooleanSpanQuery bsq1 = new BooleanSpanQuery(0, true); bsq1.add(new NodeSpanQuery(tq1), NodeBooleanClause.Occur.MUST); bsq1.add(new NodeSpanQuery(tq2), NodeBooleanClause.Occur.MUST); // Level constraints applied on the twig must not be modified assertEquals(2, tq1.getLevelConstraint()); assertEquals(4, tq1.clauses().get(0).getQuery().getLevelConstraint()); assertEquals(2, tq2.getLevelConstraint()); assertEquals(3, tq2.clauses().get(0).getQuery().getLevelConstraint()); // Node constraints applied on the twig must not be modified assertEquals(1, tq1.getNodeConstraint()[0]); assertEquals(2, tq1.getNodeConstraint()[1]); // Constraints should not be modified after a rewrite final BooleanSpanQuery rewritten = (BooleanSpanQuery) bsq1.rewrite(reader); NodeSpanQuery nodeSpanQuery = (NodeSpanQuery) rewritten.getClauses()[0].getQuery(); assertEquals(2, nodeSpanQuery.getQuery().getLevelConstraint()); assertEquals(1, nodeSpanQuery.getQuery().getNodeConstraint()[0]); assertEquals(2, nodeSpanQuery.getQuery().getNodeConstraint()[1]); nodeSpanQuery = (NodeSpanQuery) rewritten.getClauses()[1].getQuery(); assertEquals(2, nodeSpanQuery.getQuery().getLevelConstraint()); }
@Override public boolean equals(final Object o) { if (!(o instanceof NodeSpanQuery)) return false; final NodeSpanQuery other = (NodeSpanQuery) o; return (this.getBoost() == other.getBoost()) && this.query.equals(other.query) && this.levelConstraint == other.levelConstraint && this.lowerBound == other.lowerBound && this.upperBound == other.upperBound; }
@Test public void testSetAncestorPointer() { NodeSpanQuery term1 = new NodeSpanQuery(ntq("aaa").getQuery()); NodeSpanQuery term2 = new NodeSpanQuery(ntq("bbb").getQuery()); final NearSpanQuery nsq1 = new NearSpanQuery(new SpanQuery[] {term1, term2}, 0, true); final TwigQuery twig = new TwigQuery(); nsq1.setAncestorPointer(twig); assertSame(twig, nsq1.getAncestorPointer()); // clauses must have been updated assertSame(twig, term1.getAncestorPointer()); }
@Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + Float.floatToIntBits(this.getBoost()); result = prime * result + query.hashCode(); result = prime * result + lowerBound; result = prime * result + upperBound; result = prime * result + levelConstraint; return result; }
private BooleanSpanQuery toBooleanSpanQuery() throws QueryNodeException { int slop = this.hasSlop() ? this.getSlop() : BooleanQueryNodeBuilder.DEFAULT_SLOP; boolean inOrder = this.hasInOrder() ? this.getInOrder() : BooleanQueryNodeBuilder.DEFAULT_INORDER; final BooleanSpanQuery query = new BooleanSpanQuery(slop, inOrder); // convert clauses for (final QueryClause clause : clauses) { final SpanQuery q = new NodeSpanQuery((com.sindicetech.siren.search.node.NodeQuery) clause.getQuery().toQuery(false)); query.add(q, clause.getNodeBooleanOccur()); } return query; }
@Test public void testSetAncestorPointer() { NodeSpanQuery term1 = new NodeSpanQuery(ntq("aaa").getQuery()); final PositionRangeSpanQuery prsq1 = new PositionRangeSpanQuery(term1, 3, 4); final TwigQuery twig = new TwigQuery(); prsq1.setAncestorPointer(twig); assertSame(twig, prsq1.getAncestorPointer()); // clauses must have been updated assertSame(twig, term1.getAncestorPointer()); }
@Test public void testSpanExactNested() throws Exception { this.addDocuments(this.generateDocuments(2000)); NodeSpanQuery term1 = new NodeSpanQuery(ntq("three").getQuery()); NodeSpanQuery term2 = new NodeSpanQuery(ntq("hundred").getQuery()); NearSpanQuery near1 = new NearSpanQuery(new NodeSpanQuery[] {term1, term2}, 0, true); NodeSpanQuery term3 = new NodeSpanQuery(ntq("thirty").getQuery()); NodeSpanQuery term4 = new NodeSpanQuery(ntq("three").getQuery()); NearSpanQuery near2 = new NearSpanQuery(new NodeSpanQuery[] {term3, term4}, 0, true); NearSpanQuery query = new NearSpanQuery(new SpanQuery[] {near1, near2}, 0, true); checkHits(query, new int[] {333, 1333}); // assertTrue(searcher.explain(query, 333).getValue() > 0.0f); }
@Test public void testSetAncestorPointer() { NodeSpanQuery term1 = new NodeSpanQuery(ntq("aaa").getQuery()); NodeSpanQuery term2 = new NodeSpanQuery(ntq("bbb").getQuery()); final BooleanSpanQuery bsq1 = new BooleanSpanQuery(0, true); bsq1.add(term1, NodeBooleanClause.Occur.MUST); bsq1.add(term2, NodeBooleanClause.Occur.MUST); final TwigQuery twig = new TwigQuery(); bsq1.setAncestorPointer(twig); assertSame(twig, bsq1.getAncestorPointer()); // clauses must have been updated assertSame(twig, term1.getAncestorPointer()); }
@Test public void testSpanNearOrdered() throws Exception { this.addDocuments(this.generateDocuments(1000)); NodeSpanQuery term1 = new NodeSpanQuery(ntq("nine").getQuery()); NodeSpanQuery term2 = new NodeSpanQuery(ntq("six").getQuery()); NearSpanQuery query = new NearSpanQuery(new NodeSpanQuery[] {term1, term2}, 4, true); checkHits(query, 906, 926, 936, 946, 956, 966, 976, 986, 996); }
@Test public void testSpanNearUnordered() throws Exception { this.addDocuments(this.generateDocuments(1000)); NodeSpanQuery term1 = new NodeSpanQuery(ntq("nine").getQuery()); NodeSpanQuery term2 = new NodeSpanQuery(ntq("six").getQuery()); NearSpanQuery query = new NearSpanQuery(new NodeSpanQuery[] {term1, term2}, 4, false); checkHits(query, 609, 629, 639, 649, 659, 669, 679, 689, 699, 906, 926, 936, 946, 956, 966, 976, 986, 996); }
@Test public void testSpanNearOr() throws Exception { this.addDocuments(this.generateDocuments(2000)); NodeSpanQuery t1 = new NodeSpanQuery(ntq("six").getQuery()); NodeSpanQuery t3 = new NodeSpanQuery(ntq("seven").getQuery()); NodeSpanQuery t5 = new NodeSpanQuery(ntq("seven").getQuery()); NodeSpanQuery t6 = new NodeSpanQuery(ntq("six").getQuery()); OrSpanQuery to1 = new OrSpanQuery(t1, t3); OrSpanQuery to2 = new OrSpanQuery(t5, t6); NearSpanQuery query = new NearSpanQuery(new SpanQuery[] {to1, to2}, 10, true); checkHits(query, new int[] { 606, 607, 626, 627, 636, 637, 646, 647, 656, 657, 666, 667, 676, 677, 686, 687, 696, 697, 706, 707, 726, 727, 736, 737, 746, 747, 756, 757, 766, 767, 776, 777, 786, 787, 796, 797, 1606, 1607, 1626, 1627, 1636, 1637, 1646, 1647, 1656, 1657, 1666, 1667, 1676, 1677, 1686, 1687, 1696, 1697, 1706, 1707, 1726, 1727, 1736, 1737, 1746, 1747, 1756, 1757, 1766, 1767, 1776, 1777, 1786, 1787, 1796, 1797}); }
@Test public void testNotSameParent() throws Exception { this.addDocuments( doc(token("aaa", node(1,1)), token("bbb", node(2,2))) ); NodeSpanQuery term1 = new NodeSpanQuery(ntq("aaa").getQuery()); NodeSpanQuery term2 = new NodeSpanQuery(ntq("bbb").getQuery()); NearSpanQuery spanQuery = new NearSpanQuery(new NodeSpanQuery[] {term1, term2}, 0, true); Query query = new LuceneProxyNodeQuery(spanQuery); TopDocs hits = searcher.search(query, 100); assertEquals(0, hits.totalHits); }
@Test public void testSpanNearExact() throws Exception { this.addDocuments(this.generateDocuments(500)); NodeSpanQuery term1 = new NodeSpanQuery(ntq("seventy").getQuery()); NodeSpanQuery term2 = new NodeSpanQuery(ntq("seven").getQuery()); NearSpanQuery spanQuery = new NearSpanQuery(new NodeSpanQuery[] {term1, term2}, 0, true); this.checkHits(spanQuery, 77, 177, 277, 377, 477); QueryUtils.check(term1); QueryUtils.check(term2); QueryUtils.checkUnequal(term1, term2); }
@Test public void testSpanTermQuery() throws Exception { this.addDocuments(this.generateDocuments(100)); NodeSpanQuery term1 = new NodeSpanQuery(ntq("seventy").getQuery()); checkHits(term1, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79); }