@malloydata/malloy 0.0.22-dev230119001546 → 0.0.22-dev230119193053
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/lang/ast/ast-expr.d.ts +1 -2
- package/dist/lang/ast/ast-expr.js +4 -6
- package/dist/lang/ast/ast-main.d.ts +256 -2
- package/dist/lang/ast/ast-main.js +830 -16
- package/dist/lang/ast/ast-time-expr.d.ts +1 -2
- package/dist/lang/space-field.d.ts +1 -106
- package/dist/lang/space-field.js +5 -234
- package/dist/lang/test/field-symbols.spec.js +21 -23
- package/dist/lang/test/parse.spec.js +3 -4
- package/package.json +1 -1
- package/dist/lang/field-space.d.ts +0 -159
- package/dist/lang/field-space.js +0 -641
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { By, ExpressionType } from "../../model/malloy_types";
|
|
2
|
-
import { FieldSpace } from "
|
|
3
|
-
import { BinaryBoolean, ExpressionDef, ExprCompare, FieldName, FieldReference, Filter, MalloyElement } from "./ast-main";
|
|
2
|
+
import { BinaryBoolean, ExpressionDef, ExprCompare, FieldName, FieldReference, FieldSpace, Filter, MalloyElement } from "./ast-main";
|
|
4
3
|
import { ExprValue, FieldValueType, FragType } from "./ast-types";
|
|
5
4
|
export declare class ExprString extends ExpressionDef {
|
|
6
5
|
elementType: string;
|
|
@@ -28,11 +28,9 @@ exports.Apply = exports.Pick = exports.PickWhen = exports.TopBy = exports.ExprCa
|
|
|
28
28
|
** evaluation.
|
|
29
29
|
*/
|
|
30
30
|
const malloy_types_1 = require("../../model/malloy_types");
|
|
31
|
-
const field_space_1 = require("../field-space");
|
|
32
31
|
const ast_main_1 = require("./ast-main");
|
|
33
32
|
const ast_types_1 = require("./ast-types");
|
|
34
33
|
const apply_expr_1 = require("./apply-expr");
|
|
35
|
-
const space_field_1 = require("../space-field");
|
|
36
34
|
const time_utils_1 = require("./time-utils");
|
|
37
35
|
class ExprString extends ast_main_1.ExpressionDef {
|
|
38
36
|
constructor(src) {
|
|
@@ -154,7 +152,7 @@ class ExprIdReference extends ast_main_1.ExpressionDef {
|
|
|
154
152
|
}
|
|
155
153
|
apply(fs, op, expr) {
|
|
156
154
|
const entry = this.fieldReference.getField(fs).found;
|
|
157
|
-
if (entry instanceof
|
|
155
|
+
if (entry instanceof ast_main_1.SpaceParam) {
|
|
158
156
|
const cParam = entry.parameter();
|
|
159
157
|
if ((0, malloy_types_1.isConditionParameter)(cParam)) {
|
|
160
158
|
const lval = expr.getExpression(fs);
|
|
@@ -306,7 +304,7 @@ class ExprAggregateFunction extends ast_main_1.ExpressionDef {
|
|
|
306
304
|
structPath = this.source.sourceString;
|
|
307
305
|
}
|
|
308
306
|
else {
|
|
309
|
-
if (!(sourceFoot instanceof
|
|
307
|
+
if (!(sourceFoot instanceof ast_main_1.StructSpaceField)) {
|
|
310
308
|
this.log(`Aggregate source cannot be a ${footType.type}`);
|
|
311
309
|
return (0, ast_types_1.errorFor)(`Aggregate source cannot be a ${footType.type}`);
|
|
312
310
|
}
|
|
@@ -456,10 +454,10 @@ class ExprUngroup extends ast_main_1.ExpressionDef {
|
|
|
456
454
|
if (this.typeCheck(this.expr, { ...exprVal, expressionType: "scalar" })) {
|
|
457
455
|
if (this.fields.length > 0) {
|
|
458
456
|
let qs = fs;
|
|
459
|
-
if (fs instanceof
|
|
457
|
+
if (fs instanceof ast_main_1.DefSpace) {
|
|
460
458
|
qs = fs.realFS;
|
|
461
459
|
}
|
|
462
|
-
if (!(qs instanceof
|
|
460
|
+
if (!(qs instanceof ast_main_1.QuerySpace)) {
|
|
463
461
|
this.log(`${this.control}() must be in a query -- weird internal error`);
|
|
464
462
|
return (0, ast_types_1.errorFor)("ungroup query check");
|
|
465
463
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as model from "../../model/malloy_types";
|
|
2
|
+
import { Dialect } from "../../dialect/dialect";
|
|
2
3
|
import { AtomicFieldType, ExpressionType, FieldTypeDef, Fragment, TimeFieldType, TimestampUnit } from "../../model/malloy_types";
|
|
3
|
-
import { FieldSpace, QuerySpace, LookupResult } from "../field-space";
|
|
4
4
|
import { MalloyTranslation, ModelDataRequest } from "../parse-malloy";
|
|
5
|
-
import { Comparison, ExprValue } from "./ast-types";
|
|
5
|
+
import { Comparison, ExprValue, FieldValueType } from "./ast-types";
|
|
6
6
|
export declare class ErrorFactory {
|
|
7
7
|
static get structDef(): model.StructDef;
|
|
8
8
|
static isErrorStructDef(s: model.StructDef): boolean;
|
|
@@ -658,4 +658,258 @@ export declare class Range extends ExpressionDef {
|
|
|
658
658
|
requestExpression(_fs: FieldSpace): ExprValue | undefined;
|
|
659
659
|
getExpression(_fs: FieldSpace): ExprValue;
|
|
660
660
|
}
|
|
661
|
+
/**
|
|
662
|
+
* A FieldSpace is a hierarchy of namespaces, where the leaf nodes
|
|
663
|
+
* are fields. A FieldSpace can lookup fields, and generate a StructDef
|
|
664
|
+
*/
|
|
665
|
+
export interface FieldSpace {
|
|
666
|
+
type: "fieldSpace";
|
|
667
|
+
structDef(): model.StructDef;
|
|
668
|
+
emptyStructDef(): model.StructDef;
|
|
669
|
+
lookup(symbol: FieldName[]): LookupResult;
|
|
670
|
+
dialectObj(): Dialect | undefined;
|
|
671
|
+
whenComplete: (step: () => void) => void;
|
|
672
|
+
}
|
|
673
|
+
/**
|
|
674
|
+
* Used to detect references to fields in the statement which defines them
|
|
675
|
+
*/
|
|
676
|
+
export declare class DefSpace implements FieldSpace {
|
|
677
|
+
readonly realFS: FieldSpace;
|
|
678
|
+
readonly circular: FieldDeclaration;
|
|
679
|
+
readonly type = "fieldSpace";
|
|
680
|
+
foundCircle: boolean;
|
|
681
|
+
constructor(realFS: FieldSpace, circular: FieldDeclaration);
|
|
682
|
+
structDef(): model.StructDef;
|
|
683
|
+
emptyStructDef(): model.StructDef;
|
|
684
|
+
lookup(symbol: FieldName[]): LookupResult;
|
|
685
|
+
dialectObj(): Dialect | undefined;
|
|
686
|
+
whenComplete(step: () => void): void;
|
|
687
|
+
}
|
|
688
|
+
export declare class StaticSpace implements FieldSpace {
|
|
689
|
+
readonly type = "fieldSpace";
|
|
690
|
+
private memoMap?;
|
|
691
|
+
protected fromStruct: model.StructDef;
|
|
692
|
+
constructor(sourceStructDef: model.StructDef);
|
|
693
|
+
whenComplete(step: () => void): void;
|
|
694
|
+
dialectObj(): Dialect | undefined;
|
|
695
|
+
fromFieldDef(from: model.FieldDef): SpaceField;
|
|
696
|
+
private get map();
|
|
697
|
+
protected dropEntries(): void;
|
|
698
|
+
protected dropEntry(name: string): void;
|
|
699
|
+
protected entry(name: string): SpaceEntry | undefined;
|
|
700
|
+
protected setEntry(name: string, value: SpaceEntry): void;
|
|
701
|
+
protected entries(): [string, SpaceEntry][];
|
|
702
|
+
structDef(): model.StructDef;
|
|
703
|
+
emptyStructDef(): model.StructDef;
|
|
704
|
+
lookup(path: FieldName[]): LookupResult;
|
|
705
|
+
}
|
|
706
|
+
/**
|
|
707
|
+
* A FieldSpace which may undergo modification
|
|
708
|
+
*/
|
|
709
|
+
export declare class DynamicSpace extends StaticSpace {
|
|
710
|
+
protected final: model.StructDef | undefined;
|
|
711
|
+
protected source: SpaceSeed;
|
|
712
|
+
outputFS?: QuerySpace;
|
|
713
|
+
completions: (() => void)[];
|
|
714
|
+
private complete;
|
|
715
|
+
constructor(extending: SourceSpec);
|
|
716
|
+
/**
|
|
717
|
+
* Factory for DynamicSpace when there are accept/except edits
|
|
718
|
+
* @param from A structdef which seeds this space
|
|
719
|
+
* @param choose A accept/except edit of the "from" fields
|
|
720
|
+
*/
|
|
721
|
+
static filteredFrom(from: model.StructDef, choose?: FieldListEdit): DynamicSpace;
|
|
722
|
+
whenComplete(finalizeStep: () => void): void;
|
|
723
|
+
isComplete(): void;
|
|
724
|
+
protected setEntry(name: string, value: SpaceEntry): void;
|
|
725
|
+
addParameters(params: HasParameter[]): DynamicSpace;
|
|
726
|
+
newEntry(name: string, astEl: MalloyElement, entry: SpaceEntry): void;
|
|
727
|
+
addField(...defs: ExploreField[]): void;
|
|
728
|
+
addFieldDef(fd: model.FieldDef): void;
|
|
729
|
+
structDef(): model.StructDef;
|
|
730
|
+
}
|
|
731
|
+
export declare abstract class ResultSpace extends DynamicSpace {
|
|
732
|
+
readonly queryInputSpace: FieldSpace;
|
|
733
|
+
readonly exprSpace: QuerySpace;
|
|
734
|
+
astEl?: MalloyElement | undefined;
|
|
735
|
+
abstract readonly segmentType: "reduce" | "project" | "index";
|
|
736
|
+
constructor(queryInputSpace: FieldSpace);
|
|
737
|
+
log(s: string): void;
|
|
738
|
+
addMembers(members: FieldCollectionMember[]): void;
|
|
739
|
+
addReference(ref: FieldReference): void;
|
|
740
|
+
addWild(wild: WildcardFieldReference): void;
|
|
741
|
+
/**
|
|
742
|
+
* Check for the definition of an ungrouping reference in the result space,
|
|
743
|
+
* or in the case of an exclude reference, if this query is nested
|
|
744
|
+
* in another query, in the result space of a query that this query
|
|
745
|
+
* is nested inside of.
|
|
746
|
+
*/
|
|
747
|
+
checkUngroup(fn: FieldName, isExclude: boolean): void;
|
|
748
|
+
addQueryItems(...qiList: QueryItem[]): void;
|
|
749
|
+
canContain(_qd: model.QueryFieldDef): boolean;
|
|
750
|
+
protected queryFieldDefs(): model.QueryFieldDef[];
|
|
751
|
+
getQuerySegment(rf: model.QuerySegment | undefined): model.QuerySegment;
|
|
752
|
+
getPipeSegment(refineFrom: model.QuerySegment | undefined): model.PipeSegment;
|
|
753
|
+
}
|
|
754
|
+
/**
|
|
755
|
+
* Reduce and project queries use a "QuerySpace"
|
|
756
|
+
*/
|
|
757
|
+
export declare class ReduceFieldSpace extends ResultSpace {
|
|
758
|
+
readonly segmentType = "reduce";
|
|
759
|
+
}
|
|
760
|
+
export declare class ProjectFieldSpace extends ResultSpace {
|
|
761
|
+
readonly segmentType = "project";
|
|
762
|
+
canContain(qd: model.QueryFieldDef): boolean;
|
|
763
|
+
}
|
|
764
|
+
export declare abstract class SpaceEntry {
|
|
765
|
+
abstract type(): FieldType;
|
|
766
|
+
abstract refType: "field" | "parameter";
|
|
767
|
+
}
|
|
768
|
+
export declare abstract class SpaceField extends SpaceEntry {
|
|
769
|
+
readonly refType = "field";
|
|
770
|
+
protected fieldTypeFromFieldDef(def: model.FieldDef): FieldType;
|
|
771
|
+
getQueryFieldDef(_fs: FieldSpace): model.QueryFieldDef | undefined;
|
|
772
|
+
fieldDef(): model.FieldDef | undefined;
|
|
773
|
+
}
|
|
774
|
+
export interface FieldType {
|
|
775
|
+
type: FieldValueType;
|
|
776
|
+
expressionType?: model.ExpressionType;
|
|
777
|
+
}
|
|
778
|
+
export declare class StructSpaceField extends SpaceField {
|
|
779
|
+
protected sourceDef: model.StructDef;
|
|
780
|
+
protected space?: FieldSpace;
|
|
781
|
+
constructor(sourceDef: model.StructDef);
|
|
782
|
+
get fieldSpace(): FieldSpace;
|
|
783
|
+
fieldDef(): model.FieldDef;
|
|
784
|
+
type(): FieldType;
|
|
785
|
+
}
|
|
786
|
+
export declare abstract class QueryField extends SpaceField {
|
|
787
|
+
protected inSpace: FieldSpace;
|
|
788
|
+
constructor(inSpace: FieldSpace);
|
|
789
|
+
abstract getQueryFieldDef(fs: FieldSpace): model.QueryFieldDef | undefined;
|
|
790
|
+
abstract fieldDef(): model.FieldDef;
|
|
791
|
+
type(): FieldType;
|
|
792
|
+
}
|
|
793
|
+
export declare class QueryFieldStruct extends QueryField {
|
|
794
|
+
protected turtleDef: model.TurtleDef;
|
|
795
|
+
constructor(fs: FieldSpace, turtleDef: model.TurtleDef);
|
|
796
|
+
rename(name: string): void;
|
|
797
|
+
fieldDef(): model.TurtleDef;
|
|
798
|
+
getQueryFieldDef(_fs: FieldSpace): model.QueryFieldDef | undefined;
|
|
799
|
+
}
|
|
800
|
+
export declare class ColumnSpaceField extends SpaceField {
|
|
801
|
+
protected def: model.FieldTypeDef;
|
|
802
|
+
constructor(def: model.FieldTypeDef);
|
|
803
|
+
fieldDef(): model.FieldDef;
|
|
804
|
+
type(): FieldType;
|
|
805
|
+
}
|
|
806
|
+
export declare abstract class SpaceParam extends SpaceEntry {
|
|
807
|
+
abstract parameter(): model.Parameter;
|
|
808
|
+
readonly refType = "parameter";
|
|
809
|
+
}
|
|
810
|
+
export declare class DefinedParameter extends SpaceParam {
|
|
811
|
+
readonly paramDef: model.Parameter;
|
|
812
|
+
constructor(paramDef: model.Parameter);
|
|
813
|
+
parameter(): model.Parameter;
|
|
814
|
+
type(): FieldType;
|
|
815
|
+
}
|
|
816
|
+
/**
|
|
817
|
+
* Based on how things are constructed, the starting field space
|
|
818
|
+
* can either be another field space or an existing structdef.
|
|
819
|
+
* Using a SpaceSeed allows a class to accept either one
|
|
820
|
+
* and use either version at some future time.
|
|
821
|
+
*/
|
|
822
|
+
export declare class SpaceSeed {
|
|
823
|
+
readonly sourceSpec: SourceSpec;
|
|
824
|
+
private spaceSpec;
|
|
825
|
+
private asFS?;
|
|
826
|
+
private asStruct?;
|
|
827
|
+
constructor(sourceSpec: SourceSpec);
|
|
828
|
+
get structDef(): model.StructDef;
|
|
829
|
+
get fieldSpace(): FieldSpace;
|
|
830
|
+
}
|
|
831
|
+
export declare type SourceSpec = model.StructDef | FieldSpace;
|
|
832
|
+
export declare class AbstractParameter extends SpaceParam {
|
|
833
|
+
readonly astParam: HasParameter;
|
|
834
|
+
constructor(astParam: HasParameter);
|
|
835
|
+
parameter(): model.Parameter;
|
|
836
|
+
type(): FieldType;
|
|
837
|
+
}
|
|
838
|
+
export declare class ExpressionFieldFromAst extends SpaceField {
|
|
839
|
+
readonly space: DynamicSpace;
|
|
840
|
+
readonly exprDef: FieldDeclaration;
|
|
841
|
+
fieldName: string;
|
|
842
|
+
defType?: FieldType;
|
|
843
|
+
constructor(space: DynamicSpace, exprDef: FieldDeclaration);
|
|
844
|
+
get name(): string;
|
|
845
|
+
fieldDef(): model.FieldDef;
|
|
846
|
+
getQueryFieldDef(fs: FieldSpace): model.QueryFieldDef;
|
|
847
|
+
type(): FieldType;
|
|
848
|
+
}
|
|
849
|
+
export declare class QueryFieldAST extends QueryField {
|
|
850
|
+
readonly turtle: TurtleDecl;
|
|
851
|
+
protected name: string;
|
|
852
|
+
renameAs?: string;
|
|
853
|
+
nestParent?: QuerySpace;
|
|
854
|
+
constructor(fs: FieldSpace, turtle: TurtleDecl, name: string);
|
|
855
|
+
getQueryFieldDef(fs: FieldSpace): model.QueryFieldDef;
|
|
856
|
+
fieldDef(): model.TurtleDef;
|
|
857
|
+
}
|
|
858
|
+
export declare class RenameSpaceField extends SpaceField {
|
|
859
|
+
private readonly otherField;
|
|
860
|
+
private readonly newName;
|
|
861
|
+
private readonly location;
|
|
862
|
+
constructor(otherField: SpaceField, newName: string, location: model.DocumentLocation);
|
|
863
|
+
fieldDef(): model.FieldDef | undefined;
|
|
864
|
+
type(): FieldType;
|
|
865
|
+
}
|
|
866
|
+
export declare class JoinSpaceField extends StructSpaceField {
|
|
867
|
+
readonly intoFS: FieldSpace;
|
|
868
|
+
readonly join: Join;
|
|
869
|
+
constructor(intoFS: FieldSpace, join: Join);
|
|
870
|
+
}
|
|
871
|
+
/**
|
|
872
|
+
* Unlike a source, which is a refinement of a namespace, a query
|
|
873
|
+
* is creating a new unrelated namespace. The query starts with a
|
|
874
|
+
* source, which it might modify. This set of fields used to resolve
|
|
875
|
+
* expressions in the query is called the "input space". There is a
|
|
876
|
+
* specialized QuerySpace for each type of query operation.
|
|
877
|
+
*
|
|
878
|
+
* The query output is managed by an instance of ResultSpace.
|
|
879
|
+
*/
|
|
880
|
+
export declare class QuerySpace extends DynamicSpace {
|
|
881
|
+
readonly result: ResultSpace;
|
|
882
|
+
nestParent?: QuerySpace;
|
|
883
|
+
extendList: string[];
|
|
884
|
+
constructor(input: SourceSpec, result: ResultSpace);
|
|
885
|
+
extendSource(extendField: Join | FieldDeclaration): void;
|
|
886
|
+
}
|
|
887
|
+
export declare class ReferenceField extends SpaceField {
|
|
888
|
+
readonly fieldRef: FieldReference;
|
|
889
|
+
constructor(fieldRef: FieldReference);
|
|
890
|
+
getQueryFieldDef(fs: FieldSpace): model.QueryFieldDef | undefined;
|
|
891
|
+
type(): FieldType;
|
|
892
|
+
}
|
|
893
|
+
export declare class WildSpaceField extends SpaceField {
|
|
894
|
+
readonly wildText: string;
|
|
895
|
+
constructor(wildText: string);
|
|
896
|
+
type(): FieldType;
|
|
897
|
+
getQueryFieldDef(_fs: FieldSpace): model.QueryFieldDef;
|
|
898
|
+
}
|
|
899
|
+
interface LookupFound {
|
|
900
|
+
found: SpaceEntry;
|
|
901
|
+
error: undefined;
|
|
902
|
+
}
|
|
903
|
+
interface LookupError {
|
|
904
|
+
error: string;
|
|
905
|
+
found: undefined;
|
|
906
|
+
}
|
|
907
|
+
export declare type LookupResult = LookupFound | LookupError;
|
|
908
|
+
export declare class IndexFieldSpace extends ResultSpace {
|
|
909
|
+
readonly segmentType = "index";
|
|
910
|
+
fieldList: Set<string>;
|
|
911
|
+
addReference(ref: FieldReference): void;
|
|
912
|
+
addWild(wild: WildcardFieldReference): void;
|
|
913
|
+
getPipeSegment(refineIndex?: model.PipeSegment): model.IndexSegment;
|
|
914
|
+
}
|
|
661
915
|
export {};
|