mirror of
https://github.com/pikami/cosmium.git
synced 2025-12-18 16:30:44 +00:00
Implement INDEX_OF function
This commit is contained in:
@@ -186,6 +186,8 @@ func getFieldValue(field parsers.SelectItem, queryParameters map[string]interfac
|
||||
return strings_StartsWith(typedValue.Arguments, queryParameters, row)
|
||||
case parsers.FunctionCallConcat:
|
||||
return strings_Concat(typedValue.Arguments, queryParameters, row)
|
||||
case parsers.FunctionCallIndexOf:
|
||||
return strings_IndexOf(typedValue.Arguments, queryParameters, row)
|
||||
case parsers.FunctionCallIsDefined:
|
||||
return typeChecking_IsDefined(typedValue.Arguments, queryParameters, row)
|
||||
}
|
||||
|
||||
@@ -9,9 +9,9 @@ import (
|
||||
|
||||
func Test_Execute_StringFunctions(t *testing.T) {
|
||||
mockData := []memoryexecutor.RowType{
|
||||
map[string]interface{}{"id": "123", "pk": "aaa"},
|
||||
map[string]interface{}{"id": "456", "pk": "bbb"},
|
||||
map[string]interface{}{"id": "789", "pk": "AAA"},
|
||||
map[string]interface{}{"id": "123", "pk": "aaa", "str": "hello"},
|
||||
map[string]interface{}{"id": "456", "pk": "bbb", "str": "world"},
|
||||
map[string]interface{}{"id": "789", "pk": "AAA", "str": "cool world"},
|
||||
}
|
||||
|
||||
t.Run("Should execute function STRINGEQUALS(ex1, ex2, ignoreCase)", func(t *testing.T) {
|
||||
@@ -295,4 +295,52 @@ func Test_Execute_StringFunctions(t *testing.T) {
|
||||
},
|
||||
)
|
||||
})
|
||||
|
||||
t.Run("Should execute function INDEX_OF()", func(t *testing.T) {
|
||||
testQueryExecute(
|
||||
t,
|
||||
parsers.SelectStmt{
|
||||
SelectItems: []parsers.SelectItem{
|
||||
{
|
||||
Path: []string{"c", "str"},
|
||||
Type: parsers.SelectItemTypeField,
|
||||
},
|
||||
{
|
||||
Alias: "index",
|
||||
Type: parsers.SelectItemTypeFunctionCall,
|
||||
Value: parsers.FunctionCall{
|
||||
Type: parsers.FunctionCallIndexOf,
|
||||
Arguments: []interface{}{
|
||||
parsers.SelectItem{
|
||||
Path: []string{"c", "str"},
|
||||
Type: parsers.SelectItemTypeField,
|
||||
},
|
||||
parsers.SelectItem{
|
||||
Type: parsers.SelectItemTypeConstant,
|
||||
Value: parsers.Constant{
|
||||
Type: parsers.ConstantTypeString,
|
||||
Value: "o",
|
||||
},
|
||||
},
|
||||
parsers.SelectItem{
|
||||
Type: parsers.SelectItemTypeConstant,
|
||||
Value: parsers.Constant{
|
||||
Type: parsers.ConstantTypeInteger,
|
||||
Value: 4,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
Table: parsers.Table{Value: "c"},
|
||||
},
|
||||
mockData,
|
||||
[]memoryexecutor.RowType{
|
||||
map[string]interface{}{"str": "hello", "index": 4},
|
||||
map[string]interface{}{"str": "world", "index": -1},
|
||||
map[string]interface{}{"str": "cool world", "index": 6},
|
||||
},
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -71,6 +71,31 @@ func strings_Concat(arguments []interface{}, queryParameters map[string]interfac
|
||||
return result
|
||||
}
|
||||
|
||||
func strings_IndexOf(arguments []interface{}, queryParameters map[string]interface{}, row RowType) int {
|
||||
str1 := parseString(arguments[0], queryParameters, row)
|
||||
str2 := parseString(arguments[1], queryParameters, row)
|
||||
|
||||
start := 0
|
||||
if len(arguments) > 2 && arguments[2] != nil {
|
||||
if startPos, ok := getFieldValue(arguments[2].(parsers.SelectItem), queryParameters, row).(int); ok {
|
||||
start = startPos
|
||||
}
|
||||
}
|
||||
|
||||
if len(str1) <= start {
|
||||
return -1
|
||||
}
|
||||
|
||||
str1 = str1[start:]
|
||||
result := strings.Index(str1, str2)
|
||||
|
||||
if result == -1 {
|
||||
return result
|
||||
} else {
|
||||
return result + start
|
||||
}
|
||||
}
|
||||
|
||||
func getBoolFlag(arguments []interface{}, queryParameters map[string]interface{}, row RowType) bool {
|
||||
ignoreCase := false
|
||||
if len(arguments) > 2 && arguments[2] != nil {
|
||||
|
||||
Reference in New Issue
Block a user