public static IndexQuery exact( int propertyKeyId, Object value ) { return exact( propertyKeyId, Values.of( value ) ); }
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 ) ) ); }
@Test public void closingAnOnlineIndexUpdaterMustNotThrowEvenIfItHasBeenFedConflictingData() throws Exception { // The reason is that we use and close IndexUpdaters in commit - not in prepare - and therefor // we cannot have them go around and throw exceptions, because that could potentially break // recovery. // Conflicting data can happen because of faulty data coercion. These faults are resolved by // the exact-match filtering we do on index seeks. updateAndCommit( asList( add( 1L, descriptor.schema(), "a", "a" ), add( 2L, descriptor.schema(), "a", "a" ) ) ); assertThat( query( exact( 0, "a" ), exact( 1, "a" ) ), equalTo( asList( 1L, 2L ) ) ); } }
@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 ) ) ); }
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 ) ); }
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 ) ) ); }
add( 10L, descriptor.schema(), base2, obj5 ) ) ); assertThat( query( exact( 0, base1 ), range( 1, obj2, true, obj4, false ) ), equalTo( asList( 2L, 3L ) ) ); assertThat( query( exact( 0, base1 ), range( 1, obj4, true, null, false ) ), equalTo( asList( 4L, 5L ) ) ); assertThat( query( exact( 0, base1 ), range( 1, obj4, false, null, true ) ), equalTo( singletonList( 5L ) ) ); assertThat( query( exact( 0, base1 ), range( 1, obj5, false, obj2, true ) ), equalTo( EMPTY_LIST ) ); assertThat( query( exact( 0, base1 ), range( 1, null, false, obj3, false ) ), equalTo( asList( 1L, 2L ) ) ); assertThat( query( exact( 0, base1 ), range( 1, null, true, obj3, true ) ), equalTo( asList( 1L, 2L, 3L ) ) ); assertThat( query( exact( 0, base1 ), range( 1, obj1, false, obj2, true ) ), equalTo( singletonList( 2L ) ) ); assertThat( query( exact( 0, base1 ), range( 1, obj1, false, obj3, false ) ), equalTo( singletonList( 2L ) ) ); assertThat( query( exact( 0, base2 ), range( 1, obj2, true, obj4, false ) ), equalTo( asList( 7L, 8L ) ) ); assertThat( query( exact( 0, base2 ), range( 1, obj4, true, null, false ) ), equalTo( asList( 9L, 10L ) ) ); assertThat( query( exact( 0, base2 ), range( 1, obj4, false, null, true ) ), equalTo( singletonList( 10L ) ) ); assertThat( query( exact( 0, base2 ), range( 1, obj5, false, obj2, true ) ), equalTo( EMPTY_LIST ) ); assertThat( query( exact( 0, base2 ), range( 1, null, false, obj3, false ) ), equalTo( asList( 6L, 7L ) ) ); assertThat( query( exact( 0, base2 ), range( 1, null, true, obj3, true ) ), equalTo( asList( 6L, 7L, 8L ) ) ); assertThat( query( exact( 0, base2 ), range( 1, obj1, false, obj2, true ) ), equalTo( singletonList( 7L ) ) ); assertThat( query( exact( 0, base2 ), range( 1, obj1, false, obj3, false ) ), equalTo( singletonList( 7L ) ) ); assertThat( query( exact( 0, base1 ), range( 1, valueGroup ) ), equalTo( asList( 1L, 2L, 3L, 4L, 5L ) ) ); assertThat( query( exact( 0, base2 ), range( 1, valueGroup ) ), equalTo( asList( 6L, 7L, 8L, 9L, 10L ) ) ); assertThat( query( exact( 0, base1 ), range( 1, crs ) ), equalTo( asList( 1L, 2L, 3L, 4L, 5L ) ) ); assertThat( query( exact( 0, base2 ), range( 1, crs ) ), equalTo( asList( 6L, 7L, 8L, 9L, 10L ) ) );
@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 ) ) ); }
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 ) ); } }