MCPcopy
hub / github.com/google/mangle / evalDo

Function evalDo

engine/transformer.go:69–127  ·  view source on GitHub ↗

evalDo evaluates a do statement (currently: only "|> do fn::group_by") A do-transform acts on a whole result relation.

(
	head ast.Atom,
	transform ast.Transform,
	input []ast.ConstSubstList,
	emit func(atom ast.Atom) bool)

Source from the content-addressed store, hash-verified

67// evalDo evaluates a do statement (currently: only "|> do fn::group_by")
68// A do-transform acts on a whole result relation.
69func evalDo(
70 head ast.Atom,
71 transform ast.Transform,
72 input []ast.ConstSubstList,
73 emit func(atom ast.Atom) bool) error {
74
75 doStmt := transform.Statements[0]
76 switch doStmt.Fn.Function.Symbol {
77 case symbols.GroupBy.Symbol:
78 keyToGroup := make(map[uint32]grouped)
79
80 for _, subst := range input {
81 keyLen := len(doStmt.Fn.Args)
82 key := make([]ast.Constant, keyLen)
83 b := make([]byte, 8*keyLen)
84 for i, v := range doStmt.Fn.Args {
85 value := subst.Get(v.(ast.Variable)).(ast.Constant)
86 binary.LittleEndian.PutUint64(b[i*8:], value.Hash())
87 key[i] = value
88 }
89 hasher := fnv.New32()
90 hasher.Write(b)
91 h := hasher.Sum32()
92 group, ok := keyToGroup[h]
93 if !ok {
94 group = grouped{key, nil}
95 }
96 group.values = append(group.values, subst)
97 keyToGroup[h] = group
98 }
99 // Now apply reductions.
100 for _, group := range keyToGroup {
101 var subst ast.ConstSubstList
102 for i, v := range group.key {
103 subst = subst.Extend(doStmt.Fn.Args[i].(ast.Variable), v)
104 }
105 for _, stmt := range transform.Statements[1:] {
106 if builtin.IsReducerFunction(stmt.Fn.Function) {
107 con, err := functional.EvalReduceFn(stmt.Fn, group.values)
108 if err != nil {
109 return err
110 }
111 subst = subst.Extend(*stmt.Var, con)
112 } else {
113 // Do a "map" of rows (substitutions set).
114 // First, copy over bindings from subst
115 con, err := functional.EvalApplyFn(stmt.Fn, subst)
116 if err != nil {
117 return err
118 }
119 subst = subst.Extend(*stmt.Var, con)
120 }
121 }
122 emit(head.ApplySubst(subst).(ast.Atom))
123 }
124 default:
125 }
126 return nil

Callers 1

EvalTransformFunction · 0.85

Calls 7

GetMethod · 0.95
ExtendMethod · 0.95
IsReducerFunctionFunction · 0.92
EvalReduceFnFunction · 0.92
EvalApplyFnFunction · 0.92
HashMethod · 0.65
ApplySubstMethod · 0.65

Tested by

no test coverage detected