Skip to content

Eng 11242 #98

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Sep 2, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions hypertrace-graphql-labels-schema/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ dependencies {
implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-grpc-utils")
implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-schema-utils")
implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-rx-utils")
implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-deserialization")

implementation(project(":hypertrace-graphql-service-config"))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.hypertrace.core.graphql.spi.schema.GraphQlSchemaFragment;
import org.hypertrace.graphql.label.schema.LabelSchema;
import org.hypertrace.graphql.label.schema.mutation.LabelMutationSchema;

class LabelSchemaFragment implements GraphQlSchemaFragment {

Expand All @@ -14,4 +15,9 @@ public String fragmentName() {
public Class<LabelSchema> annotatedQueryClass() {
return LabelSchema.class;
}

@Override
public Class<?> annotatedMutationClass() {
return LabelMutationSchema.class;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import com.google.inject.multibindings.Multibinder;
import org.hypertrace.core.graphql.spi.schema.GraphQlSchemaFragment;
import org.hypertrace.graphql.label.dao.LabelDaoModule;
import org.hypertrace.graphql.label.deserialization.LabelDeserializationModule;
import org.hypertrace.graphql.label.request.LabelRequestModule;

public class LabelSchemaModule extends AbstractModule {
@Override
Expand All @@ -13,5 +15,7 @@ protected void configure() {
.to(LabelSchemaFragment.class);

install(new LabelDaoModule());
install(new LabelDeserializationModule());
install(new LabelRequestModule());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,16 @@

import io.grpc.CallCredentials;
import io.reactivex.rxjava3.core.Single;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import org.hypertrace.core.graphql.common.request.ContextualRequest;
import org.hypertrace.core.graphql.context.GraphQlRequestContext;
import org.hypertrace.core.graphql.utils.grpc.GrpcChannelRegistry;
import org.hypertrace.core.graphql.utils.grpc.GrpcContextBuilder;
import org.hypertrace.graphql.config.HypertraceGraphQlServiceConfig;
import org.hypertrace.graphql.label.request.LabelCreateRequest;
import org.hypertrace.graphql.label.request.LabelUpdateRequest;
import org.hypertrace.graphql.label.schema.Label;
import org.hypertrace.graphql.label.schema.LabelResultSet;
import org.hypertrace.label.config.service.v1.GetLabelsRequest;
import org.hypertrace.label.config.service.v1.GetLabelsResponse;
Expand All @@ -20,18 +24,21 @@ class LabelConfigServiceDao implements LabelDao {
private final LabelsConfigServiceFutureStub labelConfigServiceStub;
private final GrpcContextBuilder grpcContextBuilder;
private final HypertraceGraphQlServiceConfig serviceConfig;
private final LabelResponseConverter converter;
private final LabelRequestConverter requestConverter;
private final LabelResponseConverter responseConverter;

@Inject
LabelConfigServiceDao(
HypertraceGraphQlServiceConfig serviceConfig,
CallCredentials credentials,
GrpcContextBuilder grpcContextBuilder,
GrpcChannelRegistry grpcChannelRegistry,
LabelResponseConverter converter) {
LabelRequestConverter requestConverter,
LabelResponseConverter responseConverter) {
this.grpcContextBuilder = grpcContextBuilder;
this.serviceConfig = serviceConfig;
this.converter = converter;
this.requestConverter = requestConverter;
this.responseConverter = responseConverter;
this.labelConfigServiceStub =
LabelsConfigServiceGrpc.newFutureStub(
grpcChannelRegistry.forAddress(
Expand All @@ -42,7 +49,7 @@ class LabelConfigServiceDao implements LabelDao {
@Override
public Single<LabelResultSet> getLabels(ContextualRequest request) {
return this.makeRequest(request.context(), GetLabelsRequest.getDefaultInstance())
.flatMap(serverResponse -> converter.convert(serverResponse));
.flatMap(this.responseConverter::convert);
}

private Single<GetLabelsResponse> makeRequest(
Expand All @@ -57,4 +64,34 @@ private Single<GetLabelsResponse> makeRequest(
serviceConfig.getConfigServiceTimeout().toMillis(), MILLISECONDS)
.getLabels(request)));
}

@Override
public Single<Label> createLabel(LabelCreateRequest request) {
return Single.fromFuture(
this.grpcContextBuilder
.build(request.context())
.call(
() ->
this.labelConfigServiceStub
.withDeadlineAfter(
serviceConfig.getConfigServiceTimeout().toMillis(),
TimeUnit.MILLISECONDS)
.createLabel(this.requestConverter.convertCreationRequest(request))))
.flatMap(this.responseConverter::convertLabel);
}

@Override
public Single<Label> updateLabel(LabelUpdateRequest request) {
return Single.fromFuture(
this.grpcContextBuilder
.build(request.context())
.call(
() ->
this.labelConfigServiceStub
.withDeadlineAfter(
serviceConfig.getConfigServiceTimeout().toMillis(),
TimeUnit.MILLISECONDS)
.updateLabel(this.requestConverter.convertUpdateRequest(request))))
.flatMap(this.responseConverter::convertUpdateLabel);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,15 @@

import io.reactivex.rxjava3.core.Single;
import org.hypertrace.core.graphql.common.request.ContextualRequest;
import org.hypertrace.graphql.label.request.LabelCreateRequest;
import org.hypertrace.graphql.label.request.LabelUpdateRequest;
import org.hypertrace.graphql.label.schema.Label;
import org.hypertrace.graphql.label.schema.LabelResultSet;

public interface LabelDao {

Single<LabelResultSet> getLabels(ContextualRequest request);

Single<Label> createLabel(LabelCreateRequest request);

Single<Label> updateLabel(LabelUpdateRequest request);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.hypertrace.graphql.label.dao;

import org.hypertrace.graphql.label.request.LabelCreateRequest;
import org.hypertrace.graphql.label.request.LabelUpdateRequest;
import org.hypertrace.label.config.service.v1.CreateLabel;
import org.hypertrace.label.config.service.v1.CreateLabelRequest;
import org.hypertrace.label.config.service.v1.Label;
import org.hypertrace.label.config.service.v1.UpdateLabelRequest;

public class LabelRequestConverter {
CreateLabelRequest convertCreationRequest(LabelCreateRequest creationRequest) {
return CreateLabelRequest.newBuilder()
.setLabel(CreateLabel.newBuilder().setKey(creationRequest.label().key()).build())
.build();
}

UpdateLabelRequest convertUpdateRequest(LabelUpdateRequest updateRequest) {
return UpdateLabelRequest.newBuilder()
.setLabel(
Label.newBuilder()
.setKey(updateRequest.label().key())
.setId(updateRequest.label().id())
.build())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
import lombok.experimental.Accessors;
import org.hypertrace.graphql.label.schema.Label;
import org.hypertrace.graphql.label.schema.LabelResultSet;
import org.hypertrace.label.config.service.v1.CreateLabelResponse;
import org.hypertrace.label.config.service.v1.GetLabelsResponse;
import org.hypertrace.label.config.service.v1.UpdateLabelResponse;

class LabelResponseConverter {

Expand All @@ -19,6 +21,14 @@ Single<LabelResultSet> convert(GetLabelsResponse response) {
return Single.just(new DefaultLabelResultSet(labelList, labelList.size(), labelList.size()));
}

Single<Label> convertLabel(CreateLabelResponse response) {
return Single.just(new DefaultLabel(response.getLabel().getId(), response.getLabel().getKey()));
}

Single<Label> convertUpdateLabel(UpdateLabelResponse response) {
return Single.just(new DefaultLabel(response.getLabel().getId(), response.getLabel().getKey()));
}

@Value
@Accessors(fluent = true)
private static class DefaultLabelResultSet implements LabelResultSet {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package org.hypertrace.graphql.label.deserialization;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.databind.module.SimpleModule;
import java.util.List;
import lombok.NoArgsConstructor;
import lombok.Value;
import lombok.experimental.Accessors;
import org.hypertrace.core.graphql.deserialization.ArgumentDeserializationConfig;
import org.hypertrace.graphql.label.schema.mutation.CreateLabel;

public class CreateLabelDeserializationConfig implements ArgumentDeserializationConfig {
@Override
public String getArgumentKey() {
return CreateLabel.ARGUMENT_NAME;
}

@Override
public Class<?> getArgumentSchema() {
return CreateLabel.class;
}

@Override
public List<Module> jacksonModules() {
return List.of(
new SimpleModule().addAbstractTypeMapping(CreateLabel.class, CreateLabelArgument.class));
}

@Value
@Accessors(fluent = true)
@NoArgsConstructor(force = true)
private static class CreateLabelArgument implements CreateLabel {
@JsonProperty(KEY)
String key;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package org.hypertrace.graphql.label.deserialization;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.databind.module.SimpleModule;
import java.util.List;
import lombok.NoArgsConstructor;
import lombok.Value;
import lombok.experimental.Accessors;
import org.hypertrace.core.graphql.deserialization.ArgumentDeserializationConfig;
import org.hypertrace.graphql.label.schema.Label;

public class LabelDeserializationConfig implements ArgumentDeserializationConfig {

@Override
public String getArgumentKey() {
return Label.ARGUMENT_NAME;
}

@Override
public Class<?> getArgumentSchema() {
return Label.class;
}

@Override
public List<Module> jacksonModules() {
return List.of(new SimpleModule().addAbstractTypeMapping(Label.class, LabelArgument.class));
}

@Value
@Accessors(fluent = true)
@NoArgsConstructor(force = true)
private static class LabelArgument implements Label {
@JsonProperty(IDENTITY_FIELD_NAME)
String id;

@JsonProperty(KEY)
String key;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.hypertrace.graphql.label.deserialization;

import com.google.inject.AbstractModule;
import com.google.inject.multibindings.Multibinder;
import org.hypertrace.core.graphql.deserialization.ArgumentDeserializationConfig;

public class LabelDeserializationModule extends AbstractModule {
@Override
protected void configure() {
Multibinder<ArgumentDeserializationConfig> deserializationConfigBinder =
Multibinder.newSetBinder(binder(), ArgumentDeserializationConfig.class);

deserializationConfigBinder.addBinding().to(CreateLabelDeserializationConfig.class);
deserializationConfigBinder.addBinding().to(LabelDeserializationConfig.class);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package org.hypertrace.graphql.label.mutator;

import graphql.schema.DataFetcher;
import graphql.schema.DataFetchingEnvironment;
import java.util.concurrent.CompletableFuture;
import javax.inject.Inject;
import org.hypertrace.core.graphql.common.fetcher.InjectableDataFetcher;
import org.hypertrace.graphql.label.dao.LabelDao;
import org.hypertrace.graphql.label.request.LabelRequestBuilder;
import org.hypertrace.graphql.label.schema.Label;

public class LabelCreateMutator extends InjectableDataFetcher<Label> {

public LabelCreateMutator() {
super(LabelCreationMutatorImpl.class);
}

static final class LabelCreationMutatorImpl implements DataFetcher<CompletableFuture<Label>> {
private final LabelDao configDao;
private final LabelRequestBuilder requestBuilder;

@Inject
LabelCreationMutatorImpl(LabelDao configDao, LabelRequestBuilder requestBuilder) {
this.configDao = configDao;
this.requestBuilder = requestBuilder;
}

@Override
public CompletableFuture<Label> get(DataFetchingEnvironment environment) {
return this.configDao
.createLabel(
this.requestBuilder.buildCreateRequest(
environment.getContext(), environment.getArguments()))
.toCompletionStage()
.toCompletableFuture();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package org.hypertrace.graphql.label.mutator;

import graphql.schema.DataFetcher;
import graphql.schema.DataFetchingEnvironment;
import java.util.concurrent.CompletableFuture;
import javax.inject.Inject;
import org.hypertrace.core.graphql.common.fetcher.InjectableDataFetcher;
import org.hypertrace.graphql.label.dao.LabelDao;
import org.hypertrace.graphql.label.request.LabelRequestBuilder;
import org.hypertrace.graphql.label.schema.Label;

public class LabelUpdateMutator extends InjectableDataFetcher<Label> {

public LabelUpdateMutator() {
super(LabelUpdateMutatorImpl.class);
}

static final class LabelUpdateMutatorImpl implements DataFetcher<CompletableFuture<Label>> {
private final LabelDao configDao;
private final LabelRequestBuilder requestBuilder;

@Inject
LabelUpdateMutatorImpl(LabelDao configDao, LabelRequestBuilder requestBuilder) {
this.configDao = configDao;
this.requestBuilder = requestBuilder;
}

@Override
public CompletableFuture<Label> get(DataFetchingEnvironment environment) {
return this.configDao
.updateLabel(
this.requestBuilder.buildUpdateRequest(
environment.getContext(), environment.getArguments()))
.toCompletionStage()
.toCompletableFuture();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.hypertrace.graphql.label.request;

import org.hypertrace.core.graphql.common.request.ContextualRequest;
import org.hypertrace.graphql.label.schema.mutation.CreateLabel;

public interface LabelCreateRequest extends ContextualRequest {
CreateLabel label();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.hypertrace.graphql.label.request;

import java.util.Map;
import org.hypertrace.core.graphql.context.GraphQlRequestContext;

public interface LabelRequestBuilder {
LabelCreateRequest buildCreateRequest(
GraphQlRequestContext requestContext, Map<String, Object> arguments);

LabelUpdateRequest buildUpdateRequest(
GraphQlRequestContext requestContext, Map<String, Object> arguments);
}
Loading