2.0.0-dev.4
This commit is contained in:
parent
432bac7512
commit
e621d53496
3 changed files with 57 additions and 16 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
# 2.0.0-dev.4
|
||||||
|
* Add more querying methods.
|
||||||
|
* Add preamble to `Query.compile`.
|
||||||
|
|
||||||
# 2.0.0-dev.3
|
# 2.0.0-dev.3
|
||||||
* Brought back old-style query builder.
|
* Brought back old-style query builder.
|
||||||
* Strong-mode updates, revised `Join`.
|
* Strong-mode updates, revised `Join`.
|
||||||
|
|
|
@ -4,7 +4,7 @@ import 'builder.dart';
|
||||||
|
|
||||||
/// A base class for objects that compile to SQL queries, typically within an ORM.
|
/// A base class for objects that compile to SQL queries, typically within an ORM.
|
||||||
abstract class QueryBase<T> {
|
abstract class QueryBase<T> {
|
||||||
String compile({bool includeTableName: false});
|
String compile({bool includeTableName: false, String preamble});
|
||||||
|
|
||||||
T deserialize(List row);
|
T deserialize(List row);
|
||||||
|
|
||||||
|
@ -55,6 +55,33 @@ abstract class Query<T, Where extends QueryWhere> extends QueryBase<T> {
|
||||||
/// This is often a generated class.
|
/// This is often a generated class.
|
||||||
Where get where;
|
Where get where;
|
||||||
|
|
||||||
|
/// Makes a new [Where] clause.
|
||||||
|
Where newWhereClause() {
|
||||||
|
throw new UnsupportedError(
|
||||||
|
'This instance does not support creating new WHERE clauses.');
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Shorthand for calling [where].or with a new [Where] clause.
|
||||||
|
void andWhere(void Function(Where) f) {
|
||||||
|
var w = newWhereClause();
|
||||||
|
f(w);
|
||||||
|
where.and(w);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Shorthand for calling [where].or with a new [Where] clause.
|
||||||
|
void notWhere(void Function(Where) f) {
|
||||||
|
var w = newWhereClause();
|
||||||
|
f(w);
|
||||||
|
where.not(w);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Shorthand for calling [where].or with a new [Where] clause.
|
||||||
|
void orWhere(void Function(Where) f) {
|
||||||
|
var w = newWhereClause();
|
||||||
|
f(w);
|
||||||
|
where.or(w);
|
||||||
|
}
|
||||||
|
|
||||||
/// Limit the number of rows to return.
|
/// Limit the number of rows to return.
|
||||||
void limit(int n) {
|
void limit(int n) {
|
||||||
_limit = n;
|
_limit = n;
|
||||||
|
@ -83,41 +110,46 @@ abstract class Query<T, Where extends QueryWhere> extends QueryBase<T> {
|
||||||
/// Execute an `INNER JOIN` against another table.
|
/// Execute an `INNER JOIN` against another table.
|
||||||
void join(String tableName, String localKey, String foreignKey,
|
void join(String tableName, String localKey, String foreignKey,
|
||||||
{String op: '='}) {
|
{String op: '='}) {
|
||||||
_join =
|
_join = new JoinBuilder(
|
||||||
new JoinBuilder(JoinType.inner, this, tableName, localKey, foreignKey, op: op);
|
JoinType.inner, this, tableName, localKey, foreignKey,
|
||||||
|
op: op);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Execute a `LEFT JOIN` against another table.
|
/// Execute a `LEFT JOIN` against another table.
|
||||||
void leftJoin(String tableName, String localKey, String foreignKey,
|
void leftJoin(String tableName, String localKey, String foreignKey,
|
||||||
{String op: '='}) {
|
{String op: '='}) {
|
||||||
_join =
|
_join = new JoinBuilder(
|
||||||
new JoinBuilder(JoinType.left, this, tableName, localKey, foreignKey, op: op);
|
JoinType.left, this, tableName, localKey, foreignKey,
|
||||||
|
op: op);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Execute a `RIGHT JOIN` against another table.
|
/// Execute a `RIGHT JOIN` against another table.
|
||||||
void rightJoin(String tableName, String localKey, String foreignKey,
|
void rightJoin(String tableName, String localKey, String foreignKey,
|
||||||
{String op: '='}) {
|
{String op: '='}) {
|
||||||
_join =
|
_join = new JoinBuilder(
|
||||||
new JoinBuilder(JoinType.right, this, tableName, localKey, foreignKey, op: op);
|
JoinType.right, this, tableName, localKey, foreignKey,
|
||||||
|
op: op);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Execute a `FULL OUTER JOIN` against another table.
|
/// Execute a `FULL OUTER JOIN` against another table.
|
||||||
void fullOuterJoin(String tableName, String localKey, String foreignKey,
|
void fullOuterJoin(String tableName, String localKey, String foreignKey,
|
||||||
{String op: '='}) {
|
{String op: '='}) {
|
||||||
_join =
|
_join = new JoinBuilder(
|
||||||
new JoinBuilder(JoinType.full, this, tableName, localKey, foreignKey, op: op);
|
JoinType.full, this, tableName, localKey, foreignKey,
|
||||||
|
op: op);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Execute a `SELF JOIN`.
|
/// Execute a `SELF JOIN`.
|
||||||
void selfJoin(String tableName, String localKey, String foreignKey,
|
void selfJoin(String tableName, String localKey, String foreignKey,
|
||||||
{String op: '='}) {
|
{String op: '='}) {
|
||||||
_join =
|
_join = new JoinBuilder(
|
||||||
new JoinBuilder(JoinType.self, this, tableName, localKey, foreignKey, op: op);
|
JoinType.self, this, tableName, localKey, foreignKey,
|
||||||
|
op: op);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String compile({bool includeTableName: false}) {
|
String compile({bool includeTableName: false, String preamble}) {
|
||||||
var b = new StringBuffer('SELECT ');
|
var b = new StringBuffer(preamble ?? 'SELECT ');
|
||||||
var f = fields ?? ['*'];
|
var f = fields ?? ['*'];
|
||||||
if (includeTableName) f = f.map((s) => '$tableName.$s').toList();
|
if (includeTableName) f = f.map((s) => '$tableName.$s').toList();
|
||||||
b.write(f.join(', '));
|
b.write(f.join(', '));
|
||||||
|
@ -147,6 +179,10 @@ abstract class QueryWhere {
|
||||||
_and.add(other);
|
_and.add(other);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void not(QueryWhere other) {
|
||||||
|
_not.add(other);
|
||||||
|
}
|
||||||
|
|
||||||
void or(QueryWhere other) {
|
void or(QueryWhere other) {
|
||||||
_or.add(other);
|
_or.add(other);
|
||||||
}
|
}
|
||||||
|
@ -194,7 +230,7 @@ class Union<T> extends QueryBase<T> {
|
||||||
T deserialize(List row) => left.deserialize(row);
|
T deserialize(List row) => left.deserialize(row);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String compile({bool includeTableName: false}) {
|
String compile({bool includeTableName: false, String preamble}) {
|
||||||
var selector = all == true ? 'UNION ALL' : 'UNION';
|
var selector = all == true ? 'UNION ALL' : 'UNION';
|
||||||
return '(${left.compile(includeTableName: includeTableName)}) $selector (${right.compile(includeTableName: includeTableName)})';
|
return '(${left.compile(includeTableName: includeTableName)}) $selector (${right.compile(includeTableName: includeTableName)})';
|
||||||
}
|
}
|
||||||
|
@ -206,7 +242,8 @@ class JoinBuilder {
|
||||||
final Query from;
|
final Query from;
|
||||||
final String to, key, value, op;
|
final String to, key, value, op;
|
||||||
|
|
||||||
JoinBuilder(this.type, this.from, this.to, this.key, this.value, {this.op: '='});
|
JoinBuilder(this.type, this.from, this.to, this.key, this.value,
|
||||||
|
{this.op: '='});
|
||||||
|
|
||||||
String compile() {
|
String compile() {
|
||||||
var b = new StringBuffer();
|
var b = new StringBuffer();
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
name: angel_orm
|
name: angel_orm
|
||||||
version: 2.0.0-dev.3
|
version: 2.0.0-dev.4
|
||||||
description: Runtime support for Angel's ORM.
|
description: Runtime support for Angel's ORM.
|
||||||
author: Tobe O <thosakwe@gmail.com>
|
author: Tobe O <thosakwe@gmail.com>
|
||||||
homepage: https://github.com/angel-dart/orm
|
homepage: https://github.com/angel-dart/orm
|
||||||
|
|
Loading…
Reference in a new issue