@@ -111,7 +111,15 @@ func (env *Env) GetRightOperand() string {
111
111
return env .Node .BinaryExpr .RightOperand .NodeString
112
112
}
113
113
114
- func QueryEntities (graph * CodeGraph , query parser.Query ) (nodes [][]* Node , output [][]string ) {
114
+ func (env * Env ) GetClassInstanceExpr () * model.ClassInstanceExpr {
115
+ return env .Node .ClassInstanceExpr
116
+ }
117
+
118
+ func (env * Env ) GetClassInstanceExprName () string {
119
+ return env .Node .ClassInstanceExpr .ClassName
120
+ }
121
+
122
+ func QueryEntities (graph * CodeGraph , query parser.Query ) (nodes [][]* Node , output [][]interface {}) {
115
123
result := make ([][]* Node , 0 )
116
124
117
125
// log query select list alone
@@ -131,10 +139,10 @@ func QueryEntities(graph *CodeGraph, query parser.Query) (nodes [][]*Node, outpu
131
139
return nodes , output
132
140
}
133
141
134
- func generateOutput (nodeSet [][]* Node , query parser.Query ) [][]string {
135
- results := make ([][]string , 0 , len (nodeSet ))
142
+ func generateOutput (nodeSet [][]* Node , query parser.Query ) [][]interface {} {
143
+ results := make ([][]interface {} , 0 , len (nodeSet ))
136
144
for _ , nodeSet := range nodeSet {
137
- var result []string
145
+ var result []interface {}
138
146
for _ , outputFormat := range query .SelectOutput {
139
147
switch outputFormat .Type {
140
148
case "string" :
@@ -156,7 +164,7 @@ func generateOutput(nodeSet [][]*Node, query parser.Query) [][]string {
156
164
return results
157
165
}
158
166
159
- func evaluateExpression (node []* Node , expression string , query parser.Query ) (string , error ) {
167
+ func evaluateExpression (node []* Node , expression string , query parser.Query ) (interface {} , error ) {
160
168
env := generateProxyEnvForSet (node , query )
161
169
162
170
program , err := expr .Compile (expression , expr .Env (env ))
@@ -169,7 +177,7 @@ func evaluateExpression(node []*Node, expression string, query parser.Query) (st
169
177
fmt .Println ("Error evaluating expression: " , err )
170
178
return "" , err
171
179
}
172
- return output .( string ) , nil
180
+ return output , nil
173
181
}
174
182
175
183
func generateCartesianProduct (graph * CodeGraph , selectList []parser.SelectList , conditions []string ) [][]* Node {
@@ -193,7 +201,8 @@ func generateCartesianProduct(graph *CodeGraph, selectList []parser.SelectList,
193
201
}
194
202
}
195
203
} else {
196
- for _ , node := range graph .Nodes {
204
+ filteredNodes := graph .FindNodesByType (selectList [0 ].Entity )
205
+ for _ , node := range filteredNodes {
197
206
query := parser.Query {Expression : condition , SelectList : selectList }
198
207
if FilterEntities ([]* Node {node }, query ) {
199
208
typeIndex [node .Type ] = appendUnique (typeIndex [node .Type ], node )
@@ -280,6 +289,7 @@ func generateProxyEnv(node *Node, query parser.Query) map[string]interface{} {
280
289
orBitwiseExpression := "or_bitwise_expression"
281
290
unsignedRightShiftExpression := "unsigned_right_shift_expression"
282
291
xorBitwsieExpression := "xor_bitwise_expression"
292
+ classInstanceExpression := "ClassInstanceExpr"
283
293
284
294
// print query select list
285
295
for _ , entity := range query .SelectList {
@@ -326,6 +336,8 @@ func generateProxyEnv(node *Node, query parser.Query) map[string]interface{} {
326
336
unsignedRightShiftExpression = entity .Alias
327
337
case "xor_bitwise_expression" :
328
338
xorBitwsieExpression = entity .Alias
339
+ case "ClassInstanceExpr" :
340
+ classInstanceExpression = entity .Alias
329
341
}
330
342
}
331
343
env := map [string ]interface {}{
@@ -450,6 +462,12 @@ func generateProxyEnv(node *Node, query parser.Query) map[string]interface{} {
450
462
"getOperator" : "^" ,
451
463
"toString" : proxyenv .ToString ,
452
464
},
465
+ classInstanceExpression : map [string ]interface {}{
466
+ "getName" : proxyenv .GetName ,
467
+ "getDoc" : proxyenv .GetDoc ,
468
+ "toString" : proxyenv .ToString ,
469
+ "getClassInstanceExpr" : proxyenv .GetClassInstanceExpr ,
470
+ },
453
471
}
454
472
return env
455
473
}
0 commit comments