Skip to content

Commit 1e13e38

Browse files
authored
Legend SQL -> minor cleanups/optimisations (#3431)
TDS2Relation -> fail on any unsupported tds function with nice error
1 parent 2f6a6e1 commit 1e13e38

File tree

4 files changed

+60
-81
lines changed
  • legend-engine-core/legend-engine-core-pure/legend-engine-pure-code-compiled-core/src/main/resources/core/pure/tds/relation
  • legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-pure/legend-engine-xt-relationalStore-core-pure/src/main/resources/core_relational/relational/tds/relation
  • legend-engine-xts-sql
    • legend-engine-xt-sql-http-api/src/main/java/org/finos/legend/engine/query/sql/api
    • legend-engine-xt-sql-pure/src/main/resources/core_external_query_sql/binding/fromPure

4 files changed

+60
-81
lines changed

legend-engine-core/legend-engine-core-pure/legend-engine-pure-code-compiled-core/src/main/resources/core/pure/tds/relation/tdsToRelation.pure

+15-6
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ function meta::pure::tds::toRelation::transform(v:meta::protocols::pure::vX_X_X:
5151

5252
function meta::pure::tds::toRelation::transform(a:AppliedFunction[1], extensions:Extension[*]):AppliedFunction[1]
5353
{
54+
55+
let func = resolveFControlFunction($a, $extensions);
56+
5457
[
5558
pair(project_T_MANY__ColumnSpecification_MANY__TabularDataSet_1_->cast(@Function<Any>),
5659
|
@@ -226,26 +229,32 @@ function meta::pure::tds::toRelation::transform(a:AppliedFunction[1], extensions
226229
swap(take_TabularDataSet_1__Integer_1__TabularDataSet_1_, limit_Relation_1__Integer_1__Relation_1_, $a, $extensions),
227230
swap(distinct_TabularDataSet_1__TabularDataSet_1_, distinct_Relation_1__Relation_1_, $a, $extensions),
228231
swap(concatenate_TabularDataSet_1__TabularDataSet_1__TabularDataSet_1_, concatenate_Relation_1__Relation_1__Relation_1_, $a, $extensions)
229-
])->concatenate(getExtensions($a, $extensions))->getValue(resolveFControlFunction($a, $extensions), | ^$a(parameters = $a.parameters->map(p | $p->transform($extensions))))->eval();
232+
])->concatenate(getExtensions($a, $extensions))->getValue($func, | defaultTransform($func, $a, $extensions))->eval();
230233
}
231234

235+
236+
232237
function meta::pure::tds::toRelation::getExtensions(a:AppliedFunction[1], extensions:Extension[*]):meta::pure::functions::collection::Pair<Function<Any>, FunctionDefinition<{->AppliedFunction[1]}>>[*]
233238
{
234239
$extensions.tdsToRelation
235240
->filter(t | $t->instanceOf(TdsToRelationExtension_V_X_X))
236241
->cast(@TdsToRelationExtension_V_X_X).transfers->map(t | $t->eval($a, $extensions))
237242
}
238243

244+
function meta::pure::tds::toRelation::defaultTransform(f:Function<Any>[1], a:AppliedFunction[1], extensions:Extension[*]):AppliedFunction[1]
245+
{
246+
let returnType = $f->functionReturnType().rawType;
239247

248+
assert(!($returnType->isNotEmpty() && $returnType->toOne()->subTypeOf(TabularDataSet)), 'conversion of function "' + $f.name->toOne() + '"" is currently not supported');
240249

241-
function meta::pure::tds::toRelation::swap(f:Function<Any>[1], o:Function<Any>[1], a:AppliedFunction[1], extensions:Extension[*]):meta::pure::functions::collection::Pair<Function<Any>, FunctionDefinition<{->AppliedFunction[1]}>>[1]
242-
{
243-
pair($f, | appliedFunction($o, $a.parameters->map(p | $p->transform($extensions))))
250+
^$a(parameters = $a.parameters->map(p | $p->transform($extensions)));
244251
}
245252

246-
function meta::pure::tds::toRelation::fail(f:Function<Any>[1]):meta::pure::functions::collection::Pair<Function<Any>, FunctionDefinition<{->AppliedFunction[1]}>>[1]
253+
254+
255+
function meta::pure::tds::toRelation::swap(f:Function<Any>[1], o:Function<Any>[1], a:AppliedFunction[1], extensions:Extension[*]):meta::pure::functions::collection::Pair<Function<Any>, FunctionDefinition<{->AppliedFunction[1]}>>[1]
247256
{
248-
pair($f, | fail('currently no translation for function ' + $f.name->toOne()); appliedFunction($f, []);)
257+
pair($f, | appliedFunction($o, $a.parameters->map(p | $p->transform($extensions))))
249258
}
250259

251260
function meta::pure::tds::toRelation::colsToColSpecArrayInstance(params:meta::protocols::pure::vX_X_X::metamodel::m3::valuespecification::ValueSpecification[*], extensions:Extension[*]):ClassInstance[1]

legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-pure/legend-engine-xt-relationalStore-core-pure/src/main/resources/core_relational/relational/tds/relation/tdsToRelation.pure

+1-3
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,7 @@ function meta::pure::tds::toRelation::tdsToRelationExtension():TdsToRelationExte
5151
let func = $a.parameters->at(3)->transform($extensions);
5252

5353
appliedFunction(join_Relation_1__Relation_1__JoinKind_1__Function_1__Relation_1_, [$left, $right, $joinKind, $func]);
54-
),
55-
fail(tableToTDS_Table_1__TableTDS_1_),
56-
fail(meta::pure::tds::extensions::columnValueDifference_TabularDataSet_1__TabularDataSet_1__String_$1_MANY$__String_$1_MANY$__TabularDataSet_1_)
54+
)
5755
]
5856
}
5957
)

