Skip to content

Commit aaaa995

Browse files
committed
Feat: Implementing std.groupBy
1 parent fed90cd commit aaaa995

File tree

6 files changed

+59
-0
lines changed

6 files changed

+59
-0
lines changed

builtins.go

+42
Original file line numberDiff line numberDiff line change
@@ -1992,6 +1992,47 @@ func builtinExtVar(i *interpreter, name value) (value, error) {
19921992
return nil, i.Error("Undefined external variable: " + string(index))
19931993
}
19941994

1995+
func builtinGroupBy(i *interpreter, arguments []value) (value, error) {
1996+
arrv := arguments[0]
1997+
keyFv := arguments[1]
1998+
1999+
arr, err := i.getArray(arrv)
2000+
if err != nil {
2001+
return nil, err
2002+
}
2003+
keyF, err := i.getFunction(keyFv)
2004+
if err != nil {
2005+
return nil, err
2006+
}
2007+
json := make(map[string]interface{})
2008+
for _, thunk := range arr.elements {
2009+
currentValue, err := keyF.call(i, args(thunk))
2010+
if err != nil {
2011+
return nil, err
2012+
}
2013+
toStrVal, err := builtinToString(i, currentValue)
2014+
if err != nil {
2015+
return nil, err
2016+
}
2017+
strVal, err := i.getString(toStrVal)
2018+
if err != nil {
2019+
return nil, err
2020+
}
2021+
thunkValue, err := thunk.getValue(i)
2022+
if err != nil {
2023+
return nil, err
2024+
}
2025+
2026+
if json[strVal.getGoString()] == nil {
2027+
json[strVal.getGoString()] = []interface{}{thunkValue}
2028+
} else {
2029+
temp := json[strVal.getGoString()].([]interface{})
2030+
json[strVal.getGoString()] = append(temp, thunkValue)
2031+
}
2032+
}
2033+
return jsonToValue(i, json)
2034+
}
2035+
19952036
func builtinMinArray(i *interpreter, arguments []value) (value, error) {
19962037
arrv := arguments[0]
19972038
keyFv := arguments[1]
@@ -2530,6 +2571,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
25302571
&generalBuiltin{name: "sort", function: builtinSort, params: []generalBuiltinParameter{{name: "arr"}, {name: "keyF", defaultValue: functionID}}},
25312572
&generalBuiltin{name: "minArray", function: builtinMinArray, params: []generalBuiltinParameter{{name: "arr"}, {name: "keyF", defaultValue: functionID}}},
25322573
&generalBuiltin{name: "maxArray", function: builtinMaxArray, params: []generalBuiltinParameter{{name: "arr"}, {name: "keyF", defaultValue: functionID}}},
2574+
&generalBuiltin{name: "groupBy", function: builtinGroupBy, params: []generalBuiltinParameter{{name: "arr"}, {name: "keyF", defaultValue: functionID}}},
25332575
&unaryBuiltin{name: "native", function: builtinNative, params: ast.Identifiers{"x"}},
25342576
&unaryBuiltin{name: "sum", function: builtinSum, params: ast.Identifiers{"arr"}},
25352577
&unaryBuiltin{name: "avg", function: builtinAvg, params: ast.Identifiers{"arr"}},

interpreter.go

+3
Original file line numberDiff line numberDiff line change
@@ -968,6 +968,9 @@ func jsonToValue(i *interpreter, v interface{}) (value, error) {
968968
case string:
969969
return makeValueString(v), nil
970970

971+
case value:
972+
return v, nil
973+
971974
default:
972975
return nil, i.Error(fmt.Sprintf("Not a json type: %#+v", v))
973976
}

linter/internal/types/stdlib.go

+1
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ func prepareStdlib(g *typeGraph) {
151151
"sum": g.newSimpleFuncType(numberType, "arr"),
152152
"minArray": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}),
153153
"maxArray": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}),
154+
"groupBy": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}),
154155
"contains": g.newSimpleFuncType(boolType, "arr", "elem"),
155156
"avg": g.newSimpleFuncType(numberType, "arr"),
156157
"all": g.newSimpleFuncType(boolArrayType, "arr"),

testdata/builtinGroupBy.golden

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"1": [
3+
1,
4+
1.5
5+
],
6+
"2": [
7+
2
8+
],
9+
"3": [
10+
3
11+
]
12+
}

testdata/builtinGroupBy.jsonnet

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
std.groupBy([1, 1.5, 2, 3], std.floor)

testdata/builtinGroupBy.linter.golden

Whitespace-only changes.

0 commit comments

Comments
 (0)