mirror of
https://github.com/pikami/cosmium.git
synced 2025-12-19 17:00:37 +00:00
Added support for array selects
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -49,6 +49,19 @@ func makeColumnList(column interface{}, other_columns interface{}) ([]parsers.Se
|
||||
return columnList, nil
|
||||
}
|
||||
|
||||
func makeSelectArray(columns interface{}, asClause interface{}) (parsers.SelectItem, error) {
|
||||
selectItem := parsers.SelectItem{
|
||||
SelectItems: columns.([]parsers.SelectItem),
|
||||
Type: parsers.SelectItemTypeArray,
|
||||
}
|
||||
|
||||
if aliasValue, ok := asClause.(string); ok {
|
||||
selectItem.Alias = aliasValue
|
||||
}
|
||||
|
||||
return selectItem, nil
|
||||
}
|
||||
|
||||
func joinStrings(array []interface{}) string {
|
||||
var stringsArray []string
|
||||
for _, elem := range array {
|
||||
@@ -101,11 +114,17 @@ TableName <- key:Identifier {
|
||||
return parsers.Table{Value: key.(string)}, nil
|
||||
}
|
||||
|
||||
SelectItem <- name:Identifier path:(DotFieldAccess / ArrayFieldAccess)*
|
||||
asClause:(ws "AS" ws alias:Identifier { return alias, nil })? {
|
||||
SelectArray <- "[" ws columns:ColumnList ws "]" asClause:AsClause? {
|
||||
return makeSelectArray(columns, asClause)
|
||||
}
|
||||
|
||||
SelectItem <- SelectArray / name:Identifier path:(DotFieldAccess / ArrayFieldAccess)*
|
||||
asClause:AsClause? {
|
||||
return makeSelectItem(name, path, asClause, parsers.SelectItemTypeField)
|
||||
}
|
||||
|
||||
AsClause <- ws As ws alias:Identifier { return alias, nil }
|
||||
|
||||
DotFieldAccess <- "." id:Identifier {
|
||||
return id, nil
|
||||
}
|
||||
@@ -136,6 +155,8 @@ ComparisonExpression <- left:(Literal / SelectItem) ws op:ComparisonOperator ws
|
||||
|
||||
Select <- ("select" / "SELECT")
|
||||
|
||||
As <- ("as" / "AS")
|
||||
|
||||
From <- ("from" / "FROM")
|
||||
|
||||
Where <- ("where" / "WHERE")
|
||||
|
||||
@@ -65,6 +65,26 @@ func Test_Parse(t *testing.T) {
|
||||
)
|
||||
})
|
||||
|
||||
t.Run("Should parse SELECT array", func(t *testing.T) {
|
||||
testQueryParse(
|
||||
t,
|
||||
`SELECT [c.id, c.pk] as arr FROM c`,
|
||||
parsers.SelectStmt{
|
||||
SelectItems: []parsers.SelectItem{
|
||||
{
|
||||
Alias: "arr",
|
||||
Type: parsers.SelectItemTypeArray,
|
||||
SelectItems: []parsers.SelectItem{
|
||||
{Path: []string{"c", "id"}},
|
||||
{Path: []string{"c", "pk"}},
|
||||
},
|
||||
},
|
||||
},
|
||||
Table: parsers.Table{Value: "c"},
|
||||
},
|
||||
)
|
||||
})
|
||||
|
||||
t.Run("Should parse SELECT with single WHERE condition", func(t *testing.T) {
|
||||
testQueryParse(
|
||||
t,
|
||||
|
||||
Reference in New Issue
Block a user