Search in sources :

Example 6 with Value

use of com.google.cloud.spanner.Value in project spring-cloud-gcp by spring-cloud.

the class SqlSpannerQueryTests method pageableParamQueryTest.

@Test
public void pageableParamQueryTest() throws NoSuchMethodException {
    String sql = "SELECT * FROM :org.springframework.cloud.gcp.data.spanner.repository.query.SqlSpannerQueryTests$Child:" + " WHERE id = @id AND trader_id = @trader_id";
    // @formatter:off
    String entityResolvedSql = "SELECT *, " + "ARRAY (SELECT AS STRUCT canceled, documentId, id, childId, content " + "FROM documents WHERE (documents.id = children.id AND documents.childId = children.childId) " + "AND (canceled = false)) AS documents " + "FROM (SELECT * FROM children WHERE id = @id AND trader_id = @trader_id) children " + "WHERE disabled = false ORDER BY trader_id ASC LIMIT 10 OFFSET 30";
    // @formatter:on
    Object[] params = new Object[] { "ID", "TRADER_ID", PageRequest.of(3, 10, Sort.by(Order.asc("trader_id"))) };
    String[] paramNames = new String[] { "id", "trader_id", "ignoredPageable" };
    when(queryMethod.isCollectionQuery()).thenReturn(false);
    when(queryMethod.getReturnedObjectType()).thenReturn((Class) Child.class);
    EvaluationContext evaluationContext = new StandardEvaluationContext();
    for (int i = 0; i < params.length; i++) {
        evaluationContext.setVariable(paramNames[i], params[i]);
    }
    when(this.evaluationContextProvider.getEvaluationContext(any(), any())).thenReturn(evaluationContext);
    SqlSpannerQuery sqlSpannerQuery = createQuery(sql, Child.class, false);
    doAnswer((invocation) -> {
        Statement statement = invocation.getArgument(0);
        SpannerQueryOptions queryOptions = invocation.getArgument(1);
        assertThat(queryOptions.isAllowPartialRead()).isTrue();
        assertThat(statement.getSql()).isEqualTo(entityResolvedSql);
        Map<String, Value> paramMap = statement.getParameters();
        assertThat(paramMap.get("id").getString()).isEqualTo(params[0]);
        assertThat(paramMap.get("trader_id").getString()).isEqualTo(params[1]);
        assertThat(paramMap.get("ignoredPageable")).isNull();
        return null;
    }).when(this.spannerTemplate).executeQuery(any(), any());
    // This dummy method was created so the metadata for the ARRAY param inner type is
    // provided.
    Method method = QueryHolder.class.getMethod("dummyMethod4", String.class, String.class, Pageable.class);
    when(this.queryMethod.getMethod()).thenReturn(method);
    Mockito.<Parameters>when(this.queryMethod.getParameters()).thenReturn(new DefaultParameters(method));
    sqlSpannerQuery.execute(params);
    verify(this.spannerTemplate, times(1)).executeQuery(any(), any());
}
Also used : StandardEvaluationContext(org.springframework.expression.spel.support.StandardEvaluationContext) Statement(com.google.cloud.spanner.Statement) Method(java.lang.reflect.Method) SpannerQueryOptions(org.springframework.cloud.gcp.data.spanner.core.SpannerQueryOptions) DefaultParameters(org.springframework.data.repository.query.DefaultParameters) Value(com.google.cloud.spanner.Value) EvaluationContext(org.springframework.expression.EvaluationContext) StandardEvaluationContext(org.springframework.expression.spel.support.StandardEvaluationContext) Test(org.junit.Test)

Example 7 with Value

use of com.google.cloud.spanner.Value in project spring-cloud-gcp by spring-cloud.

the class SpannerStatementQueryTests method runPageableOrSortTest.

private void runPageableOrSortTest(Object[] params, Method method, String expectedSql) {
    when(this.queryMethod.getName()).thenReturn("findByPriceLessThan");
    this.partTreeSpannerQuery = spy(createQuery());
    when(this.spannerTemplate.query((Function<Struct, Object>) any(), any(), any())).thenReturn(Collections.singletonList(1L));
    doReturn(new DefaultParameters(method)).when(this.queryMethod).getParameters();
    when(this.spannerTemplate.query((Class) any(), any(), any())).thenAnswer((invocation) -> {
        Statement statement = invocation.getArgument(1);
        assertThat(statement.getSql()).isEqualTo(expectedSql);
        Map<String, Value> paramMap = statement.getParameters();
        assertThat(paramMap.get("tag0").getFloat64()).isEqualTo(params[0]);
        assertThat(paramMap).hasSize(1);
        return null;
    });
    doReturn(Object.class).when(this.partTreeSpannerQuery).getReturnedSimpleConvertableItemType();
    doReturn(null).when(this.partTreeSpannerQuery).convertToSimpleReturnType(any(), any());
    this.partTreeSpannerQuery.execute(params);
    verify(this.spannerTemplate, times(1)).query((Class) any(), any(), any());
}
Also used : DefaultParameters(org.springframework.data.repository.query.DefaultParameters) Statement(com.google.cloud.spanner.Statement) Value(com.google.cloud.spanner.Value) Struct(com.google.cloud.spanner.Struct)

Example 8 with Value

use of com.google.cloud.spanner.Value in project spring-cloud-gcp by spring-cloud.

the class SpannerStatementQueryTests method compoundNameConventionCountTest.

@Test
public void compoundNameConventionCountTest() throws NoSuchMethodException {
    when(this.queryMethod.getName()).thenReturn("existsDistinctByActionIgnoreCaseAndSymbolOrTraderIdAndPriceLessThanOrPriceGreater" + "ThanEqualAndIdIsNotNullAndTraderIdIsNullAndTraderIdLikeAndPriceTrueAndPriceFalse" + "AndPriceGreaterThanAndPriceLessThanEqualOrderByIdDesc");
    this.partTreeSpannerQuery = spy(createQuery());
    when(this.spannerTemplate.query((Function<Struct, Object>) any(), any(), any())).thenReturn(Collections.singletonList(1L));
    Object[] params = new Object[] { Trade.Action.BUY, "abcd", "abc123", 8.88, 3.33, "ignored", "ignored", "blahblah", "ignored", "ignored", 1.11, 2.22 };
    Method method = QueryHolder.class.getMethod("repositoryMethod3", Object.class, Object.class, Object.class, Object.class, Object.class, Object.class, Object.class, Object.class, Object.class, Object.class, Object.class, Object.class);
    doReturn(new DefaultParameters(method)).when(this.queryMethod).getParameters();
    when(this.spannerTemplate.query((Function<Struct, Object>) any(), any(), any())).thenAnswer((invocation) -> {
        Statement statement = invocation.getArgument(1);
        String expectedSql = "SELECT EXISTS" + "(SELECT DISTINCT shares, trader_id, ticker, price, action, id, value " + "FROM trades WHERE ( LOWER(action)=LOWER(@tag0) " + "AND ticker=@tag1 ) OR " + "( trader_id=@tag2 AND price<@tag3 ) OR ( price>=@tag4 AND id<>NULL AND " + "trader_id=NULL AND trader_id LIKE @tag7 AND price=TRUE AND price=FALSE AND " + "price>@tag10 AND price<=@tag11 ) ORDER BY id DESC LIMIT 1)";
        assertThat(statement.getSql()).isEqualTo(expectedSql);
        Map<String, Value> paramMap = statement.getParameters();
        assertThat(paramMap.get("tag0").getString()).isEqualTo(params[0].toString());
        assertThat(paramMap.get("tag1").getString()).isEqualTo(params[1]);
        assertThat(paramMap.get("tag2").getString()).isEqualTo(params[2]);
        assertThat(paramMap.get("tag3").getFloat64()).isEqualTo(params[3]);
        assertThat(paramMap.get("tag4").getFloat64()).isEqualTo(params[4]);
        assertThat(paramMap.get("tag5").getString()).isEqualTo(params[5]);
        assertThat(paramMap.get("tag6").getString()).isEqualTo(params[6]);
        assertThat(paramMap.get("tag7").getString()).isEqualTo(params[7]);
        assertThat(paramMap.get("tag8").getString()).isEqualTo(params[8]);
        assertThat(paramMap.get("tag9").getString()).isEqualTo(params[9]);
        assertThat(paramMap.get("tag10").getFloat64()).isEqualTo(params[10]);
        assertThat(paramMap.get("tag11").getFloat64()).isEqualTo(params[11]);
        return null;
    });
    doReturn(Object.class).when(this.partTreeSpannerQuery).getReturnedSimpleConvertableItemType();
    doReturn(null).when(this.partTreeSpannerQuery).convertToSimpleReturnType(any(), any());
    this.partTreeSpannerQuery.execute(params);
    verify(this.spannerTemplate, times(1)).query((Function<Struct, Object>) any(), any(), any());
}
Also used : DefaultParameters(org.springframework.data.repository.query.DefaultParameters) Statement(com.google.cloud.spanner.Statement) Value(com.google.cloud.spanner.Value) Method(java.lang.reflect.Method) Struct(com.google.cloud.spanner.Struct) Test(org.junit.Test)

