private static IndexEntryUpdate<SchemaDescriptor> add( long nodeId, SchemaDescriptor schema, Object value1, Object value2 ) { return add( nodeId, schema, Values.of( value1 ), Values.of( value2 ) ); }
private void testIndexScanAndSeekExactWithExact( Value a, Value b ) throws Exception { updateAndCommit( asList( add( 1L, descriptor.schema(), a, a ), add( 2L, descriptor.schema(), b, b ), add( 3L, descriptor.schema(), a, b ) ) ); assertThat( query( exact( 0, a ), exact( 1, a ) ), equalTo( singletonList( 1L ) ) ); assertThat( query( exact( 0, b ), exact( 1, b ) ), equalTo( singletonList( 2L ) ) ); assertThat( query( exact( 0, a ), exact( 1, b ) ), equalTo( singletonList( 3L ) ) ); assertThat( query( exists( 1 ) ), equalTo( asList( 1L, 2L, 3L ) ) ); }
private void shouldSeekInOrderExactWithRange( IndexOrder order, Object o0, Object o1, Object o2, Object o3, Object o4, Object o5 ) throws Exception { Object baseValue = 1; // Todo use random value instead IndexQuery exact = exact( 100, baseValue ); IndexQuery range = range( 200, Values.of( o0 ), true, Values.of( o5 ), true ); IndexOrder[] indexOrders = orderCapability( exact, range ); Assume.assumeTrue( "Assume support for order " + order, ArrayUtils.contains( indexOrders, order ) ); updateAndCommit( asList( add( 1, descriptor.schema(), baseValue, o0 ), add( 1, descriptor.schema(), baseValue, o5 ), add( 1, descriptor.schema(), baseValue, o1 ), add( 1, descriptor.schema(), baseValue, o4 ), add( 1, descriptor.schema(), baseValue, o2 ), add( 1, descriptor.schema(), baseValue, o3 ) ) ); SimpleNodeValueClient client = new SimpleNodeValueClient(); try ( AutoCloseable ignored = query( client, order, exact, range ) ) { List<Long> seenIds = assertClientReturnValuesInOrder( client, order ); assertThat( seenIds.size(), equalTo( 6 ) ); } }
private void testIndexSeekExactWithExists( Value a, Value b ) throws Exception { Assume.assumeTrue( "Assume support for granular composite queries", testSuite.supportsGranularCompositeQueries() ); updateAndCommit( asList( add( 1L, descriptor.schema(), a, Values.of( 1 ) ), add( 2L, descriptor.schema(), b, Values.of( "abv" ) ), add( 3L, descriptor.schema(), a, Values.of( false ) ) ) ); assertThat( query( exact( 0, a ), exists( 1 ) ), equalTo( asList( 1L, 3L ) ) ); assertThat( query( exact( 0, b ), exists( 1 ) ), equalTo( singletonList( 2L ) ) ); }
@Test public void testIndexSeekPrefixRangeWithExistsByString() throws Exception { Assume.assumeTrue( "Assume support for granular composite queries", testSuite.supportsGranularCompositeQueries() ); updateAndCommit( asList( add( 1L, descriptor.schema(), "a", 1 ), add( 2L, descriptor.schema(), "A", epochDate( 2 ) ), add( 3L, descriptor.schema(), "apa", "..." ), add( 4L, descriptor.schema(), "apA", "someString" ), add( 5L, descriptor.schema(), "b", true ), add( 6L, descriptor.schema(), "a", 100 ), add( 7L, descriptor.schema(), "A", epochDate( 200 ) ), add( 8L, descriptor.schema(), "apa", "!!!" ), add( 9L, descriptor.schema(), "apA", "someOtherString" ), add( 10L, descriptor.schema(), "b", false ) ) ); assertThat( query( IndexQuery.stringPrefix( 0, stringValue( "a" )), exists( 1 ) ), equalTo( asList( 1L, 3L, 4L, 6L, 8L, 9L ) ) ); assertThat( query( IndexQuery.stringPrefix( 0, stringValue( "A" )), exists( 1 ) ), equalTo( asList( 2L, 7L) ) ); assertThat( query( IndexQuery.stringPrefix( 0, stringValue( "ba") ), exists( 1 ) ), equalTo( EMPTY_LIST ) ); assertThat( query( IndexQuery.stringPrefix( 0, stringValue( "" )), exists( 1 ) ), equalTo( asList( 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L ) ) ); }
@Test public void testIndexScanAndSeekExactWithExactByPoint() throws Exception { Assume.assumeTrue( "Assume support for spatial", testSuite.supportsSpatial() ); PointValue gps = pointValue( WGS84, 12.6, 56.7 ); PointValue car = pointValue( Cartesian, 12.6, 56.7 ); PointValue gps3d = pointValue( CoordinateReferenceSystem.WGS84_3D, 12.6, 56.7, 100.0 ); PointValue car3d = pointValue( CoordinateReferenceSystem.Cartesian_3D, 12.6, 56.7, 100.0 ); updateAndCommit( asList( add( 1L, descriptor.schema(), gps, gps ), add( 2L, descriptor.schema(), car, car ), add( 3L, descriptor.schema(), gps, car ), add( 4L, descriptor.schema(), gps3d, gps3d ), add( 5L, descriptor.schema(), car3d, car3d ), add( 6L, descriptor.schema(), gps, car3d ) ) ); assertThat( query( exact( 0, gps ), exact( 1, gps ) ), equalTo( singletonList( 1L ) ) ); assertThat( query( exact( 0, car ), exact( 1, car ) ), equalTo( singletonList( 2L ) ) ); assertThat( query( exact( 0, gps ), exact( 1, car ) ), equalTo( singletonList( 3L ) ) ); assertThat( query( exact( 0, gps3d ), exact( 1, gps3d ) ), equalTo( singletonList( 4L ) ) ); assertThat( query( exact( 0, car3d ), exact( 1, car3d ) ), equalTo( singletonList( 5L ) ) ); assertThat( query( exact( 0, gps ), exact( 1, car3d ) ), equalTo( singletonList( 6L ) ) ); assertThat( query( exists( 1 ) ), equalTo( asList( 1L, 2L, 3L, 4L, 5L, 6L ) ) ); }
@Test public void testIndexSeekExactWithPrefixRangeByString() throws Exception { Assume.assumeTrue( "Assume support for granular composite queries", testSuite.supportsGranularCompositeQueries() ); updateAndCommit( asList( add( 1L, descriptor.schema(), "a", "a" ), add( 2L, descriptor.schema(), "a", "A" ), add( 3L, descriptor.schema(), "a", "apa" ), add( 4L, descriptor.schema(), "a", "apA" ), add( 5L, descriptor.schema(), "a", "b" ), add( 6L, descriptor.schema(), "b", "a" ), add( 7L, descriptor.schema(), "b", "A" ), add( 8L, descriptor.schema(), "b", "apa" ), add( 9L, descriptor.schema(), "b", "apA" ), add( 10L, descriptor.schema(), "b", "b" ) ) ); assertThat( query( exact( 0, "a" ), IndexQuery.stringPrefix( 1, stringValue( "a" ) ) ), equalTo( asList( 1L, 3L, 4L ) ) ); assertThat( query( exact( 0, "a" ), IndexQuery.stringPrefix( 1, stringValue( "A" )) ), equalTo( Collections.singletonList( 2L ) ) ); assertThat( query( exact( 0, "a" ), IndexQuery.stringPrefix( 1, stringValue( "ba") ) ), equalTo( EMPTY_LIST ) ); assertThat( query( exact( 0, "a" ), IndexQuery.stringPrefix( 1, stringValue( "" )) ), equalTo( asList( 1L, 2L, 3L, 4L, 5L ) ) ); assertThat( query( exact( 0, "b" ), IndexQuery.stringPrefix( 1, stringValue( "a" )) ), equalTo( asList( 6L, 8L, 9L ) ) ); assertThat( query( exact( 0, "b" ), IndexQuery.stringPrefix( 1, stringValue( "A" )) ), equalTo( Collections.singletonList( 7L ) ) ); assertThat( query( exact( 0, "b" ), IndexQuery.stringPrefix( 1, stringValue( "ba") ) ), equalTo( EMPTY_LIST ) ); assertThat( query( exact( 0, "b" ), IndexQuery.stringPrefix( 1, stringValue( "" ) ) ), equalTo( asList( 6L, 7L, 8L, 9L, 10L ) ) ); }
@Test public void testIndexSeekRangeWithExistsByBoolean() throws Exception { Assume.assumeTrue( "Assume support for granular composite queries", testSuite.supportsGranularCompositeQueries() ); Assume.assumeTrue( "Assume support for boolean range queries", testSuite.supportsBooleanRangeQueries() ); updateAndCommit( asList( add( 1L, descriptor.schema(), false, "someString" ), add( 2L, descriptor.schema(), true, 1000 ) ) ); assertThat( query( range( 0, BooleanValue.FALSE, true, BooleanValue.TRUE, true ), exists( 1 ) ), equalTo( asList( 1L, 2L ) ) ); assertThat( query( range( 0, BooleanValue.FALSE, false, BooleanValue.TRUE, true ), exists( 1 ) ), equalTo( singletonList( 2L ) ) ); assertThat( query( range( 0, BooleanValue.FALSE, true, BooleanValue.TRUE, false ), exists( 1 ) ), equalTo( singletonList( 1L ) ) ); assertThat( query( range( 0, BooleanValue.FALSE, false, BooleanValue.TRUE, false ), exists( 1 ) ), equalTo( EMPTY_LIST ) ); assertThat( query( range( 0, null, true, BooleanValue.TRUE, true ), exists( 1 ) ), equalTo( asList( 1L, 2L ) ) ); assertThat( query( range( 0, BooleanValue.FALSE, true, null, true ), exists( 1 ) ), equalTo( asList( 1L, 2L ) ) ); assertThat( query( range( 0, BooleanValue.TRUE, true, BooleanValue.FALSE, true ), exists( 1 ) ), equalTo( EMPTY_LIST ) ); }
private void testIndexSeekRangeWithExists( Value obj1, Value obj2, Value obj3, Value obj4, Value obj5 ) throws Exception { Assume.assumeTrue( "Assume support for granular composite queries", testSuite.supportsGranularCompositeQueries() ); updateAndCommit( asList( add( 1L, descriptor.schema(), obj1, Values.of( 100 ) ), add( 2L, descriptor.schema(), obj2, Values.of( "someString" ) ), add( 3L, descriptor.schema(), obj3, Values.of( epochDate( 300 ) ) ), add( 4L, descriptor.schema(), obj4, Values.of( true ) ), add( 5L, descriptor.schema(), obj5, Values.of( 42 ) ) ) ); assertThat( query( range( 0, obj2, true, obj4, false ), exists( 1 ) ), equalTo( asList( 2L, 3L ) ) ); assertThat( query( range( 0, obj4, true, null, false ), exists( 1 ) ), equalTo( asList( 4L, 5L ) ) ); assertThat( query( range( 0, obj4, false, null, true ), exists( 1 ) ), equalTo( singletonList( 5L ) ) ); assertThat( query( range( 0, obj5, false, obj2, true ), exists( 1 ) ), equalTo( EMPTY_LIST ) ); assertThat( query( range( 0, null, false, obj3, false ), exists( 1 ) ), equalTo( asList( 1L, 2L ) ) ); assertThat( query( range( 0, null, true, obj3, true ), exists( 1 ) ), equalTo( asList( 1L, 2L, 3L ) ) ); ValueGroup valueGroup = obj1.valueGroup(); if ( valueGroup != GEOMETRY && valueGroup != GEOMETRY_ARRAY ) { // This cannot be done for spatial values because each bound in a spatial query needs a coordinate reference system, // and those are provided by Value instances, e.g. PointValue assertThat( query( range( 0, obj1.valueGroup() ), exists( 1 ) ), equalTo( asList( 1L, 2L, 3L, 4L, 5L ) ) ); } assertThat( query( range( 0, obj1, false, obj2, true ), exists( 1 ) ), equalTo( singletonList( 2L ) ) ); assertThat( query( range( 0, obj1, false, obj3, false ), exists( 1 ) ), equalTo( singletonList( 2L ) ) ); }
add( 1L, descriptor.schema(), base1, obj1 ), add( 2L, descriptor.schema(), base1, obj2 ), add( 3L, descriptor.schema(), base1, obj3 ), add( 4L, descriptor.schema(), base1, obj4 ), add( 5L, descriptor.schema(), base1, obj5 ), add( 6L, descriptor.schema(), base2, obj1 ), add( 7L, descriptor.schema(), base2, obj2 ), add( 8L, descriptor.schema(), base2, obj3 ), add( 9L, descriptor.schema(), base2, obj4 ), add( 10L, descriptor.schema(), base2, obj5 ) ) );
private void testIndexSeekExactWithRangeByBooleanType( Value base1, Value base2, Value obj1, Value obj2 ) throws Exception { updateAndCommit( asList( add( 1L, descriptor.schema(), base1, obj1 ), add( 2L, descriptor.schema(), base1, obj2 ), add( 3L, descriptor.schema(), base2, obj1 ), add( 4L, descriptor.schema(), base2, obj2 ) ) ); assertThat( query( exact( 0, base1 ), range( 1, obj1, true, obj2, true ) ), equalTo( asList( 1L, 2L ) ) ); assertThat( query( exact( 0, base1 ), range( 1, obj1, false, obj2, true ) ), equalTo( singletonList( 2L ) ) ); assertThat( query( exact( 0, base1 ), range( 1, obj1, true, obj2, false ) ), equalTo( singletonList( 1L ) ) ); assertThat( query( exact( 0, base1 ), range( 1, obj1, false, obj2, false ) ), equalTo( EMPTY_LIST ) ); assertThat( query( exact( 0, base1 ), range( 1, null, true, obj2, true ) ), equalTo( asList( 1L, 2L ) ) ); assertThat( query( exact( 0, base1 ), range( 1, obj1, true, null, true ) ), equalTo( asList( 1L, 2L ) ) ); assertThat( query( exact( 0, base1 ), range( 1, obj1.valueGroup() ) ), equalTo( asList( 1L, 2L ) ) ); assertThat( query( exact( 0, base1 ), range( 1, obj2, true, obj1, true ) ), equalTo( EMPTY_LIST ) ); assertThat( query( exact( 0, base2 ), range( 1, obj1, true, obj2, true ) ), equalTo( asList( 3L, 4L ) ) ); assertThat( query( exact( 0, base2 ), range( 1, obj1, false, obj2, true ) ), equalTo( singletonList( 4L ) ) ); assertThat( query( exact( 0, base2 ), range( 1, obj1, true, obj2, false ) ), equalTo( singletonList( 3L ) ) ); assertThat( query( exact( 0, base2 ), range( 1, obj1, false, obj2, false ) ), equalTo( EMPTY_LIST ) ); assertThat( query( exact( 0, base2 ), range( 1, null, true, obj2, true ) ), equalTo( asList( 3L, 4L ) ) ); assertThat( query( exact( 0, base2 ), range( 1, obj1, true, null, true ) ), equalTo( asList( 3L, 4L ) ) ); assertThat( query( exact( 0, base2 ), range( 1, obj1.valueGroup() ) ), equalTo( asList( 3L, 4L ) ) ); assertThat( query( exact( 0, base2 ), range( 1, obj2, true, obj1, true ) ), equalTo( EMPTY_LIST ) ); }