Search in sources :

Example 76 with Scan

use of com.scalar.db.api.Scan in project scalardb by scalar-labs.

the class SelectStatementHandlerTest method handle_ScanOperationWithPartialMultipleClusteringKeysRangeInclusively_ShouldCallQueryItemsWithProperQuery.

@Test
public void handle_ScanOperationWithPartialMultipleClusteringKeysRangeInclusively_ShouldCallQueryItemsWithProperQuery() {
    // Arrange
    when(metadata.getPartitionKeyNames()).thenReturn(new LinkedHashSet<>(Collections.singletonList(ANY_NAME_1)));
    when(metadata.getClusteringKeyNames()).thenReturn(new LinkedHashSet<>(Arrays.asList(ANY_NAME_2, ANY_NAME_3)));
    when(metadata.getClusteringOrder(any())).thenReturn(Order.ASC);
    when(metadata.getClusteringOrders()).thenReturn(ImmutableMap.of(ANY_NAME_2, Order.ASC, ANY_NAME_3, Order.ASC));
    when(client.query(any(QueryRequest.class))).thenReturn(queryResponse);
    when(queryResponse.items()).thenReturn(Collections.singletonList(new HashMap<>()));
    Scan scan = prepareScan().withStart(new Key(ANY_NAME_2, ANY_TEXT_2), true).withEnd(new Key(ANY_NAME_2, ANY_TEXT_3), true);
    String expectedCondition = DynamoOperation.PARTITION_KEY + " = " + DynamoOperation.PARTITION_KEY_ALIAS + " AND " + DynamoOperation.CLUSTERING_KEY + " BETWEEN " + DynamoOperation.START_CLUSTERING_KEY_ALIAS + " AND " + DynamoOperation.END_CLUSTERING_KEY_ALIAS;
    DynamoOperation dynamoOperation = new DynamoOperation(scan, metadata);
    ByteBuffer partitionKey = dynamoOperation.getConcatenatedPartitionKey();
    Map<String, AttributeValue> expectedBindMap = new HashMap<>();
    expectedBindMap.put(DynamoOperation.PARTITION_KEY_ALIAS, AttributeValue.builder().b(SdkBytes.fromByteBuffer(partitionKey)).build());
    expectedBindMap.put(DynamoOperation.START_CLUSTERING_KEY_ALIAS, AttributeValue.builder().b(SdkBytes.fromByteBuffer(new KeyBytesEncoder().encode(new Key(ANY_NAME_2, ANY_TEXT_2), metadata.getClusteringOrders()))).build());
    expectedBindMap.put(DynamoOperation.END_CLUSTERING_KEY_ALIAS, AttributeValue.builder().b(SdkBytes.fromByteBuffer(BytesUtils.getClosestNextBytes(new KeyBytesEncoder().encode(new Key(ANY_NAME_2, ANY_TEXT_3), metadata.getClusteringOrders())).get())).build());
    // Act Assert
    assertThatCode(() -> handler.handle(scan)).doesNotThrowAnyException();
    // Assert
    ArgumentCaptor<QueryRequest> captor = ArgumentCaptor.forClass(QueryRequest.class);
    verify(client).query(captor.capture());
    QueryRequest actualRequest = captor.getValue();
    assertThat(actualRequest.keyConditionExpression()).isEqualTo(expectedCondition);
    assertThat(actualRequest.expressionAttributeValues()).isEqualTo(expectedBindMap);
}
Also used : AttributeValue(software.amazon.awssdk.services.dynamodb.model.AttributeValue) QueryRequest(software.amazon.awssdk.services.dynamodb.model.QueryRequest) KeyBytesEncoder(com.scalar.db.storage.dynamo.bytes.KeyBytesEncoder) HashMap(java.util.HashMap) Scan(com.scalar.db.api.Scan) ByteBuffer(java.nio.ByteBuffer) Key(com.scalar.db.io.Key) Test(org.junit.jupiter.api.Test)

Example 77 with Scan

use of com.scalar.db.api.Scan in project scalardb by scalar-labs.

the class OperationCheckerTest method whenCheckingScanOperationWithIndexedColumnAsPartitionKey_shouldNotThrowAnyException.

@Test
public void whenCheckingScanOperationWithIndexedColumnAsPartitionKey_shouldNotThrowAnyException() {
    // Arrange
    Key partitionKey = new Key(COL1, 1);
    Key startClusteringKey = null;
    Key endClusteringKey = null;
    List<String> projections = Arrays.asList(COL1, COL2, COL3);
    int limit = 10;
    Scan scan = new Scan(partitionKey).withStart(startClusteringKey).withStart(endClusteringKey).withProjections(projections).withLimit(limit).forNamespace(NAMESPACE).forTable(TABLE_NAME);
    // Act Assert
    assertThatCode(() -> operationChecker.check(scan)).doesNotThrowAnyException();
}
Also used : Scan(com.scalar.db.api.Scan) Key(com.scalar.db.io.Key) Test(org.junit.jupiter.api.Test)

Example 78 with Scan

use of com.scalar.db.api.Scan in project scalardb by scalar-labs.

