> requiredKeys =
+ Arrays.asList(
+ GrpcMetadataKeys.AUTHORIZATION_METADATA_KEY,
+ GrpcMetadataKeys.RECORDSPACE_METADATA_KEY,
+ GrpcMetadataKeys.TENANT_METADATA_KEY);
public AuthInterceptor(String key) {
biscuitManager = new BiscuitManager(key);
@@ -53,29 +52,30 @@ public AuthInterceptor(String key) {
/**
* Intercept {@link ServerCall} dispatch by the {@code next} {@link ServerCallHandler}. General
- * semantics of {@link ServerCallHandler#startCall} apply and the returned
- * {@link ServerCall.Listener} must not be {@code null}.
+ * semantics of {@link ServerCallHandler#startCall} apply and the returned {@link
+ * ServerCall.Listener} must not be {@code null}.
*
* If the implementation throws an exception, {@code call} will be closed with an error.
* Implementations must not throw an exception if they started processing that may use {@code
* call} on another thread.
*
- * @param call object to receive response messages
- * @param headers which can contain extra call metadata from {@link ClientCall#start},
- * e.g. authentication credentials.
- * @param next next processor in the interceptor chain
+ * @param call object to receive response messages
+ * @param headers which can contain extra call metadata from {@link ClientCall#start}, e.g.
+ * authentication credentials.
+ * @param next next processor in the interceptor chain
* @return listener for processing incoming messages for {@code call}, never {@code null}.
*/
@Override
- public ServerCall.Listener interceptCall(ServerCall call, Metadata headers, ServerCallHandler next) {
+ public ServerCall.Listener interceptCall(
+ ServerCall call, Metadata headers, ServerCallHandler next) {
Context context = Context.current();
LOGGER.info("{}", headers);
if (!headers.containsKey(GrpcMetadataKeys.AUTHORIZATION_METADATA_KEY)) {
- call.close(Status.PERMISSION_DENIED.withDescription("no authorization token"), new Metadata());
- return new ServerCall.Listener() {
- };
+ call.close(
+ Status.PERMISSION_DENIED.withDescription("no authorization token"), new Metadata());
+ return new ServerCall.Listener() {};
}
String tenant = getFromHeaders(headers, GrpcMetadataKeys.TENANT_METADATA_KEY);
@@ -83,27 +83,26 @@ public ServerCall.Listener interceptCall(ServerCall() {
- };
+ return new ServerCall.Listener() {};
}
String token = headers.get(GrpcMetadataKeys.AUTHORIZATION_METADATA_KEY);
if (token == null) {
call.close(Status.PERMISSION_DENIED.withDescription("no token provided"), new Metadata());
- return new ServerCall.Listener() {
- };
+ return new ServerCall.Listener() {};
}
if (!token.startsWith("Bearer ")) {
- call.close(Status.PERMISSION_DENIED.withDescription("expected format 'Bearer my-token'"), new Metadata());
- return new ServerCall.Listener() {
- };
+ call.close(
+ Status.PERMISSION_DENIED.withDescription("expected format 'Bearer my-token'"),
+ new Metadata());
+ return new ServerCall.Listener() {};
}
- Either result = this.biscuitManager.checkTenant(tenant, token.substring("Bearer ".length()));
+ Either result =
+ this.biscuitManager.checkTenant(tenant, token.substring("Bearer ".length()));
if (result.isLeft()) {
call.close(Status.UNAUTHENTICATED.withDescription("bad tenant and/or token"), headers);
- return new ServerCall.Listener() {
- };
+ return new ServerCall.Listener() {};
}
// Admin calls does not need recordSpaces
diff --git a/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/GrpcContextKeys.java b/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/GrpcContextKeys.java
index aaf49bf..c0e1318 100644
--- a/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/GrpcContextKeys.java
+++ b/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/GrpcContextKeys.java
@@ -20,10 +20,9 @@
import io.grpc.StatusRuntimeException;
public class GrpcContextKeys {
- /**
- * Key for accessing requested tenant id
- */
+ /** Key for accessing requested tenant id */
public static final Context.Key TENANT_ID_KEY = Context.key("tenant");
+
public static final Context.Key CONTAINER_NAME = Context.key("recordSpace");
public static String getTenantIDOrFail() throws StatusRuntimeException {
@@ -37,7 +36,8 @@ public static String getTenantIDOrFail() throws StatusRuntimeException {
public static String getContainerOrFail() throws StatusRuntimeException {
String recordSpace = GrpcContextKeys.CONTAINER_NAME.get();
if (recordSpace == null) {
- throw new StatusRuntimeException(Status.FAILED_PRECONDITION.withDescription("missing recordSpace"));
+ throw new StatusRuntimeException(
+ Status.FAILED_PRECONDITION.withDescription("missing recordSpace"));
}
return recordSpace;
}
diff --git a/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/GrpcMetadataKeys.java b/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/GrpcMetadataKeys.java
index bf537b9..31d03bc 100644
--- a/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/GrpcMetadataKeys.java
+++ b/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/GrpcMetadataKeys.java
@@ -15,12 +15,15 @@
*/
package fr.pierrezemb.recordstore.grpc;
-import io.grpc.Metadata;
-
import static io.grpc.Metadata.ASCII_STRING_MARSHALLER;
+import io.grpc.Metadata;
+
public class GrpcMetadataKeys {
- public static final Metadata.Key AUTHORIZATION_METADATA_KEY = Metadata.Key.of("Authorization", ASCII_STRING_MARSHALLER);
- public static final Metadata.Key TENANT_METADATA_KEY = Metadata.Key.of("Tenant", ASCII_STRING_MARSHALLER);
- public static final Metadata.Key RECORDSPACE_METADATA_KEY = Metadata.Key.of("RecordSpace", ASCII_STRING_MARSHALLER);
+ public static final Metadata.Key AUTHORIZATION_METADATA_KEY =
+ Metadata.Key.of("Authorization", ASCII_STRING_MARSHALLER);
+ public static final Metadata.Key TENANT_METADATA_KEY =
+ Metadata.Key.of("Tenant", ASCII_STRING_MARSHALLER);
+ public static final Metadata.Key RECORDSPACE_METADATA_KEY =
+ Metadata.Key.of("RecordSpace", ASCII_STRING_MARSHALLER);
}
diff --git a/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/ManagedKVService.java b/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/ManagedKVService.java
new file mode 100644
index 0000000..12b79c9
--- /dev/null
+++ b/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/ManagedKVService.java
@@ -0,0 +1,120 @@
+/**
+ * Copyright 2020 Pierre Zemb
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package fr.pierrezemb.recordstore.grpc;
+
+import com.apple.foundationdb.record.RecordMetaData;
+import com.apple.foundationdb.record.RecordMetaDataBuilder;
+import com.apple.foundationdb.record.metadata.Key;
+import com.apple.foundationdb.record.query.RecordQuery;
+import com.apple.foundationdb.record.query.expressions.Query;
+import com.apple.foundationdb.tuple.Tuple;
+import fr.pierrezemb.recordstore.fdb.RecordLayer;
+import fr.pierrezemb.recordstore.proto.managed.kv.ManagedKVGrpc;
+import fr.pierrezemb.recordstore.proto.managed.kv.ManagedKVProto;
+import io.grpc.Status;
+import io.grpc.StatusRuntimeException;
+import io.grpc.stub.StreamObserver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ManagedKVService extends ManagedKVGrpc.ManagedKVImplBase {
+ private static final Logger LOGGER = LoggerFactory.getLogger(ManagedKVService.class);
+ private static final String MANAGED_KV_NAME = "managedKV";
+ private final RecordLayer recordLayer;
+ private final RecordMetaData recordMetaData;
+
+ public ManagedKVService(RecordLayer recordLayer) {
+ this.recordLayer = recordLayer;
+ RecordMetaDataBuilder recordMetaDataBuilder =
+ RecordMetaData.newBuilder().setRecords(ManagedKVProto.getDescriptor());
+ recordMetaDataBuilder.getRecordType("KeyValue").setPrimaryKey(Key.Expressions.field("key"));
+ this.recordMetaData = recordMetaDataBuilder.build();
+ }
+
+ @Override
+ public void put(
+ ManagedKVProto.KeyValue request,
+ StreamObserver responseObserver) {
+ String tenantID = GrpcContextKeys.getTenantIDOrFail();
+ String recordSpace = GrpcContextKeys.getContainerOrFail();
+
+ try {
+ this.recordLayer.putRecord(
+ tenantID, MANAGED_KV_NAME, recordSpace, this.recordMetaData, request);
+ } catch (RuntimeException e) {
+ LOGGER.error(e.getMessage());
+ throw new StatusRuntimeException(Status.INTERNAL.withDescription(e.getMessage()));
+ }
+
+ responseObserver.onNext(ManagedKVProto.EmptyResponse.newBuilder().build());
+ responseObserver.onCompleted();
+ }
+
+ @Override
+ public void delete(
+ ManagedKVProto.DeleteRequest request,
+ StreamObserver responseObserver) {
+ String tenantID = GrpcContextKeys.getTenantIDOrFail();
+ String recordSpace = GrpcContextKeys.getContainerOrFail();
+
+ Tuple primaryKey = Tuple.from(request.getKeyToDelete().toByteArray());
+
+ try {
+ boolean deleted =
+ this.recordLayer.deleteRecord(
+ tenantID, MANAGED_KV_NAME, recordSpace, this.recordMetaData, primaryKey);
+ LOGGER.debug("delete({})={}", primaryKey.toString(), deleted);
+ responseObserver.onNext(ManagedKVProto.EmptyResponse.newBuilder().build());
+ } catch (RuntimeException e) {
+ LOGGER.error(e.getMessage());
+ throw new StatusRuntimeException(Status.INTERNAL.withDescription(e.getMessage()));
+ }
+ responseObserver.onCompleted();
+ }
+
+ @Override
+ public void scan(
+ ManagedKVProto.ScanRequest request,
+ StreamObserver responseObserver) {
+ String tenantID = GrpcContextKeys.getTenantIDOrFail();
+ String recordSpace = GrpcContextKeys.getContainerOrFail();
+
+ RecordQuery query =
+ RecordQuery.newBuilder()
+ .setRecordType("KeyValue")
+ .setFilter(
+ request.getEndKey().isEmpty()
+ ? Query.field("key").equalsValue(request.getStartKey().toByteArray())
+ : Query.and(
+ Query.field("key").greaterThanOrEquals(request.getStartKey().toByteArray()),
+ Query.field("key").lessThanOrEquals(request.getEndKey().toByteArray())))
+ .build();
+
+ try {
+ this.recordLayer
+ .scanRecords(tenantID, MANAGED_KV_NAME, recordSpace, this.recordMetaData, query)
+ .stream()
+ .map(
+ queriedRecord ->
+ ManagedKVProto.KeyValue.newBuilder().mergeFrom(queriedRecord).build())
+ .forEach(responseObserver::onNext);
+ } catch (RuntimeException e) {
+ LOGGER.error(e.getMessage());
+ throw new StatusRuntimeException(Status.INTERNAL.withDescription(e.getMessage()));
+ }
+ responseObserver.onCompleted();
+ }
+}
diff --git a/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/RecordService.java b/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/RecordService.java
index 7920ff0..5b3a343 100644
--- a/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/RecordService.java
+++ b/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/RecordService.java
@@ -41,14 +41,18 @@ public RecordService(RecordLayer recordLayer) {
* @param responseObserver
*/
@Override
- public void put(RecordStoreProtocol.PutRecordRequest request, StreamObserver responseObserver) {
+ public void put(
+ RecordStoreProtocol.PutRecordRequest request,
+ StreamObserver responseObserver) {
String tenantID = GrpcContextKeys.getTenantIDOrFail();
String recordSpace = GrpcContextKeys.getContainerOrFail();
try {
- this.recordLayer.putRecord(tenantID, recordSpace, request.getRecordTypeName(), request.getMessage().toByteArray());
+ this.recordLayer.putRecord(
+ tenantID, recordSpace, request.getRecordTypeName(), request.getMessage().toByteArray());
} catch (InvalidProtocolBufferException e) {
- throw new StatusRuntimeException(Status.INVALID_ARGUMENT.withDescription("could not parse Protobuf: " + e.getMessage()));
+ throw new StatusRuntimeException(
+ Status.INVALID_ARGUMENT.withDescription("could not parse Protobuf: " + e.getMessage()));
} catch (RuntimeException e) {
log.error(e.getMessage());
throw new StatusRuntimeException(Status.INTERNAL.withDescription(e.getMessage()));
@@ -58,19 +62,23 @@ public void put(RecordStoreProtocol.PutRecordRequest request, StreamObserver responseObserver) {
+ public void query(
+ RecordStoreProtocol.QueryRequest request,
+ StreamObserver responseObserver) {
String tenantID = GrpcContextKeys.getTenantIDOrFail();
String recordSpace = GrpcContextKeys.getContainerOrFail();
RecordQuery query = GrpcQueryGenerator.generate(request);
- IsolationLevel isolationLevel = request
- .getQueryIsolationLevel().equals(RecordStoreProtocol.QueryIsolationLevel.SERIALIZABLE) ?
- IsolationLevel.SERIALIZABLE : IsolationLevel.SNAPSHOT;
+ IsolationLevel isolationLevel =
+ request
+ .getQueryIsolationLevel()
+ .equals(RecordStoreProtocol.QueryIsolationLevel.SERIALIZABLE)
+ ? IsolationLevel.SERIALIZABLE
+ : IsolationLevel.SNAPSHOT;
try {
this.recordLayer.queryRecords(tenantID, recordSpace, query, isolationLevel, responseObserver);
@@ -81,13 +89,14 @@ public void query(RecordStoreProtocol.QueryRequest request, StreamObserver responseObserver) {
+ public void delete(
+ RecordStoreProtocol.DeleteRecordRequest request,
+ StreamObserver responseObserver) {
String tenantID = GrpcContextKeys.getTenantIDOrFail();
String recordSpace = GrpcContextKeys.getContainerOrFail();
@@ -100,9 +109,8 @@ public void delete(RecordStoreProtocol.DeleteRecordRequest request, StreamObserv
count = this.recordLayer.deleteRecords(tenantID, recordSpace, query);
}
- responseObserver.onNext(RecordStoreProtocol.DeleteRecordResponse.newBuilder()
- .setDeletedCount(count)
- .build());
+ responseObserver.onNext(
+ RecordStoreProtocol.DeleteRecordResponse.newBuilder().setDeletedCount(count).build());
responseObserver.onCompleted();
} catch (RuntimeException e) {
log.error(e.getMessage());
@@ -111,17 +119,20 @@ public void delete(RecordStoreProtocol.DeleteRecordRequest request, StreamObserv
}
@Override
- public void getQueryPlan(RecordStoreProtocol.QueryRequest request, StreamObserver responseObserver) {
+ public void getQueryPlan(
+ RecordStoreProtocol.QueryRequest request,
+ StreamObserver responseObserver) {
String tenantID = GrpcContextKeys.getTenantIDOrFail();
String recordSpace = GrpcContextKeys.getContainerOrFail();
RecordQuery query = GrpcQueryGenerator.generate(request);
try {
String queryPlan = this.recordLayer.getQueryPlan(tenantID, recordSpace, query);
- responseObserver.onNext(RecordStoreProtocol.GetQueryPlanResponse.newBuilder()
- .setQueryPlan(query.toString())
- .setQueryPlan(queryPlan)
- .build());
+ responseObserver.onNext(
+ RecordStoreProtocol.GetQueryPlanResponse.newBuilder()
+ .setQueryPlan(query.toString())
+ .setQueryPlan(queryPlan)
+ .build());
responseObserver.onCompleted();
} catch (RuntimeException e) {
log.error(e.getMessage());
diff --git a/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/SchemaService.java b/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/SchemaService.java
index 5689a78..650279e 100644
--- a/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/SchemaService.java
+++ b/record-store/src/main/java/fr/pierrezemb/recordstore/grpc/SchemaService.java
@@ -27,11 +27,10 @@
import io.grpc.Status;
import io.grpc.StatusRuntimeException;
import io.grpc.stub.StreamObserver;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import java.util.List;
import java.util.stream.Collectors;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class SchemaService extends SchemaServiceGrpc.SchemaServiceImplBase {
private static final Logger log = LoggerFactory.getLogger(SchemaService.class);
@@ -46,33 +45,47 @@ public SchemaService(RecordLayer recordLayer) {
* @param responseObserver
*/
@Override
- public void get(RecordStoreProtocol.GetSchemaRequest request, StreamObserver responseObserver) {
+ public void get(
+ RecordStoreProtocol.GetSchemaRequest request,
+ StreamObserver responseObserver) {
String tenantID = GrpcContextKeys.getTenantIDOrFail();
String recordSpace = GrpcContextKeys.getContainerOrFail();
try {
- List indexes = recordLayer.getIndexes(tenantID, recordSpace);
+ List indexes =
+ recordLayer.getIndexes(tenantID, recordSpace);
RecordMetaData metadataStore = recordLayer.getSchema(tenantID, recordSpace);
List records =
- ImmutableMap.of(request.getRecordTypeName(), metadataStore.getRecordMetaData().getRecordType(request.getRecordTypeName()))
- .entrySet()
- .stream()
- .map(e -> RecordStoreProtocol.SchemaDescription.newBuilder()
- .setName(e.getKey())
- .addAllIndexes(indexes)
- .addPrimaryKeyField(e.getValue().getPrimaryKey().toKeyExpression().getField().getFieldName())
- .setSchema(ProtobufReflectionUtil.protoFileDescriptorSet(e.getValue().getDescriptor()))
- .build())
- .collect(Collectors.toList());
-
-
- responseObserver.onNext(RecordStoreProtocol.GetSchemaResponse.newBuilder()
- .setSchemas(records.get(0))
- .setVersion(metadataStore.getRecordMetaData().getVersion())
- .build());
+ ImmutableMap.of(
+ request.getRecordTypeName(),
+ metadataStore.getRecordMetaData().getRecordType(request.getRecordTypeName()))
+ .entrySet()
+ .stream()
+ .map(
+ e ->
+ RecordStoreProtocol.SchemaDescription.newBuilder()
+ .setName(e.getKey())
+ .addAllIndexes(indexes)
+ .addPrimaryKeyField(
+ e.getValue()
+ .getPrimaryKey()
+ .toKeyExpression()
+ .getField()
+ .getFieldName())
+ .setSchema(
+ ProtobufReflectionUtil.protoFileDescriptorSet(
+ e.getValue().getDescriptor()))
+ .build())
+ .collect(Collectors.toList());
+
+ responseObserver.onNext(
+ RecordStoreProtocol.GetSchemaResponse.newBuilder()
+ .setSchemas(records.get(0))
+ .setVersion(metadataStore.getRecordMetaData().getVersion())
+ .build());
responseObserver.onCompleted();
} catch (RuntimeException e) {
log.error(e.getMessage());
@@ -80,18 +93,20 @@ public void get(RecordStoreProtocol.GetSchemaRequest request, StreamObserver responseObserver) {
+ public void upsert(
+ RecordStoreProtocol.UpsertSchemaRequest request,
+ StreamObserver responseObserver) {
String tenantID = GrpcContextKeys.getTenantIDOrFail();
String recordSpace = GrpcContextKeys.getContainerOrFail();
try {
- recordLayer.upsertSchema(tenantID, recordSpace, request.getSchema(), request.getRecordTypeIndexDefinitionsList());
+ recordLayer.upsertSchema(
+ tenantID, recordSpace, request.getSchema(), request.getRecordTypeIndexDefinitionsList());
} catch (MetaDataException | Descriptors.DescriptorValidationException e) {
log.error(e.getMessage());
throw new StatusRuntimeException(Status.INTERNAL.withDescription(e.getMessage()));
@@ -101,22 +116,24 @@ public void upsert(RecordStoreProtocol.UpsertSchemaRequest request, StreamObserv
responseObserver.onCompleted();
}
-
/**
* @param request
* @param responseObserver
*/
@Override
- public void stat(RecordStoreProtocol.StatRequest request, StreamObserver responseObserver) {
+ public void stat(
+ RecordStoreProtocol.StatRequest request,
+ StreamObserver responseObserver) {
String tenantID = GrpcContextKeys.getTenantIDOrFail();
String recordSpace = GrpcContextKeys.getContainerOrFail();
try {
Tuple result = recordLayer.getCountAndCountUpdates(tenantID, recordSpace);
- responseObserver.onNext(RecordStoreProtocol.StatResponse.newBuilder()
- .setCount(result.getLong(0))
- .setCountUpdates(result.getLong(1))
- .build());
+ responseObserver.onNext(
+ RecordStoreProtocol.StatResponse.newBuilder()
+ .setCount(result.getLong(0))
+ .setCountUpdates(result.getLong(1))
+ .build());
responseObserver.onCompleted();
} catch (RuntimeException e) {
log.error(e.getMessage());
diff --git a/record-store/src/main/java/fr/pierrezemb/recordstore/query/GraphQLQueryGenerator.java b/record-store/src/main/java/fr/pierrezemb/recordstore/query/GraphQLQueryGenerator.java
index 657084e..d43a83e 100644
--- a/record-store/src/main/java/fr/pierrezemb/recordstore/query/GraphQLQueryGenerator.java
+++ b/record-store/src/main/java/fr/pierrezemb/recordstore/query/GraphQLQueryGenerator.java
@@ -20,8 +20,7 @@
public class GraphQLQueryGenerator {
public static RecordQuery generate(DataFetchingEnvironment env) {
- RecordQuery.Builder queryBuilder = RecordQuery.newBuilder()
- .setRecordType("User");
+ RecordQuery.Builder queryBuilder = RecordQuery.newBuilder().setRecordType("User");
return queryBuilder.build();
}
}
diff --git a/record-store/src/main/java/fr/pierrezemb/recordstore/query/GrpcQueryGenerator.java b/record-store/src/main/java/fr/pierrezemb/recordstore/query/GrpcQueryGenerator.java
index e89e27f..9723aff 100644
--- a/record-store/src/main/java/fr/pierrezemb/recordstore/query/GrpcQueryGenerator.java
+++ b/record-store/src/main/java/fr/pierrezemb/recordstore/query/GrpcQueryGenerator.java
@@ -24,27 +24,27 @@
import fr.pierrezemb.recordstore.proto.RecordStoreProtocol;
import io.grpc.Status;
import io.grpc.StatusRuntimeException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class GrpcQueryGenerator {
private static final Logger LOGGER = LoggerFactory.getLogger(GrpcQueryGenerator.class);
public static RecordQuery generate(RecordStoreProtocol.QueryRequest request) {
- RecordQuery.Builder queryBuilder = RecordQuery.newBuilder()
- .setRecordType(request.getRecordTypeName());
+ RecordQuery.Builder queryBuilder =
+ RecordQuery.newBuilder().setRecordType(request.getRecordTypeName());
if (request.getFieldsToReturnCount() > 0) {
- queryBuilder.setRequiredResults(request.getFieldsToReturnList().asByteStringList()
- .stream()
- .map(e -> Key.Expressions.field(String.valueOf(e.toString()))).collect(Collectors.toList()));
+ queryBuilder.setRequiredResults(
+ request.getFieldsToReturnList().asByteStringList().stream()
+ .map(e -> Key.Expressions.field(String.valueOf(e.toString())))
+ .collect(Collectors.toList()));
}
if (request.hasSortBy()) {
@@ -65,7 +65,8 @@ public static RecordQuery generate(RecordStoreProtocol.QueryRequest request) {
queryBuilder.setSort(Key.Expressions.field(request.getSortBy().getField()), true);
break;
case UNRECOGNIZED:
- throw new StatusRuntimeException(Status.INVALID_ARGUMENT.withDescription("cannot recognize sortBy"));
+ throw new StatusRuntimeException(
+ Status.INVALID_ARGUMENT.withDescription("cannot recognize sortBy"));
}
}
@@ -78,8 +79,8 @@ public static RecordQuery generate(RecordStoreProtocol.QueryRequest request) {
}
public static RecordQuery generate(RecordStoreProtocol.DeleteRecordRequest request) {
- RecordQuery.Builder queryBuilder = RecordQuery.newBuilder()
- .setRecordType(request.getRecordTypeName());
+ RecordQuery.Builder queryBuilder =
+ RecordQuery.newBuilder().setRecordType(request.getRecordTypeName());
try {
QueryComponent queryComponents = parseNode(request.getFilter());
@@ -92,14 +93,14 @@ public static RecordQuery generate(RecordStoreProtocol.DeleteRecordRequest reque
return queryBuilder.build();
}
- public static QueryComponent parseNode(RecordStoreProtocol.QueryFilterNode node) throws ParseException {
+ public static QueryComponent parseNode(RecordStoreProtocol.QueryFilterNode node)
+ throws ParseException {
if (node == null) {
return null;
}
switch (node.getContentCase()) {
-
case FIELD_NODE:
return parseFieldNode(node.getFieldNode());
case AND_NODE:
@@ -115,20 +116,23 @@ public static QueryComponent parseNode(RecordStoreProtocol.QueryFilterNode node)
private static QueryComponent handleMapNode(RecordStoreProtocol.QueryFilterMapNode mapNode) {
if (mapNode.hasKey() && !mapNode.hasValue()) {
- return Query.field(mapNode.getField()).mapMatches(constructFunctionMatcher(mapNode.getKey()), null);
+ return Query.field(mapNode.getField())
+ .mapMatches(constructFunctionMatcher(mapNode.getKey()), null);
}
if (!mapNode.hasKey() && mapNode.hasValue()) {
- return Query.field(mapNode.getField()).mapMatches(null, constructFunctionMatcher(mapNode.getValue()));
+ return Query.field(mapNode.getField())
+ .mapMatches(null, constructFunctionMatcher(mapNode.getValue()));
}
- return Query.field(mapNode.getField()).mapMatches(
- constructFunctionMatcher(mapNode.getKey()),
- constructFunctionMatcher(mapNode.getValue())
- );
+ return Query.field(mapNode.getField())
+ .mapMatches(
+ constructFunctionMatcher(mapNode.getKey()),
+ constructFunctionMatcher(mapNode.getValue()));
}
- private static Function constructFunctionMatcher(RecordStoreProtocol.QueryFilterFieldNode node) {
+ private static Function constructFunctionMatcher(
+ RecordStoreProtocol.QueryFilterFieldNode node) {
return k -> {
try {
return switchOnOperations(k, node);
@@ -139,8 +143,8 @@ private static Function constructFunctionMatcher(RecordSt
};
}
-
- private static List parseChildrenNodes(RecordStoreProtocol.QueryFilterOrNode node) throws ParseException {
+ private static List parseChildrenNodes(RecordStoreProtocol.QueryFilterOrNode node)
+ throws ParseException {
List queryComponents = new ArrayList<>();
for (RecordStoreProtocol.QueryFilterNode children : node.getNodesList()) {
queryComponents.add(parseNode(children));
@@ -148,7 +152,8 @@ private static List parseChildrenNodes(RecordStoreProtocol.Query
return queryComponents;
}
- private static List parseChildrenNodes(RecordStoreProtocol.QueryFilterAndNode node) throws ParseException {
+ private static List parseChildrenNodes(
+ RecordStoreProtocol.QueryFilterAndNode node) throws ParseException {
List queryComponents = new ArrayList<>();
for (RecordStoreProtocol.QueryFilterNode children : node.getNodesList()) {
queryComponents.add(parseNode(children));
@@ -156,7 +161,8 @@ private static List parseChildrenNodes(RecordStoreProtocol.Query
return queryComponents;
}
- private static QueryComponent parseFieldNode(RecordStoreProtocol.QueryFilterFieldNode node) throws ParseException {
+ private static QueryComponent parseFieldNode(RecordStoreProtocol.QueryFilterFieldNode node)
+ throws ParseException {
if (node == null) {
throw new ParseException("node is null", 0);
}
@@ -166,47 +172,49 @@ private static QueryComponent parseFieldNode(RecordStoreProtocol.QueryFilterFiel
return switchOnOperations(temporaryQuery, node);
}
- private static QueryComponent switchOnOperations(Field temporaryQuery, RecordStoreProtocol.QueryFilterFieldNode node) throws ParseException {
+ private static QueryComponent switchOnOperations(
+ Field temporaryQuery, RecordStoreProtocol.QueryFilterFieldNode node) throws ParseException {
switch (node.getOperation()) {
case GREATER_THAN_OR_EQUALS:
- return node.getIsFieldDefinedAsRepeated() ?
- temporaryQuery.oneOfThem().greaterThanOrEquals(parseValue(node)) :
- temporaryQuery.greaterThanOrEquals(parseValue(node));
+ return node.getIsFieldDefinedAsRepeated()
+ ? temporaryQuery.oneOfThem().greaterThanOrEquals(parseValue(node))
+ : temporaryQuery.greaterThanOrEquals(parseValue(node));
case LESS_THAN_OR_EQUALS:
- return node.getIsFieldDefinedAsRepeated() ?
- temporaryQuery.oneOfThem().lessThanOrEquals(parseValue(node)) :
- temporaryQuery.lessThanOrEquals(parseValue(node));
+ return node.getIsFieldDefinedAsRepeated()
+ ? temporaryQuery.oneOfThem().lessThanOrEquals(parseValue(node))
+ : temporaryQuery.lessThanOrEquals(parseValue(node));
case GREATER_THAN:
- return node.getIsFieldDefinedAsRepeated() ?
- temporaryQuery.oneOfThem().greaterThan(parseValue(node)) :
- temporaryQuery.greaterThan(parseValue(node));
+ return node.getIsFieldDefinedAsRepeated()
+ ? temporaryQuery.oneOfThem().greaterThan(parseValue(node))
+ : temporaryQuery.greaterThan(parseValue(node));
case LESS_THAN:
- return node.getIsFieldDefinedAsRepeated() ?
- temporaryQuery.oneOfThem().lessThan(parseValue(node)) :
- temporaryQuery.lessThan(parseValue(node));
+ return node.getIsFieldDefinedAsRepeated()
+ ? temporaryQuery.oneOfThem().lessThan(parseValue(node))
+ : temporaryQuery.lessThan(parseValue(node));
case START_WITH:
- return node.getIsFieldDefinedAsRepeated() ?
- temporaryQuery.oneOfThem().startsWith(String.valueOf(parseValue(node))) :
- temporaryQuery.startsWith(String.valueOf(parseValue(node)));
+ return node.getIsFieldDefinedAsRepeated()
+ ? temporaryQuery.oneOfThem().startsWith(String.valueOf(parseValue(node)))
+ : temporaryQuery.startsWith(String.valueOf(parseValue(node)));
case IS_EMPTY:
return Query.field(node.getField()).isEmpty();
case IS_NULL:
return Query.field(node.getField()).isNull();
case EQUALS:
- return node.getIsFieldDefinedAsRepeated() ?
- temporaryQuery.oneOfThem().equalsValue(parseValue(node)) :
- temporaryQuery.equalsValue(parseValue(node));
+ return node.getIsFieldDefinedAsRepeated()
+ ? temporaryQuery.oneOfThem().equalsValue(parseValue(node))
+ : temporaryQuery.equalsValue(parseValue(node));
case NOT_EQUALS:
- return node.getIsFieldDefinedAsRepeated() ?
- temporaryQuery.oneOfThem().notEquals(parseValue(node)) :
- temporaryQuery.notEquals(parseValue(node));
+ return node.getIsFieldDefinedAsRepeated()
+ ? temporaryQuery.oneOfThem().notEquals(parseValue(node))
+ : temporaryQuery.notEquals(parseValue(node));
case NOT_NULL:
return Query.field(node.getField()).notNull();
case MATCHES:
if (node.getValueCase() != RecordStoreProtocol.QueryFilterFieldNode.ValueCase.FIELDNODE) {
throw new ParseException("Matches onl accept a nested FieldValue", 0);
}
- return Query.field(node.getField()).matches(Objects.requireNonNull(parseFieldNode(node.getFieldNode())));
+ return Query.field(node.getField())
+ .matches(Objects.requireNonNull(parseFieldNode(node.getFieldNode())));
case TEXT_CONTAINS_ANY:
return Query.field(node.getField()).text().containsAny(node.getTokensList());
case TEXT_CONTAINS_ALL:
@@ -218,7 +226,8 @@ private static QueryComponent switchOnOperations(Field temporaryQuery, RecordSto
}
}
- private static Object parseValue(RecordStoreProtocol.QueryFilterFieldNode node) throws ParseException {
+ private static Object parseValue(RecordStoreProtocol.QueryFilterFieldNode node)
+ throws ParseException {
switch (node.getValueCase()) {
case STRING_VALUE:
return node.getStringValue();
diff --git a/record-store/src/main/java/fr/pierrezemb/recordstore/utils/graphql/ProtoDataFetcher.java b/record-store/src/main/java/fr/pierrezemb/recordstore/utils/graphql/ProtoDataFetcher.java
index 1eb75ed..76e4534 100644
--- a/record-store/src/main/java/fr/pierrezemb/recordstore/utils/graphql/ProtoDataFetcher.java
+++ b/record-store/src/main/java/fr/pierrezemb/recordstore/utils/graphql/ProtoDataFetcher.java
@@ -23,15 +23,14 @@
import graphql.schema.DataFetchingEnvironment;
import graphql.schema.GraphQLEnumType;
import graphql.schema.GraphQLType;
-
import java.lang.reflect.Method;
import java.util.Map;
final class ProtoDataFetcher implements DataFetcher