@lovrozagar/oat 0.7.6 → 0.7.7
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../src/runtime/checks.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../src/runtime/checks.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/checks.js
CHANGED
|
@@ -390,6 +390,11 @@ function asTermValue(value) {
|
|
|
390
390
|
function setOf(records, identity) {
|
|
391
391
|
return new Set(ids(records, identity));
|
|
392
392
|
}
|
|
393
|
+
/** List identities that oat seeded. Extra rows outside this set are not scored as defects. */
|
|
394
|
+
function knownHits(items, ctx) {
|
|
395
|
+
const known = setOf(ctx.records, ctx.identity);
|
|
396
|
+
return new Set(ids(items, ctx.identity).filter((id) => known.has(id)));
|
|
397
|
+
}
|
|
393
398
|
function sameSet(a, b) {
|
|
394
399
|
if (a.size !== b.size)
|
|
395
400
|
return false;
|
|
@@ -3308,25 +3313,30 @@ const numericComparisonIsNumeric = {
|
|
|
3308
3313
|
.sort();
|
|
3309
3314
|
if (expected.length === 0)
|
|
3310
3315
|
return;
|
|
3316
|
+
/* Extra matching rows outside the seeded cohort are not a defect. Score got ∩ known. */
|
|
3311
3317
|
const gtTerm = filterTerm(conv(ctx), field, "gt", threshold);
|
|
3312
3318
|
if (gtTerm === null)
|
|
3313
3319
|
return;
|
|
3314
3320
|
const result = await list(ctx, { ...q(ctx, { limit: ctx.query?.maxLimit ?? 100 }), ...gtTerm });
|
|
3315
3321
|
if (result.exchange.status >= 400)
|
|
3316
3322
|
return;
|
|
3317
|
-
const got = ids(result.items, ctx.identity)
|
|
3318
|
-
|
|
3323
|
+
const got = ids(result.items, ctx.identity);
|
|
3324
|
+
const gotKnown = [...knownHits(result.items, ctx)].sort();
|
|
3325
|
+
if (gotKnown.join(",") === expected.join(","))
|
|
3319
3326
|
return;
|
|
3320
|
-
const missing = expected.filter((id) => !
|
|
3321
|
-
const extra =
|
|
3327
|
+
const missing = expected.filter((id) => !gotKnown.includes(id));
|
|
3328
|
+
const extra = gotKnown.filter((id) => !expected.includes(id));
|
|
3322
3329
|
const lexical = expected.filter((id) => {
|
|
3323
3330
|
const record = ctx.records.find((r) => String(r[ctx.identity]) === id);
|
|
3324
3331
|
return record !== undefined && String(record[field]) < String(threshold);
|
|
3325
3332
|
});
|
|
3326
|
-
|
|
3327
|
-
|
|
3333
|
+
const comparedAsText = missing.length > 0 && missing.every((id) => lexical.includes(id));
|
|
3334
|
+
ctx.findings.backend(this.id, ctx.entityName, comparedAsText
|
|
3335
|
+
? `"${field}" is compared as text rather than as a number`
|
|
3336
|
+
: `"${field}" comparison does not agree with numeric ordering`, `filter=${field}.gt.${threshold} returned ${got.length} record(s); ${expected.length} known ` +
|
|
3337
|
+
`records hold a greater numeric value. Missing: ${missing.slice(0, 4).join(", ") || "none"}. ` +
|
|
3328
3338
|
`Unexpected: ${extra.slice(0, 4).join(", ") || "none"}. ` +
|
|
3329
|
-
(
|
|
3339
|
+
(comparedAsText
|
|
3330
3340
|
? "Every missing record is one whose value sorts below the threshold as a string, " +
|
|
3331
3341
|
"so the comparison is lexical: the query value was never coerced from text."
|
|
3332
3342
|
: "The comparison does not agree with numeric ordering."), [result.exchange]);
|
|
@@ -4336,8 +4346,8 @@ const filterIsNullSelectsNulls = {
|
|
|
4336
4346
|
const expectedNulls = new Set(ctx.records
|
|
4337
4347
|
.filter((row) => row[field.field] === null || row[field.field] === undefined)
|
|
4338
4348
|
.map((row) => String(row[ctx.identity])));
|
|
4339
|
-
const gotNulls =
|
|
4340
|
-
const overlap = [...gotNulls].filter((id) =>
|
|
4349
|
+
const gotNulls = knownHits(nulls.items, ctx);
|
|
4350
|
+
const overlap = [...gotNulls].filter((id) => knownHits(present.items, ctx).has(id));
|
|
4341
4351
|
if (!sameSet(expectedNulls, gotNulls) || overlap.length > 0) {
|
|
4342
4352
|
ctx.findings.backend(this.id, ctx.entityName, "is.null / is.notnull do not partition on nulls", `is.null returned ${gotNulls.size} record(s); ${expectedNulls.size} cohort rows are null. ` +
|
|
4343
4353
|
(overlap.length > 0 ? `${overlap.length} appear on both sides.` : ""), [nulls.last.exchange, present.last.exchange]);
|
|
@@ -4374,7 +4384,7 @@ const filterContainsMembership = {
|
|
|
4374
4384
|
.filter((row) => Array.isArray(row[field.field]) &&
|
|
4375
4385
|
row[field.field].some((item) => String(item) === String(element)))
|
|
4376
4386
|
.map((row) => String(row[ctx.identity])));
|
|
4377
|
-
const got =
|
|
4387
|
+
const got = knownHits(result.items, ctx);
|
|
4378
4388
|
if (sameSet(expected, got))
|
|
4379
4389
|
return;
|
|
4380
4390
|
ctx.findings.backend(this.id, ctx.entityName, "contains does not select membership of the given element", `${field.field}.contains.${String(element)} returned ${got.size}; ${expected.size} records hold that element.`, [result.last.exchange]);
|