|
|
@ -1210,18 +1210,56 @@ func (e *SQLEngine) buildPredicate(expr sqlparser.Expr) (func(*schema_pb.RecordV |
|
|
|
} |
|
|
|
|
|
|
|
// buildComparisonPredicate creates a predicate for comparison operations (=, <, >, etc.)
|
|
|
|
// Handles column names on both left and right sides of the comparison
|
|
|
|
func (e *SQLEngine) buildComparisonPredicate(expr *sqlparser.ComparisonExpr) (func(*schema_pb.RecordValue) bool, error) { |
|
|
|
// Extract column name (left side)
|
|
|
|
colName, ok := expr.Left.(*sqlparser.ColName) |
|
|
|
if !ok { |
|
|
|
return nil, fmt.Errorf("unsupported comparison left side: %T", expr.Left) |
|
|
|
var columnName string |
|
|
|
var compareValue interface{} |
|
|
|
var operator string |
|
|
|
|
|
|
|
// Check if column is on the left side (normal case: column > value)
|
|
|
|
if colName, ok := expr.Left.(*sqlparser.ColName); ok { |
|
|
|
columnName = colName.Name.String() |
|
|
|
operator = expr.Operator |
|
|
|
|
|
|
|
// Extract comparison value from right side
|
|
|
|
val, err := e.extractComparisonValue(expr.Right) |
|
|
|
if err != nil { |
|
|
|
return nil, fmt.Errorf("failed to extract right-side value: %v", err) |
|
|
|
} |
|
|
|
compareValue = val |
|
|
|
|
|
|
|
columnName := colName.Name.String() |
|
|
|
} else if colName, ok := expr.Right.(*sqlparser.ColName); ok { |
|
|
|
// Column is on the right side (reversed case: value < column)
|
|
|
|
columnName = colName.Name.String() |
|
|
|
|
|
|
|
// Extract comparison value (right side)
|
|
|
|
var compareValue interface{} |
|
|
|
switch val := expr.Right.(type) { |
|
|
|
// Reverse the operator when column is on right side
|
|
|
|
operator = e.reverseOperator(expr.Operator) |
|
|
|
|
|
|
|
// Extract comparison value from left side
|
|
|
|
val, err := e.extractComparisonValue(expr.Left) |
|
|
|
if err != nil { |
|
|
|
return nil, fmt.Errorf("failed to extract left-side value: %v", err) |
|
|
|
} |
|
|
|
compareValue = val |
|
|
|
|
|
|
|
} else { |
|
|
|
return nil, fmt.Errorf("no column name found in comparison expression, left: %T, right: %T", expr.Left, expr.Right) |
|
|
|
} |
|
|
|
|
|
|
|
// Create predicate based on operator
|
|
|
|
return func(record *schema_pb.RecordValue) bool { |
|
|
|
fieldValue, exists := record.Fields[columnName] |
|
|
|
if !exists { |
|
|
|
return false |
|
|
|
} |
|
|
|
|
|
|
|
return e.evaluateComparison(fieldValue, operator, compareValue) |
|
|
|
}, nil |
|
|
|
} |
|
|
|
|
|
|
|
// extractComparisonValue extracts the comparison value from a SQL expression
|
|
|
|
func (e *SQLEngine) extractComparisonValue(expr sqlparser.Expr) (interface{}, error) { |
|
|
|
switch val := expr.(type) { |
|
|
|
case *sqlparser.SQLVal: |
|
|
|
switch val.Type { |
|
|
|
case sqlparser.IntVal: |
|
|
@ -1229,9 +1267,9 @@ func (e *SQLEngine) buildComparisonPredicate(expr *sqlparser.ComparisonExpr) (fu |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
compareValue = intVal |
|
|
|
return intVal, nil |
|
|
|
case sqlparser.StrVal: |
|
|
|
compareValue = string(val.Val) |
|
|
|
return string(val.Val), nil |
|
|
|
default: |
|
|
|
return nil, fmt.Errorf("unsupported SQL value type: %v", val.Type) |
|
|
|
} |
|
|
@ -1253,22 +1291,10 @@ func (e *SQLEngine) buildComparisonPredicate(expr *sqlparser.ComparisonExpr) (fu |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
compareValue = inValues |
|
|
|
return inValues, nil |
|
|
|
default: |
|
|
|
return nil, fmt.Errorf("unsupported comparison right side: %T", expr.Right) |
|
|
|
return nil, fmt.Errorf("unsupported comparison value type: %T", expr) |
|
|
|
} |
|
|
|
|
|
|
|
// Create predicate based on operator
|
|
|
|
operator := expr.Operator |
|
|
|
|
|
|
|
return func(record *schema_pb.RecordValue) bool { |
|
|
|
fieldValue, exists := record.Fields[columnName] |
|
|
|
if !exists { |
|
|
|
return false |
|
|
|
} |
|
|
|
|
|
|
|
return e.evaluateComparison(fieldValue, operator, compareValue) |
|
|
|
}, nil |
|
|
|
} |
|
|
|
|
|
|
|
// evaluateComparison performs the actual comparison
|
|
|
|