@payloadcms/drizzle 3.1.1-canary.c40ff01 → 3.1.2-canary.eb1a61e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/count.js +1 -1
  2. package/dist/count.js.map +1 -1
  3. package/dist/countGlobalVersions.js +1 -1
  4. package/dist/countGlobalVersions.js.map +1 -1
  5. package/dist/countVersions.js +1 -1
  6. package/dist/countVersions.js.map +1 -1
  7. package/dist/create.js +1 -1
  8. package/dist/create.js.map +1 -1
  9. package/dist/createGlobal.js +1 -1
  10. package/dist/createGlobal.js.map +1 -1
  11. package/dist/createGlobalVersion.js +1 -1
  12. package/dist/createGlobalVersion.js.map +1 -1
  13. package/dist/createVersion.js +1 -1
  14. package/dist/createVersion.js.map +1 -1
  15. package/dist/deleteMany.js +1 -1
  16. package/dist/deleteMany.js.map +1 -1
  17. package/dist/deleteOne.js +3 -3
  18. package/dist/deleteOne.js.map +1 -1
  19. package/dist/deleteVersions.js +1 -1
  20. package/dist/deleteVersions.js.map +1 -1
  21. package/dist/find/buildFindManyArgs.d.ts +2 -2
  22. package/dist/find/buildFindManyArgs.d.ts.map +1 -1
  23. package/dist/find/buildFindManyArgs.js.map +1 -1
  24. package/dist/find/findMany.d.ts +2 -2
  25. package/dist/find/findMany.d.ts.map +1 -1
  26. package/dist/find/findMany.js.map +1 -1
  27. package/dist/find/traverseFields.d.ts +2 -2
  28. package/dist/find/traverseFields.d.ts.map +1 -1
  29. package/dist/find/traverseFields.js +312 -359
  30. package/dist/find/traverseFields.js.map +1 -1
  31. package/dist/find.js +1 -1
  32. package/dist/find.js.map +1 -1
  33. package/dist/findGlobal.js +1 -1
  34. package/dist/findGlobal.js.map +1 -1
  35. package/dist/findGlobalVersions.js +1 -1
  36. package/dist/findGlobalVersions.js.map +1 -1
  37. package/dist/findOne.js +1 -1
  38. package/dist/findOne.js.map +1 -1
  39. package/dist/findVersions.js +1 -1
  40. package/dist/findVersions.js.map +1 -1
  41. package/dist/postgres/init.js +4 -4
  42. package/dist/postgres/init.js.map +1 -1
  43. package/dist/postgres/schema/build.d.ts +2 -2
  44. package/dist/postgres/schema/build.d.ts.map +1 -1
  45. package/dist/postgres/schema/build.js.map +1 -1
  46. package/dist/postgres/schema/idToUUID.d.ts +2 -2
  47. package/dist/postgres/schema/idToUUID.d.ts.map +1 -1
  48. package/dist/postgres/schema/idToUUID.js.map +1 -1
  49. package/dist/postgres/schema/setColumnID.d.ts +2 -2
  50. package/dist/postgres/schema/setColumnID.d.ts.map +1 -1
  51. package/dist/postgres/schema/setColumnID.js +1 -3
  52. package/dist/postgres/schema/setColumnID.js.map +1 -1
  53. package/dist/postgres/schema/traverseFields.d.ts +2 -2
  54. package/dist/postgres/schema/traverseFields.d.ts.map +1 -1
  55. package/dist/postgres/schema/traverseFields.js +38 -182
  56. package/dist/postgres/schema/traverseFields.js.map +1 -1
  57. package/dist/queries/buildAndOrConditions.d.ts +2 -2
  58. package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
  59. package/dist/queries/buildAndOrConditions.js.map +1 -1
  60. package/dist/queries/buildOrderBy.d.ts +2 -2
  61. package/dist/queries/buildOrderBy.d.ts.map +1 -1
  62. package/dist/queries/buildOrderBy.js.map +1 -1
  63. package/dist/queries/buildQuery.d.ts +2 -2
  64. package/dist/queries/buildQuery.d.ts.map +1 -1
  65. package/dist/queries/buildQuery.js.map +1 -1
  66. package/dist/queries/getTableColumnFromPath.d.ts +3 -3
  67. package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
  68. package/dist/queries/getTableColumnFromPath.js +34 -59
  69. package/dist/queries/getTableColumnFromPath.js.map +1 -1
  70. package/dist/queries/parseParams.d.ts +2 -2
  71. package/dist/queries/parseParams.d.ts.map +1 -1
  72. package/dist/queries/parseParams.js.map +1 -1
  73. package/dist/queryDrafts.js +1 -1
  74. package/dist/queryDrafts.js.map +1 -1
  75. package/dist/transform/read/index.d.ts +2 -2
  76. package/dist/transform/read/index.d.ts.map +1 -1
  77. package/dist/transform/read/index.js.map +1 -1
  78. package/dist/transform/read/traverseFields.d.ts +2 -2
  79. package/dist/transform/read/traverseFields.d.ts.map +1 -1
  80. package/dist/transform/read/traverseFields.js +380 -421
  81. package/dist/transform/read/traverseFields.js.map +1 -1
  82. package/dist/transform/write/array.d.ts +2 -2
  83. package/dist/transform/write/array.d.ts.map +1 -1
  84. package/dist/transform/write/array.js +1 -1
  85. package/dist/transform/write/array.js.map +1 -1
  86. package/dist/transform/write/blocks.d.ts +2 -2
  87. package/dist/transform/write/blocks.d.ts.map +1 -1
  88. package/dist/transform/write/blocks.js +1 -1
  89. package/dist/transform/write/blocks.js.map +1 -1
  90. package/dist/transform/write/index.d.ts +2 -2
  91. package/dist/transform/write/index.d.ts.map +1 -1
  92. package/dist/transform/write/index.js.map +1 -1
  93. package/dist/transform/write/traverseFields.d.ts +2 -2
  94. package/dist/transform/write/traverseFields.d.ts.map +1 -1
  95. package/dist/transform/write/traverseFields.js +53 -171
  96. package/dist/transform/write/traverseFields.js.map +1 -1
  97. package/dist/update.js +2 -2
  98. package/dist/update.js.map +1 -1
  99. package/dist/updateGlobal.js +1 -1
  100. package/dist/updateGlobal.js.map +1 -1
  101. package/dist/updateGlobalVersion.js +1 -1
  102. package/dist/updateGlobalVersion.js.map +1 -1
  103. package/dist/updateVersion.js +1 -1
  104. package/dist/updateVersion.js.map +1 -1
  105. package/dist/upsertRow/index.d.ts.map +1 -1
  106. package/dist/upsertRow/index.js +8 -8
  107. package/dist/upsertRow/index.js.map +1 -1
  108. package/dist/upsertRow/types.d.ts +2 -2
  109. package/dist/upsertRow/types.d.ts.map +1 -1
  110. package/dist/upsertRow/types.js.map +1 -1
  111. package/package.json +4 -4
