Skip to content
This repository was archived by the owner on Feb 18, 2021. It is now read-only.

Commit f6789be

Browse files
author
stefanwullems
committed
a query with options gets its own id
1 parent 24e0490 commit f6789be

File tree

3 files changed

+64
-25
lines changed

3 files changed

+64
-25
lines changed

src/QueryManager.ts

+2-6
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import Store from '@orbit/store'
22
import { Transform, RecordOperation, Record } from '@orbit/data'
33

44
import { Observable } from './Observable'
5-
import { getUpdatedRecords, hasChanged } from './helpers'
5+
import { getUpdatedRecords, hasChanged, shouldUpdate } from './helpers'
66
import { Term, Queries, Expression, RecordData, Status, QueryRefs, Query, RecordObject, Options, SingleOptions, MultipleOptions } from './types'
77

88
export class QueryManager extends Observable {
@@ -151,11 +151,7 @@ export class QueryManager extends Observable {
151151
Object.keys(this._subscriptions).forEach(id => {
152152
const termsOrExpression = JSON.parse(id)
153153

154-
const shouldUpdate = !Array.isArray(termsOrExpression)
155-
? hasChanged(termsOrExpression as Expression, records, relatedRecords)
156-
: termsOrExpression.some(({ expression }) => hasChanged(expression, records, relatedRecords))
157-
158-
if (shouldUpdate) {
154+
if (shouldUpdate(termsOrExpression, records, relatedRecords)) {
159155
const data = this._queryCache(termsOrExpression)
160156
super.notify(id, data)
161157
}

src/__tests__/QueryManager.test.ts

+42-18
Original file line numberDiff line numberDiff line change
@@ -40,35 +40,59 @@ beforeEach(() => {
4040
manager = new QueryManager(store.fork())
4141
})
4242

43-
// test('QueryManager._extractTerms(...) returns an ordered array of terms', () => {
44-
// const account = { type: 'account', id: '1' }
43+
describe('QueryManager.query(...)', () => {
44+
test('Makes a new query when no queries are going on', () => {
45+
const account = { type: 'account', id: '1' }
46+
47+
const query = (q: QueryBuilder) => q.findRecord(account)
4548

46-
// const query = (q: QueryBuilder) => q.findRecord(account)/ const queries = { Cccount: query, Account: query, Bccount: query, }
49+
manager.query(query)
50+
51+
expect(Object.keys(manager._queryRefs).length).toBe(1)
52+
})
4753

48-
// const terms = manager._extractTermsOrExpression(queries)
54+
test('No new query will be made when an identical query already exists', () => {
55+
const account = { type: 'account', id: '1' }
4956

50-
// expect(terms).toMatchObject([
51-
// { key: 'Account', expression: { op: 'findRecord', record: {Account: account } },
52-
// { key: 'Bccount', expression: { op: 'findRecord', record: {Account: account } },
53-
// { key: 'Cccount', expression: { op: 'findRecord', record: {Account: account } }
54-
// ])
55-
// })
57+
const query = (q: QueryBuilder) => q.findRecord(account)
5658

57-
test('QueryManager.query(...) makes a new query when no queries are going on', () => {
58-
const account = { type: 'account', id: '1' }
59+
manager.query(query)
5960

60-
const query = (q: QueryBuilder) => q.findRecord(account)
61-
const listener = jest.fn()
61+
expect(Object.keys(manager._queryRefs).length).toBe(1)
6262

63-
manager.subscribe(query, listener)
63+
manager.query(query)
6464

65-
expect(Object.keys(manager._queryRefs).length).toBe(0)
65+
expect(Object.keys(manager._queryRefs).length).toBe(1)
66+
})
6667

67-
manager.query(query)
68+
test('Able to pass in options to make a unique query', () => {
69+
const account = { type: 'account', id: '1' }
6870

69-
expect(Object.keys(manager._queryRefs).length).toBe(1)
71+
const query = (q: QueryBuilder) => q.findRecord(account)
72+
73+
const listener1 = jest.fn()
74+
const listener2 = jest.fn()
75+
76+
const options = {
77+
label: 'Find all contacts',
78+
sources: {
79+
remote: {
80+
include: ['phone-numbers']
81+
}
82+
}
83+
}
84+
85+
manager.query(query)
86+
87+
expect(Object.keys(manager._queryRefs).length).toBe(1)
88+
89+
manager.query(query, options)
90+
91+
expect(Object.keys(manager._queryRefs).length).toBe(2)
92+
})
7093
})
7194

95+
7296
describe('queryCache(...)', () => {
7397
test('The record object is null if no match is found', () => {
7498
const account = { type: 'account', id: '1' }

src/helpers.ts

+20-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { RecordOperation, RecordIdentity } from '@orbit/data'
2-
import { Expression } from './types';
2+
import { Expression, Term, Options } from './types';
33

44
export const getUpdatedRecords = (operations: RecordOperation[]) => {
55
const records: RecordIdentity[] = []
@@ -24,6 +24,25 @@ export const getUpdatedRecords = (operations: RecordOperation[]) => {
2424
return { records, relatedRecords }
2525
}
2626

27+
export const shouldUpdate = (
28+
termsOrExpression: Term[] | Expression | { termsOrExpression: Term[] | Expression, options: Options },
29+
records: RecordIdentity[],
30+
relatedRecords: RecordIdentity[]) => {
31+
32+
if (Array.isArray(termsOrExpression)) {
33+
return termsOrExpression.some(({ expression }) => hasChanged(expression, records, relatedRecords))
34+
}
35+
36+
else if (termsOrExpression['op']) {
37+
return hasChanged(termsOrExpression as Expression, records, relatedRecords)
38+
}
39+
40+
else {
41+
// @ts-ignore
42+
return shouldUpdate(termsOrExpression.termsOrExpression, records, relatedRecords)
43+
}
44+
}
45+
2746
export const hasChanged = (
2847
expression: Expression,
2948
records: RecordIdentity[],

0 commit comments

Comments
 (0)