Skip to content

Commit c47ff1c

Browse files
committed
wip
1 parent 591fa39 commit c47ff1c

File tree

3 files changed

+438
-11
lines changed

3 files changed

+438
-11
lines changed

src/schema-convertors.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,14 @@
1+
import internalSchemaToMongoDB from './schema-convertors/internalToMongoDB';
12
import { Schema as InternalSchema } from './schema-analyzer';
2-
import { ExtendedJSONSchema, MongoDBJSONSchema, StandardJSONSchema } from './types';
3+
import { ExtendedJSONSchema, StandardJSONSchema } from './types';
34

45
function internalSchemaToStandard(
56
internalSchema: InternalSchema,
67
options: {
78
signal?: AbortSignal
89
}): StandardJSONSchema {
910
// TODO: COMPASS-8700
10-
return {};
11-
}
12-
13-
function internalSchemaToMongoDB(
14-
internalSchema: InternalSchema,
15-
options: {
16-
signal?: AbortSignal
17-
}): MongoDBJSONSchema {
18-
// TODO: COMPASS-8701
19-
return {} as MongoDBJSONSchema;
11+
return {} as StandardJSONSchema;
2012
}
2113

2214
function internalSchemaToExtended(
Lines changed: 367 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,367 @@
1+
import assert from 'assert';
2+
import internalSchemaToStandard from './internalToMongodb';
3+
4+
describe.only('internalSchemaToStandard', function() {
5+
describe('Converts: ', function() {
6+
it('document/object', function() {
7+
const internal = {
8+
count: 2,
9+
fields: [
10+
{
11+
name: 'author',
12+
path: [
13+
'author'
14+
],
15+
count: 1,
16+
type: [
17+
'Document',
18+
'Undefined'
19+
],
20+
probability: 1,
21+
hasDuplicates: false,
22+
types: [
23+
{
24+
name: 'Document',
25+
path: [
26+
'author'
27+
],
28+
count: 1,
29+
probability: 0.5,
30+
bsonType: 'Document',
31+
fields: [
32+
{
33+
name: 'name',
34+
path: [
35+
'author',
36+
'name'
37+
],
38+
count: 1,
39+
type: 'String',
40+
probability: 1,
41+
hasDuplicates: false,
42+
types: [
43+
{
44+
name: 'String',
45+
path: [
46+
'author',
47+
'name'
48+
],
49+
count: 1,
50+
probability: 1,
51+
unique: 1,
52+
hasDuplicates: false,
53+
values: [
54+
'Peter Sonder'
55+
],
56+
bsonType: 'String'
57+
}
58+
]
59+
},
60+
{
61+
name: 'rating',
62+
path: [
63+
'author',
64+
'rating'
65+
],
66+
count: 1,
67+
type: 'Double',
68+
probability: 1,
69+
hasDuplicates: false,
70+
types: [
71+
{
72+
name: 'Double',
73+
path: [
74+
'author',
75+
'rating'
76+
],
77+
count: 1,
78+
probability: 1,
79+
unique: 1,
80+
hasDuplicates: false,
81+
values: [
82+
1.3
83+
],
84+
bsonType: 'Double'
85+
}
86+
]
87+
}
88+
]
89+
},
90+
{
91+
name: 'Undefined',
92+
bsonType: 'Undefined',
93+
unique: 1,
94+
hasDuplicates: false,
95+
path: [
96+
'author'
97+
],
98+
count: 1,
99+
probability: 0.5
100+
}
101+
]
102+
}
103+
]
104+
};
105+
const standard = internalSchemaToStandard(internal);
106+
assert.deepStrictEqual(standard, {
107+
bsonType: 'object',
108+
required: ['author'],
109+
properties: {
110+
author: {
111+
bsonType: 'object',
112+
required: ['name', 'rating'],
113+
properties: {
114+
name: {
115+
bsonType: 'string'
116+
},
117+
rating: {
118+
bsonType: 'double'
119+
}
120+
}
121+
}
122+
}
123+
});
124+
});
125+
126+
it('array - single type', function() {
127+
const internal = {
128+
count: 2,
129+
fields: [
130+
{
131+
name: 'genres',
132+
path: [
133+
'genres'
134+
],
135+
count: 1,
136+
type: [
137+
'array',
138+
'Undefined'
139+
],
140+
probability: 0.5,
141+
hasDuplicates: false,
142+
types: [
143+
{
144+
name: 'array',
145+
path: [
146+
'genres'
147+
],
148+
count: 1,
149+
probability: 0.5,
150+
bsonType: 'Array',
151+
types: [
152+
{
153+
name: 'String',
154+
path: [
155+
'genres'
156+
],
157+
count: 2,
158+
probability: 1,
159+
unique: 2,
160+
hasDuplicates: false,
161+
values: [
162+
'crimi',
163+
'comedy'
164+
],
165+
bsonType: 'String'
166+
}
167+
],
168+
totalCount: 2,
169+
lengths: [
170+
2
171+
],
172+
averageLength: 2
173+
},
174+
{
175+
name: 'Undefined',
176+
bsonType: 'Undefined',
177+
unique: 1,
178+
hasDuplicates: false,
179+
path: [
180+
'genres'
181+
],
182+
count: 1,
183+
probability: 0.5
184+
}
185+
]
186+
}
187+
]
188+
};
189+
const standard = internalSchemaToStandard(internal);
190+
assert.deepStrictEqual(standard, {
191+
bsonType: 'object',
192+
required: [],
193+
properties: {
194+
genres: {
195+
bsonType: 'array',
196+
items: {
197+
bsonType: 'string'
198+
}
199+
}
200+
}
201+
});
202+
});
203+
204+
it('array - complex mixed type', function() {
205+
const internal = {
206+
count: 2,
207+
fields: [
208+
{
209+
name: 'genres',
210+
path: [
211+
'genres'
212+
],
213+
count: 1,
214+
type: [
215+
'Array',
216+
'Undefined'
217+
],
218+
probability: 0.5,
219+
hasDuplicates: false,
220+
types: [
221+
{
222+
name: 'Array',
223+
path: [
224+
'genres'
225+
],
226+
count: 1,
227+
probability: 0.5,
228+
bsonType: 'Array',
229+
types: [
230+
{
231+
name: 'String',
232+
path: [
233+
'genres'
234+
],
235+
count: 2,
236+
probability: 0.6666666666666666,
237+
unique: 2,
238+
hasDuplicates: false,
239+
values: [
240+
'crimi',
241+
'comedy'
242+
],
243+
bsonType: 'String'
244+
},
245+
{
246+
name: 'Document',
247+
path: [
248+
'genres'
249+
],
250+
count: 1,
251+
probability: 0.3333333333333333,
252+
bsonType: 'Document',
253+
fields: [
254+
{
255+
name: 'long',
256+
path: [
257+
'genres',
258+
'long'
259+
],
260+
count: 1,
261+
type: 'String',
262+
probability: 1,
263+
hasDuplicates: false,
264+
types: [
265+
{
266+
name: 'String',
267+
path: [
268+
'genres',
269+
'long'
270+
],
271+
count: 1,
272+
probability: 1,
273+
unique: 1,
274+
hasDuplicates: false,
275+
values: [
276+
'science fiction'
277+
],
278+
bsonType: 'String'
279+
}
280+
]
281+
},
282+
{
283+
name: 'short',
284+
path: [
285+
'genres',
286+
'short'
287+
],
288+
count: 1,
289+
type: 'String',
290+
probability: 1,
291+
hasDuplicates: false,
292+
types: [
293+
{
294+
name: 'String',
295+
path: [
296+
'genres',
297+
'short'
298+
],
299+
count: 1,
300+
probability: 1,
301+
unique: 1,
302+
hasDuplicates: false,
303+
values: [
304+
'scifi'
305+
],
306+
bsonType: 'String'
307+
}
308+
]
309+
}
310+
]
311+
}
312+
],
313+
totalCount: 3,
314+
lengths: [
315+
3
316+
],
317+
averageLength: 3
318+
},
319+
{
320+
name: 'Undefined',
321+
bsonType: 'Undefined',
322+
unique: 1,
323+
hasDuplicates: false,
324+
path: [
325+
'genres'
326+
],
327+
count: 1,
328+
probability: 0.5
329+
}
330+
]
331+
}
332+
]
333+
};
334+
const standard = internalSchemaToStandard(internal);
335+
assert.deepStrictEqual(standard, {
336+
bsonType: 'object',
337+
required: [],
338+
properties: {
339+
genres: {
340+
bsonType: 'array',
341+
items: {
342+
anyOf: [
343+
{
344+
bsonType: 'string'
345+
},
346+
{
347+
bsonType: 'object',
348+
required: ['long', 'short'],
349+
properties: {
350+
long: {
351+
bsonType: 'string'
352+
},
353+
short: {
354+
bsonType: 'string'
355+
}
356+
}
357+
}
358+
]
359+
}
360+
}
361+
}
362+
});
363+
});
364+
365+
// TODO: array - simple mixed type
366+
});
367+
});

0 commit comments

Comments
 (0)