Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions packages/malloy/src/lang/ast/query-elements/query-arrow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import type {QueryElement} from '../types/query-element';
import {QueryBase} from './query-base';
import type {View} from '../view-elements/view';
import {checkRequiredGroupBys} from '../../../model/composite_source_utils';
import type {ParameterSpace} from '../field-space/parameter-space';

/**
* A query operation that adds segments to a LHS source or query.
Expand All @@ -47,16 +48,19 @@ export class QueryArrow extends QueryBase implements QueryElement {
super({source, view});
}

queryComp(isRefOk: boolean): QueryComp {
queryComp(
isRefOk: boolean,
parameterSpace: ParameterSpace | undefined
): QueryComp {
let inputStruct: StructDef;
let queryBase: Query;
let fieldSpace: FieldSpace;
if (this.source instanceof Source) {
// We create a fresh query with either the QOPDesc as the head,
// the view as the head, or the scalar as the head (if scalar lenses is enabled)
const invoked = isRefOk
? this.source.structRef(undefined)
: {structRef: this.source.getSourceDef(undefined)};
? this.source.structRef(parameterSpace)
: {structRef: this.source.getSourceDef(parameterSpace)};
queryBase = {
type: 'query',
...invoked,
Expand All @@ -65,11 +69,11 @@ export class QueryArrow extends QueryBase implements QueryElement {
};
inputStruct = refIsStructDef(invoked.structRef)
? invoked.structRef
: this.source.getSourceDef(undefined);
: this.source.getSourceDef(parameterSpace);
fieldSpace = new StaticSourceSpace(inputStruct, 'public');
} else {
// We are adding a second stage to the given "source" query; we get the query and add a segment
const lhsQuery = this.source.queryComp(isRefOk);
const lhsQuery = this.source.queryComp(isRefOk, parameterSpace);
queryBase = lhsQuery.query;
inputStruct = lhsQuery.outputStruct;
fieldSpace = new StaticSourceSpace(lhsQuery.outputStruct, 'public');
Expand Down
8 changes: 6 additions & 2 deletions packages/malloy/src/lang/ast/query-elements/query-base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,16 @@ import {
type Query,
type SourceDef,
} from '../../../model/malloy_types';
import type {ParameterSpace} from '../field-space/parameter-space';
import {detectAndRemovePartialStages} from '../query-utils';
import {MalloyElement} from '../types/malloy-element';
import type {QueryComp} from '../types/query-comp';

export abstract class QueryBase extends MalloyElement {
abstract queryComp(isRefOk: boolean): QueryComp;
abstract queryComp(
isRefOk: boolean,
parameterSpace: ParameterSpace | undefined
): QueryComp;

protected resolveCompositeSource(
inputSource: SourceDef,
Expand All @@ -65,7 +69,7 @@ export abstract class QueryBase extends MalloyElement {
}

query(): Query {
const {query} = this.queryComp(true);
const {query} = this.queryComp(true, undefined);

return {
...query,
Expand Down
8 changes: 6 additions & 2 deletions packages/malloy/src/lang/ast/query-elements/query-refine.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

import type {ParameterSpace} from '../field-space/parameter-space';
import {StaticSourceSpace} from '../field-space/static-space';
import {getFinalStruct} from '../struct-utils';
import type {QueryComp} from '../types/query-comp';
Expand All @@ -43,8 +44,11 @@ export class QueryRefine extends QueryBase implements QueryElement {
super({base, refinement});
}

queryComp(isRefOk: boolean): QueryComp {
const q = this.base.queryComp(isRefOk);
queryComp(
isRefOk: boolean,
parameterSpace: ParameterSpace | undefined
): QueryComp {
const q = this.base.queryComp(isRefOk, parameterSpace);
const inputFS = new StaticSourceSpace(q.inputStruct, 'public');
const resultPipe = this.refinement.refine(
inputFS,
Expand Down
5 changes: 3 additions & 2 deletions packages/malloy/src/lang/ast/source-elements/query-source.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
import type {SourceDef, QuerySourceDef} from '../../../model/malloy_types';
import {Source} from './source';
import type {QueryElement} from '../types/query-element';
import type {ParameterSpace} from '../field-space/parameter-space';
import {ParameterSpace} from '../field-space/parameter-space';
import type {HasParameter} from '../parameters/has-parameter';
import {v4 as uuidv4} from 'uuid';

Expand All @@ -42,7 +42,8 @@ export class QuerySource extends Source {
parameterSpace: ParameterSpace | undefined,
pList: HasParameter[] | undefined
): SourceDef {
const comp = this.query.queryComp(false);
const paramSpace = parameterSpace ?? new ParameterSpace(pList ?? []);
const comp = this.query.queryComp(false, paramSpace);
const queryStruct: QuerySourceDef = {
...comp.outputStruct,
name: `QuerySource-${uuidv4()}`,
Expand Down
6 changes: 5 additions & 1 deletion packages/malloy/src/lang/ast/types/query-element.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,13 @@ import {QueryReference} from '../query-elements/query-reference';
import {QueryRaw} from '../query-elements/query-raw';
import type {Query} from '../../../model/malloy_types';
import type {QueryComp} from './query-comp';
import type {ParameterSpace} from '../field-space/parameter-space';

export interface QueryElement extends MalloyElement {
queryComp(isRefOk: boolean): QueryComp;
queryComp(
isRefOk: boolean,
parameterSpace: ParameterSpace | undefined
): QueryComp;
query(): Query;
}

Expand Down
14 changes: 13 additions & 1 deletion test/src/core/parameters.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ describe('parameters', () => {
}
`).malloyResultMatches(runtime, {s1: 'CA', s2: 'CA', c: 1});
});
it.skip('can pass param into query definition', async () => {
it('can pass param into query source', async () => {
await expect(`
##! experimental.parameters
source: state_facts(
Expand All @@ -283,6 +283,18 @@ describe('parameters', () => {
}
`).malloyResultMatches(runtime, {state: 'CA'});
});
it.skip('can pass param into query definition', async () => {
await expect(`
##! experimental.parameters
source: state_facts is duckdb.table('malloytest.state_facts')

source: state_facts_query(the_state::string) is state_facts -> { select: the_state }

run: state_facts_query(the_state is "CA") -> {
select: the_state
}
`).malloyResultMatches(runtime, {the_state: 'CA'});
});
it('can use param in join on', async () => {
await expect(`
##! experimental.parameters
Expand Down
Loading