AMQL Docs
Concepts

Origin Model

Understand how AQL transformations like select and filter retain the origin model, preserving model context that plain SQL queries lose.

In AQL, when you apply transformations on a Table or a Field (like select or filter), it outputs a new Table or a Field object that still retains information about the first model that you used.

For example, in the AML layer you have defined a model called order_items, and then you apply some transformations to it:

Model order_items {
  dimension item_id {}
  dimension order_id
  dimension product_id {}
  dimension quantity {}
}

Model products {
  dimension id {}
  dimension price {}
}

Imagine that you use SQL to query these two models:

select
    oi.quantity * p.price as item_value
from order_items oi
left join products p on oi.product_id = p.id

After this SQL transformation, you will have a new table with only one column (item_value) and there is no information about order_items or products models.

with order_items_transformed as (
        select
            order_items.quantity * products.price as item_value
        from order_items
        left join products on order_items.product_id = products.id
    )

// Invalid
select
    order_items.order_id
from order_items_transformed

With AQL, the same transformation will also produce a new table with only a value column:

// Output a new virtual 'order_items_transformed' table
order_items | select(item_value: order_items.quantity * products.price)

However, the new table still retains the information about order_items. In this case, order_items is the origin model of the new order_items_transformed table. After the transformation, you can still access information of order_items:

order_items
| select(item_value: order_items.quantity * products.price)
| select(order_items.order_id, order_items.item_id, item_value)