Add support for subqueries

This commit is contained in:
Pijus Kamandulis
2024-12-07 22:29:26 +02:00
parent 3584f9b5ce
commit 66ea859f34
15 changed files with 3227 additions and 2290 deletions

View File

@@ -8,10 +8,10 @@ import (
"github.com/pikami/cosmium/parsers"
)
func (c memoryExecutorContext) strings_StringEquals(arguments []interface{}, row RowType) bool {
str1 := c.parseString(arguments[0], row)
str2 := c.parseString(arguments[1], row)
ignoreCase := c.getBoolFlag(arguments, row)
func (r rowContext) strings_StringEquals(arguments []interface{}) bool {
str1 := r.parseString(arguments[0])
str2 := r.parseString(arguments[1])
ignoreCase := r.getBoolFlag(arguments)
if ignoreCase {
return strings.EqualFold(str1, str2)
@@ -20,10 +20,10 @@ func (c memoryExecutorContext) strings_StringEquals(arguments []interface{}, row
return str1 == str2
}
func (c memoryExecutorContext) strings_Contains(arguments []interface{}, row RowType) bool {
str1 := c.parseString(arguments[0], row)
str2 := c.parseString(arguments[1], row)
ignoreCase := c.getBoolFlag(arguments, row)
func (r rowContext) strings_Contains(arguments []interface{}) bool {
str1 := r.parseString(arguments[0])
str2 := r.parseString(arguments[1])
ignoreCase := r.getBoolFlag(arguments)
if ignoreCase {
str1 = strings.ToLower(str1)
@@ -33,10 +33,10 @@ func (c memoryExecutorContext) strings_Contains(arguments []interface{}, row Row
return strings.Contains(str1, str2)
}
func (c memoryExecutorContext) strings_EndsWith(arguments []interface{}, row RowType) bool {
str1 := c.parseString(arguments[0], row)
str2 := c.parseString(arguments[1], row)
ignoreCase := c.getBoolFlag(arguments, row)
func (r rowContext) strings_EndsWith(arguments []interface{}) bool {
str1 := r.parseString(arguments[0])
str2 := r.parseString(arguments[1])
ignoreCase := r.getBoolFlag(arguments)
if ignoreCase {
str1 = strings.ToLower(str1)
@@ -46,10 +46,10 @@ func (c memoryExecutorContext) strings_EndsWith(arguments []interface{}, row Row
return strings.HasSuffix(str1, str2)
}
func (c memoryExecutorContext) strings_StartsWith(arguments []interface{}, row RowType) bool {
str1 := c.parseString(arguments[0], row)
str2 := c.parseString(arguments[1], row)
ignoreCase := c.getBoolFlag(arguments, row)
func (r rowContext) strings_StartsWith(arguments []interface{}) bool {
str1 := r.parseString(arguments[0])
str2 := r.parseString(arguments[1])
ignoreCase := r.getBoolFlag(arguments)
if ignoreCase {
str1 = strings.ToLower(str1)
@@ -59,12 +59,12 @@ func (c memoryExecutorContext) strings_StartsWith(arguments []interface{}, row R
return strings.HasPrefix(str1, str2)
}
func (c memoryExecutorContext) strings_Concat(arguments []interface{}, row RowType) string {
func (r rowContext) strings_Concat(arguments []interface{}) string {
result := ""
for _, arg := range arguments {
if selectItem, ok := arg.(parsers.SelectItem); ok {
value := c.getFieldValue(selectItem, row)
value := r.resolveSelectItem(selectItem)
result += convertToString(value)
}
}
@@ -72,13 +72,13 @@ func (c memoryExecutorContext) strings_Concat(arguments []interface{}, row RowTy
return result
}
func (c memoryExecutorContext) strings_IndexOf(arguments []interface{}, row RowType) int {
str1 := c.parseString(arguments[0], row)
str2 := c.parseString(arguments[1], row)
func (r rowContext) strings_IndexOf(arguments []interface{}) int {
str1 := r.parseString(arguments[0])
str2 := r.parseString(arguments[1])
start := 0
if len(arguments) > 2 && arguments[2] != nil {
if startPos, ok := c.getFieldValue(arguments[2].(parsers.SelectItem), row).(int); ok {
if startPos, ok := r.resolveSelectItem(arguments[2].(parsers.SelectItem)).(int); ok {
start = startPos
}
}
@@ -97,26 +97,26 @@ func (c memoryExecutorContext) strings_IndexOf(arguments []interface{}, row RowT
}
}
func (c memoryExecutorContext) strings_ToString(arguments []interface{}, row RowType) string {
value := c.getFieldValue(arguments[0].(parsers.SelectItem), row)
func (r rowContext) strings_ToString(arguments []interface{}) string {
value := r.resolveSelectItem(arguments[0].(parsers.SelectItem))
return convertToString(value)
}
func (c memoryExecutorContext) strings_Upper(arguments []interface{}, row RowType) string {
value := c.getFieldValue(arguments[0].(parsers.SelectItem), row)
func (r rowContext) strings_Upper(arguments []interface{}) string {
value := r.resolveSelectItem(arguments[0].(parsers.SelectItem))
return strings.ToUpper(convertToString(value))
}
func (c memoryExecutorContext) strings_Lower(arguments []interface{}, row RowType) string {
value := c.getFieldValue(arguments[0].(parsers.SelectItem), row)
func (r rowContext) strings_Lower(arguments []interface{}) string {
value := r.resolveSelectItem(arguments[0].(parsers.SelectItem))
return strings.ToLower(convertToString(value))
}
func (c memoryExecutorContext) strings_Left(arguments []interface{}, row RowType) string {
func (r rowContext) strings_Left(arguments []interface{}) string {
var ok bool
var length int
str := c.parseString(arguments[0], row)
lengthEx := c.getFieldValue(arguments[1].(parsers.SelectItem), row)
str := r.parseString(arguments[0])
lengthEx := r.resolveSelectItem(arguments[1].(parsers.SelectItem))
if length, ok = lengthEx.(int); !ok {
logger.Error("strings_Left - got parameters of wrong type")
@@ -134,28 +134,28 @@ func (c memoryExecutorContext) strings_Left(arguments []interface{}, row RowType
return str[:length]
}
func (c memoryExecutorContext) strings_Length(arguments []interface{}, row RowType) int {
str := c.parseString(arguments[0], row)
func (r rowContext) strings_Length(arguments []interface{}) int {
str := r.parseString(arguments[0])
return len(str)
}
func (c memoryExecutorContext) strings_LTrim(arguments []interface{}, row RowType) string {
str := c.parseString(arguments[0], row)
func (r rowContext) strings_LTrim(arguments []interface{}) string {
str := r.parseString(arguments[0])
return strings.TrimLeft(str, " ")
}
func (c memoryExecutorContext) strings_Replace(arguments []interface{}, row RowType) string {
str := c.parseString(arguments[0], row)
oldStr := c.parseString(arguments[1], row)
newStr := c.parseString(arguments[2], row)
func (r rowContext) strings_Replace(arguments []interface{}) string {
str := r.parseString(arguments[0])
oldStr := r.parseString(arguments[1])
newStr := r.parseString(arguments[2])
return strings.Replace(str, oldStr, newStr, -1)
}
func (c memoryExecutorContext) strings_Replicate(arguments []interface{}, row RowType) string {
func (r rowContext) strings_Replicate(arguments []interface{}) string {
var ok bool
var times int
str := c.parseString(arguments[0], row)
timesEx := c.getFieldValue(arguments[1].(parsers.SelectItem), row)
str := r.parseString(arguments[0])
timesEx := r.resolveSelectItem(arguments[1].(parsers.SelectItem))
if times, ok = timesEx.(int); !ok {
logger.Error("strings_Replicate - got parameters of wrong type")
@@ -173,8 +173,8 @@ func (c memoryExecutorContext) strings_Replicate(arguments []interface{}, row Ro
return strings.Repeat(str, times)
}
func (c memoryExecutorContext) strings_Reverse(arguments []interface{}, row RowType) string {
str := c.parseString(arguments[0], row)
func (r rowContext) strings_Reverse(arguments []interface{}) string {
str := r.parseString(arguments[0])
runes := []rune(str)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
@@ -184,11 +184,11 @@ func (c memoryExecutorContext) strings_Reverse(arguments []interface{}, row RowT
return string(runes)
}
func (c memoryExecutorContext) strings_Right(arguments []interface{}, row RowType) string {
func (r rowContext) strings_Right(arguments []interface{}) string {
var ok bool
var length int
str := c.parseString(arguments[0], row)
lengthEx := c.getFieldValue(arguments[1].(parsers.SelectItem), row)
str := r.parseString(arguments[0])
lengthEx := r.resolveSelectItem(arguments[1].(parsers.SelectItem))
if length, ok = lengthEx.(int); !ok {
logger.Error("strings_Right - got parameters of wrong type")
@@ -206,18 +206,18 @@ func (c memoryExecutorContext) strings_Right(arguments []interface{}, row RowTyp
return str[len(str)-length:]
}
func (c memoryExecutorContext) strings_RTrim(arguments []interface{}, row RowType) string {
str := c.parseString(arguments[0], row)
func (r rowContext) strings_RTrim(arguments []interface{}) string {
str := r.parseString(arguments[0])
return strings.TrimRight(str, " ")
}
func (c memoryExecutorContext) strings_Substring(arguments []interface{}, row RowType) string {
func (r rowContext) strings_Substring(arguments []interface{}) string {
var ok bool
var startPos int
var length int
str := c.parseString(arguments[0], row)
startPosEx := c.getFieldValue(arguments[1].(parsers.SelectItem), row)
lengthEx := c.getFieldValue(arguments[2].(parsers.SelectItem), row)
str := r.parseString(arguments[0])
startPosEx := r.resolveSelectItem(arguments[1].(parsers.SelectItem))
lengthEx := r.resolveSelectItem(arguments[2].(parsers.SelectItem))
if startPos, ok = startPosEx.(int); !ok {
logger.Error("strings_Substring - got start parameters of wrong type")
@@ -240,16 +240,16 @@ func (c memoryExecutorContext) strings_Substring(arguments []interface{}, row Ro
return str[startPos:endPos]
}
func (c memoryExecutorContext) strings_Trim(arguments []interface{}, row RowType) string {
str := c.parseString(arguments[0], row)
func (r rowContext) strings_Trim(arguments []interface{}) string {
str := r.parseString(arguments[0])
return strings.TrimSpace(str)
}
func (c memoryExecutorContext) getBoolFlag(arguments []interface{}, row RowType) bool {
func (r rowContext) getBoolFlag(arguments []interface{}) bool {
ignoreCase := false
if len(arguments) > 2 && arguments[2] != nil {
ignoreCaseItem := arguments[2].(parsers.SelectItem)
if value, ok := c.getFieldValue(ignoreCaseItem, row).(bool); ok {
if value, ok := r.resolveSelectItem(ignoreCaseItem).(bool); ok {
ignoreCase = value
}
}
@@ -257,9 +257,9 @@ func (c memoryExecutorContext) getBoolFlag(arguments []interface{}, row RowType)
return ignoreCase
}
func (c memoryExecutorContext) parseString(argument interface{}, row RowType) string {
func (r rowContext) parseString(argument interface{}) string {
exItem := argument.(parsers.SelectItem)
ex := c.getFieldValue(exItem, row)
ex := r.resolveSelectItem(exItem)
if str1, ok := ex.(string); ok {
return str1
}