Skip to content

Commit 90a17e8

Browse files
rockdabootedmocosta
andcommitted
[chore] [pkg/ottl] Introduce ctxutil.GetMap() and ctxutil.GetMapKeyName() internal functions (open-telemetry#39952)
These functions have been requested [here](open-telemetry#39681 (comment)) and [here](open-telemetry#39681 (comment)) as prerequisite for OTTL attributes accessors for the profiles signal. Also adds tests for `GetMap()`, that were missing. Unit tests --------- Co-authored-by: Edmo Vamerlatti Costa <[email protected]>
1 parent be2ebbc commit 90a17e8

File tree

3 files changed

+41
-40
lines changed

3 files changed

+41
-40
lines changed

pkg/ottl/contexts/internal/ctxutil/map.go

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,13 @@ import (
1414
)
1515

1616
func GetMapValue[K any](ctx context.Context, tCtx K, m pcommon.Map, keys []ottl.Key[K]) (any, error) {
17-
s, err := GetMapKeyName(ctx, tCtx, keys)
17+
if len(keys) == 0 {
18+
return nil, errors.New("cannot get map value without keys")
19+
}
20+
21+
s, err := GetMapKeyName(ctx, tCtx, keys[0])
1822
if err != nil {
19-
return nil, err
23+
return nil, fmt.Errorf("cannot get map value: %w", err)
2024
}
2125

2226
val, ok := m.Get(*s)
@@ -28,9 +32,13 @@ func GetMapValue[K any](ctx context.Context, tCtx K, m pcommon.Map, keys []ottl.
2832
}
2933

3034
func SetMapValue[K any](ctx context.Context, tCtx K, m pcommon.Map, keys []ottl.Key[K], val any) error {
31-
s, err := GetMapKeyName(ctx, tCtx, keys)
35+
if len(keys) == 0 {
36+
return errors.New("cannot set map value without keys")
37+
}
38+
39+
s, err := GetMapKeyName(ctx, tCtx, keys[0])
3240
if err != nil {
33-
return err
41+
return fmt.Errorf("cannot set map value: %w", err)
3442
}
3543

3644
currentValue, ok := m.Get(*s)
@@ -40,17 +48,13 @@ func SetMapValue[K any](ctx context.Context, tCtx K, m pcommon.Map, keys []ottl.
4048
return SetIndexableValue[K](ctx, tCtx, currentValue, val, keys[1:])
4149
}
4250

43-
func GetMapKeyName[K any](ctx context.Context, tCtx K, keys []ottl.Key[K]) (*string, error) {
44-
if len(keys) == 0 {
45-
return nil, errors.New("empty keys")
46-
}
47-
48-
resolvedKey, err := keys[0].String(ctx, tCtx)
51+
func GetMapKeyName[K any](ctx context.Context, tCtx K, key ottl.Key[K]) (*string, error) {
52+
resolvedKey, err := key.String(ctx, tCtx)
4953
if err != nil {
5054
return nil, err
5155
}
5256
if resolvedKey == nil {
53-
resolvedKey, err = FetchValueFromExpression[K, string](ctx, tCtx, keys[0])
57+
resolvedKey, err = FetchValueFromExpression[K, string](ctx, tCtx, key)
5458
if err != nil {
5559
return nil, fmt.Errorf("unable to resolve a string index in map: %w", err)
5660
}

pkg/ottl/contexts/internal/ctxutil/map_test.go

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func Test_GetMapValue_Invalid(t *testing.T) {
4040
G: getSetter,
4141
},
4242
},
43-
err: errors.New("unable to resolve a string index in map: could not resolve key for map/slice, expecting 'string' but got '<nil>'"),
43+
err: errors.New("cannot get map value: unable to resolve a string index in map: could not resolve key for map/slice, expecting 'string' but got '<nil>'"),
4444
},
4545
{
4646
name: "index map with int",
@@ -172,7 +172,7 @@ func Test_SetMapValue_Invalid(t *testing.T) {
172172
G: getSetter,
173173
},
174174
},
175-
err: errors.New("unable to resolve a string index in map: could not resolve key for map/slice, expecting 'string' but got '<nil>'"),
175+
err: errors.New("cannot set map value: unable to resolve a string index in map: could not resolve key for map/slice, expecting 'string' but got '<nil>'"),
176176
},
177177
{
178178
name: "index map with int",
@@ -320,22 +320,26 @@ func Test_SetMap(t *testing.T) {
320320
return m
321321
}
322322
tests := []struct {
323-
name string
324-
val any
325-
err error
323+
name string
324+
val any
325+
err error
326+
expected any
326327
}{
327328
{
328-
name: "invalid type",
329-
val: "invalid",
330-
err: errors.New("failed to convert type string into pcommon.Map"),
329+
name: "invalid type",
330+
val: "invalid",
331+
err: nil, // This is an issue in SetMap(), not returning an error here.
332+
expected: pcommon.NewMap(),
331333
},
332334
{
333-
name: "raw map",
334-
val: map[string]any{"foo": "bar"},
335+
name: "raw map",
336+
val: map[string]any{"foo": "bar"},
337+
expected: createMap(),
335338
},
336339
{
337-
name: "pcommon.Map",
338-
val: createMap(),
340+
name: "pcommon.Map",
341+
val: createMap(),
342+
expected: createMap(),
339343
},
340344
}
341345

@@ -347,7 +351,7 @@ func Test_SetMap(t *testing.T) {
347351
require.Equal(t, tt.err, err)
348352
return
349353
}
350-
assert.Equal(t, m, createMap())
354+
assert.Equal(t, tt.expected, m)
351355
})
352356
}
353357
}
@@ -403,11 +407,14 @@ func Test_GetMapKeyName(t *testing.T) {
403407
key string
404408
}{
405409
{
410+
<<<<<<< HEAD
406411
name: "empty keys",
407412
keys: []ottl.Key[any]{},
408413
err: errors.New("empty keys"),
409414
},
410415
{
416+
=======
417+
>>>>>>> ec280e51f8 ([chore] [pkg/ottl] Introduce `ctxutil.GetMap()` and `ctxutil.GetMapKeyName()` internal functions (#39952))
411418
name: "first key not a string",
412419
keys: []ottl.Key[any]{
413420
&pathtest.Key[any]{
@@ -437,7 +444,11 @@ func Test_GetMapKeyName(t *testing.T) {
437444

438445
for _, tt := range tests {
439446
t.Run(tt.name, func(t *testing.T) {
447+
<<<<<<< HEAD
440448
resolvedKey, err := ctxutil.GetMapKeyName[any](context.Background(), nil, tt.keys)
449+
=======
450+
resolvedKey, err := ctxutil.GetMapKeyName[any](context.Background(), nil, tt.keys[0])
451+
>>>>>>> ec280e51f8 ([chore] [pkg/ottl] Introduce `ctxutil.GetMap()` and `ctxutil.GetMapKeyName()` internal functions (#39952))
441452
if tt.err != nil {
442453
assert.Equal(t, tt.err.Error(), err.Error())
443454
return

pkg/ottl/contexts/internal/ctxutil/value.go

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,10 @@ func getIndexableValue[K any](ctx context.Context, tCtx K, value pcommon.Value,
7474
for index := 0; index < len(keys); index++ {
7575
switch val.Type() {
7676
case pcommon.ValueTypeMap:
77-
s, err := keys[index].String(ctx, tCtx)
77+
s, err := GetMapKeyName(ctx, tCtx, keys[index])
7878
if err != nil {
7979
return nil, err
8080
}
81-
if s == nil {
82-
resString, err := FetchValueFromExpression[K, string](ctx, tCtx, keys[index])
83-
if err != nil {
84-
return nil, fmt.Errorf("unable to resolve a string index in map: %w", err)
85-
}
86-
s = resString
87-
}
8881
val, ok = val.Map().Get(*s)
8982
if !ok {
9083
return nil, nil
@@ -128,17 +121,10 @@ func SetIndexableValue[K any](ctx context.Context, tCtx K, currentValue pcommon.
128121
for index := 0; index < len(keys); index++ {
129122
switch currentValue.Type() {
130123
case pcommon.ValueTypeMap:
131-
s, err := keys[index].String(ctx, tCtx)
124+
s, err := GetMapKeyName(ctx, tCtx, keys[index])
132125
if err != nil {
133126
return err
134127
}
135-
if s == nil {
136-
resString, err := FetchValueFromExpression[K, string](ctx, tCtx, keys[index])
137-
if err != nil {
138-
return fmt.Errorf("unable to resolve a string index in map: %w", err)
139-
}
140-
s = resString
141-
}
142128
potentialValue, ok := currentValue.Map().Get(*s)
143129
if !ok {
144130
currentValue = currentValue.Map().PutEmpty(*s)

0 commit comments

Comments
 (0)