Skip to content
This repository was archived by the owner on Jun 9, 2020. It is now read-only.

Commit b4b9be7

Browse files
committed
Merge pull request #17 from crossfilter/fix-adding-data-to-existing-queries
Fix: Data adds to existing queries
2 parents 321db01 + 81d3ee2 commit b4b9be7

File tree

7 files changed

+118
-43
lines changed

7 files changed

+118
-43
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "universe",
3-
"version": "0.6.3",
3+
"version": "0.6.4",
44
"description": "The fastest way to query and explore multivariate datasets",
55
"main": "src/universe.js",
66
"directories": {

src/query.js

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ module.exports = function(service) {
4949
return createColumn(query)
5050
.then(makeCrossfilterGroup)
5151
.then(buildRequiredColumns)
52+
.then(setupDataListeners)
5253
.then(applyQuery)
5354

5455

@@ -93,29 +94,32 @@ module.exports = function(service) {
9394
dynamicReference: query.group
9495
})
9596
}))
96-
.then(function() {
97-
// Here, we create a listener to recreate and apply the reducer
98-
// (with updated reference data) to
99-
// the group anytime data changes
100-
var stopDataListen = service.onDataChange(function() {
101-
return applyQuery(query)
102-
})
103-
query.removeListeners.push(stopDataListen)
97+
.then(function(){
10498
return query
10599
})
106100
}
107101
return query
108102
}
109103

110-
function applyQuery(query) {
104+
function setupDataListeners(query){
105+
// Here, we create a listener to recreate and apply the reducer to
106+
// the group anytime underlying data changes
107+
var stopDataListen = service.onDataChange(function() {
108+
return applyQuery(query)
109+
})
110+
query.removeListeners.push(stopDataListen)
111111

112-
// apply a one time listener for filtering. This is what allows
113-
// us to post aggregate and change the data on each filter
112+
// This is a similar listener for filtering which will (if needed)
113+
// run any post aggregations on the data after each filter action
114114
var stopFilterListen = service.onFilter(function() {
115115
return postAggregate(query)
116116
})
117117
query.removeListeners.push(stopFilterListen)
118118

119+
return query
120+
}
121+
122+
function applyQuery(query) {
119123
return buildReducer(query)
120124
.then(applyReducer)
121125
.then(attachData)

test/filter.spec.js

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,28 @@ var chaiAsPromised = require('chai-as-promised')
44
chai.use(chaiAsPromised)
55
var expect = chai.expect
66

7-
var universe = require('../universe');
8-
var crossfilter = require('crossfilter2');
7+
var universe = require('../universe')
8+
var crossfilter = require('crossfilter2')
99

1010

11-
var data = require('./data');
11+
var data = require('./data')
1212

1313

1414
describe('universe filter', function() {
1515

16-
var u = universe(data)
17-
16+
var u
17+
1818
beforeEach(function() {
19-
return u.then(function(u) {
20-
return u.clear()
19+
u = universe(data)
20+
})
21+
22+
afterEach(function() {
23+
return u.then(function(u){
24+
return u.destroy()
2125
})
2226
})
2327

28+
2429
it('has the filter method', function() {
2530
return u.then(function(u) {
2631
expect(typeof(u.filter)).to.deep.equal('function')

test/query.dynamicData.spec.js

Lines changed: 64 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,65 @@ var chaiAsPromised = require('chai-as-promised')
55
chai.use(chaiAsPromised)
66

77

8-
var universe = require('../universe');
9-
var data = require('./data');
10-
var crossfilter = require('crossfilter2');
8+
var universe = require('../universe')
9+
var data = require('./data')
10+
var crossfilter = require('crossfilter2')
1111

12-
describe('universe query', function() {
12+
describe('universe dynamic data', function() {
1313

14-
var u = universe(crossfilter(data))
14+
var u
1515

1616
beforeEach(function() {
17+
u = universe(crossfilter(data))
18+
})
19+
20+
afterEach(function() {
1721
return u.then(function(u){
18-
return u.clear()
22+
return u.destroy()
23+
})
24+
})
25+
26+
it('can add data to an existing query', function() {
27+
var res
28+
return u.then(function(u){
29+
return u.query({
30+
groupBy: 'type',
31+
select: {
32+
$count: 'true',
33+
$sum: 'total'
34+
},
35+
})
36+
})
37+
.then(function(r){
38+
res = r
39+
expect(res.data).to.deep.equal([
40+
{"key": "cash","value": {"count": 2, sum: 300}},
41+
{"key": "tab","value": {"count": 8, sum: 920}},
42+
{"key": "visa","value": {"count": 2, sum: 500}}
43+
])
44+
return res.universe.add([{
45+
date: "2012-11-14T17:29:52Z",
46+
quantity: 100,
47+
total: 50000,
48+
tip: 999,
49+
type: "visa",
50+
productIDs: ["004"]
51+
}, {
52+
date: "2012-11-14T17:29:52Z",
53+
quantity: 100,
54+
total: 400,
55+
tip: 600,
56+
type: "other",
57+
productIDs: ["004"]
58+
}])
59+
})
60+
.then(function(r){
61+
expect(res.data).to.deep.equal([
62+
{"key": "cash","value": {"count": 2, sum: 300}},
63+
{"key": "other","value": {"count": 1, sum: 400}},
64+
{"key": "tab","value": {"count": 8, sum: 920}},
65+
{"key": "visa","value": {"count": 3, sum: 50500}},
66+
])
1967
})
2068
})
2169

@@ -76,6 +124,16 @@ describe('universe query', function() {
76124
})
77125
.then(function(r){
78126
res = r
127+
return res.universe.add([{
128+
date: "2012-11-14T17:29:52Z",
129+
quantity: 100,
130+
total: 50000,
131+
tip: 999,
132+
type: "visa",
133+
productIDs: ["004"]
134+
}])
135+
})
136+
.then(function(r){
79137
expect(res.data).to.deep.equal([
80138
{ key: 'cash', value: { valueList: [100, 200] } },
81139
{ key: 'tab', value: { valueList: [90, 90, 90, 90, 90, 90, 190, 190] } },

test/query.spec.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,21 @@ var chaiAsPromised = require('chai-as-promised')
55
chai.use(chaiAsPromised)
66

77

8-
var universe = require('../universe');
9-
var data = require('./data');
10-
var crossfilter = require('crossfilter2');
8+
var universe = require('../universe')
9+
var data = require('./data')
10+
var crossfilter = require('crossfilter2')
1111

1212
describe('universe query', function() {
1313

14-
var u = universe(crossfilter(data))
14+
var u
1515

1616
beforeEach(function() {
17+
u = universe(data)
18+
})
19+
20+
afterEach(function() {
1721
return u.then(function(u){
18-
return u.clear()
22+
return u.destroy()
1923
})
2024
})
2125

universe.js

Lines changed: 16 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

universe.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)