@malloydata/malloy 0.0.1 → 0.0.2
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.
- package/dist/dialect/dialect.d.ts +1 -1
- package/dist/dialect/dialect.js +13 -0
- package/dist/lang/ast/apply-expr.d.ts +2 -2
- package/dist/lang/ast/apply-expr.js +19 -3
- package/dist/lang/ast/ast-expr.d.ts +37 -37
- package/dist/lang/ast/ast-expr.js +22 -27
- package/dist/lang/ast/ast-main.d.ts +12 -12
- package/dist/lang/ast/ast-main.js +34 -44
- package/dist/lang/ast/ast-time-expr.d.ts +19 -19
- package/dist/lang/ast/ast-time-expr.js +6 -7
- package/dist/lang/ast/time-utils.d.ts +1 -0
- package/dist/lang/ast/time-utils.js +12 -1
- package/dist/lang/field-space.d.ts +37 -37
- package/dist/lang/field-space.js +108 -130
- package/dist/lang/space-field.d.ts +10 -7
- package/dist/lang/space-field.js +11 -4
- package/dist/lang/test/parse.spec.js +1 -1
- package/dist/model/malloy_query.js +6 -0
- package/dist/model/malloy_types.d.ts +12 -1
- package/package.json +2 -1
package/dist/lang/field-space.js
CHANGED
|
@@ -35,7 +35,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
35
35
|
return result;
|
|
36
36
|
};
|
|
37
37
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
-
exports.
|
|
38
|
+
exports.DefSpace = exports.IndexFieldSpace = exports.ProjectFieldSpace = exports.ReduceFieldSpace = exports.ResultSpace = exports.QuerySpace = exports.DynamicSpace = exports.StaticSpace = void 0;
|
|
39
39
|
/* eslint-disable no-useless-constructor */
|
|
40
40
|
const lodash_1 = require("lodash");
|
|
41
41
|
const dialect_1 = require("../dialect");
|
|
@@ -54,8 +54,13 @@ class StaticSpace {
|
|
|
54
54
|
whenComplete(step) {
|
|
55
55
|
step();
|
|
56
56
|
}
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
dialectObj() {
|
|
58
|
+
try {
|
|
59
|
+
return (0, dialect_1.getDialect)(this.fromStruct.dialect);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
59
64
|
}
|
|
60
65
|
fromFieldDef(from) {
|
|
61
66
|
if (from.type === "struct") {
|
|
@@ -116,6 +121,8 @@ class StaticSpace {
|
|
|
116
121
|
}
|
|
117
122
|
if (found instanceof space_field_1.SpaceField) {
|
|
118
123
|
/*
|
|
124
|
+
* TODO cache defs, post the addReference call to whenComplete
|
|
125
|
+
*
|
|
119
126
|
* In the cleanup phase of query space construction, it may check
|
|
120
127
|
* the output space for ungrouping variables. However if an
|
|
121
128
|
* ungrouping variable is a measure, the field expression value
|
|
@@ -129,18 +136,7 @@ class StaticSpace {
|
|
|
129
136
|
* ... or this check would look at the finalized output of
|
|
130
137
|
* the namespace and not re-compile ...
|
|
131
138
|
*/
|
|
132
|
-
|
|
133
|
-
if (this instanceof QuerySpace) {
|
|
134
|
-
const qfd = found.getQueryFieldDef(this.qfs());
|
|
135
|
-
if (qfd &&
|
|
136
|
-
typeof qfd != "string" &&
|
|
137
|
-
!model.isFilteredAliasedName(qfd)) {
|
|
138
|
-
definition = qfd;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
definition = found.fieldDef();
|
|
143
|
-
}
|
|
139
|
+
const definition = found.fieldDef();
|
|
144
140
|
if (definition) {
|
|
145
141
|
head.addReference({
|
|
146
142
|
type: found instanceof space_field_1.StructSpaceField
|
|
@@ -285,7 +281,7 @@ class DynamicSpace extends StaticSpace {
|
|
|
285
281
|
def.log("Can't rename field to itself");
|
|
286
282
|
continue;
|
|
287
283
|
}
|
|
288
|
-
const oldValue = def.oldName.getField(
|
|
284
|
+
const oldValue = def.oldName.getField(this);
|
|
289
285
|
if (oldValue.found) {
|
|
290
286
|
if (oldValue.found instanceof space_field_1.SpaceField) {
|
|
291
287
|
this.setEntry(def.newName, new space_field_1.RenameSpaceField(oldValue.found, def.newName, def.location));
|
|
@@ -360,7 +356,7 @@ class DynamicSpace extends StaticSpace {
|
|
|
360
356
|
}
|
|
361
357
|
// If we have join expressions, we need to now go back and fill them in
|
|
362
358
|
for (const [join, missingOn] of fixupJoins) {
|
|
363
|
-
join.fixupJoinOn(
|
|
359
|
+
join.fixupJoinOn(this, missingOn);
|
|
364
360
|
}
|
|
365
361
|
}
|
|
366
362
|
this.isComplete();
|
|
@@ -370,25 +366,39 @@ class DynamicSpace extends StaticSpace {
|
|
|
370
366
|
exports.DynamicSpace = DynamicSpace;
|
|
371
367
|
/**
|
|
372
368
|
* A namespace for Query operations. The have an input and an
|
|
373
|
-
* output set of fields.
|
|
369
|
+
* output set of fields. The InputSpace is the QueryOperationSpace
|
|
370
|
+
* which is where all expressions are evaluated, and the output
|
|
371
|
+
* space is ResultSpace.
|
|
372
|
+
*
|
|
374
373
|
*/
|
|
375
|
-
class
|
|
376
|
-
constructor(input) {
|
|
374
|
+
class QuerySpace extends DynamicSpace {
|
|
375
|
+
constructor(input, result) {
|
|
377
376
|
const inputSpace = new SourceSpace(input);
|
|
378
|
-
super(
|
|
379
|
-
this.
|
|
377
|
+
super(inputSpace.structDef);
|
|
378
|
+
this.result = result;
|
|
379
|
+
this.extendList = [];
|
|
380
380
|
}
|
|
381
|
-
|
|
382
|
-
|
|
381
|
+
extendSource(extendField) {
|
|
382
|
+
this.addField(extendField);
|
|
383
|
+
if (extendField instanceof ast_1.Join) {
|
|
384
|
+
this.extendList.push(extendField.name.refString);
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
this.extendList.push(extendField.defineName);
|
|
388
|
+
}
|
|
383
389
|
}
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
390
|
+
}
|
|
391
|
+
exports.QuerySpace = QuerySpace;
|
|
392
|
+
class ResultSpace extends DynamicSpace {
|
|
393
|
+
constructor(queryInputSpace) {
|
|
394
|
+
super(queryInputSpace.emptyStructDef());
|
|
395
|
+
this.queryInputSpace = queryInputSpace;
|
|
396
|
+
this.exprSpace = new QuerySpace(queryInputSpace, this);
|
|
397
|
+
}
|
|
398
|
+
log(s) {
|
|
399
|
+
if (this.astEl) {
|
|
400
|
+
this.astEl.log(s);
|
|
401
|
+
}
|
|
392
402
|
}
|
|
393
403
|
addMembers(members) {
|
|
394
404
|
for (const member of members) {
|
|
@@ -415,45 +425,18 @@ class QueryOperationSpace extends DynamicSpace {
|
|
|
415
425
|
addWild(wild) {
|
|
416
426
|
this.setEntry(wild.refString, new space_field_1.WildSpaceField(wild.refString));
|
|
417
427
|
}
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
exports.QueryOperationSpace = QueryOperationSpace;
|
|
425
|
-
/**
|
|
426
|
-
* Reduce and project queries use a "QuerySpace"
|
|
427
|
-
*/
|
|
428
|
-
class QuerySpace extends QueryOperationSpace {
|
|
429
|
-
constructor() {
|
|
430
|
-
super(...arguments);
|
|
431
|
-
this.extendedFields = [];
|
|
432
|
-
}
|
|
433
|
-
extendSource(extendField) {
|
|
434
|
-
this.extendedFields.push(extendField instanceof ast_1.Join
|
|
435
|
-
? extendField.name.refString
|
|
436
|
-
: extendField.defineName);
|
|
437
|
-
this.extendInto().addField(extendField);
|
|
438
|
-
}
|
|
439
|
-
inputFS() {
|
|
440
|
-
if (this.extendedInput) {
|
|
441
|
-
return this.extendedInput;
|
|
442
|
-
}
|
|
443
|
-
return this.queryInput.fieldSpace;
|
|
444
|
-
}
|
|
445
|
-
qfs() {
|
|
446
|
-
return {
|
|
447
|
-
in: this.inputFS(),
|
|
448
|
-
out: this,
|
|
449
|
-
};
|
|
450
|
-
}
|
|
428
|
+
/**
|
|
429
|
+
* Check for the definition of an ungrouping reference in the result space,
|
|
430
|
+
* or in the case of an exclude reference, if this query is nested
|
|
431
|
+
* in another query, in the result space of a query that this query
|
|
432
|
+
* is nested inside of.
|
|
433
|
+
*/
|
|
451
434
|
checkUngroup(fn, isExclude) {
|
|
452
|
-
if (this.
|
|
453
|
-
if (isExclude && this.nestParent) {
|
|
454
|
-
const parent = this.nestParent;
|
|
435
|
+
if (!this.entry(fn.refString)) {
|
|
436
|
+
if (isExclude && this.exprSpace.nestParent) {
|
|
437
|
+
const parent = this.exprSpace.nestParent;
|
|
455
438
|
parent.whenComplete(() => {
|
|
456
|
-
parent.checkUngroup(fn, isExclude);
|
|
439
|
+
parent.result.checkUngroup(fn, isExclude);
|
|
457
440
|
});
|
|
458
441
|
}
|
|
459
442
|
else {
|
|
@@ -462,46 +445,6 @@ class QuerySpace extends QueryOperationSpace {
|
|
|
462
445
|
}
|
|
463
446
|
}
|
|
464
447
|
}
|
|
465
|
-
extendInto() {
|
|
466
|
-
if (!this.extendedInput) {
|
|
467
|
-
this.extendedInput = new DynamicSpace(this.queryInput.sourceSpec);
|
|
468
|
-
}
|
|
469
|
-
return this.extendedInput;
|
|
470
|
-
}
|
|
471
|
-
getPipeSegment(refineFrom) {
|
|
472
|
-
const reduceOrProject = this.segType;
|
|
473
|
-
if (reduceOrProject === "index") {
|
|
474
|
-
throw new Error("IndexSegment getPipeSegment should not call super");
|
|
475
|
-
}
|
|
476
|
-
if (refineFrom === null || refineFrom === void 0 ? void 0 : refineFrom.extendSource) {
|
|
477
|
-
for (const xField of refineFrom.extendSource) {
|
|
478
|
-
this.extendInto().addFieldDef(xField);
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
const segment = {
|
|
482
|
-
type: reduceOrProject,
|
|
483
|
-
fields: this.queryFieldDefs(),
|
|
484
|
-
};
|
|
485
|
-
segment.fields = (0, field_utils_1.mergeFields)(refineFrom === null || refineFrom === void 0 ? void 0 : refineFrom.fields, segment.fields);
|
|
486
|
-
if (refineFrom === null || refineFrom === void 0 ? void 0 : refineFrom.extendSource) {
|
|
487
|
-
segment.extendSource = refineFrom.extendSource;
|
|
488
|
-
}
|
|
489
|
-
if (this.extendedInput) {
|
|
490
|
-
const newExtends = [];
|
|
491
|
-
// have to get the whole structdef because we need all the join
|
|
492
|
-
// resolution to happen and that only happens at the completion
|
|
493
|
-
// of the structdef generation.
|
|
494
|
-
const extendedStruct = this.extendedInput.structDef();
|
|
495
|
-
for (const extendName of this.extendedFields) {
|
|
496
|
-
const extendEnt = extendedStruct.fields.find((f) => (0, field_utils_1.nameOf)(f) == extendName);
|
|
497
|
-
if (extendEnt) {
|
|
498
|
-
newExtends.push(extendEnt);
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
segment.extendSource = (0, field_utils_1.mergeFields)(segment.extendSource, newExtends);
|
|
502
|
-
}
|
|
503
|
-
return segment;
|
|
504
|
-
}
|
|
505
448
|
addQueryItems(...qiList) {
|
|
506
449
|
for (const qi of qiList) {
|
|
507
450
|
if (qi instanceof ast_1.FieldReference || qi instanceof ast_1.NestReference) {
|
|
@@ -511,8 +454,8 @@ class QuerySpace extends QueryOperationSpace {
|
|
|
511
454
|
this.addField(qi);
|
|
512
455
|
}
|
|
513
456
|
else if ((0, ast_1.isNestedQuery)(qi)) {
|
|
514
|
-
const qf = new space_field_1.QueryFieldAST(this
|
|
515
|
-
qf.nestParent = this;
|
|
457
|
+
const qf = new space_field_1.QueryFieldAST(this, qi, qi.name);
|
|
458
|
+
qf.nestParent = this.exprSpace;
|
|
516
459
|
this.setEntry(qi.name, qf);
|
|
517
460
|
}
|
|
518
461
|
else {
|
|
@@ -528,13 +471,13 @@ class QuerySpace extends QueryOperationSpace {
|
|
|
528
471
|
const fields = [];
|
|
529
472
|
for (const [name, field] of this.entries()) {
|
|
530
473
|
if (field instanceof space_field_1.SpaceField) {
|
|
531
|
-
const fieldQueryDef = field.getQueryFieldDef(this.
|
|
474
|
+
const fieldQueryDef = field.getQueryFieldDef(this.exprSpace);
|
|
532
475
|
if (fieldQueryDef) {
|
|
533
476
|
if (this.canContain(fieldQueryDef)) {
|
|
534
477
|
fields.push(fieldQueryDef);
|
|
535
478
|
}
|
|
536
479
|
else {
|
|
537
|
-
this.log(`'${name}' not legal in ${this.
|
|
480
|
+
this.log(`'${name}' not legal in ${this.segmentType}`);
|
|
538
481
|
}
|
|
539
482
|
}
|
|
540
483
|
else {
|
|
@@ -545,19 +488,61 @@ class QuerySpace extends QueryOperationSpace {
|
|
|
545
488
|
this.isComplete();
|
|
546
489
|
return fields;
|
|
547
490
|
}
|
|
491
|
+
getQuerySegment(rf) {
|
|
492
|
+
const p = this.getPipeSegment(rf);
|
|
493
|
+
if (model.isQuerySegment(p)) {
|
|
494
|
+
return p;
|
|
495
|
+
}
|
|
496
|
+
throw new Error("TODO NOT POSSIBLE");
|
|
497
|
+
}
|
|
498
|
+
getPipeSegment(refineFrom) {
|
|
499
|
+
if (this.segmentType == "index") {
|
|
500
|
+
// TODO ... should make this go away
|
|
501
|
+
throw new Error("INDEX FIELD PIPE SEGMENT MIS HANDLED");
|
|
502
|
+
}
|
|
503
|
+
if (refineFrom === null || refineFrom === void 0 ? void 0 : refineFrom.extendSource) {
|
|
504
|
+
for (const xField of refineFrom.extendSource) {
|
|
505
|
+
this.exprSpace.addFieldDef(xField);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
const segment = {
|
|
509
|
+
type: this.segmentType,
|
|
510
|
+
fields: this.queryFieldDefs(),
|
|
511
|
+
};
|
|
512
|
+
segment.fields = (0, field_utils_1.mergeFields)(refineFrom === null || refineFrom === void 0 ? void 0 : refineFrom.fields, segment.fields);
|
|
513
|
+
if (refineFrom === null || refineFrom === void 0 ? void 0 : refineFrom.extendSource) {
|
|
514
|
+
segment.extendSource = refineFrom.extendSource;
|
|
515
|
+
}
|
|
516
|
+
if (this.exprSpace.extendList.length > 0) {
|
|
517
|
+
const newExtends = [];
|
|
518
|
+
const extendedStruct = this.exprSpace.structDef();
|
|
519
|
+
for (const extendName of this.exprSpace.extendList) {
|
|
520
|
+
const extendEnt = extendedStruct.fields.find((f) => (0, field_utils_1.nameOf)(f) == extendName);
|
|
521
|
+
if (extendEnt) {
|
|
522
|
+
newExtends.push(extendEnt);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
segment.extendSource = (0, field_utils_1.mergeFields)(segment.extendSource, newExtends);
|
|
526
|
+
}
|
|
527
|
+
this.isComplete();
|
|
528
|
+
return segment;
|
|
529
|
+
}
|
|
548
530
|
}
|
|
549
|
-
exports.
|
|
550
|
-
|
|
531
|
+
exports.ResultSpace = ResultSpace;
|
|
532
|
+
/**
|
|
533
|
+
* Reduce and project queries use a "QuerySpace"
|
|
534
|
+
*/
|
|
535
|
+
class ReduceFieldSpace extends ResultSpace {
|
|
551
536
|
constructor() {
|
|
552
537
|
super(...arguments);
|
|
553
|
-
this.
|
|
538
|
+
this.segmentType = "reduce";
|
|
554
539
|
}
|
|
555
540
|
}
|
|
556
541
|
exports.ReduceFieldSpace = ReduceFieldSpace;
|
|
557
|
-
class ProjectFieldSpace extends
|
|
542
|
+
class ProjectFieldSpace extends ResultSpace {
|
|
558
543
|
constructor() {
|
|
559
544
|
super(...arguments);
|
|
560
|
-
this.
|
|
545
|
+
this.segmentType = "project";
|
|
561
546
|
}
|
|
562
547
|
canContain(qd) {
|
|
563
548
|
if (typeof qd !== "string") {
|
|
@@ -577,14 +562,14 @@ class ProjectFieldSpace extends QuerySpace {
|
|
|
577
562
|
}
|
|
578
563
|
}
|
|
579
564
|
exports.ProjectFieldSpace = ProjectFieldSpace;
|
|
580
|
-
class IndexFieldSpace extends
|
|
565
|
+
class IndexFieldSpace extends ResultSpace {
|
|
581
566
|
constructor() {
|
|
582
567
|
super(...arguments);
|
|
583
|
-
this.
|
|
568
|
+
this.segmentType = "index";
|
|
584
569
|
this.fieldList = new Set();
|
|
585
570
|
}
|
|
586
571
|
addReference(ref) {
|
|
587
|
-
if (ref.getField(this.
|
|
572
|
+
if (ref.getField(this.exprSpace).found) {
|
|
588
573
|
this.fieldList.add(ref.refString);
|
|
589
574
|
}
|
|
590
575
|
}
|
|
@@ -633,19 +618,12 @@ class DefSpace {
|
|
|
633
618
|
}
|
|
634
619
|
return this.realFS.lookup(symbol);
|
|
635
620
|
}
|
|
636
|
-
|
|
637
|
-
return this.realFS.
|
|
621
|
+
dialectObj() {
|
|
622
|
+
return this.realFS.dialectObj();
|
|
638
623
|
}
|
|
639
624
|
whenComplete(step) {
|
|
640
625
|
this.realFS.whenComplete(step);
|
|
641
626
|
}
|
|
642
627
|
}
|
|
643
628
|
exports.DefSpace = DefSpace;
|
|
644
|
-
function fsPair(inFS, outFS) {
|
|
645
|
-
return {
|
|
646
|
-
in: inFS,
|
|
647
|
-
out: outFS || inFS,
|
|
648
|
-
};
|
|
649
|
-
}
|
|
650
|
-
exports.fsPair = fsPair;
|
|
651
629
|
//# sourceMappingURL=field-space.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as model from "../model/malloy_types";
|
|
2
|
-
import { FieldSpace,
|
|
2
|
+
import { FieldSpace, DynamicSpace, QuerySpace } from "./field-space";
|
|
3
3
|
import { FieldValueType, FieldDeclaration, TurtleDecl, HasParameter, Join, FieldReference } from "./ast";
|
|
4
4
|
interface FieldType {
|
|
5
5
|
type: FieldValueType;
|
|
@@ -28,7 +28,7 @@ export declare class AbstractParameter extends SpaceParam {
|
|
|
28
28
|
export declare abstract class SpaceField extends SpaceEntry {
|
|
29
29
|
readonly refType = "field";
|
|
30
30
|
protected fieldTypeFromFieldDef(def: model.FieldDef): FieldType;
|
|
31
|
-
getQueryFieldDef(_fs:
|
|
31
|
+
getQueryFieldDef(_fs: FieldSpace): model.QueryFieldDef | undefined;
|
|
32
32
|
fieldDef(): model.FieldDef | undefined;
|
|
33
33
|
}
|
|
34
34
|
export declare class RenameSpaceField extends SpaceField {
|
|
@@ -43,7 +43,7 @@ export declare class WildSpaceField extends SpaceField {
|
|
|
43
43
|
readonly wildText: string;
|
|
44
44
|
constructor(wildText: string);
|
|
45
45
|
type(): FieldType;
|
|
46
|
-
getQueryFieldDef(_fs:
|
|
46
|
+
getQueryFieldDef(_fs: FieldSpace): model.QueryFieldDef;
|
|
47
47
|
}
|
|
48
48
|
export declare class StructSpaceField extends SpaceField {
|
|
49
49
|
protected sourceDef: model.StructDef;
|
|
@@ -67,7 +67,8 @@ export declare class ColumnSpaceField extends SpaceField {
|
|
|
67
67
|
export declare abstract class QueryField extends SpaceField {
|
|
68
68
|
protected inSpace: FieldSpace;
|
|
69
69
|
constructor(inSpace: FieldSpace);
|
|
70
|
-
getQueryFieldDef(
|
|
70
|
+
abstract getQueryFieldDef(fs: FieldSpace): model.QueryFieldDef | undefined;
|
|
71
|
+
abstract fieldDef(): model.FieldDef;
|
|
71
72
|
type(): FieldType;
|
|
72
73
|
}
|
|
73
74
|
export declare class QueryFieldAST extends QueryField {
|
|
@@ -76,6 +77,7 @@ export declare class QueryFieldAST extends QueryField {
|
|
|
76
77
|
renameAs?: string;
|
|
77
78
|
nestParent?: QuerySpace;
|
|
78
79
|
constructor(fs: FieldSpace, turtle: TurtleDecl, name: string);
|
|
80
|
+
getQueryFieldDef(fs: FieldSpace): model.QueryFieldDef;
|
|
79
81
|
fieldDef(): model.TurtleDef;
|
|
80
82
|
}
|
|
81
83
|
export declare class QueryFieldStruct extends QueryField {
|
|
@@ -83,6 +85,7 @@ export declare class QueryFieldStruct extends QueryField {
|
|
|
83
85
|
constructor(fs: FieldSpace, turtleDef: model.TurtleDef);
|
|
84
86
|
rename(name: string): void;
|
|
85
87
|
fieldDef(): model.TurtleDef;
|
|
88
|
+
getQueryFieldDef(_fs: FieldSpace): model.QueryFieldDef | undefined;
|
|
86
89
|
}
|
|
87
90
|
/**
|
|
88
91
|
* FilteredAliasedName
|
|
@@ -96,13 +99,13 @@ export declare class FANSPaceField extends SpaceField {
|
|
|
96
99
|
name(): string;
|
|
97
100
|
private filtersPresent;
|
|
98
101
|
fieldDef(): model.FieldDef | undefined;
|
|
99
|
-
getQueryFieldDef(_fs:
|
|
102
|
+
getQueryFieldDef(_fs: FieldSpace): model.QueryFieldDef;
|
|
100
103
|
type(): FieldType;
|
|
101
104
|
}
|
|
102
105
|
export declare class ReferenceField extends SpaceField {
|
|
103
106
|
readonly fieldRef: FieldReference;
|
|
104
107
|
constructor(fieldRef: FieldReference);
|
|
105
|
-
getQueryFieldDef(fs:
|
|
108
|
+
getQueryFieldDef(fs: FieldSpace): model.QueryFieldDef | undefined;
|
|
106
109
|
type(): FieldType;
|
|
107
110
|
}
|
|
108
111
|
export declare class ExpressionFieldFromAst extends SpaceField {
|
|
@@ -113,7 +116,7 @@ export declare class ExpressionFieldFromAst extends SpaceField {
|
|
|
113
116
|
constructor(space: DynamicSpace, exprDef: FieldDeclaration);
|
|
114
117
|
get name(): string;
|
|
115
118
|
fieldDef(): model.FieldDef;
|
|
116
|
-
getQueryFieldDef(fs:
|
|
119
|
+
getQueryFieldDef(fs: FieldSpace): model.QueryFieldDef;
|
|
117
120
|
type(): FieldType;
|
|
118
121
|
}
|
|
119
122
|
export {};
|
package/dist/lang/space-field.js
CHANGED
|
@@ -176,9 +176,6 @@ class QueryField extends SpaceField {
|
|
|
176
176
|
super();
|
|
177
177
|
this.inSpace = inSpace;
|
|
178
178
|
}
|
|
179
|
-
getQueryFieldDef(_fs) {
|
|
180
|
-
return this.fieldDef();
|
|
181
|
-
}
|
|
182
179
|
type() {
|
|
183
180
|
return { type: "turtle" };
|
|
184
181
|
}
|
|
@@ -190,6 +187,13 @@ class QueryFieldAST extends QueryField {
|
|
|
190
187
|
this.turtle = turtle;
|
|
191
188
|
this.name = name;
|
|
192
189
|
}
|
|
190
|
+
getQueryFieldDef(fs) {
|
|
191
|
+
const def = this.turtle.getFieldDef(fs, this.nestParent);
|
|
192
|
+
if (this.renameAs) {
|
|
193
|
+
def.as = this.renameAs;
|
|
194
|
+
}
|
|
195
|
+
return def;
|
|
196
|
+
}
|
|
193
197
|
fieldDef() {
|
|
194
198
|
const def = this.turtle.getFieldDef(this.inSpace, this.nestParent);
|
|
195
199
|
if (this.renameAs) {
|
|
@@ -213,6 +217,9 @@ class QueryFieldStruct extends QueryField {
|
|
|
213
217
|
fieldDef() {
|
|
214
218
|
return this.turtleDef;
|
|
215
219
|
}
|
|
220
|
+
getQueryFieldDef(_fs) {
|
|
221
|
+
return this.fieldDef();
|
|
222
|
+
}
|
|
216
223
|
}
|
|
217
224
|
exports.QueryFieldStruct = QueryFieldStruct;
|
|
218
225
|
/**
|
|
@@ -297,7 +304,7 @@ class ReferenceField extends SpaceField {
|
|
|
297
304
|
}
|
|
298
305
|
getQueryFieldDef(fs) {
|
|
299
306
|
// Lookup string and generate error if it isn't defined.
|
|
300
|
-
const check = this.fieldRef.getField(fs
|
|
307
|
+
const check = this.fieldRef.getField(fs);
|
|
301
308
|
if (check.error) {
|
|
302
309
|
this.fieldRef.log(check.error);
|
|
303
310
|
}
|
|
@@ -233,7 +233,7 @@ class BetaExpression extends Testable {
|
|
|
233
233
|
const aStruct = this.internalModel.contents.ab;
|
|
234
234
|
if (aStruct.type === "struct") {
|
|
235
235
|
const tstFS = new field_space_1.StaticSpace(aStruct);
|
|
236
|
-
const exprDef = exprAst.getExpression(
|
|
236
|
+
const exprDef = exprAst.getExpression(tstFS);
|
|
237
237
|
if (inspectCompile) {
|
|
238
238
|
console.log("EXPRESSION: ", (0, test_translator_1.pretty)(exprDef));
|
|
239
239
|
}
|
|
@@ -1264,6 +1264,12 @@ class QueryQuery extends QueryField {
|
|
|
1264
1264
|
switch (expr.function) {
|
|
1265
1265
|
case "now":
|
|
1266
1266
|
break;
|
|
1267
|
+
case "div":
|
|
1268
|
+
expressions.push(expr.denominator);
|
|
1269
|
+
expressions.push(expr.numerator);
|
|
1270
|
+
break;
|
|
1271
|
+
case "timeLiteral":
|
|
1272
|
+
break;
|
|
1267
1273
|
case "timeDiff":
|
|
1268
1274
|
expressions.push(expr.left.value, expr.right.value);
|
|
1269
1275
|
break;
|
|
@@ -173,7 +173,18 @@ export interface RegexpMatchFragment extends DialectFragmentBase {
|
|
|
173
173
|
expr: Expr;
|
|
174
174
|
regexp: string;
|
|
175
175
|
}
|
|
176
|
-
export
|
|
176
|
+
export interface DivFragment extends DialectFragmentBase {
|
|
177
|
+
function: "div";
|
|
178
|
+
numerator: Expr;
|
|
179
|
+
denominator: Expr;
|
|
180
|
+
}
|
|
181
|
+
export interface TimeLiteralFragment extends DialectFragmentBase {
|
|
182
|
+
function: "timeLiteral";
|
|
183
|
+
literal: string;
|
|
184
|
+
literalType: TimeFieldType;
|
|
185
|
+
timezone: string;
|
|
186
|
+
}
|
|
187
|
+
export declare type DialectFragment = DivFragment | TimeLiteralFragment | NowFragment | TimeDeltaFragment | TimeDiffFragment | TimeTruncFragment | TypecastFragment | TimeExtractFragment | RegexpMatchFragment;
|
|
177
188
|
export declare type Fragment = string | ApplyFragment | ApplyValueFragment | FieldFragment | ParameterFragment | FilterFragment | AggregateFragment | UngroupFragment | DialectFragment;
|
|
178
189
|
export declare type Expr = Fragment[];
|
|
179
190
|
export interface TypedValue {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@malloydata/malloy",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"license": "GPL-2.0",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"blueimp-md5": "^2.19.0",
|
|
19
19
|
"lodash": "^4.17.20",
|
|
20
20
|
"luxon": "^1.26.0",
|
|
21
|
+
"md5": "^2.3.0",
|
|
21
22
|
"url": "^0.11.0"
|
|
22
23
|
},
|
|
23
24
|
"devDependencies": {
|