@@ -1,5 +1,5 @@
1
1
  import { and, eq, sql } from 'drizzle-orm';
2
- import { fieldAffectsData, fieldIsVirtual, tabHasName } from 'payload/shared';
2
+ import { fieldIsVirtual } from 'payload/shared';
3
3
  import toSnakeCase from 'to-snake-case';
4
4
  import buildQuery from '../queries/buildQuery.js';
5
5
  import { chainMethods } from './chainMethods.js';
@@ -16,333 +16,287 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
16
16
  currentArgs.with[`${path}${field.name}`] = true;
17
17
  }
18
18
  }
19
- if (field.type === 'collapsible' || field.type === 'row' || field.type === 'tab' && !tabHasName(field)) {
20
- traverseFields({
21
- _locales,
22
- adapter,
23
- currentArgs,
24
- currentTableName,
25
- depth,
26
- fields: field.fields,
27
- joinQuery,
28
- joins,
29
- path,
30
- select,
31
- selectMode,
32
- tablePath,
33
- topLevelArgs,
34
- topLevelTableName,
35
- withTabledFields
36
- });
37
- return;
38
- }
39
- if (field.type === 'tabs') {
40
- traverseFields({
41
- _locales,
42
- adapter,
43
- currentArgs,
44
- currentTableName,
45
- depth,
46
- fields: field.tabs.map((tab)=>({
47
- ...tab,
48
- type: 'tab'
49
- })),
50
- joinQuery,
51
- joins,
52
- path,
53
- select,
54
- selectAllOnCurrentLevel,
55
- selectMode,
56
- tablePath,
57
- topLevelArgs,
58
- topLevelTableName,
59
- versions,
60
- withTabledFields
61
- });
62
- return;
63
- }
64
- if (fieldAffectsData(field)) {
65
- switch(field.type){
66
- case 'array':
67
- {
68
- const arraySelect = selectAllOnCurrentLevel ? true : select?.[field.name];
69
- if (select) {
70
- if (selectMode === 'include' && typeof arraySelect === 'undefined' || selectMode === 'exclude' && arraySelect === false) {
71
- break;
72
- }
19
+ switch(field.type){
20
+ case 'array':
21
+ {
22
+ const arraySelect = selectAllOnCurrentLevel ? true : select?.[field.name];
23
+ if (select) {
24
+ if (selectMode === 'include' && typeof arraySelect === 'undefined' || selectMode === 'exclude' && arraySelect === false) {
25
+ break;
26
+ }
27
+ }
28
+ const withArray = {
29
+ columns: typeof arraySelect === 'object' ? {
30
+ id: true,
31
+ _order: true
32
+ } : {
33
+ _parentID: false
34
+ },
35
+ orderBy: ({ _order }, { asc })=>[
36
+ asc(_order)
37
+ ],
38
+ with: {}
39
+ };
40
+ const arrayTableName = adapter.tableNameMap.get(`${currentTableName}_${tablePath}${toSnakeCase(field.name)}`);
41
+ if (typeof arraySelect === 'object') {
42
+ if (adapter.tables[arrayTableName]._locale) {
43
+ withArray.columns._locale = true;
44
+ }
45
+ if (adapter.tables[arrayTableName]._uuid) {
46
+ withArray.columns._uuid = true;
73
47
  }
74
- const withArray = {
48
+ }
49
+ const arrayTableNameWithLocales = `${arrayTableName}${adapter.localesSuffix}`;
50
+ if (adapter.tables[arrayTableNameWithLocales]) {
51
+ withArray.with._locales = {
75
52
  columns: typeof arraySelect === 'object' ? {
76
- id: true,
77
- _order: true
53
+ _locale: true
78
54
  } : {
55
+ id: false,
79
56
  _parentID: false
80
57
  },
81
- orderBy: ({ _order }, { asc })=>[
82
- asc(_order)
83
- ],
84
58
  with: {}
85
59
  };
86
- const arrayTableName = adapter.tableNameMap.get(`${currentTableName}_${tablePath}${toSnakeCase(field.name)}`);
87
- if (typeof arraySelect === 'object') {
88
- if (adapter.tables[arrayTableName]._locale) {
89
- withArray.columns._locale = true;
90
- }
91
- if (adapter.tables[arrayTableName]._uuid) {
92
- withArray.columns._uuid = true;
60
+ }
61
+ currentArgs.with[`${path}${field.name}`] = withArray;
62
+ traverseFields({
63
+ _locales: withArray.with._locales,
64
+ adapter,
65
+ currentArgs: withArray,
66
+ currentTableName: arrayTableName,
67
+ depth,
68
+ fields: field.flattenedFields,
69
+ joinQuery,
70
+ path: '',
71
+ select: typeof arraySelect === 'object' ? arraySelect : undefined,
72
+ selectMode,
73
+ tablePath: '',
74
+ topLevelArgs,
75
+ topLevelTableName,
76
+ withinLocalizedField: withinLocalizedField || field.localized,
77
+ withTabledFields
78
+ });
79
+ if (typeof arraySelect === 'object' && withArray.with._locales && Object.keys(withArray.with._locales).length === 1) {
80
+ delete withArray.with._locales;
81
+ }
82
+ break;
83
+ }
84
+ case 'blocks':
85
+ {
86
+ const blocksSelect = selectAllOnCurrentLevel ? true : select?.[field.name];
87
+ if (select) {
88
+ if (selectMode === 'include' && !blocksSelect || selectMode === 'exclude' && blocksSelect === false) {
89
+ break;
90
+ }
91
+ }
92
+ field.blocks.forEach((block)=>{
93
+ const blockKey = `_blocks_${block.slug}`;
94
+ let blockSelect;
95
+ let blockSelectMode = selectMode;
96
+ if (selectMode === 'include' && blocksSelect === true) {
97
+ blockSelect = true;
98
+ }
99
+ if (typeof blocksSelect === 'object') {
100
+ if (typeof blocksSelect[block.slug] === 'object') {
101
+ blockSelect = blocksSelect[block.slug];
102
+ } else if (selectMode === 'include' && typeof blocksSelect[block.slug] === 'undefined' || selectMode === 'exclude' && blocksSelect[block.slug] === false) {
103
+ blockSelect = {};
104
+ blockSelectMode = 'include';
105
+ } else if (selectMode === 'include' && blocksSelect[block.slug] === true) {
106
+ blockSelect = true;
93
107
  }
94
108
  }
95
- const arrayTableNameWithLocales = `${arrayTableName}${adapter.localesSuffix}`;
96
- if (adapter.tables[arrayTableNameWithLocales]) {
97
- withArray.with._locales = {
98
- columns: typeof arraySelect === 'object' ? {
99
- _locale: true
109
+ if (!topLevelArgs[blockKey]) {
110
+ const withBlock = {
111
+ columns: typeof blockSelect === 'object' ? {
112
+ id: true,
113
+ _order: true,
114
+ _path: true
100
115
  } : {
101
- id: false,
102
116
  _parentID: false
103
117
  },
118
+ orderBy: ({ _order }, { asc })=>[
119
+ asc(_order)
120
+ ],
104
121
  with: {}
105
122
  };
106
- }
107
- currentArgs.with[`${path}${field.name}`] = withArray;
108
- traverseFields({
109
- _locales: withArray.with._locales,
110
- adapter,
111
- currentArgs: withArray,
112
- currentTableName: arrayTableName,
113
- depth,
114
- fields: field.fields,
115
- joinQuery,
116
- path: '',
117
- select: typeof arraySelect === 'object' ? arraySelect : undefined,
118
- selectMode,
119
- tablePath: '',
120
- topLevelArgs,
121
- topLevelTableName,
122
- withinLocalizedField: withinLocalizedField || field.localized,
123
- withTabledFields
124
- });
125
- if (typeof arraySelect === 'object' && withArray.with._locales && Object.keys(withArray.with._locales).length === 1) {
126
- delete withArray.with._locales;
127
- }
128
- break;
129
- }
130
- case 'blocks':
131
- {
132
- const blocksSelect = selectAllOnCurrentLevel ? true : select?.[field.name];
133
- if (select) {
134
- if (selectMode === 'include' && !blocksSelect || selectMode === 'exclude' && blocksSelect === false) {
135
- break;
136
- }
137
- }
138
- field.blocks.forEach((block)=>{
139
- const blockKey = `_blocks_${block.slug}`;
140
- let blockSelect;
141
- let blockSelectMode = selectMode;
142
- if (selectMode === 'include' && blocksSelect === true) {
143
- blockSelect = true;
144
- }
145
- if (typeof blocksSelect === 'object') {
146
- if (typeof blocksSelect[block.slug] === 'object') {
147
- blockSelect = blocksSelect[block.slug];
148
- } else if (selectMode === 'include' && typeof blocksSelect[block.slug] === 'undefined' || selectMode === 'exclude' && blocksSelect[block.slug] === false) {
149
- blockSelect = {};
150
- blockSelectMode = 'include';
151
- } else if (selectMode === 'include' && blocksSelect[block.slug] === true) {
152
- blockSelect = true;
123
+ const tableName = adapter.tableNameMap.get(`${topLevelTableName}_blocks_${toSnakeCase(block.slug)}`);
124
+ if (typeof blockSelect === 'object') {
125
+ if (adapter.tables[tableName]._locale) {
126
+ withBlock.columns._locale = true;
127
+ }
128
+ if (adapter.tables[tableName]._uuid) {
129
+ withBlock.columns._uuid = true;
153
130
  }
154
131
  }
155
- if (!topLevelArgs[blockKey]) {
156
- const withBlock = {
157
- columns: typeof blockSelect === 'object' ? {
158
- id: true,
159
- _order: true,
160
- _path: true
161
- } : {
162
- _parentID: false
163
- },
164
- orderBy: ({ _order }, { asc })=>[
165
- asc(_order)
166
- ],
132
+ if (adapter.tables[`${tableName}${adapter.localesSuffix}`]) {
133
+ withBlock.with._locales = {
167
134
  with: {}
168
135
  };
169
- const tableName = adapter.tableNameMap.get(`${topLevelTableName}_blocks_${toSnakeCase(block.slug)}`);
170
136
  if (typeof blockSelect === 'object') {
171
- if (adapter.tables[tableName]._locale) {
172
- withBlock.columns._locale = true;
173
- }
174
- if (adapter.tables[tableName]._uuid) {
175
- withBlock.columns._uuid = true;
176
- }
177
- }
178
- if (adapter.tables[`${tableName}${adapter.localesSuffix}`]) {
179
- withBlock.with._locales = {
180
- with: {}
137
+ withBlock.with._locales.columns = {
138
+ _locale: true
181
139
  };
182
- if (typeof blockSelect === 'object') {
183
- withBlock.with._locales.columns = {
184
- _locale: true
185
- };
186
- }
187
- }
188
- topLevelArgs.with[blockKey] = withBlock;
189
- traverseFields({
190
- _locales: withBlock.with._locales,
191
- adapter,
192
- currentArgs: withBlock,
193
- currentTableName: tableName,
194
- depth,
195
- fields: block.fields,
196
- joinQuery,
197
- path: '',
198
- select: typeof blockSelect === 'object' ? blockSelect : undefined,
199
- selectMode: blockSelectMode,
200
- tablePath: '',
201
- topLevelArgs,
202
- topLevelTableName,
203
- withinLocalizedField: withinLocalizedField || field.localized,
204
- withTabledFields
205
- });
206
- if (typeof blockSelect === 'object' && withBlock.with._locales && Object.keys(withBlock.with._locales.columns).length === 1) {
207
- delete withBlock.with._locales;
208
140
  }
209
141
  }
210
- });
142
+ topLevelArgs.with[blockKey] = withBlock;
143
+ traverseFields({
144
+ _locales: withBlock.with._locales,
145
+ adapter,
146
+ currentArgs: withBlock,
147
+ currentTableName: tableName,
148
+ depth,
149
+ fields: block.flattenedFields,
150
+ joinQuery,
151
+ path: '',
152
+ select: typeof blockSelect === 'object' ? blockSelect : undefined,
153
+ selectMode: blockSelectMode,
154
+ tablePath: '',
155
+ topLevelArgs,
156
+ topLevelTableName,
157
+ withinLocalizedField: withinLocalizedField || field.localized,
158
+ withTabledFields
159
+ });
160
+ if (typeof blockSelect === 'object' && withBlock.with._locales && Object.keys(withBlock.with._locales.columns).length === 1) {
161
+ delete withBlock.with._locales;
162
+ }
163
+ }
164
+ });
165
+ break;
166
+ }
167
+ case 'group':
168
+ case 'tab':
169
+ {
170
+ const fieldSelect = select?.[field.name];
171
+ if (fieldSelect === false) {
211
172
  break;
212
173
  }
213
- case 'group':
214
- case 'tab':
215
- {
216
- const fieldSelect = select?.[field.name];
217
- if (fieldSelect === false) {
218
- break;
219
- }
220
- traverseFields({
221
- _locales,
222
- adapter,
223
- currentArgs,
224
- currentTableName,
225
- depth,
226
- fields: field.fields,
227
- joinQuery,
228
- joins,
229
- path: `${path}${field.name}_`,
230
- select: typeof fieldSelect === 'object' ? fieldSelect : undefined,
231
- selectAllOnCurrentLevel: selectAllOnCurrentLevel || fieldSelect === true || selectMode === 'exclude' && typeof fieldSelect === 'undefined',
232
- selectMode,
233
- tablePath: `${tablePath}${toSnakeCase(field.name)}_`,
234
- topLevelArgs,
235
- topLevelTableName,
236
- versions,
237
- withinLocalizedField: withinLocalizedField || field.localized,
238
- withTabledFields
239
- });
174
+ traverseFields({
175
+ _locales,
176
+ adapter,
177
+ currentArgs,
178
+ currentTableName,
179
+ depth,
180
+ fields: field.flattenedFields,
181
+ joinQuery,
182
+ joins,
183
+ path: `${path}${field.name}_`,
184
+ select: typeof fieldSelect === 'object' ? fieldSelect : undefined,
185
+ selectAllOnCurrentLevel: selectAllOnCurrentLevel || fieldSelect === true || selectMode === 'exclude' && typeof fieldSelect === 'undefined',
186
+ selectMode,
187
+ tablePath: `${tablePath}${toSnakeCase(field.name)}_`,
188
+ topLevelArgs,
189
+ topLevelTableName,
190
+ versions,
191
+ withinLocalizedField: withinLocalizedField || field.localized,
192
+ withTabledFields
193
+ });
194
+ break;
195
+ }
196
+ case 'join':
197
+ {
198
+ // when `joinsQuery` is false, do not join
199
+ if (joinQuery === false) {
240
200
  break;
241
201
  }
242
- case 'join':
243
- {
244
- // when `joinsQuery` is false, do not join
245
- if (joinQuery === false) {
246
- break;
247
- }
248
- if (select && selectMode === 'include' && !select[field.name] || selectMode === 'exclude' && select[field.name] === false) {
249
- break;
250
- }
251
- const joinSchemaPath = `${path.replaceAll('_', '.')}${field.name}`;
252
- if (joinQuery[joinSchemaPath] === false) {
253
- break;
202
+ if (select && selectMode === 'include' && !select[field.name] || selectMode === 'exclude' && select[field.name] === false) {
203
+ break;
204
+ }
205
+ const joinSchemaPath = `${path.replaceAll('_', '.')}${field.name}`;
206
+ if (joinQuery[joinSchemaPath] === false) {
207
+ break;
208
+ }
209
+ const { limit: limitArg = field.defaultLimit ?? 10, sort = field.defaultSort, where } = joinQuery[joinSchemaPath] || {};
210
+ let limit = limitArg;
211
+ if (limit !== 0) {
212
+ // get an additional document and slice it later to determine if there is a next page
213
+ limit += 1;
214
+ }
215
+ const fields = adapter.payload.collections[field.collection].config.flattenedFields;
216
+ const joinCollectionTableName = adapter.tableNameMap.get(toSnakeCase(field.collection));
217
+ const joins = [];
218
+ const buildQueryResult = buildQuery({
219
+ adapter,
220
+ fields,
221
+ joins,
222
+ locale,
223
+ sort,
224
+ tableName: joinCollectionTableName,
225
+ where
226
+ });
227
+ let subQueryWhere = buildQueryResult.where;
228
+ const orderBy = buildQueryResult.orderBy;
229
+ let joinLocalesCollectionTableName;
230
+ const currentIDColumn = versions ? adapter.tables[currentTableName].parent : adapter.tables[currentTableName].id;
231
+ // Handle hasMany _rels table
232
+ if (field.hasMany) {
233
+ const joinRelsCollectionTableName = `${joinCollectionTableName}${adapter.relationshipsSuffix}`;
234
+ if (field.localized) {
235
+ joinLocalesCollectionTableName = joinRelsCollectionTableName;
254
236
  }
255
- const { limit: limitArg = field.defaultLimit ?? 10, sort = field.defaultSort, where } = joinQuery[joinSchemaPath] || {};
256
- let limit = limitArg;
257
- if (limit !== 0) {
258
- // get an additional document and slice it later to determine if there is a next page
259
- limit += 1;
237
+ let columnReferenceToCurrentID;
238
+ if (versions) {
239
+ columnReferenceToCurrentID = `${topLevelTableName.replace('_', '').replace(new RegExp(`${adapter.versionsSuffix}$`), '')}_id`;
240
+ } else {
241
+ columnReferenceToCurrentID = `${topLevelTableName}_id`;
260
242
  }
261
- const fields = adapter.payload.collections[field.collection].config.fields;
262
- const joinCollectionTableName = adapter.tableNameMap.get(toSnakeCase(field.collection));
263
- const joins = [];
264
- const buildQueryResult = buildQuery({
265
- adapter,
266
- fields,
267
- joins,
268
- locale,
269
- sort,
270
- tableName: joinCollectionTableName,
271
- where
243
+ joins.push({
244
+ type: 'innerJoin',
245
+ condition: and(eq(adapter.tables[joinRelsCollectionTableName].parent, adapter.tables[joinCollectionTableName].id), eq(sql.raw(`"${joinRelsCollectionTableName}"."${columnReferenceToCurrentID}"`), currentIDColumn), eq(adapter.tables[joinRelsCollectionTableName].path, field.on)),
246
+ table: adapter.tables[joinRelsCollectionTableName]
272
247
  });
273
- let subQueryWhere = buildQueryResult.where;
274
- const orderBy = buildQueryResult.orderBy;
275
- let joinLocalesCollectionTableName;
276
- const currentIDColumn = versions ? adapter.tables[currentTableName].parent : adapter.tables[currentTableName].id;
277
- // Handle hasMany _rels table
278
- if (field.hasMany) {
279
- const joinRelsCollectionTableName = `${joinCollectionTableName}${adapter.relationshipsSuffix}`;
280
- if (field.localized) {
281
- joinLocalesCollectionTableName = joinRelsCollectionTableName;
282
- }
283
- let columnReferenceToCurrentID;
284
- if (versions) {
285
- columnReferenceToCurrentID = `${topLevelTableName.replace('_', '').replace(new RegExp(`${adapter.versionsSuffix}$`), '')}_id`;
286
- } else {
287
- columnReferenceToCurrentID = `${topLevelTableName}_id`;
288
- }
248
+ } else {
249
+ // Handle localized without hasMany
250
+ const foreignColumn = field.on.replaceAll('.', '_');
251
+ if (field.localized) {
252
+ joinLocalesCollectionTableName = `${joinCollectionTableName}${adapter.localesSuffix}`;
289
253
  joins.push({
290
254
  type: 'innerJoin',
291
- condition: and(eq(adapter.tables[joinRelsCollectionTableName].parent, adapter.tables[joinCollectionTableName].id), eq(sql.raw(`"${joinRelsCollectionTableName}"."${columnReferenceToCurrentID}"`), currentIDColumn), eq(adapter.tables[joinRelsCollectionTableName].path, field.on)),
292
- table: adapter.tables[joinRelsCollectionTableName]
255
+ condition: and(eq(adapter.tables[joinLocalesCollectionTableName]._parentID, adapter.tables[joinCollectionTableName].id), eq(adapter.tables[joinLocalesCollectionTableName][foreignColumn], currentIDColumn)),
256
+ table: adapter.tables[joinLocalesCollectionTableName]
293
257
  });
258
+ // Handle without localized and without hasMany, just a condition append to where. With localized the inner join handles eq.
294
259
  } else {
295
- // Handle localized without hasMany
296
- const foreignColumn = field.on.replaceAll('.', '_');
297
- if (field.localized) {
298
- joinLocalesCollectionTableName = `${joinCollectionTableName}${adapter.localesSuffix}`;
299
- joins.push({
300
- type: 'innerJoin',
301
- condition: and(eq(adapter.tables[joinLocalesCollectionTableName]._parentID, adapter.tables[joinCollectionTableName].id), eq(adapter.tables[joinLocalesCollectionTableName][foreignColumn], currentIDColumn)),
302
- table: adapter.tables[joinLocalesCollectionTableName]
303
- });
304
- // Handle without localized and without hasMany, just a condition append to where. With localized the inner join handles eq.
260
+ const constraint = eq(adapter.tables[joinCollectionTableName][foreignColumn], currentIDColumn);
261
+ if (subQueryWhere) {
262
+ subQueryWhere = and(subQueryWhere, constraint);
305
263
  } else {
306
- const constraint = eq(adapter.tables[joinCollectionTableName][foreignColumn], currentIDColumn);
307
- if (subQueryWhere) {
308
- subQueryWhere = and(subQueryWhere, constraint);
309
- } else {
310
- subQueryWhere = constraint;
311
- }
264
+ subQueryWhere = constraint;
312
265
  }
313
266
  }
314
- const chainedMethods = [];
315
- joins.forEach(({ type, condition, table })=>{
316
- chainedMethods.push({
317
- args: [
318
- table,
319
- condition
320
- ],
321
- method: type ?? 'leftJoin'
322
- });
267
+ }
268
+ const chainedMethods = [];
269
+ joins.forEach(({ type, condition, table })=>{
270
+ chainedMethods.push({
271
+ args: [
272
+ table,
273
+ condition
274
+ ],
275
+ method: type ?? 'leftJoin'
323
276
  });
324
- if (limit !== 0) {
325
- chainedMethods.push({
326
- args: [
327
- limit
328
- ],
329
- method: 'limit'
330
- });
331
- }
332
- const db = adapter.drizzle;
333
- const subQuery = chainMethods({
334
- methods: chainedMethods,
335
- query: db.select({
336
- id: adapter.tables[joinCollectionTableName].id,
337
- ...joinLocalesCollectionTableName && {
338
- locale: adapter.tables[joinLocalesCollectionTableName].locale || adapter.tables[joinLocalesCollectionTableName]._locale
339
- }
340
- }).from(adapter.tables[joinCollectionTableName]).where(subQueryWhere).orderBy(()=>orderBy.map(({ column, order })=>order(column)))
277
+ });
278
+ if (limit !== 0) {
279
+ chainedMethods.push({
280
+ args: [
281
+ limit
282
+ ],
283
+ method: 'limit'
341
284
  });
342
- const columnName = `${path.replaceAll('.', '_')}${field.name}`;
343
- const jsonObjectSelect = field.localized ? sql.raw(`'_parentID', "id", '_locale', "${adapter.tables[joinLocalesCollectionTableName].locale ? 'locale' : '_locale'}"`) : sql.raw(`'id', "id"`);
344
- if (adapter.name === 'sqlite') {
345
- currentArgs.extras[columnName] = sql`
285
+ }
286
+ const db = adapter.drizzle;
287
+ const subQuery = chainMethods({
288
+ methods: chainedMethods,
289
+ query: db.select({
290
+ id: adapter.tables[joinCollectionTableName].id,
291
+ ...joinLocalesCollectionTableName && {
292
+ locale: adapter.tables[joinLocalesCollectionTableName].locale || adapter.tables[joinLocalesCollectionTableName]._locale
293
+ }
294
+ }).from(adapter.tables[joinCollectionTableName]).where(subQueryWhere).orderBy(()=>orderBy.map(({ column, order })=>order(column)))
295
+ });
296
+ const columnName = `${path.replaceAll('.', '_')}${field.name}`;
297
+ const jsonObjectSelect = field.localized ? sql.raw(`'_parentID', "id", '_locale', "${adapter.tables[joinLocalesCollectionTableName].locale ? 'locale' : '_locale'}"`) : sql.raw(`'id', "id"`);
298
+ if (adapter.name === 'sqlite') {
299
+ currentArgs.extras[columnName] = sql`
346
300
  COALESCE((
347
301
  SELECT json_group_array(json_object(${jsonObjectSelect}))
348
302
  FROM (
@@ -350,8 +304,8 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
350
304
  ) AS ${sql.raw(`${columnName}_sub`)}
351
305
  ), '[]')
352
306
  `.as(columnName);
353
- } else {
354
- currentArgs.extras[columnName] = sql`
307
+ } else {
308
+ currentArgs.extras[columnName] = sql`
355
309
  COALESCE((
356
310
  SELECT json_agg(json_build_object(${jsonObjectSelect}))
357
311
  FROM (
@@ -359,85 +313,84 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
359
313
  ) AS ${sql.raw(`${columnName}_sub`)}
360
314
  ), '[]'::json)
361
315
  `.as(columnName);
362
- }
316
+ }
317
+ break;
318
+ }
319
+ case 'point':
320
+ {
321
+ if (adapter.name === 'sqlite') {
363
322
  break;
364
323
  }
365
- case 'point':
366
- {
367
- if (adapter.name === 'sqlite') {
368
- break;
369
- }
370
- const args = field.localized ? _locales : currentArgs;
371
- if (!args.columns) {
372
- args.columns = {};
373
- }
374
- if (!args.extras) {
375
- args.extras = {};
376
- }
377
- const name = `${path}${field.name}`;
378
- // Drizzle handles that poorly. See https://github.com/drizzle-team/drizzle-orm/issues/2526
379
- // Additionally, this way we format the column value straight in the database using ST_AsGeoJSON
380
- args.columns[name] = false;
381
- let shouldSelect = false;
382
- if (select || selectAllOnCurrentLevel) {
383
- if (selectAllOnCurrentLevel || selectMode === 'include' && select[field.name] === true || selectMode === 'exclude' && typeof select[field.name] === 'undefined') {
384
- shouldSelect = true;
385
- }
386
- } else {
324
+ const args = field.localized ? _locales : currentArgs;
325
+ if (!args.columns) {
326
+ args.columns = {};
327
+ }
328
+ if (!args.extras) {
329
+ args.extras = {};
330
+ }
331
+ const name = `${path}${field.name}`;
332
+ // Drizzle handles that poorly. See https://github.com/drizzle-team/drizzle-orm/issues/2526
333
+ // Additionally, this way we format the column value straight in the database using ST_AsGeoJSON
334
+ args.columns[name] = false;
335
+ let shouldSelect = false;
336
+ if (select || selectAllOnCurrentLevel) {
337
+ if (selectAllOnCurrentLevel || selectMode === 'include' && select[field.name] === true || selectMode === 'exclude' && typeof select[field.name] === 'undefined') {
387
338
  shouldSelect = true;
388
339
  }
389
- if (shouldSelect) {
390
- args.extras[name] = sql.raw(`ST_AsGeoJSON(${toSnakeCase(name)})::jsonb`).as(name);
391
- }
392
- break;
340
+ } else {
341
+ shouldSelect = true;
393
342
  }
394
- case 'select':
395
- {
396
- if (field.hasMany) {
397
- if (select) {
398
- if (selectMode === 'include' && !select[field.name] || selectMode === 'exclude' && select[field.name] === false) {
399
- break;
400
- }
343
+ if (shouldSelect) {
344
+ args.extras[name] = sql.raw(`ST_AsGeoJSON(${toSnakeCase(name)})::jsonb`).as(name);
345
+ }
346
+ break;
347
+ }
348
+ case 'select':
349
+ {
350
+ if (field.hasMany) {
351
+ if (select) {
352
+ if (selectMode === 'include' && !select[field.name] || selectMode === 'exclude' && select[field.name] === false) {
353
+ break;
401
354
  }
402
- const withSelect = {
403
- columns: {
404
- id: false,
405
- order: false,
406
- parent: false
407
- },
408
- orderBy: ({ order }, { asc })=>[
409
- asc(order)
410
- ]
411
- };
412
- currentArgs.with[`${path}${field.name}`] = withSelect;
413
355
  }
356
+ const withSelect = {
357
+ columns: {
358
+ id: false,
359
+ order: false,
360
+ parent: false
361
+ },
362
+ orderBy: ({ order }, { asc })=>[
363
+ asc(order)
364
+ ]
365
+ };
366
+ currentArgs.with[`${path}${field.name}`] = withSelect;
367
+ }
368
+ break;
369
+ }
370
+ default:
371
+ {
372
+ if (!select && !selectAllOnCurrentLevel) {
414
373
  break;
415
374
  }
416
- default:
417
- {
418
- if (!select && !selectAllOnCurrentLevel) {
419
- break;
375
+ if (selectAllOnCurrentLevel || selectMode === 'include' && select[field.name] === true || selectMode === 'exclude' && typeof select[field.name] === 'undefined') {
376
+ const fieldPath = `${path}${field.name}`;
377
+ if ((field.localized || withinLocalizedField) && _locales) {
378
+ _locales.columns[fieldPath] = true;
379
+ } else if (adapter.tables[currentTableName]?.[fieldPath]) {
380
+ currentArgs.columns[fieldPath] = true;
420
381
  }
421
- if (selectAllOnCurrentLevel || selectMode === 'include' && select[field.name] === true || selectMode === 'exclude' && typeof select[field.name] === 'undefined') {
422
- const fieldPath = `${path}${field.name}`;
423
- if ((field.localized || withinLocalizedField) && _locales) {
424
- _locales.columns[fieldPath] = true;
425
- } else if (adapter.tables[currentTableName]?.[fieldPath]) {
426
- currentArgs.columns[fieldPath] = true;
427
- }
428
- if (!withTabledFields.rels && field.type === 'relationship' && (field.hasMany || Array.isArray(field.relationTo))) {
429
- withTabledFields.rels = true;
430
- }
431
- if (!withTabledFields.numbers && field.type === 'number' && field.hasMany) {
432
- withTabledFields.numbers = true;
433
- }
434
- if (!withTabledFields.texts && field.type === 'text' && field.hasMany) {
435
- withTabledFields.texts = true;
436
- }
382
+ if (!withTabledFields.rels && field.type === 'relationship' && (field.hasMany || Array.isArray(field.relationTo))) {
383
+ withTabledFields.rels = true;
384
+ }
385
+ if (!withTabledFields.numbers && field.type === 'number' && field.hasMany) {
386
+ withTabledFields.numbers = true;
387
+ }
388
+ if (!withTabledFields.texts && field.type === 'text' && field.hasMany) {
389
+ withTabledFields.texts = true;
437
390
  }
438
- break;
439
391
  }
440
- }
392
+ break;
393
+ }
441
394
  }
442
395
  });
443
396
  return topLevelArgs;