legend-engine-xts-sql/legend-engine-xt-sql-http-api/src/main/java/org/finos/legend/engine/query/sql/api/SQLExecutor.java

+8-5
Original file line numberDiff line numberDiff line change
@@ -237,11 +237,14 @@ private Root_meta_external_query_sql_transformation_queryToPure_PlanGenerationRe
237237

238238
if (result._plan() == null)
239239
{
240-
Lambda lambda = read(result._lambda(), Lambda.class);
241-
FunctionDefinition<?> func = HelperValueSpecificationBuilder.buildLambda(lambda, pureModel.getContext());
242-
FunctionDefinition<?> func2 = core_pure_router_preeval_preeval.Root_meta_pure_router_preeval_preval_FunctionDefinition_1__Extension_MANY__FunctionDefinition_1_(func, routerExtensions.apply(pureModel), pureModel.getExecutionSupport());
243-
Root_meta_pure_executionPlan_ExecutionPlan plan = PlanGenerator.generateExecutionPlanAsPure(func2, result._mapping(), result._runtime(), null, pureModel, PlanPlatform.JAVA, null, routerExtensions.apply(pureModel));
244-
result._plan(plan);
240+
TraceUtils.trace("generating plan", span ->
241+
{
242+
Lambda lambda = read(result._lambda(), Lambda.class);
243+
FunctionDefinition<?> func = HelperValueSpecificationBuilder.buildLambda(lambda, pureModel.getContext());
244+
FunctionDefinition<?> func2 = core_pure_router_preeval_preeval.Root_meta_pure_router_preeval_preval_FunctionDefinition_1__Extension_MANY__FunctionDefinition_1_(func, routerExtensions.apply(pureModel), pureModel.getExecutionSupport());
245+
Root_meta_pure_executionPlan_ExecutionPlan plan = PlanGenerator.generateExecutionPlanAsPure(func2, result._mapping(), result._runtime(), null, pureModel, PlanPlatform.JAVA, null, routerExtensions.apply(pureModel));
246+
result._plan(plan);
247+
});
245248
}
246249
else
247250
{

0 commit comments

Comments
 (0)