Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Simplified Shared Fragment Calls #169

@RaoulFoaleng

Description

@RaoulFoaleng

Rewrite shared fragment to look like function calls:

@attribute(cql:shared_fragment)
CREATE PROCEDURE ShapeDeclaration()
BEGIN
  SELECT
    NULL_TEXT              text_column,
    NULL_INT               int_column,
    TRUE                   bool_column
  WHERE FALSE;
END

@attribute(cql:shared_fragment)
CREATE PROCEDURE RowAdder()
BEGIN
  WITH source(*) LIKE ShapeDeclaration,
  rows_added(*) AS (
    SELECT * FROM source
    UNION ALL
    SELECT * FROM my_table_with_matching_columns
  )
  SELECT * FROM rows_added;
END

@attribute(cql:shared_fragment)
CREATE PROCEDURE ColumnAdder()
BEGIN
  WITH source(*) LIKE ShapeDeclaration,
  columns_added(*) AS (
    SELECT source.*, other_table.other_column
    FROM source
    INNER JOIN other_table ON source.id = other_table.id
  )
  SELECT * FROM columns_added;
END

CREATE PROCEDURE FinalQuery()
BEGIN
  WITH shape(*) AS (CALL ShapeDeclaration()),
  with_threads(*) AS (CALL RowAdder()) USING shape AS source),
  with_extra_column(*) AS (CALL ColumnAdder() USING with_threads AS source)
  SELECT * FROM with_extra_column;
END

To something like this:

interface ShapeDeclaration {
  text_column: text,
  int_column: int,
  bool_column: bool,
}

proc RowAdder(source: ShapeDeclaration)
{
  select * from source
  union all
  select * from my_table_with_matching_columns;
}

proc ColumnAdder(source: ShapeDeclaration)
{
  select source.*, other_table.other_column
  from source
  inner join other_table on source.id = other_table.id
}

proc FinalQuery()
{
  let base: ShapeDeclaration = {};
  let with_rows = RowAdder(base);
  let with_extra_columns = ColumnAdder(with_rows);
  select * from with_extra_columns;
}

We're introducing the notion of object interface (aka CQL shape) that represent a shared fragment result and those object can be composed.

sproc FinalQuery() implementation looks much more simpler in the second example.

Share fragment feature is a great feature that allow sproc composability but at the same the syntax to call them look confusing and congested:

...
WITH shape(*) AS (CALL ShapeDeclaration()),
  with_threads(*) AS (CALL RowAdder()) USING shape AS source),
  with_extra_column(*) AS (CALL ColumnAdder() USING with_threads AS source)
...

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions