Search in sources :

Example 1 with SpannerCustomConverter

use of org.springframework.cloud.gcp.data.spanner.core.convert.SpannerCustomConverter in project spring-cloud-gcp by spring-cloud.

the class SpannerStatementQueryExecutor method buildQuery.

/**
 * Builds a query that returns the rows associated with a key set with additional SQL-where.
 * The {@link org.springframework.cloud.gcp.data.spanner.core.mapping.Where} of the {@code persistentEntity} parameter
 * is ignored, you should pass the SQL-where as a {@code whereClause} parameter.
 * The secondary {@code index} will be used instead of the table name when the corresponding parameter is not null.
 * @param keySet the key set whose members to get.
 * @param persistentEntity the persistent entity of the table.
 * @param <T> the type of the persistent entity
 * @param writeConverter a converter to convert key values as needed to bind to the query statement.
 * @param mappingContext mapping context
 * @param whereClause SQL where clause
 * @param index the secondary index name
 * @return the Spanner statement to perform the retrieval.
 */
public static <T> Statement buildQuery(KeySet keySet, SpannerPersistentEntity<T> persistentEntity, SpannerCustomConverter writeConverter, SpannerMappingContext mappingContext, String whereClause, String index) {
    List<String> orParts = new ArrayList<>();
    List<String> tags = new ArrayList<>();
    List keyParts = new ArrayList();
    int tagNum = 0;
    List<SpannerPersistentProperty> keyProperties = persistentEntity.getFlattenedPrimaryKeyProperties();
    for (Key key : keySet.getKeys()) {
        StringJoiner andJoiner = new StringJoiner(" AND ");
        Iterator parentKeyParts = key.getParts().iterator();
        while (parentKeyParts.hasNext()) {
            SpannerPersistentProperty keyProp = keyProperties.get(tagNum % keyProperties.size());
            String tagName = "tag" + tagNum;
            andJoiner.add(keyProp.getColumnName() + " = @" + tagName);
            tags.add(tagName);
            keyParts.add(parentKeyParts.next());
            tagNum++;
        }
        orParts.add(andJoiner.toString());
    }
    String keyClause = orParts.stream().map(s -> "(" + s + ")").collect(Collectors.joining(" OR "));
    String condition = combineWithAnd(keyClause, whereClause);
    String sb = "SELECT " + getColumnsStringForSelect(persistentEntity, mappingContext, true) + " FROM " + (StringUtils.isEmpty(index) ? persistentEntity.tableName() : String.format("%s@{FORCE_INDEX=%s}", persistentEntity.tableName(), index)) + (condition.isEmpty() ? "" : " WHERE " + condition);
    return buildStatementFromSqlWithArgs(sb, tags, null, writeConverter, keyParts.toArray(), null);
}
Also used : IgnoreCaseType(org.springframework.data.repository.query.parser.Part.IgnoreCaseType) BiFunction(java.util.function.BiFunction) SpannerDataException(org.springframework.cloud.gcp.data.spanner.core.mapping.SpannerDataException) HashMap(java.util.HashMap) Function(java.util.function.Function) ConversionUtils(org.springframework.cloud.gcp.data.spanner.core.convert.ConversionUtils) ArrayList(java.util.ArrayList) Parameter(java.lang.reflect.Parameter) Map(java.util.Map) Key(com.google.cloud.spanner.Key) StreamSupport(java.util.stream.StreamSupport) SpannerTemplate(org.springframework.cloud.gcp.data.spanner.core.SpannerTemplate) Pageable(org.springframework.data.domain.Pageable) Sort(org.springframework.data.domain.Sort) SpannerPersistentEntity(org.springframework.cloud.gcp.data.spanner.core.mapping.SpannerPersistentEntity) SpannerMappingContext(org.springframework.cloud.gcp.data.spanner.core.mapping.SpannerMappingContext) SpannerPageableQueryOptions(org.springframework.cloud.gcp.data.spanner.core.SpannerPageableQueryOptions) Iterator(java.util.Iterator) PartTree(org.springframework.data.repository.query.parser.PartTree) ParameterAccessor(org.springframework.data.repository.query.ParameterAccessor) Collectors(java.util.stream.Collectors) KeySet(com.google.cloud.spanner.KeySet) Statement(com.google.cloud.spanner.Statement) List(java.util.List) SpannerPersistentProperty(org.springframework.cloud.gcp.data.spanner.core.mapping.SpannerPersistentProperty) Where(org.springframework.cloud.gcp.data.spanner.core.mapping.Where) ParameterizedType(java.lang.reflect.ParameterizedType) Struct(com.google.cloud.spanner.Struct) StringJoiner(java.util.StringJoiner) ValueBinder(com.google.cloud.spanner.ValueBinder) ConverterAwareMappingSpannerEntityWriter(org.springframework.cloud.gcp.data.spanner.core.convert.ConverterAwareMappingSpannerEntityWriter) SpannerCustomConverter(org.springframework.cloud.gcp.data.spanner.core.convert.SpannerCustomConverter) StringUtils(org.springframework.util.StringUtils) ArrayList(java.util.ArrayList) Iterator(java.util.Iterator) ArrayList(java.util.ArrayList) List(java.util.List) Key(com.google.cloud.spanner.Key) StringJoiner(java.util.StringJoiner) SpannerPersistentProperty(org.springframework.cloud.gcp.data.spanner.core.mapping.SpannerPersistentProperty)

Aggregations

Key (com.google.cloud.spanner.Key)1 KeySet (com.google.cloud.spanner.KeySet)1 Statement (com.google.cloud.spanner.Statement)1 Struct (com.google.cloud.spanner.Struct)1 ValueBinder (com.google.cloud.spanner.ValueBinder)1 Parameter (java.lang.reflect.Parameter)1 ParameterizedType (java.lang.reflect.ParameterizedType)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 Iterator (java.util.Iterator)1 List (java.util.List)1 Map (java.util.Map)1 StringJoiner (java.util.StringJoiner)1 BiFunction (java.util.function.BiFunction)1 Function (java.util.function.Function)1 Collectors (java.util.stream.Collectors)1 StreamSupport (java.util.stream.StreamSupport)1 SpannerPageableQueryOptions (org.springframework.cloud.gcp.data.spanner.core.SpannerPageableQueryOptions)1 SpannerTemplate (org.springframework.cloud.gcp.data.spanner.core.SpannerTemplate)1 ConversionUtils (org.springframework.cloud.gcp.data.spanner.core.convert.ConversionUtils)1