diff --git a/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/request/LabelUpdateRequest.java b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/request/LabelUpdateRequest.java index afa3c08a..f57e53d2 100644 --- a/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/request/LabelUpdateRequest.java +++ b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/request/LabelUpdateRequest.java @@ -1,8 +1,8 @@ package org.hypertrace.graphql.label.request; import org.hypertrace.core.graphql.common.request.ContextualRequest; -import org.hypertrace.graphql.label.schema.Label; +import org.hypertrace.graphql.label.schema.mutation.UpdateLabel; public interface LabelUpdateRequest extends ContextualRequest { - Label label(); + UpdateLabel label(); } diff --git a/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/Label.java b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/Label.java index 309b1f65..059333e2 100644 --- a/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/Label.java +++ b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/Label.java @@ -4,7 +4,7 @@ import org.hypertrace.core.graphql.common.schema.id.Identifiable; @GraphQLName(Label.TYPE_NAME) -public interface Label extends Identifiable, LabelData { +public interface Label extends Identifiable, LabelData, LabeledEntities { String TYPE_NAME = "Label"; String ARGUMENT_NAME = "label"; } diff --git a/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/LabeledEntities.java b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/LabeledEntities.java new file mode 100644 index 00000000..8d3e78c3 --- /dev/null +++ b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/LabeledEntities.java @@ -0,0 +1,20 @@ +package org.hypertrace.graphql.label.schema; + +import graphql.annotations.annotationTypes.GraphQLField; +import graphql.annotations.annotationTypes.GraphQLName; +import graphql.annotations.annotationTypes.GraphQLNonNull; +import org.hypertrace.core.graphql.common.schema.results.arguments.page.LimitArgument; + +@GraphQLName(LabeledEntities.TYPE_NAME) +public interface LabeledEntities { + String TYPE_NAME = "LabeledEntities"; + String LABELED_ENTITIES_QUERY_NAME = "labeledEntities"; + String ENTITY_TYPE_ARGUMENT_NAME = "type"; + + @GraphQLField + @GraphQLNonNull + @GraphQLName(LABELED_ENTITIES_QUERY_NAME) + LabeledEntityResultSet labeledEntities( + @GraphQLNonNull @GraphQLName(ENTITY_TYPE_ARGUMENT_NAME) String entityType, + @GraphQLName(LimitArgument.ARGUMENT_NAME) int limit); +} diff --git a/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/LabeledEntity.java b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/LabeledEntity.java new file mode 100644 index 00000000..fa9cabb0 --- /dev/null +++ b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/LabeledEntity.java @@ -0,0 +1,10 @@ +package org.hypertrace.graphql.label.schema; + +import graphql.annotations.annotationTypes.GraphQLName; +import org.hypertrace.core.graphql.common.schema.attributes.AttributeQueryable; +import org.hypertrace.core.graphql.common.schema.id.Identifiable; + +@GraphQLName(LabeledEntity.TYPE_NAME) +public interface LabeledEntity extends AttributeQueryable, Identifiable { + String TYPE_NAME = "LabeledEntity"; +} diff --git a/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/LabeledEntityResultSet.java b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/LabeledEntityResultSet.java new file mode 100644 index 00000000..81c3511f --- /dev/null +++ b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/LabeledEntityResultSet.java @@ -0,0 +1,18 @@ +package org.hypertrace.graphql.label.schema; + +import graphql.annotations.annotationTypes.GraphQLField; +import graphql.annotations.annotationTypes.GraphQLName; +import graphql.annotations.annotationTypes.GraphQLNonNull; +import java.util.List; +import org.hypertrace.core.graphql.common.schema.results.ResultSet; + +@GraphQLName(LabeledEntityResultSet.TYPE_NAME) +public interface LabeledEntityResultSet extends ResultSet { + String TYPE_NAME = "LabeledEntityResultSet"; + + @Override + @GraphQLField + @GraphQLNonNull + @GraphQLName(RESULT_SET_RESULTS_NAME) + List results(); +} diff --git a/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/mutation/LabelMutationSchema.java b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/mutation/LabelMutationSchema.java index 8a8e63a0..5d2e1687 100644 --- a/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/mutation/LabelMutationSchema.java +++ b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/mutation/LabelMutationSchema.java @@ -22,5 +22,5 @@ public interface LabelMutationSchema { @GraphQLNonNull @GraphQLName(UPDATE_LABEL) @GraphQLDataFetcher(LabelUpdateMutator.class) - Label updateLabel(@GraphQLNonNull @GraphQLName(Label.ARGUMENT_NAME) Label label); + Label updateLabel(@GraphQLNonNull @GraphQLName(Label.ARGUMENT_NAME) UpdateLabel label); } diff --git a/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/mutation/UpdateLabel.java b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/mutation/UpdateLabel.java new file mode 100644 index 00000000..3b631ca7 --- /dev/null +++ b/hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/mutation/UpdateLabel.java @@ -0,0 +1,11 @@ +package org.hypertrace.graphql.label.schema.mutation; + +import graphql.annotations.annotationTypes.GraphQLName; +import org.hypertrace.core.graphql.common.schema.id.Identifiable; +import org.hypertrace.graphql.label.schema.LabelData; + +@GraphQLName(UpdateLabel.TYPE_NAME) +public interface UpdateLabel extends Identifiable, LabelData { + String TYPE_NAME = "UpdateLabel"; + String ARGUMENT_NAME = "label"; +} diff --git a/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/dao/LabelResponseConverter.java b/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/dao/LabelResponseConverter.java index 1ab8983a..703ead87 100644 --- a/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/dao/LabelResponseConverter.java +++ b/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/dao/LabelResponseConverter.java @@ -1,12 +1,17 @@ package org.hypertrace.graphql.label.dao; import io.reactivex.rxjava3.core.Single; +import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; import lombok.Value; import lombok.experimental.Accessors; import org.hypertrace.graphql.label.schema.Label; import org.hypertrace.graphql.label.schema.LabelResultSet; +import org.hypertrace.graphql.label.schema.LabeledEntity; +import org.hypertrace.graphql.label.schema.LabeledEntityResultSet; import org.hypertrace.label.config.service.v1.CreateLabelResponse; import org.hypertrace.label.config.service.v1.GetLabelsResponse; import org.hypertrace.label.config.service.v1.UpdateLabelResponse; @@ -42,7 +47,8 @@ private Label convertLabel(org.hypertrace.label.config.service.v1.Label label) { label.getId(), label.getData().getKey(), label.getData().hasColor() ? label.getData().getColor() : null, - label.getData().hasDescription() ? label.getData().getDescription() : null); + label.getData().hasDescription() ? label.getData().getDescription() : null, + Collections.emptyMap()); } @Value @@ -60,5 +66,36 @@ private static class DefaultLabel implements Label { String key; String color; String description; + Map> labeledEntitiesMap; + + @Override + public LabeledEntityResultSet labeledEntities(String entityType, int limit) { + List labeledEntities = + Optional.ofNullable(labeledEntitiesMap.get(entityType)).orElse(Collections.emptyList()); + List labeledEntitiesWithLimit = + labeledEntities.size() > limit ? labeledEntities.subList(0, limit) : labeledEntities; + return new DefaultLabeledEntityResultSet( + labeledEntitiesWithLimit, labeledEntitiesWithLimit.size(), labeledEntities.size()); + } + } + + @Value + @Accessors(fluent = true) + private static class DefaultLabeledEntityResultSet implements LabeledEntityResultSet { + List results; + long count; + long total; + } + + @Value + @Accessors(fluent = true) + private static class DefaultLabeledEntity implements LabeledEntity { + String id; + Map attributeValues; + + @Override + public Object attribute(String key) { + return this.attributeValues.get(key); + } } } diff --git a/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/deserialization/LabelDeserializationModule.java b/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/deserialization/LabelDeserializationModule.java index 16c2c943..06a9eccc 100644 --- a/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/deserialization/LabelDeserializationModule.java +++ b/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/deserialization/LabelDeserializationModule.java @@ -11,6 +11,6 @@ protected void configure() { Multibinder.newSetBinder(binder(), ArgumentDeserializationConfig.class); deserializationConfigBinder.addBinding().to(CreateLabelDeserializationConfig.class); - deserializationConfigBinder.addBinding().to(LabelDeserializationConfig.class); + deserializationConfigBinder.addBinding().to(UpdateLabelDeserializationConfig.class); } } diff --git a/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/deserialization/LabelDeserializationConfig.java b/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/deserialization/UpdateLabelDeserializationConfig.java similarity index 67% rename from hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/deserialization/LabelDeserializationConfig.java rename to hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/deserialization/UpdateLabelDeserializationConfig.java index 11885891..e843dbe7 100644 --- a/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/deserialization/LabelDeserializationConfig.java +++ b/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/deserialization/UpdateLabelDeserializationConfig.java @@ -8,29 +8,30 @@ import lombok.Value; import lombok.experimental.Accessors; import org.hypertrace.core.graphql.deserialization.ArgumentDeserializationConfig; -import org.hypertrace.graphql.label.schema.Label; +import org.hypertrace.graphql.label.schema.mutation.UpdateLabel; -public class LabelDeserializationConfig implements ArgumentDeserializationConfig { +public class UpdateLabelDeserializationConfig implements ArgumentDeserializationConfig { @Override public String getArgumentKey() { - return Label.ARGUMENT_NAME; + return UpdateLabel.ARGUMENT_NAME; } @Override public Class getArgumentSchema() { - return Label.class; + return UpdateLabel.class; } @Override public List jacksonModules() { - return List.of(new SimpleModule().addAbstractTypeMapping(Label.class, LabelArgument.class)); + return List.of( + new SimpleModule().addAbstractTypeMapping(UpdateLabel.class, UpdateLabelArgument.class)); } @Value @Accessors(fluent = true) @NoArgsConstructor(force = true) - private static class LabelArgument implements Label { + private static class UpdateLabelArgument implements UpdateLabel { @JsonProperty(IDENTITY_FIELD_NAME) String id; diff --git a/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/request/LabelRequestBuilderImpl.java b/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/request/LabelRequestBuilderImpl.java index 59929624..8f154007 100644 --- a/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/request/LabelRequestBuilderImpl.java +++ b/hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/request/LabelRequestBuilderImpl.java @@ -6,8 +6,8 @@ import lombok.experimental.Accessors; import org.hypertrace.core.graphql.context.GraphQlRequestContext; import org.hypertrace.core.graphql.deserialization.ArgumentDeserializer; -import org.hypertrace.graphql.label.schema.Label; import org.hypertrace.graphql.label.schema.mutation.CreateLabel; +import org.hypertrace.graphql.label.schema.mutation.UpdateLabel; public class LabelRequestBuilderImpl implements LabelRequestBuilder { private final ArgumentDeserializer argumentDeserializer; @@ -30,7 +30,7 @@ public LabelUpdateRequest buildUpdateRequest( GraphQlRequestContext requestContext, Map arguments) { return new LabelUpdateRequestImpl( requestContext, - this.argumentDeserializer.deserializeObject(arguments, Label.class).orElseThrow()); + this.argumentDeserializer.deserializeObject(arguments, UpdateLabel.class).orElseThrow()); } @Value @@ -44,6 +44,6 @@ private static class LabelCreateRequestImpl implements LabelCreateRequest { @Accessors(fluent = true) private static class LabelUpdateRequestImpl implements LabelUpdateRequest { GraphQlRequestContext context; - Label label; + UpdateLabel label; } }