Skip to content

Commit c330d51

Browse files
committed
feat(DataLoader): Added override with DataLoader on .get($connection)
1 parent de28464 commit c330d51

File tree

3 files changed

+110
-114
lines changed

3 files changed

+110
-114
lines changed

src/composeWithDataLoader.js

Lines changed: 109 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
import { TypeComposer } from 'graphql-compose'
22
import DataLoader from 'dataloader'
3-
import {
4-
wrapFindById,
5-
wrapFindByIds,
6-
wrapConnection,
7-
wrapFindMany,
8-
} from './resolvers'
3+
import hash from 'object-hash'
4+
import SingleContinous from './singleContinous'
95

106
import {
117
dataloaderOptions
@@ -20,14 +16,116 @@ export function composeWithDataLoader(
2016
// if (!(typeComposer instanceof TypeComposer)) {
2117
// throw new Error('You should provide TypeComposer instance to composeWithDataLoader method');
2218
// }
19+
//
20+
//
21+
/**
22+
* Set defaults
23+
*/
24+
options ={
25+
cacheExpiration: options.cacheExpiration || 300,
26+
removeProjection: options.removeProjection || true,
27+
debug: options.debug || false,
28+
}
29+
30+
/**
31+
* Add DataLoader to FindById
32+
*/
33+
let findByIdResolver = typeComposer.getResolver('findById')
34+
let findByIdLoader = new DataLoader( (resolveParamsArray) => {
35+
if (options.debug) console.log('New db request (findById)')
36+
let params = resolveParamsArray[0]
37+
38+
return findByIdResolver.resolve(params).then(res => [res])
39+
},
40+
{ cacheKeyFn: key => key.args._id.toString() })
41+
42+
typeComposer.setResolver( 'findById',
43+
findByIdResolver.wrapResolve(fn => rp => {
44+
if (options.removeProjection) delete rp.projection
45+
SingleContinous.run(findByIdLoader, rp, options)
46+
return findByIdLoader.load(rp)
47+
})
48+
)
49+
50+
51+
52+
/**
53+
* Add DataLoader to FindByIds
54+
*/
55+
// let findByIdsResolver = typeComposer.getResolver('findByIds')
56+
// let findByIdsLoader = new DataLoader( (resolveParamsArray) => {
57+
// if (options.debug) console.log('New db request (findByIds)')
58+
// return findByIdResolver.resolve(resolveParamsArray[0]).then(res => [res])
59+
// },
60+
// { cacheKeyFn: key => {
61+
// let hashKey = hash(key.args)
62+
// return hashKey
63+
// } })
64+
65+
// typeComposer.setResolver(
66+
// 'findByIds',
67+
// findByIdsResolver.wrapResolve(fn => rp => {
68+
// SingleContinous.run(findByIdsLoader, rp, opt)
69+
// return findByIdsLoader.load(rp)
70+
// })
71+
// )
72+
73+
2374

2475
/**
25-
* get resolvers to add DataLoader to
76+
* Add DataLoader to FindMany
2677
*/
27-
typeComposer = wrapFindById(typeComposer, options)
28-
typeComposer = wrapFindByIds(typeComposer, options)
29-
typeComposer = wrapFindMany(typeComposer, options)
30-
typeComposer = wrapConnection(typeComposer, options)
78+
// let findManyResolver = typeComposer.getResolver('findMany')
79+
// let findManyLoader = new DataLoader( (resolveParamsArray) => {
80+
// if (options.debug) console.log('New db request (findMany)')
81+
// console.log(resolveParamsArray[0])
82+
// //response
83+
// return findManyResolver.resolve(resolveParamsArray[0]).then(res => [res])
84+
// },
85+
// { cacheKeyFn: key => {
86+
// let hashKey = hash(key.args)
87+
// return hashKey
88+
// } })
89+
90+
// typeComposer.setResolver(
91+
// 'findMany',
92+
// findManyResolver.wrapResolve(fn => rp => {
93+
// if (options.removeProjection) delete rp.projection
94+
// SingleContinous.run(findManyLoader, rp, options)
95+
// return findManyLoader.load(rp)
96+
// })
97+
// )
98+
99+
100+
/**
101+
* Add DataLoader to Connection
102+
*/
103+
let connectionResolver = typeComposer.getResolver('connection')
104+
let connectionFieldNames = typeComposer.getFieldNames()
105+
let connectionLoader = new DataLoader( (resolveParamsArray) => {
106+
if (options.debug) console.log('New db request (connection)')
107+
let params = resolveParamsArray[0]
108+
//response
109+
return connectionResolver.resolve(params).then(res => [res])
110+
},
111+
{ cacheKeyFn: key => {
112+
let hashKey = hash(key.args)
113+
return hashKey
114+
} })
115+
116+
typeComposer.setResolver( 'connection',
117+
connectionResolver.wrapResolve(fn => rp => {
118+
if(options.removeProjection){
119+
let projection ={ edges: { node: {} } }
120+
connectionFieldNames.map( field => projection.edges.node[field] = true)
121+
rp.projection = projection
122+
}
123+
SingleContinous.run(connectionLoader, rp, options)
124+
return connectionLoader.load(rp)
125+
})
126+
)
127+
128+
31129

32130
return typeComposer
33131
}

src/definitions.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export type dataloaderOptions = {
22
cacheExpiration?: number,
3+
removeProjection?: bool,
34
debug?: bool,
45
}

src/resolvers.js

Lines changed: 0 additions & 103 deletions
This file was deleted.

0 commit comments

Comments
 (0)