RockyJin %!s(int64=5) %!d(string=hai) anos
pai
achega
5c8046f6e4
Modificáronse 1 ficheiros con 32 adicións e 1 borrados
  1. 32 1
      xsql/ast.go

+ 32 - 1
xsql/ast.go

@@ -1108,11 +1108,14 @@ func (v *ValuerEval) Eval(expr Expr) interface{} {
 
 func (v *ValuerEval) evalBinaryExpr(expr *BinaryExpr) interface{} {
 	lhs := v.Eval(expr.LHS)
+	fmt.Printf("%T\n", lhs)
 	switch val := lhs.(type) {
 	case map[string]interface{}:
 		return v.evalJsonExpr(val, expr.OP, expr.RHS)
 	case []interface{}:
 		return v.evalJsonExpr(val, expr.OP, expr.RHS)
+	case []map[string]interface {}:
+		return v.evalJsonExpr(val, expr.OP, expr.RHS)
 	case error:
 		return val
 	}
@@ -1140,7 +1143,34 @@ func (v *ValuerEval) evalJsonExpr(result interface{}, op Token, expr Expr) inter
 		}
 	}
 
-	if val, ok := result.([]interface{}); ok {
+
+	if val, ok := result.([]interface {}); ok {
+		switch op {
+		case SUBSET:
+			ber := v.Eval(expr)
+			if berVal, ok1 := ber.(*BracketEvalResult); ok1 {
+				if berVal.isIndex() {
+					if berVal.Start >= len(val) {
+						return fmt.Errorf("out of index: %d of %d", berVal.Start, len(val))
+					}
+					return val[berVal.Start]
+				} else {
+					if berVal.Start >= len(val) {
+						return fmt.Errorf("start value is out of index: %d of %d", berVal.Start, len(val))
+					}
+
+					if berVal.End >= len(val) {
+						return fmt.Errorf("end value is out of index: %d of %d", berVal.End, len(val))
+					}
+					return val[berVal.Start:berVal.End]
+				}
+			} else {
+				return fmt.Errorf("invalid evaluation result - %v", berVal)
+			}
+		default:
+			return fmt.Errorf("%v is an invalid operation for %T", op, val)
+		}
+	} else if val, ok := result.([]map[string]interface {}); ok {
 		switch op {
 		case SUBSET:
 			ber := v.Eval(expr)
@@ -1167,6 +1197,7 @@ func (v *ValuerEval) evalJsonExpr(result interface{}, op Token, expr Expr) inter
 			return fmt.Errorf("%v is an invalid operation for %T", op, val)
 		}
 	}
+
 	return nil
 }