the class OperationCheckerTest method whenCheckingScanOperationWithInvalidPartialOrdering_shouldThrowIllegalArgumentException.

@Test
public void whenCheckingScanOperationWithInvalidPartialOrdering_shouldThrowIllegalArgumentException() {
    // Arrange
    Key partitionKey = new Key(PKEY1, 1, PKEY2, "val1");
    Key startClusteringKey = new Key(CKEY1, 2, CKEY2, "val1");
    Key endClusteringKey = new Key(CKEY1, 2, CKEY2, "val9");
    List<String> projections = Arrays.asList(COL1, COL2, COL3);
    int limit = -10;
    Scan scan = new Scan(partitionKey).withStart(startClusteringKey).withEnd(endClusteringKey).withProjections(projections).withLimit(limit).withOrdering(new Scan.Ordering(CKEY2, Scan.Ordering.Order.ASC)).forNamespace(NAMESPACE).forTable(TABLE_NAME);
    // Act Assert
    assertThatThrownBy(() -> operationChecker.check(scan)).isInstanceOf(IllegalArgumentException.class);
}
Also used : Scan(com.scalar.db.api.Scan) Key(com.scalar.db.io.Key) Test(org.junit.jupiter.api.Test)

Example 79 with Scan

use of com.scalar.db.api.Scan in project scalardb by scalar-labs.

the class OperationCheckerTest method whenCheckingScanOperationWithNonIndexedColumnAsPartitionKey_shouldThrowIllegalArgumentException.

@Test
public void whenCheckingScanOperationWithNonIndexedColumnAsPartitionKey_shouldThrowIllegalArgumentException() {
    // Arrange
    Key partitionKey = new Key(COL2, 0.1d);
    Key startClusteringKey = null;
    Key endClusteringKey = null;
    List<String> projections = Arrays.asList(COL1, COL2, COL3);
    int limit = 10;
    Scan scan = new Scan(partitionKey).withStart(startClusteringKey).withStart(endClusteringKey).withProjections(projections).withLimit(limit).forNamespace(NAMESPACE).forTable(TABLE_NAME);
    // Act Assert
    assertThatThrownBy(() -> operationChecker.check(scan)).isInstanceOf(IllegalArgumentException.class);
}
Also used : Scan(com.scalar.db.api.Scan) Key(com.scalar.db.io.Key) Test(org.junit.jupiter.api.Test)

Example 80 with Scan

use of com.scalar.db.api.Scan in project scalardb by scalar-labs.

the class JdbcServiceTest method whenGetScannerExecuted_withScanAll_shouldCallQueryBuilder.

@Test
@SuppressFBWarnings("OBL_UNSATISFIED_OBLIGATION")
public void whenGetScannerExecuted_withScanAll_shouldCallQueryBuilder() throws Exception {
    // Arrange
    when(queryBuilder.select(any())).thenReturn(selectQueryBuilder);
    when(selectQueryBuilder.from(any(), any(), any())).thenReturn(selectQueryBuilder);
    when(selectQueryBuilder.limit(anyInt())).thenReturn(selectQueryBuilder);
    when(selectQueryBuilder.build()).thenReturn(selectQuery);
    when(connection.prepareStatement(any())).thenReturn(preparedStatement);
    when(preparedStatement.executeQuery()).thenReturn(resultSet);
    when(resultSet.next()).thenReturn(false);
    // Act
    Scan scan = new ScanAll().forNamespace(NAMESPACE).forTable(TABLE);
    jdbcService.getScanner(scan, connection);
    // Assert
    verify(operationChecker).check(any(ScanAll.class));
    verify(queryBuilder).select(any());
}
Also used : Scan(com.scalar.db.api.Scan) ScanAll(com.scalar.db.api.ScanAll) Test(org.junit.jupiter.api.Test) SuppressFBWarnings(edu.umd.cs.findbugs.annotations.SuppressFBWarnings)

Aggregations

Scan (com.scalar.db.api.Scan)241 Key (com.scalar.db.io.Key)137 Test (org.junit.jupiter.api.Test)125 Result (com.scalar.db.api.Result)105 Test (org.junit.Test)72 Put (com.scalar.db.api.Put)37 HashMap (java.util.HashMap)32 QueryRequest (software.amazon.awssdk.services.dynamodb.model.QueryRequest)32 AttributeValue (software.amazon.awssdk.services.dynamodb.model.AttributeValue)31 ByteBuffer (java.nio.ByteBuffer)27 KeyBytesEncoder (com.scalar.db.storage.dynamo.bytes.KeyBytesEncoder)26 Scanner (com.scalar.db.api.Scanner)17 CosmosQueryRequestOptions (com.azure.cosmos.models.CosmosQueryRequestOptions)14 Assertions.catchThrowable (org.assertj.core.api.Assertions.catchThrowable)13 ArgumentMatchers.anyString (org.mockito.ArgumentMatchers.anyString)13 PartitionKey (com.azure.cosmos.models.PartitionKey)11 ArrayList (java.util.ArrayList)11 Delete (com.scalar.db.api.Delete)9 Value (com.scalar.db.io.Value)8 ConditionalExpression (com.scalar.db.api.ConditionalExpression)7