orm: limit

pull/5532/head
Alexander Medvednikov 2020-06-27 16:19:12 +02:00
parent f8f2fa246e
commit f073ffa4ad
4 changed files with 46 additions and 27 deletions

View File

@ -168,6 +168,12 @@ fn test_orm_sqlite() {
} }
assert no_user.name == '' // TODO optional assert no_user.name == '' // TODO optional
assert no_user.age == 0 assert no_user.age == 0
//
two_users := sql db {
select from User limit 2
}
assert two_users.len == 2
assert two_users[0].id > 0
} }
struct User { struct User {

View File

@ -106,7 +106,7 @@ pub:
field_name string field_name string
pub mut: pub mut:
expr_type table.Type // type of `Foo` in `Foo.bar` expr_type table.Type // type of `Foo` in `Foo.bar`
typ table.Type // type of the entire thing (`Foo.bar`) typ table.Type // type of the entire thing (`Foo.bar`)
} }
// module declaration // module declaration
@ -211,10 +211,10 @@ pub:
pub struct AnonFn { pub struct AnonFn {
pub: pub:
decl FnDecl decl FnDecl
is_called bool is_called bool
pub mut: pub mut:
typ table.Type typ table.Type
} }
pub struct FnDecl { pub struct FnDecl {
@ -809,7 +809,6 @@ pub enum SqlExprKind {
update update
} }
*/ */
pub enum SqlStmtKind { pub enum SqlStmtKind {
insert insert
update update
@ -818,32 +817,36 @@ pub enum SqlStmtKind {
pub struct SqlStmt { pub struct SqlStmt {
pub: pub:
kind SqlStmtKind kind SqlStmtKind
db_expr Expr // `db` in `sql db {` db_expr Expr // `db` in `sql db {`
object_var_name string // `user` object_var_name string // `user`
table_type table.Type table_type table.Type
pos token.Position pos token.Position
where_expr Expr where_expr Expr
updated_columns []string //for `update set x=y` updated_columns []string // for `update set x=y`
update_exprs []Expr//for `update` update_exprs []Expr // for `update`
pub mut: pub mut:
table_name string table_name string
fields []table.Field fields []table.Field
} }
pub struct SqlExpr { pub struct SqlExpr {
pub: pub:
typ table.Type typ table.Type
is_count bool is_count bool
db_expr Expr // `db` in `sql db {` db_expr Expr // `db` in `sql db {`
where_expr Expr where_expr Expr
has_where bool has_where bool
is_array bool has_offset bool
table_type table.Type offset_expr Expr
pos token.Position is_array bool
table_type table.Type
pos token.Position
has_limit bool
limit_expr Expr
pub mut: pub mut:
table_name string table_name string
fields []table.Field fields []table.Field
} }
[inline] [inline]
@ -898,8 +901,7 @@ pub fn (expr Expr) position() token.Position {
InfixExpr { InfixExpr {
left_pos := expr.left.position() left_pos := expr.left.position()
right_pos := expr.right.position() right_pos := expr.right.position()
if left_pos.pos == 0 || if left_pos.pos == 0 || right_pos.pos == 0 {
right_pos.pos == 0 {
return expr.pos return expr.pos
} }
return token.Position{ return token.Position{

View File

@ -131,7 +131,12 @@ fn (mut g Gen) sql_select_expr(node ast.SqlExpr) {
if node.has_where && node.where_expr is ast.InfixExpr { if node.has_where && node.where_expr is ast.InfixExpr {
g.expr_to_sql(node.where_expr) g.expr_to_sql(node.where_expr)
} }
g.writeln(' order by id"));') g.write(' order by id ')
if node.has_limit {
g.write(' limit ')
g.expr_to_sql(node.limit_expr)
}
g.writeln('"));')
// Dump all sql parameters generated by our custom expr handler // Dump all sql parameters generated by our custom expr handler
binds := g.sql_buf.str() binds := g.sql_buf.str()
g.sql_buf = strings.new_builder(100) g.sql_buf = strings.new_builder(100)
@ -182,7 +187,7 @@ fn (mut g Gen) sql_select_expr(node ast.SqlExpr) {
g.writeln('\tif (_step_res$tmp == SQLITE_ROW) ;') // another row g.writeln('\tif (_step_res$tmp == SQLITE_ROW) ;') // another row
g.writeln('\telse if (_step_res$tmp != SQLITE_OK) break;') g.writeln('\telse if (_step_res$tmp != SQLITE_OK) break;')
} else { } else {
g.writeln('printf("RES: %d\\n", _step_res$tmp) ;') // g.writeln('printf("RES: %d\\n", _step_res$tmp) ;')
g.writeln('\tif (_step_res$tmp == SQLITE_OK || _step_res$tmp == SQLITE_ROW) {') g.writeln('\tif (_step_res$tmp == SQLITE_OK || _step_res$tmp == SQLITE_ROW) {')
} }
for i, field in node.fields { for i, field in node.fields {

View File

@ -38,13 +38,17 @@ fn (mut p Parser) sql_expr() ast.Expr {
} }
} }
} }
mut has_limit := false
mut limit_expr := ast.Expr{}
if p.tok.kind == .name && p.tok.lit == 'limit' { if p.tok.kind == .name && p.tok.lit == 'limit' {
// `limit 1` means that a single object is returned // `limit 1` means that a single object is returned
p.check_name() // `limit` p.check_name() // `limit`
if p.tok.kind == .number && p.tok.lit == '1' { if p.tok.kind == .number && p.tok.lit == '1' {
query_one = true query_one = true
} else {
has_limit = true
} }
p.next() limit_expr = p.expr(0)
} }
if !query_one && !is_count { if !query_one && !is_count {
// return an array // return an array
@ -63,6 +67,8 @@ fn (mut p Parser) sql_expr() ast.Expr {
table_type: table_type table_type: table_type
where_expr: where_expr where_expr: where_expr
has_where: has_where has_where: has_where
has_limit: has_limit
limit_expr: limit_expr
is_array: !query_one is_array: !query_one
pos: pos pos: pos
} }