Browse Source

Merge branch 'master' of github.com:brianc/node-sql

auto-join
Sascha Depold 12 years ago
parent
commit
2d5b8f8ea0
  1. 1
      .gitignore
  2. 24
      README.md
  3. 18
      lib/column.js
  4. 12
      lib/dialect/postgres.js
  5. 2
      lib/node/column.js
  6. 3
      lib/table.js
  7. 2
      package.json
  8. 48
      test/dialects/aggregate-tests.js
  9. 21
      test/table-tests.js

1
.gitignore

@ -1 +1,2 @@
node_modules/
.idea

24
README.md

@ -18,7 +18,7 @@ var sql = require('sql');
//first we define our tables
var user = sql.define({
name: 'user',
columns: ['id', 'email', 'lastLogin']
columns: ['id', 'name', 'email', 'lastLogin']
});
var post = sql.define({
@ -47,10 +47,10 @@ console.log(query.values); //['boom', 1, 'bang', 2]
//how about a join?
var query = user.select(user.name, post.content)
var query = user.select(user.name, post.body)
.from(user.join(post).on(user.id.equals(post.userId))).toQuery();
console.log(query.text); //'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")'
console.log(query.text); //'SELECT "user"."name", "post"."body" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")'
//this also makes parts of your queries composable, which is handy
@ -65,7 +65,7 @@ var userToFriends = user
.leftJoin(friends).on(friendship.friendId.equals(friends.id));
//and now...compose...
var friendsWhoHaveLoggedInQuery = user.from(userToFriends).where(friends.lastLogin.notNull());
var friendsWhoHaveLoggedInQuery = user.from(userToFriends).where(friends.lastLogin.isNotNull());
//SELECT * FROM "user"
//LEFT JOIN "friendship" ON ("user"."id" = "friendship"."userId")
//LEFT JOIN "user" AS "friends" ON ("friendship"."friendId" = "friends"."id")
@ -77,6 +77,22 @@ var friendsWhoUseGmailQuery = user.from(userToFriends).where(friends.email.like(
//LEFT JOIN "user" AS "friends" ON ("friendship"."friendId" = "friends"."id")
//WHERE "friends"."email" LIKE %1
//Using different property names for columns
//helpful if your column name is long or not camelCase
var user = sql.define({
name: 'user',
columns: [{
name: 'id'
}, {
name: 'state_or_province',
property: 'state'
}
]
});
//now, instead of user.state_or_province, you can just use user.state
console.log(user.select().where(user.state.equals('WA')).toQuery().text);
// "SELECT "user".* FROM "user" WHERE ("user"."state_or_province" = $1)"
```
There are a __lot__ more examples included in the `test/dialects` folder.

18
lib/column.js

@ -84,13 +84,25 @@ Column.prototype.arrayAgg = function(alias) {
return new ColumnNode(context);
};
Column.prototype.count = function(alias) {
Column.prototype.aggregate = function(alias, aggregator) {
var context = contextify(this);
context.aggCount = true;
context.alias = alias || context.name + '_count';
context.aggregator = aggregator.toUpperCase();
context.alias = alias || context.name + '_' + context.aggregator.toLowerCase();
return new ColumnNode(context);
};
Column.prototype.count = function(alias) {
return this.aggregate(alias, 'count');
};
Column.prototype.min = function(alias) {
return this.aggregate(alias, 'min');
};
Column.prototype.max = function(alias) {
return this.aggregate(alias, 'max');
};
Column.prototype.distinct = function() {
var context = contextify(this);
context.distinct = true;

12
lib/dialect/postgres.js

@ -304,12 +304,16 @@ Postgres.prototype.visitColumn = function(columnNode) {
if (columnNode.asArray) {
closeParen++;
txt += this._arrayAggFunctionName+'(';
} if (columnNode.aggCount) {
}
if (!!columnNode.aggregator) {
closeParen++;
txt += 'COUNT(';
} if (columnNode.distinct === true) {
txt += columnNode.aggregator + '(';
}
if (columnNode.distinct === true) {
closeParen++;
txt += 'DISTINCT('
txt += 'DISTINCT(';
}
}
if(!this._visitedInsert && !this._visitingUpdateTargetColumn && !this._visitingCreate && !this._visitingAlter) {

2
lib/node/column.js

@ -10,7 +10,7 @@ module.exports = Node.define({
this.alias = config.alias;
this.star = config.star;
this.asArray = config.asArray;
this.aggCount = config.aggCount;
this.aggregator = config.aggregator;
this.table = config.table;
this.value = config.getValue();
this.dataType = config.dataType;

3
lib/table.js

@ -60,7 +60,8 @@ Table.prototype.addColumn = function(col) {
console.log('Please notice that you have just defined the column "' + col.name + '". In order to access it, you need to use "table.getColumn(\'' + col.name + '\');"!');
}
this.columns.push(col);
this[col.name] = this[col.name] || col;
var property = col.property || col.name;
this[property] = this[property] || col;
return this;
};

2
package.json

@ -2,7 +2,7 @@
"author": "brianc <brian.m.carlson@gmail.com>",
"name": "sql",
"description": "sql builder",
"version": "0.17.0",
"version": "0.18.0",
"homepage": "https://github.com/brianc/node-sql",
"repository": {
"type": "git",

48
test/dialects/aggregate-tests.js

@ -50,3 +50,51 @@ Harness.test({
mysql : 'SELECT COUNT(`post`.`content`) AS `content_count` FROM `post`',
params: []
});
Harness.test({
query : post.select(post.id.min()),
pg : 'SELECT MIN("post"."id") AS "id_min" FROM "post"',
sqlite: 'SELECT MIN("post"."id") AS "id_min" FROM "post"',
mysql : 'SELECT MIN(`post`.`id`) AS `id_min` FROM `post`',
params: []
});
Harness.test({
query : post.select(post.id.min().as('min_id')),
pg : 'SELECT MIN("post"."id") AS "min_id" FROM "post"',
sqlite: 'SELECT MIN("post"."id") AS "min_id" FROM "post"',
mysql : 'SELECT MIN(`post`.`id`) AS `min_id` FROM `post`',
params: []
});
Harness.test({
query : post.select(post.id.min('min_id')),
pg : 'SELECT MIN("post"."id") AS "min_id" FROM "post"',
sqlite: 'SELECT MIN("post"."id") AS "min_id" FROM "post"',
mysql : 'SELECT MIN(`post`.`id`) AS `min_id` FROM `post`',
params: []
});
Harness.test({
query : post.select(post.id.max()),
pg : 'SELECT MAX("post"."id") AS "id_max" FROM "post"',
sqlite: 'SELECT MAX("post"."id") AS "id_max" FROM "post"',
mysql : 'SELECT MAX(`post`.`id`) AS `id_max` FROM `post`',
params: []
});
Harness.test({
query : post.select(post.id.max().as('max_id')),
pg : 'SELECT MAX("post"."id") AS "max_id" FROM "post"',
sqlite: 'SELECT MAX("post"."id") AS "max_id" FROM "post"',
mysql : 'SELECT MAX(`post`.`id`) AS `max_id` FROM `post`',
params: []
});
Harness.test({
query : post.select(post.id.max('max_id')),
pg : 'SELECT MAX("post"."id") AS "max_id" FROM "post"',
sqlite: 'SELECT MAX("post"."id") AS "max_id" FROM "post"',
mysql : 'SELECT MAX(`post`.`id`) AS `max_id` FROM `post`',
params: []
});

21
test/table-tests.js

@ -56,6 +56,27 @@ suite('table', function() {
});
});
test('table with user-defined column property names', function () {
var table = Table.define({
name: 'blah',
columns: [{
name: 'id',
property: 'theId'
}, {
name: 'email',
property: 'uniqueEmail'
}]
});
var cols = table.columns;
assert.equal(cols.length, 2);
assert.equal(cols[0].name, 'id');
assert(cols[0] === table.theId, 'Expected table.theId to be the first column');
assert(table.id === undefined, 'Expected table.id to not exist');
assert.equal(cols[1].name, 'email');
assert(cols[1] === table.uniqueEmail, 'Expected table.uniqueEmail to be the second column');
assert(table.email === undefined, 'Expected table.email to not exist');
});
test('table with fancier column definitions', function() {
var table = Table.define({
name: 'blah',

Loading…
Cancel
Save