cosmium/parsers/nosql/string_functions_test.go

516 lines
12 KiB
Go
Raw Normal View History

2024-02-18 22:37:09 +02:00
package nosql_test
import (
"testing"
"github.com/pikami/cosmium/parsers"
testutils "github.com/pikami/cosmium/test_utils"
2024-02-18 22:37:09 +02:00
)
func Test_Execute_StringFunctions(t *testing.T) {
2024-02-19 00:08:51 +02:00
t.Run("Should parse function STRINGEQUALS(ex1, ex2, ignoreCase)", func(t *testing.T) {
2024-02-18 22:37:09 +02:00
testQueryParse(
t,
`SELECT STRINGEQUALS(c.id, "123", true) FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallStringEquals,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
testutils.SelectItem_Constant_String("123"),
testutils.SelectItem_Constant_Bool(true),
2024-02-18 22:37:09 +02:00
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
2024-02-19 00:08:51 +02:00
t.Run("Should parse function STRINGEQUALS(ex1, ex2)", func(t *testing.T) {
2024-02-18 22:37:09 +02:00
testQueryParse(
t,
`SELECT STRINGEQUALS(c.id, "123") FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallStringEquals,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
testutils.SelectItem_Constant_String("123"),
2024-02-18 22:37:09 +02:00
nil,
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
2024-02-21 20:16:52 +02:00
t.Run("Should parse function CONCAT()", func(t *testing.T) {
testQueryParse(
t,
`SELECT CONCAT(c.id, "123", c.pk) FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallConcat,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
testutils.SelectItem_Constant_String("123"),
2024-02-21 20:16:52 +02:00
parsers.SelectItem{
Path: []string{"c", "pk"},
Type: parsers.SelectItemTypeField,
},
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
2024-02-21 20:25:14 +02:00
t.Run("Should parse function CONTAINS()", func(t *testing.T) {
testQueryParse(
t,
`SELECT CONTAINS(c.id, "123", true) FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallContains,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
testutils.SelectItem_Constant_String("123"),
testutils.SelectItem_Constant_Bool(true),
2024-02-21 20:25:14 +02:00
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
t.Run("Should parse function ENDSWITH()", func(t *testing.T) {
testQueryParse(
t,
`SELECT ENDSWITH(c.id, "123", true) FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallEndsWith,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
testutils.SelectItem_Constant_String("123"),
testutils.SelectItem_Constant_Bool(true),
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
t.Run("Should parse function STARTSWITH()", func(t *testing.T) {
testQueryParse(
t,
`SELECT STARTSWITH(c.id, "123", true) FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallStartsWith,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
testutils.SelectItem_Constant_String("123"),
testutils.SelectItem_Constant_Bool(true),
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
2024-02-22 22:12:52 +02:00
t.Run("Should parse function INDEX_OF()", func(t *testing.T) {
testQueryParse(
t,
`SELECT INDEX_OF(c.id, "2", 1) FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallIndexOf,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
testutils.SelectItem_Constant_String("2"),
testutils.SelectItem_Constant_Int(1),
2024-02-22 22:12:52 +02:00
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
2024-02-23 00:11:14 +02:00
t.Run("Should parse function ToString()", func(t *testing.T) {
testQueryParse(
t,
`SELECT ToString(c.id) FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallToString,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
2024-02-24 20:00:47 +02:00
t.Run("Should parse function UPPER()", func(t *testing.T) {
testQueryParse(
t,
`SELECT UPPER(c.id) FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallUpper,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
t.Run("Should parse function LOWER()", func(t *testing.T) {
testQueryParse(
t,
`SELECT LOWER(c.id) FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallLower,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
t.Run("Should parse function LEFT()", func(t *testing.T) {
testQueryParse(
t,
`SELECT LEFT(c.id, 5) FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallLeft,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
testutils.SelectItem_Constant_Int(5),
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
t.Run("Should parse function LENGTH()", func(t *testing.T) {
testQueryParse(
t,
`SELECT LENGTH(c.id) FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallLength,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
t.Run("Should parse function LTRIM()", func(t *testing.T) {
testQueryParse(
t,
`SELECT LTRIM(c.id) FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallLTrim,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
t.Run("Should parse function REPLACE()", func(t *testing.T) {
testQueryParse(
t,
`SELECT REPLACE(c.id, "old", "new") FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallReplace,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
testutils.SelectItem_Constant_String("old"),
testutils.SelectItem_Constant_String("new"),
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
t.Run("Should parse function REPLICATE()", func(t *testing.T) {
testQueryParse(
t,
`SELECT REPLICATE(c.id, 3) FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallReplicate,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
testutils.SelectItem_Constant_Int(3),
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
t.Run("Should parse function REVERSE()", func(t *testing.T) {
testQueryParse(
t,
`SELECT REVERSE(c.id) FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallReverse,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
t.Run("Should parse function RIGHT()", func(t *testing.T) {
testQueryParse(
t,
`SELECT RIGHT(c.id, 3) FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallRight,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
testutils.SelectItem_Constant_Int(3),
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
t.Run("Should parse function RTRIM()", func(t *testing.T) {
testQueryParse(
t,
`SELECT RTRIM(c.id) FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallRTrim,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
t.Run("Should parse function SUBSTRING()", func(t *testing.T) {
testQueryParse(
t,
`SELECT SUBSTRING(c.id, 1, 5) FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallSubstring,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
testutils.SelectItem_Constant_Int(1),
testutils.SelectItem_Constant_Int(5),
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
t.Run("Should parse function TRIM()", func(t *testing.T) {
testQueryParse(
t,
`SELECT TRIM(c.id) FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Type: parsers.SelectItemTypeFunctionCall,
Value: parsers.FunctionCall{
Type: parsers.FunctionCallTrim,
Arguments: []interface{}{
parsers.SelectItem{
Path: []string{"c", "id"},
Type: parsers.SelectItemTypeField,
},
},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
2024-02-18 22:37:09 +02:00
}