Example 9 with Value

use of com.google.cloud.spanner.Value in project beam by apache.

the class TestStructMapper method modStructFrom.

private static Struct modStructFrom(Mod mod, boolean useJsonFields) {
    final Value keys = useJsonFields ? Value.json(mod.getKeysJson()) : Value.string(mod.getKeysJson());
    final Value newValues = useJsonFields ? Value.json(mod.getNewValuesJson()) : Value.string(mod.getNewValuesJson());
    final Value oldValues = useJsonFields ? Value.json(mod.getOldValuesJson()) : Value.string(mod.getOldValuesJson());
    return Struct.newBuilder().set("keys").to(keys).set("new_values").to(newValues).set("old_values").to(oldValues).build();
}
Also used : Value(com.google.cloud.spanner.Value)

Example 10 with Value

use of com.google.cloud.spanner.Value in project spring-cloud-gcp by spring-cloud.

the class SpannerStatementQueryTests method compoundNameConventionTest.

@Test
public void compoundNameConventionTest() throws NoSuchMethodException {
    when(this.queryMethod.getName()).thenReturn("findTop3DistinctByActionIgnoreCaseAndSymbolOrTraderIdAndPriceLessThanOrPriceGreater" + "ThanEqualAndIdIsNotNullAndTraderIdIsNullAndTraderIdLikeAndPriceTrueAndPriceFalse" + "AndPriceGreaterThanAndPriceLessThanEqualAndPriceIn" + "AndValueLessThanOrderByIdDesc");
    this.partTreeSpannerQuery = spy(createQuery());
    Object[] params = new Object[] { Trade.Action.BUY, "abcd", "abc123", // an int is not a natively supported type, and is intentionally used to use custom
    8, // converters
    3.33, "ignored", "ignored", "blahblah", "ignored", "ignored", 1.11, 2.22, Arrays.asList(1, 2), BigDecimal.ONE };
    when(this.spannerTemplate.query((Class<Object>) any(), any(), any())).thenAnswer((invocation) -> {
        Statement statement = invocation.getArgument(1);
        String expectedQuery = "SELECT DISTINCT shares, trader_id, ticker, price, action, id, value " + "FROM trades WHERE ( LOWER(action)=LOWER(@tag0) " + "AND ticker=@tag1 ) OR " + "( trader_id=@tag2 AND price<@tag3 ) OR ( price>=@tag4 AND id<>NULL AND " + "trader_id=NULL AND trader_id LIKE @tag7 AND price=TRUE AND price=FALSE AND " + "price>@tag10 AND price<=@tag11 AND price IN UNNEST(@tag12) " + "AND value<@tag13 ) ORDER BY id DESC LIMIT 3";
        assertThat(statement.getSql()).isEqualTo(expectedQuery);
        Map<String, Value> paramMap = statement.getParameters();
        assertThat(paramMap.get("tag0").getString()).isEqualTo(params[0].toString());
        assertThat(paramMap.get("tag1").getString()).isEqualTo(params[1]);
        assertThat(paramMap.get("tag2").getString()).isEqualTo(params[2]);
        assertThat(paramMap.get("tag3").getInt64()).isEqualTo(8L);
        assertThat(paramMap.get("tag4").getFloat64()).isEqualTo(params[4]);
        assertThat(paramMap.get("tag5").getString()).isEqualTo(params[5]);
        assertThat(paramMap.get("tag6").getString()).isEqualTo(params[6]);
        assertThat(paramMap.get("tag7").getString()).isEqualTo(params[7]);
        assertThat(paramMap.get("tag8").getString()).isEqualTo(params[8]);
        assertThat(paramMap.get("tag9").getString()).isEqualTo(params[9]);
        assertThat(paramMap.get("tag10").getFloat64()).isEqualTo(params[10]);
        assertThat(paramMap.get("tag11").getFloat64()).isEqualTo(params[11]);
        assertThat(paramMap.get("tag12").getInt64Array()).isEqualTo(((List<Integer>) params[12]).stream().map(Long::valueOf).collect(Collectors.toList()));
        assertThat(paramMap.get("tag13").getNumeric()).isEqualTo(params[13]);
        return null;
    });
    doReturn(Object.class).when(this.partTreeSpannerQuery).getReturnedSimpleConvertableItemType();
    doReturn(null).when(this.partTreeSpannerQuery).convertToSimpleReturnType(any(), any());
    // This dummy method was created so the metadata for the ARRAY param inner type is
    // provided.
    Method method = QueryHolder.class.getMethod("repositoryMethod1", Object.class, Object.class, Object.class, Object.class, Object.class, Object.class, Object.class, Object.class, Object.class, Object.class, Object.class, Object.class, List.class, BigDecimal.class);
    when(this.queryMethod.getMethod()).thenReturn(method);
    doReturn(new DefaultParameters(method)).when(this.queryMethod).getParameters();
    this.partTreeSpannerQuery.execute(params);
    verify(this.spannerTemplate, times(1)).query((Class<Object>) any(), any(), any());
}
Also used : DefaultParameters(org.springframework.data.repository.query.DefaultParameters) Statement(com.google.cloud.spanner.Statement) Value(com.google.cloud.spanner.Value) Method(java.lang.reflect.Method) Test(org.junit.Test)

Aggregations

Value (com.google.cloud.spanner.Value)14 Test (org.junit.Test)9 Statement (com.google.cloud.spanner.Statement)8 Method (java.lang.reflect.Method)8 DefaultParameters (org.springframework.data.repository.query.DefaultParameters)8 SpannerQueryOptions (org.springframework.cloud.gcp.data.spanner.core.SpannerQueryOptions)5 EvaluationContext (org.springframework.expression.EvaluationContext)5 StandardEvaluationContext (org.springframework.expression.spel.support.StandardEvaluationContext)5 Struct (com.google.cloud.spanner.Struct)3 Mutation (com.google.cloud.spanner.Mutation)1 WriteBuilder (com.google.cloud.spanner.Mutation.WriteBuilder)1 Type (com.google.cloud.spanner.Type)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1 ColumnType (org.apache.beam.sdk.io.gcp.spanner.changestreams.model.ColumnType)1 PrimaryKey (org.springframework.cloud.gcp.data.spanner.core.mapping.PrimaryKey)1 CommitTimestamps (org.springframework.cloud.gcp.data.spanner.test.domain.CommitTimestamps)1