Implement ToString function

This commit is contained in:
Pijus Kamandulis
2024-02-23 00:11:14 +02:00
parent 59632ec966
commit 16f41a5479
7 changed files with 277 additions and 139 deletions

View File

@@ -188,6 +188,8 @@ func getFieldValue(field parsers.SelectItem, queryParameters map[string]interfac
return strings_Concat(typedValue.Arguments, queryParameters, row)
case parsers.FunctionCallIndexOf:
return strings_IndexOf(typedValue.Arguments, queryParameters, row)
case parsers.FunctionCallToString:
return strings_ToString(typedValue.Arguments, queryParameters, row)
case parsers.FunctionCallIsDefined:
return typeChecking_IsDefined(typedValue.Arguments, queryParameters, row)
}

View File

@@ -9,8 +9,8 @@ import (
func Test_Execute_StringFunctions(t *testing.T) {
mockData := []memoryexecutor.RowType{
map[string]interface{}{"id": "123", "pk": "aaa", "str": "hello"},
map[string]interface{}{"id": "456", "pk": "bbb", "str": "world"},
map[string]interface{}{"id": "123", "pk": "aaa", "str": "hello", "rng_type": true},
map[string]interface{}{"id": "456", "pk": "bbb", "str": "world", "rng_type": 159},
map[string]interface{}{"id": "789", "pk": "AAA", "str": "cool world"},
}
@@ -343,4 +343,38 @@ func Test_Execute_StringFunctions(t *testing.T) {
},
)
})
t.Run("Should execute function ToString()", func(t *testing.T) {
testQueryExecute(
t,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
{
Alias: "str",
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallToString,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "rng_type"},
Type: parsers.SelectItemTypeField,
},
},
},
},
},
Table: parsers.Table{Value: "c"},
},
mockData,
[]memoryexecutor.RowType{
map[string]interface{}{"id": "123", "str": "true"},
map[string]interface{}{"id": "456", "str": "159"},
map[string]interface{}{"id": "789", "str": ""},
},
)
})
}

View File

@@ -96,6 +96,11 @@ func strings_IndexOf(arguments []interface{}, queryParameters map[string]interfa
}
}
func strings_ToString(arguments []interface{}, queryParameters map[string]interface{}, row RowType) string {
value := getFieldValue(arguments[0].(parsers.SelectItem), queryParameters, row)
return convertToString(value)
}
func getBoolFlag(arguments []interface{}, queryParameters map[string]interface{}, row RowType) bool {
ignoreCase := false
if len(arguments) > 2 && arguments[2] != nil {
@@ -127,6 +132,8 @@ func convertToString(value interface{}) string {
return fmt.Sprintf("%d", v)
case float32, float64:
return fmt.Sprintf("%f", v)
case bool:
return fmt.Sprintf("%t", v)
}
return ""
}