good morning!!!!

Skip to content
Snippets Groups Projects
Commit e21d8706 authored by José Carlos Nieto's avatar José Carlos Nieto
Browse files

Adding tests for SELECT.

parent 35992917
No related branches found
No related tags found
No related merge requests found
package sqlgen
type Cond struct {
}
func (self Cond) String() string {
return ""
}
...@@ -17,3 +17,7 @@ func (self Columns) String() string { ...@@ -17,3 +17,7 @@ func (self Columns) String() string {
return strings.Join(out, sqlColumnComma) return strings.Join(out, sqlColumnComma)
} }
func (self Columns) Len() int {
return len(self.v)
}
...@@ -11,17 +11,24 @@ const ( ...@@ -11,17 +11,24 @@ const (
sqlColumnComma = `, ` sqlColumnComma = `, `
sqlEscape = `"{{.Raw}}"` sqlEscape = `"{{.Raw}}"`
sqlOrderByLayout = `
{{if .Columns}}
ORDER BY {{.Columns}} {{.Sort}}
{{end}}
`
sqlSelectLayout = ` sqlSelectLayout = `
SELECT {{.Fields}} FROM {{.Source}} SELECT {{.Columns}} FROM {{.Source}}
{{if .Where}} {{if .Where}}
WHERE {{.Where}} WHERE {{.Where}}
{{end}} {{end}}
{{if .OrderBy}}
ORDER BY {{.OrderBy}} {{.Sort}} {{.OrderBy}}
{{end}}
{{if .Limit}} {{if .Limit}}
LIMIT {{.Limit}} LIMIT {{.Limit}}
{{end}} {{end}}
{{if .Offset}} {{if .Offset}}
OFFSET {{.Offset}} OFFSET {{.Offset}}
{{end}} {{end}}
...@@ -71,6 +78,8 @@ const ( ...@@ -71,6 +78,8 @@ const (
sqlAnd = `AND` sqlAnd = `AND`
sqlOr = `OR` sqlOr = `OR`
sqlDefaultOperator = `=` sqlDefaultOperator = `=`
sqlDescKeyword = `DESC`
sqlAscKeyword = `ASC`
sqlColumnValue = `{{.Column}} {{.Operator}} {{.Value}}` sqlColumnValue = `{{.Column}} {{.Operator}} {{.Value}}`
...@@ -84,21 +93,12 @@ const ( ...@@ -84,21 +93,12 @@ const (
SqlDropTable SqlDropTable
SqlDropDatabase SqlDropDatabase
SqlSelectCount SqlSelectCount
SqlSelect
) )
type ( type (
Fields []string
Limit int Limit int
Offset int Offset int
Sort string
OrderBy string
FieldValues map[string]string
PrimaryKey string
Values []string
Operator string
Field string
Function string
Where string
) )
func mustParse(text string, data interface{}) string { func mustParse(text string, data interface{}) string {
...@@ -114,26 +114,18 @@ func mustParse(text string, data interface{}) string { ...@@ -114,26 +114,18 @@ func mustParse(text string, data interface{}) string {
return b.String() return b.String()
} }
func (self *FieldValues) String() string {
return ""
}
type Statement struct { type Statement struct {
Type Type
Source Source
Database Database
Limit Limit
Offset Offset
Field
Columns Columns
FieldValues OrderBy
PrimaryKey
Values
Function
Where Where
} }
func (self *Statement) String() string { func (self *Statement) Compile() string {
switch self.Type { switch self.Type {
case SqlTruncate: case SqlTruncate:
return mustParse(sqlTruncateLayout, self) return mustParse(sqlTruncateLayout, self)
...@@ -143,6 +135,8 @@ func (self *Statement) String() string { ...@@ -143,6 +135,8 @@ func (self *Statement) String() string {
return mustParse(sqlDropDatabaseLayout, self) return mustParse(sqlDropDatabaseLayout, self)
case SqlSelectCount: case SqlSelectCount:
return mustParse(sqlSelectCountLayout, self) return mustParse(sqlSelectCountLayout, self)
case SqlSelect:
return mustParse(sqlSelectLayout, self)
} }
return "" return ""
} }
...@@ -129,7 +129,7 @@ func TestTruncateTable(t *testing.T) { ...@@ -129,7 +129,7 @@ func TestTruncateTable(t *testing.T) {
Source: Source{"source name"}, Source: Source{"source name"},
} }
s = strings.TrimSpace(stmt.String()) s = strings.TrimSpace(stmt.Compile())
e = `TRUNCATE TABLE "source name"` e = `TRUNCATE TABLE "source name"`
if s != e { if s != e {
...@@ -146,7 +146,7 @@ func TestDropTable(t *testing.T) { ...@@ -146,7 +146,7 @@ func TestDropTable(t *testing.T) {
Source: Source{"source name"}, Source: Source{"source name"},
} }
s = strings.TrimSpace(stmt.String()) s = strings.TrimSpace(stmt.Compile())
e = `DROP TABLE "source name"` e = `DROP TABLE "source name"`
if s != e { if s != e {
...@@ -163,7 +163,7 @@ func TestDropDatabase(t *testing.T) { ...@@ -163,7 +163,7 @@ func TestDropDatabase(t *testing.T) {
Database: Database{"source name"}, Database: Database{"source name"},
} }
s = trim(stmt.String()) s = trim(stmt.Compile())
e = `DROP DATABASE "source name"` e = `DROP DATABASE "source name"`
if s != e { if s != e {
...@@ -180,10 +180,191 @@ func TestSelectCount(t *testing.T) { ...@@ -180,10 +180,191 @@ func TestSelectCount(t *testing.T) {
Source: Source{"source name"}, Source: Source{"source name"},
} }
s = trim(stmt.String()) s = trim(stmt.Compile())
e = `SELECT COUNT(1) AS _t FROM "source name"` e = `SELECT COUNT(1) AS _t FROM "source name"`
if s != e { if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e) t.Fatalf("Got: %s, Expecting: %s", s, e)
} }
} }
func TestSelectFieldsFrom(t *testing.T) {
var s, e string
var stmt Statement
stmt = Statement{
Type: SqlSelect,
Columns: Columns{
[]Column{
{"foo"},
{"bar"},
{"baz"},
},
},
Source: Source{"source name"},
}
s = trim(stmt.Compile())
e = `SELECT "foo", "bar", "baz" FROM "source name"`
if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e)
}
}
func TestSelectFieldsFromWithLimitOffset(t *testing.T) {
var s, e string
var stmt Statement
// LIMIT only.
stmt = Statement{
Type: SqlSelect,
Columns: Columns{
[]Column{
{"foo"},
{"bar"},
{"baz"},
},
},
Limit: 42,
Source: Source{"source name"},
}
s = trim(stmt.Compile())
e = `SELECT "foo", "bar", "baz" FROM "source name" LIMIT 42`
if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e)
}
// OFFSET only.
stmt = Statement{
Type: SqlSelect,
Columns: Columns{
[]Column{
{"foo"},
{"bar"},
{"baz"},
},
},
Offset: 17,
Source: Source{"source name"},
}
s = trim(stmt.Compile())
e = `SELECT "foo", "bar", "baz" FROM "source name" OFFSET 17`
if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e)
}
// LIMIT AND OFFSET.
stmt = Statement{
Type: SqlSelect,
Columns: Columns{
[]Column{
{"foo"},
{"bar"},
{"baz"},
},
},
Limit: 42,
Offset: 17,
Source: Source{"source name"},
}
s = trim(stmt.Compile())
e = `SELECT "foo", "bar", "baz" FROM "source name" LIMIT 42 OFFSET 17`
if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e)
}
}
func TestSelectFieldsFromWithOrderBy(t *testing.T) {
var s, e string
var stmt Statement
// Simple ORDER BY
stmt = Statement{
Type: SqlSelect,
Columns: Columns{
[]Column{
{"foo"},
{"bar"},
{"baz"},
},
},
OrderBy: OrderBy{
Columns: Columns{
[]Column{
{"foo"},
},
},
},
Source: Source{"source name"},
}
s = trim(stmt.Compile())
e = `SELECT "foo", "bar", "baz" FROM "source name" ORDER BY "foo"`
if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e)
}
// ORDER BY field ASC
stmt = Statement{
Type: SqlSelect,
Columns: Columns{
[]Column{
{"foo"},
{"bar"},
{"baz"},
},
},
OrderBy: OrderBy{
Columns: Columns{
[]Column{
{"foo"},
},
},
Sort: Sort{SqlSortAsc},
},
Source: Source{"source name"},
}
s = trim(stmt.Compile())
e = `SELECT "foo", "bar", "baz" FROM "source name" ORDER BY "foo" ASC`
if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e)
}
// ORDER BY field DESC
stmt = Statement{
Type: SqlSelect,
Columns: Columns{
[]Column{
{"foo"},
{"bar"},
{"baz"},
},
},
OrderBy: OrderBy{
Columns: Columns{
[]Column{
{"foo"},
},
},
Sort: Sort{SqlSortDesc},
},
Source: Source{"source name"},
}
s = trim(stmt.Compile())
e = `SELECT "foo", "bar", "baz" FROM "source name" ORDER BY "foo" DESC`
if s != e {
t.Fatalf("Got: %s, Expecting: %s", s, e)
}
}
package sqlgen
type OrderBy struct {
Columns
Sort
}
func (self OrderBy) String() string {
if self.Columns.Len() > 0 {
return mustParse(sqlOrderByLayout, self)
}
return ""
}
type Sort struct {
v uint8
}
const (
SqlSortNone = iota
SqlSortAsc
SqlSortDesc
)
func (self Sort) String() string {
switch self.v {
case SqlSortAsc:
return sqlAscKeyword
case SqlSortDesc:
return sqlDescKeyword
}
return ""
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment