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 ) ); } }
@Test public void testIndexScanAndSeekExactWithExactByTemporalArray() throws Exception { testIndexScanAndSeekExactWithExact( dateArray( 333, 900 ), dateArray( 101, 900 ) ); }
@Test public void shouldRangeSeekInOrderDescendingDuration() throws Exception { Object o0 = Duration.ofMillis( 0 ); Object o1 = Duration.ofMillis( 1 ); Object o2 = Duration.ofMillis( 2 ); Object o3 = Duration.ofMillis( 3 ); Object o4 = Duration.ofMillis( 4 ); Object o5 = Duration.ofMillis( 5 ); shouldSeekInOrderExactWithRange( IndexOrder.DESCENDING, o0, o1, o2, o3, o4, o5 ); }
updateAndCommit( asList( 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 ) ) ); 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 ) ) );
@Test public void testIndexSeekExactWithExistsByString() throws Exception { testIndexSeekExactWithExists( "a", "b" ); }
@Test public void testIndexScanAndSeekExactWithExactByString() throws Exception { testIndexScanAndSeekExactWithExact( "a", "b" ); }
@Test public void testIndexSeekExactWithExistsByTemporalArray() throws Exception { testIndexSeekExactWithExists( dateArray( 303, 900 ), dateArray( 101, 900 ) ); }
@Test public void testIndexSeekExactWithRangeByNumberArray() throws Exception { testIndexSeekExactWithRange( longArray( new long[]{333, 9000} ), longArray( new long[]{101, 900} ), longArray( new long[]{111, 900} ), longArray( new long[]{222, 900} ), longArray( new long[]{333, 900} ), longArray( new long[]{444, 900} ), longArray( new long[]{555, 900} ) ); }
private static IndexEntryUpdate<SchemaDescriptor> add( long nodeId, SchemaDescriptor schema, Object value1, Object value2 ) { return add( nodeId, schema, Values.of( value1 ), Values.of( value2 ) ); }
@Test public void shouldRangeSeekInOrderAscendingLocalDateTimeArray() throws Exception { Object o0 = new LocalDateTime[]{LocalDateTime.of( 10, 10, 10, 10, 10, 10, 0 )}; Object o1 = new LocalDateTime[]{LocalDateTime.of( 10, 10, 10, 10, 10, 10, 1 )}; Object o2 = new LocalDateTime[]{LocalDateTime.of( 10, 10, 10, 10, 10, 10, 2 )}; Object o3 = new LocalDateTime[]{LocalDateTime.of( 10, 10, 10, 10, 10, 10, 3 )}; Object o4 = new LocalDateTime[]{LocalDateTime.of( 10, 10, 10, 10, 10, 10, 4 )}; Object o5 = new LocalDateTime[]{LocalDateTime.of( 10, 10, 10, 10, 10, 10, 5 )}; shouldSeekInOrderExactWithRange( IndexOrder.ASCENDING, o0, o1, o2, o3, o4, o5 ); }
@Test public void testIndexSeekExactWithExistsByNumber() throws Exception { testIndexSeekExactWithExists( 303, 101 ); }
@Test public void testIndexScanAndSeekExactWithExactByNumber() throws Exception { testIndexScanAndSeekExactWithExact( 333, 101 ); }
@Test public void testIndexSeekExactWithRangeByString() throws Exception { testIndexSeekExactWithRange( Values.of( "a" ), Values.of( "b" ), Values.of( "Anabelle" ), Values.of( "Anna" ), Values.of( "Bob" ), Values.of( "Harriet" ), Values.of( "William" ) ); }
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 shouldRangeSeekInOrderDescendingLocalDateTimeArray() throws Exception { Object o0 = new LocalDateTime[]{LocalDateTime.of( 10, 10, 10, 10, 10, 10, 0 )}; Object o1 = new LocalDateTime[]{LocalDateTime.of( 10, 10, 10, 10, 10, 10, 1 )}; Object o2 = new LocalDateTime[]{LocalDateTime.of( 10, 10, 10, 10, 10, 10, 2 )}; Object o3 = new LocalDateTime[]{LocalDateTime.of( 10, 10, 10, 10, 10, 10, 3 )}; Object o4 = new LocalDateTime[]{LocalDateTime.of( 10, 10, 10, 10, 10, 10, 4 )}; Object o5 = new LocalDateTime[]{LocalDateTime.of( 10, 10, 10, 10, 10, 10, 5 )}; shouldSeekInOrderExactWithRange( IndexOrder.DESCENDING, o0, o1, o2, o3, o4, o5 ); }
@Test public void testIndexSeekExactWithExistsByBoolean() throws Exception { testIndexSeekExactWithExists( true, false ); }
@Test public void testIndexScanAndSeekExactWithExactByBoolean() throws Exception { testIndexScanAndSeekExactWithExact( true, false ); }