Skip to content

Commit 6c8f5e0

Browse files
Changes to get entities and services count associated with label (#123)
1 parent 3cddf21 commit 6c8f5e0

File tree

11 files changed

+500
-41
lines changed

11 files changed

+500
-41
lines changed

hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/fetcher/LabelFetcher.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
import java.util.concurrent.CompletableFuture;
66
import javax.inject.Inject;
77
import org.hypertrace.core.graphql.common.fetcher.InjectableDataFetcher;
8-
import org.hypertrace.core.graphql.common.request.ContextualRequestBuilder;
9-
import org.hypertrace.graphql.label.dao.LabelDao;
8+
import org.hypertrace.graphql.label.joiner.EntityAndRuleJoinerBuilder;
109
import org.hypertrace.graphql.label.schema.LabelResultSet;
1110

1211
public class LabelFetcher extends InjectableDataFetcher<LabelResultSet> {
@@ -16,19 +15,18 @@ public LabelFetcher() {
1615
}
1716

1817
static final class LabelFetcherImpl implements DataFetcher<CompletableFuture<LabelResultSet>> {
19-
private final ContextualRequestBuilder requestBuilder;
20-
private final LabelDao labelDao;
18+
private final EntityAndRuleJoinerBuilder requestBuilder;
2119

2220
@Inject
23-
LabelFetcherImpl(ContextualRequestBuilder requestBuilder, LabelDao labelDao) {
21+
LabelFetcherImpl(EntityAndRuleJoinerBuilder requestBuilder) {
2422
this.requestBuilder = requestBuilder;
25-
this.labelDao = labelDao;
2623
}
2724

2825
@Override
2926
public CompletableFuture<LabelResultSet> get(DataFetchingEnvironment environment) {
30-
return this.labelDao
31-
.getLabels(this.requestBuilder.build(environment.getContext()))
27+
return this.requestBuilder
28+
.build(environment.getContext(), environment.getSelectionSet())
29+
.flatMap(request -> request.joinLabelsWithEntitiesAndRules())
3230
.toCompletionStage()
3331
.toCompletableFuture();
3432
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.hypertrace.graphql.label.joiner;
2+
3+
import io.reactivex.rxjava3.core.Single;
4+
import org.hypertrace.graphql.label.schema.LabelResultSet;
5+
6+
public interface EntityAndRuleJoiner {
7+
8+
/**
9+
* Produces label result set after joining labels with associated entities and label application
10+
* rules
11+
*
12+
* @return label result set
13+
*/
14+
Single<LabelResultSet> joinLabelsWithEntitiesAndRules();
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.hypertrace.graphql.label.joiner;
2+
3+
import graphql.schema.DataFetchingFieldSelectionSet;
4+
import io.reactivex.rxjava3.core.Single;
5+
import org.hypertrace.core.graphql.context.GraphQlRequestContext;
6+
7+
public interface EntityAndRuleJoinerBuilder {
8+
Single<EntityAndRuleJoiner> build(
9+
GraphQlRequestContext context, DataFetchingFieldSelectionSet selectionSet);
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.hypertrace.graphql.label.joiner;
2+
3+
public interface LabelApplicationRulesRequest {
4+
int limit();
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.hypertrace.graphql.label.joiner;
2+
3+
import graphql.schema.DataFetchingFieldSelectionSet;
4+
5+
public interface LabeledEntitiesRequest {
6+
String entityType();
7+
8+
int limit();
9+
10+
DataFetchingFieldSelectionSet selectionSet();
11+
}
Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,30 @@
11
package org.hypertrace.graphql.label.schema;
22

3+
import graphql.annotations.annotationTypes.GraphQLField;
34
import graphql.annotations.annotationTypes.GraphQLName;
5+
import graphql.annotations.annotationTypes.GraphQLNonNull;
46
import org.hypertrace.core.graphql.common.schema.id.Identifiable;
7+
import org.hypertrace.core.graphql.common.schema.results.arguments.page.LimitArgument;
8+
import org.hypertrace.graphql.label.schema.rule.LabelApplicationRuleResultSet;
59

610
@GraphQLName(Label.TYPE_NAME)
7-
public interface Label extends Identifiable, LabelData, LabeledEntities {
11+
public interface Label extends Identifiable, LabelData {
812
String TYPE_NAME = "Label";
913
String ARGUMENT_NAME = "label";
14+
String LABELED_ENTITIES_QUERY_NAME = "labeledEntities";
15+
String ENTITY_TYPE_ARGUMENT_NAME = "type";
16+
String LABEL_APPLICATION_RULES_QUERY_NAME = "labelApplicationRules";
17+
18+
@GraphQLField
19+
@GraphQLNonNull
20+
@GraphQLName(LABELED_ENTITIES_QUERY_NAME)
21+
LabeledEntityResultSet labeledEntities(
22+
@GraphQLNonNull @GraphQLName(ENTITY_TYPE_ARGUMENT_NAME) String entityType,
23+
@GraphQLName(LimitArgument.ARGUMENT_NAME) int limit);
24+
25+
@GraphQLField
26+
@GraphQLNonNull
27+
@GraphQLName(LABEL_APPLICATION_RULES_QUERY_NAME)
28+
LabelApplicationRuleResultSet labelApplicationRules(
29+
@GraphQLName(LimitArgument.ARGUMENT_NAME) int limit);
1030
}

hypertrace-graphql-labels-schema-api/src/main/java/org/hypertrace/graphql/label/schema/LabeledEntities.java

Lines changed: 0 additions & 20 deletions
This file was deleted.

hypertrace-graphql-labels-schema-impl/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ dependencies {
2828
implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-rx-utils")
2929
implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-deserialization")
3030

31+
implementation(project(":hypertrace-graphql-entity-schema"))
32+
3133
implementation(project(":hypertrace-graphql-service-config"))
3234
}
3335

hypertrace-graphql-labels-schema-impl/src/main/java/org/hypertrace/graphql/label/dao/LabelResponseConverter.java

Lines changed: 55 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,17 @@
44
import java.util.Collections;
55
import java.util.List;
66
import java.util.Map;
7-
import java.util.Optional;
87
import java.util.stream.Collectors;
98
import lombok.Value;
109
import lombok.experimental.Accessors;
10+
import org.hypertrace.core.graphql.common.utils.CollectorUtils;
11+
import org.hypertrace.graphql.entity.schema.Entity;
12+
import org.hypertrace.graphql.entity.schema.EntityResultSet;
1113
import org.hypertrace.graphql.label.schema.Label;
1214
import org.hypertrace.graphql.label.schema.LabelResultSet;
1315
import org.hypertrace.graphql.label.schema.LabeledEntity;
1416
import org.hypertrace.graphql.label.schema.LabeledEntityResultSet;
17+
import org.hypertrace.graphql.label.schema.rule.LabelApplicationRuleResultSet;
1518
import org.hypertrace.label.config.service.v1.CreateLabelResponse;
1619
import org.hypertrace.label.config.service.v1.GetLabelsResponse;
1720
import org.hypertrace.label.config.service.v1.UpdateLabelResponse;
@@ -48,7 +51,42 @@ private Label convertLabel(org.hypertrace.label.config.service.v1.Label label) {
4851
label.getData().getKey(),
4952
label.getData().hasColor() ? label.getData().getColor() : null,
5053
label.getData().hasDescription() ? label.getData().getDescription() : null,
51-
Collections.emptyMap());
54+
Collections.emptyMap(),
55+
null);
56+
}
57+
58+
public Single<Label> convertLabel(
59+
Label label,
60+
Map<String, EntityResultSet> entityResultMap,
61+
LabelApplicationRuleResultSet labelApplicationRuleResultSet) {
62+
Label convertedLabel =
63+
new DefaultLabel(
64+
label.id(),
65+
label.key(),
66+
label.color(),
67+
label.description(),
68+
getLabeledEntityResultSetMap(entityResultMap),
69+
labelApplicationRuleResultSet);
70+
return Single.just(convertedLabel);
71+
}
72+
73+
private Map<String, LabeledEntityResultSet> getLabeledEntityResultSetMap(
74+
Map<String, EntityResultSet> entityResultMap) {
75+
return entityResultMap.entrySet().stream()
76+
.map(entry -> Map.entry(entry.getKey(), getLabeledEntityResultSet(entry.getValue())))
77+
.collect(CollectorUtils.immutableMapEntryCollector());
78+
}
79+
80+
private LabeledEntityResultSet getLabeledEntityResultSet(EntityResultSet entityResultSet) {
81+
List<LabeledEntity> labeledEntities = convertEntities(entityResultSet);
82+
return new DefaultLabeledEntityResultSet(
83+
labeledEntities, labeledEntities.size(), entityResultSet.total());
84+
}
85+
86+
private List<LabeledEntity> convertEntities(EntityResultSet entityResultSet) {
87+
return entityResultSet.results().stream()
88+
.map(DefaultLabeledEntity::new)
89+
.collect(Collectors.toList());
5290
}
5391

5492
@Value
@@ -66,16 +104,17 @@ private static class DefaultLabel implements Label {
66104
String key;
67105
String color;
68106
String description;
69-
Map<String, List<LabeledEntity>> labeledEntitiesMap;
107+
Map<String, LabeledEntityResultSet> labeledEntityResultSetMap;
108+
LabelApplicationRuleResultSet labelApplicationRuleResultSet;
70109

71110
@Override
72111
public LabeledEntityResultSet labeledEntities(String entityType, int limit) {
73-
List<LabeledEntity> labeledEntities =
74-
Optional.ofNullable(labeledEntitiesMap.get(entityType)).orElse(Collections.emptyList());
75-
List<LabeledEntity> labeledEntitiesWithLimit =
76-
labeledEntities.size() > limit ? labeledEntities.subList(0, limit) : labeledEntities;
77-
return new DefaultLabeledEntityResultSet(
78-
labeledEntitiesWithLimit, labeledEntitiesWithLimit.size(), labeledEntities.size());
112+
return labeledEntityResultSetMap.get(entityType);
113+
}
114+
115+
@Override
116+
public LabelApplicationRuleResultSet labelApplicationRules(int limit) {
117+
return labelApplicationRuleResultSet;
79118
}
80119
}
81120

@@ -90,12 +129,16 @@ private static class DefaultLabeledEntityResultSet implements LabeledEntityResul
90129
@Value
91130
@Accessors(fluent = true)
92131
private static class DefaultLabeledEntity implements LabeledEntity {
93-
String id;
94-
Map<String, Object> attributeValues;
132+
Entity entity;
133+
134+
@Override
135+
public String id() {
136+
return entity.id();
137+
}
95138

96139
@Override
97140
public Object attribute(String key) {
98-
return this.attributeValues.get(key);
141+
return this.entity.attribute(key);
99142
}
100143
}
101144
}

0 commit comments

Comments
 (0)