use of org.apache.jackrabbit.oak.spi.query.Cursor in project jackrabbit-oak by apache.
the class LuceneIndexTest method testCursorStability.
@Test
public void testCursorStability() throws Exception {
NodeBuilder index = newLucenePropertyIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "lucene", ImmutableSet.of("foo"), null);
NodeBuilder rules = index.child(INDEX_RULES);
NodeBuilder fooProp = rules.child("nt:base").child(LuceneIndexConstants.PROP_NODE).child("foo");
fooProp.setProperty(LuceneIndexConstants.PROP_PROPERTY_INDEX, true);
// 1. Create 60 nodes
NodeState before = builder.getNodeState();
int noOfDocs = LucenePropertyIndex.LUCENE_QUERY_BATCH_SIZE + 10;
for (int i = 0; i < noOfDocs; i++) {
builder.child("a" + i).setProperty("foo", (long) i);
}
NodeState after = builder.getNodeState();
NodeState indexed = HOOK.processCommit(before, after, CommitInfo.EMPTY);
tracker = new IndexTracker();
tracker.update(indexed);
// Perform query and get hold of cursor
AdvancedQueryIndex queryIndex = new LucenePropertyIndex(tracker);
FilterImpl filter = createFilter(NT_BASE);
filter.restrictProperty("foo", Operator.GREATER_OR_EQUAL, PropertyValues.newLong(0L));
List<IndexPlan> plans = queryIndex.getPlans(filter, null, indexed);
Cursor cursor = queryIndex.query(plans.get(0), indexed);
// Trigger loading of cursor
assertTrue(cursor.hasNext());
// Now before traversing further go ahead and delete all but 10 nodes
before = indexed;
builder = indexed.builder();
for (int i = 0; i < noOfDocs - 10; i++) {
builder.child("a" + i).remove();
}
after = builder.getNodeState();
indexed = HOOK.processCommit(before, after, CommitInfo.EMPTY);
builder = indexed.builder();
// Ensure that Lucene actually removes deleted docs
NodeBuilder idx = builder.child(INDEX_DEFINITIONS_NAME).child("lucene");
purgeDeletedDocs(idx, new IndexDefinition(root, idx.getNodeState(), "/foo"));
int numDeletes = getDeletedDocCount(idx, new IndexDefinition(root, idx.getNodeState(), "/foo"));
Assert.assertEquals(0, numDeletes);
// Update the IndexSearcher
tracker.update(builder.getNodeState());
// its hard to get correct size estimate as post deletion cursor
// would have already picked up 50 docs which would not be considered
// deleted by QE for the revision at which query was triggered
// So just checking for >
List<String> resultPaths = Lists.newArrayList();
while (cursor.hasNext()) {
resultPaths.add(cursor.next().getPath());
}
Set<String> uniquePaths = Sets.newHashSet(resultPaths);
assertEquals(resultPaths.size(), uniquePaths.size());
assertTrue(!uniquePaths.isEmpty());
}
use of org.apache.jackrabbit.oak.spi.query.Cursor in project jackrabbit-oak by apache.
the class CursorsTest method intersectionCursorExceptions.
@Test
public void intersectionCursorExceptions() {
QueryEngineSettings s = new QueryEngineSettings();
Cursor a = new SimpleCursor("1:", "/x", "/b", "/c", "/e", "/e", "/c");
Cursor b = new SimpleCursor("2:", "/a", "/c", "/d", "/b", "/c");
Cursor c = Cursors.newIntersectionCursor(a, b, s);
c.next();
c.next();
try {
c.remove();
fail();
} catch (UnsupportedOperationException e) {
// expected
}
try {
c.next();
fail();
} catch (IllegalStateException e) {
// expected
}
}
use of org.apache.jackrabbit.oak.spi.query.Cursor in project jackrabbit-oak by apache.
the class CursorsTest method intersectionCursor.
@Test
public void intersectionCursor() {
QueryEngineSettings s = new QueryEngineSettings();
Cursor a = new SimpleCursor("1:", "/b", "/c", "/e", "/e", "/c");
Cursor b = new SimpleCursor("2:", "/a", "/c", "/d", "/b", "/c");
Cursor c = Cursors.newIntersectionCursor(a, b, s);
assertEquals("1:/b, 1:/c", list(c));
assertFalse(c.hasNext());
}
Aggregations