1010import org .hypertrace .core .attribute .service .cachingclient .CachingAttributeClient ;
1111import org .hypertrace .core .attribute .service .projection .AttributeProjection ;
1212import org .hypertrace .core .attribute .service .projection .AttributeProjectionRegistry ;
13+ import org .hypertrace .core .attribute .service .v1 .AttributeDefinition ;
14+ import org .hypertrace .core .attribute .service .v1 .AttributeDefinition .AttributeDefinitions ;
1315import org .hypertrace .core .attribute .service .v1 .AttributeDefinition .SourceField ;
1416import org .hypertrace .core .attribute .service .v1 .AttributeKind ;
1517import org .hypertrace .core .attribute .service .v1 .AttributeMetadata ;
1618import org .hypertrace .core .attribute .service .v1 .AttributeType ;
1719import org .hypertrace .core .attribute .service .v1 .LiteralValue ;
20+ import org .hypertrace .core .attribute .service .v1 .LiteralValue .ValueCase ;
1821import org .hypertrace .core .attribute .service .v1 .Projection ;
1922import org .hypertrace .core .attribute .service .v1 .ProjectionExpression ;
2023
@@ -36,28 +39,49 @@ public Single<LiteralValue> resolve(
3639 return this .buildError ("Attribute definition not set" );
3740 }
3841
39- switch (attributeMetadata .getDefinition ().getValueCase ()) {
42+ return this .resolveDefinition (
43+ valueSource , attributeMetadata , attributeMetadata .getDefinition ());
44+ }
45+
46+ private Single <LiteralValue > resolveDefinition (
47+ ValueSource valueSource ,
48+ AttributeMetadata attributeMetadata ,
49+ AttributeDefinition definition ) {
50+
51+ switch (definition .getValueCase ()) {
4052 case SOURCE_PATH :
4153 return this .resolveValue (
4254 valueSource ,
4355 attributeMetadata .getScopeString (),
4456 attributeMetadata .getType (),
4557 attributeMetadata .getValueKind (),
46- attributeMetadata . getDefinition () .getSourcePath ());
58+ definition .getSourcePath ());
4759 case PROJECTION :
4860 return this .resolveProjection (
4961 valueSource , attributeMetadata .getDefinition ().getProjection ());
5062 case SOURCE_FIELD :
5163 return this .resolveField (
64+ valueSource , definition .getSourceField (), attributeMetadata .getValueKind ());
65+ case FIRST_VALUE_PRESENT :
66+ return this .resolveFirstValuePresent (
5267 valueSource ,
53- attributeMetadata . getDefinition (). getSourceField () ,
54- attributeMetadata .getValueKind ());
68+ attributeMetadata ,
69+ attributeMetadata .getDefinition (). getFirstValuePresent ());
5570 case VALUE_NOT_SET :
5671 default :
5772 return this .buildError ("Unrecognized attribute definition" );
5873 }
5974 }
6075
76+ private Maybe <LiteralValue > maybeResolveDefinition (
77+ ValueSource valueSource ,
78+ AttributeMetadata attributeMetadata ,
79+ AttributeDefinition definition ) {
80+ return this .resolveDefinition (valueSource , attributeMetadata , definition )
81+ .filter (literalValue -> !literalValue .getValueCase ().equals (ValueCase .VALUE_NOT_SET ))
82+ .onErrorComplete ();
83+ }
84+
6185 private Single <LiteralValue > resolveValue (
6286 ValueSource contextValueSource ,
6387 String attributeScope ,
@@ -107,6 +131,17 @@ private Single<LiteralValue> resolveField(
107131 .defaultIfEmpty (LiteralValue .getDefaultInstance ());
108132 }
109133
134+ private Single <LiteralValue > resolveFirstValuePresent (
135+ ValueSource valueSource ,
136+ AttributeMetadata attributeMetadata ,
137+ AttributeDefinitions definitions ) {
138+
139+ return Observable .fromIterable (definitions .getDefinitionsList ())
140+ .concatMapMaybe (
141+ definition -> this .maybeResolveDefinition (valueSource , attributeMetadata , definition ))
142+ .first (LiteralValue .getDefaultInstance ());
143+ }
144+
110145 private Single <LiteralValue > resolveExpression (
111146 ValueSource valueSource , ProjectionExpression expression ) {
112147
0 commit comments