|
21 | 21 | var assert = require('assert');
|
22 | 22 | var datastore = require('../../lib/datastore');
|
23 | 23 | var entity = require('../../lib/datastore/entity.js');
|
| 24 | +var Query = require('../../lib/datastore/query.js'); |
24 | 25 | var queryProto = require('../testdata/proto_query.json');
|
25 | 26 |
|
26 | 27 | describe('Query', function() {
|
27 |
| - var ds = new datastore.Dataset({ projectId: 'my-project-id' }); |
28 |
| - var dsWithNs = new datastore.Dataset({ |
29 |
| - projectId: 'my-project-id', |
30 |
| - namespace: 'ns' |
31 |
| - }); |
32 |
| - |
33 |
| - it('should use undefined for all falsy namespace values', function() { |
| 28 | + it('should use null for all falsy namespace values', function() { |
34 | 29 | [
|
35 |
| - ds.createQuery('', 'Kind'), |
36 |
| - ds.createQuery(null, 'Kind'), |
37 |
| - ds.createQuery(undefined, 'Kind'), |
38 |
| - ds.createQuery(0, 'Kind') |
| 30 | + new Query('', 'Kind'), |
| 31 | + new Query(null, 'Kind'), |
| 32 | + new Query(undefined, 'Kind'), |
| 33 | + new Query(0, 'Kind'), |
| 34 | + new Query('Kind') |
39 | 35 | ].forEach(function(query) {
|
40 | 36 | assert.strictEqual(query.namespace, null);
|
| 37 | + assert.equal(query.kinds, 'Kind'); |
41 | 38 | });
|
42 | 39 | });
|
43 | 40 |
|
44 |
| - it('should use default namespace if none is specified', function(done) { |
45 |
| - var q = ds.createQuery(['kind1']); |
46 |
| - assert.strictEqual(q.namespace, null); |
47 |
| - done(); |
48 |
| - }); |
49 |
| - |
50 |
| - it('should use support custom namespaces', function(done) { |
51 |
| - var q = dsWithNs.createQuery(['kind1']); |
52 |
| - assert.equal(q.namespace, 'ns'); |
53 |
| - done(); |
| 41 | + it('should support custom namespaces', function() { |
| 42 | + var query = new Query('ns', ['kind1']); |
| 43 | + assert.equal(query.namespace, 'ns'); |
54 | 44 | });
|
55 | 45 |
|
56 |
| - it('should support querying multiple kinds', function(done) { |
57 |
| - var q = ds.createQuery(['kind1', 'kind2']); |
58 |
| - var qNS = dsWithNs.createQuery(['kind1', 'kind2']); |
| 46 | + it('should support querying multiple kinds', function() { |
| 47 | + var query = new Query(['kind1', 'kind2']); |
| 48 | + var queryWithNamespace = new Query('ns', ['kind1', 'kind2']); |
59 | 49 |
|
60 |
| - assert.strictEqual(q.namespace, null); |
61 |
| - assert.equal(q.kinds[0], 'kind1'); |
62 |
| - assert.equal(q.kinds[1], 'kind2'); |
| 50 | + assert.strictEqual(query.namespace, null); |
| 51 | + assert.equal(query.kinds[0], 'kind1'); |
| 52 | + assert.equal(query.kinds[1], 'kind2'); |
63 | 53 |
|
64 |
| - assert.equal(qNS.namespace, 'ns'); |
65 |
| - assert.equal(qNS.kinds[0], 'kind1'); |
66 |
| - assert.equal(qNS.kinds[1], 'kind2'); |
67 |
| - done(); |
| 54 | + assert.equal(queryWithNamespace.namespace, 'ns'); |
| 55 | + assert.equal(queryWithNamespace.kinds[0], 'kind1'); |
| 56 | + assert.equal(queryWithNamespace.kinds[1], 'kind2'); |
68 | 57 | });
|
69 | 58 |
|
70 |
| - it('should support field selection by field name', function(done) { |
71 |
| - var q = ds.createQuery(['kind1']).select(['name', 'title']); |
72 |
| - assert.equal(q.selectVal[0], 'name'); |
73 |
| - assert.equal(q.selectVal[1], 'title'); |
74 |
| - done(); |
| 59 | + it('should support field selection by field name', function() { |
| 60 | + var query = new Query(['kind1']) |
| 61 | + .select(['name', 'title']); |
| 62 | + assert.equal(query.selectVal[0], 'name'); |
| 63 | + assert.equal(query.selectVal[1], 'title'); |
75 | 64 | });
|
76 | 65 |
|
77 |
| - it('should support ancestor filtering', function(done) { |
78 |
| - var q = ds.createQuery(['kind1']).hasAncestor(['kind2', 123]); |
79 |
| - assert.equal(q.filters[0].name, '__key__'); |
80 |
| - assert.equal(q.filters[0].op, 'HAS_ANCESTOR'); |
81 |
| - assert.deepEqual(q.filters[0].val, ['kind2', 123]); |
82 |
| - done(); |
| 66 | + it('should support ancestor filtering', function() { |
| 67 | + var query = new Query(['kind1']) |
| 68 | + .hasAncestor(['kind2', 123]); |
| 69 | + assert.equal(query.filters[0].name, '__key__'); |
| 70 | + assert.equal(query.filters[0].op, 'HAS_ANCESTOR'); |
| 71 | + assert.deepEqual(query.filters[0].val, ['kind2', 123]); |
83 | 72 | });
|
84 | 73 |
|
85 |
| - it('should support multiple filters', function(done) { |
| 74 | + it('should support multiple filters', function() { |
86 | 75 | var now = new Date();
|
87 |
| - var q = ds.createQuery(['kind1']) |
| 76 | + var query = new Query(['kind1']) |
88 | 77 | .filter('date <=', now)
|
89 | 78 | .filter('name =', 'Title')
|
90 | 79 | .filter('count >', 20);
|
91 |
| - assert.equal(q.filters[0].name, 'date'); |
92 |
| - assert.equal(q.filters[0].op, '<='); |
93 |
| - assert.strictEqual(q.filters[0].val, now); |
94 |
| - |
95 |
| - assert.equal(q.filters[1].name, 'name'); |
96 |
| - assert.equal(q.filters[1].op, '='); |
97 |
| - assert.strictEqual(q.filters[1].val, 'Title'); |
98 |
| - |
99 |
| - assert.equal(q.filters[2].name, 'count'); |
100 |
| - assert.equal(q.filters[2].op, '>'); |
101 |
| - assert.strictEqual(q.filters[2].val, 20); |
102 |
| - done(); |
| 80 | + |
| 81 | + assert.equal(query.filters[0].name, 'date'); |
| 82 | + assert.equal(query.filters[0].op, '<='); |
| 83 | + assert.strictEqual(query.filters[0].val, now); |
| 84 | + |
| 85 | + assert.equal(query.filters[1].name, 'name'); |
| 86 | + assert.equal(query.filters[1].op, '='); |
| 87 | + assert.equal(query.filters[1].val, 'Title'); |
| 88 | + |
| 89 | + assert.equal(query.filters[2].name, 'count'); |
| 90 | + assert.equal(query.filters[2].op, '>'); |
| 91 | + assert.strictEqual(query.filters[2].val, 20); |
103 | 92 | });
|
104 | 93 |
|
105 |
| - it('should support ordering asc and desc', function(done) { |
106 |
| - var q = ds.createQuery(['kind1']).order('+name').order('-count'); |
107 |
| - assert.equal(q.orders[0].name, 'name'); |
108 |
| - assert.equal(q.orders[0].sign, '+'); |
109 |
| - assert.equal(q.orders[1].name, 'count'); |
110 |
| - assert.equal(q.orders[1].sign, '-'); |
111 |
| - done(); |
| 94 | + it('should support ordering asc and desc', function() { |
| 95 | + var query = new Query(['kind1']) |
| 96 | + .order('+name') |
| 97 | + .order('-count'); |
| 98 | + assert.equal(query.orders[0].name, 'name'); |
| 99 | + assert.equal(query.orders[0].sign, '+'); |
| 100 | + assert.equal(query.orders[1].name, 'count'); |
| 101 | + assert.equal(query.orders[1].sign, '-'); |
112 | 102 | });
|
113 | 103 |
|
114 |
| - it('should throw error is invalid sort sign is provided', function(done) { |
| 104 | + it('should throw error is invalid sort sign is provided', function() { |
115 | 105 | assert.throws(function() {
|
116 |
| - ds.createQuery(['kind1']).order('*name'); |
| 106 | + new Query(['kind1']).order('*name'); |
117 | 107 | }, /Invalid order pattern/);
|
118 |
| - done(); |
119 | 108 | });
|
120 | 109 |
|
121 |
| - it('should provide pagination with offset and limit', function(done) { |
122 |
| - var q = ds.createQuery(['kind1']).offset(20).limit(100); |
123 |
| - assert.strictEqual(q.offsetVal, 20); |
124 |
| - assert.strictEqual(q.limitVal, 100); |
125 |
| - done(); |
| 110 | + it('should provide pagination with offset and limit', function() { |
| 111 | + var query = new Query(['kind1']) |
| 112 | + .offset(20) |
| 113 | + .limit(100); |
| 114 | + assert.strictEqual(query.offsetVal, 20); |
| 115 | + assert.strictEqual(query.limitVal, 100); |
126 | 116 | });
|
127 | 117 |
|
128 |
| - it('should allow page start and end tokens', function(done) { |
129 |
| - var q = ds.createQuery(['kind1']).start('abc123').end('def987'); |
130 |
| - assert.strictEqual(q.startVal, 'abc123'); |
131 |
| - assert.strictEqual(q.endVal, 'def987'); |
132 |
| - done(); |
| 118 | + it('should allow page start and end tokens', function() { |
| 119 | + var query = new Query(['kind1']) |
| 120 | + .start('abc123') |
| 121 | + .end('def987'); |
| 122 | + assert.equal(query.startVal, 'abc123'); |
| 123 | + assert.equal(query.endVal, 'def987'); |
133 | 124 | });
|
134 | 125 |
|
135 |
| - it('should be converted to a query proto successfully', function(done) { |
136 |
| - var q = ds.createQuery(['Kind']) |
| 126 | + it('should be converted to a query proto successfully', function() { |
| 127 | + var query = new Query(['Kind']) |
137 | 128 | .select(['name', 'count'])
|
138 | 129 | .filter('count >=', datastore.int(5))
|
139 | 130 | .filter('name =', 'Burcu')
|
140 | 131 | .order('-count')
|
141 | 132 | .groupBy(['count'])
|
142 | 133 | .offset(5)
|
143 | 134 | .limit(10);
|
144 |
| - assert.deepEqual(entity.queryToQueryProto(q), queryProto); |
145 |
| - done(); |
| 135 | + assert.deepEqual(entity.queryToQueryProto(query), queryProto); |
146 | 136 | });
|
147 | 137 | });
|
0 commit comments