@duckcodeailabs/dql-cli 0.7.0 → 0.8.0
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/args.js +1 -1
- package/dist/args.js.map +1 -1
- package/dist/args.test.js +3 -3
- package/dist/args.test.js.map +1 -1
- package/dist/assets/dql-notebook/assets/index-BZV40eAE.css +1 -0
- package/dist/assets/dql-notebook/assets/index-BsWoK_RX.js +532 -0
- package/dist/assets/dql-notebook/index.html +2 -1
- package/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +4 -2
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +104 -90
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/init.test.js +8 -10
- package/dist/commands/init.test.js.map +1 -1
- package/dist/commands/lineage.js +16 -0
- package/dist/commands/lineage.js.map +1 -1
- package/dist/commands/new.test.js +8 -8
- package/dist/commands/new.test.js.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/package.json +7 -7
- package/package.json +15 -14
- package/LICENSE +0 -123
- package/dist/assets/dql-notebook/assets/index-B_X7pyPz.js +0 -510
- package/dist/assets/templates/dashboard/README.md +0 -30
- package/dist/assets/templates/dashboard/blocks/.gitkeep +0 -1
- package/dist/assets/templates/dashboard/dashboards/pipeline_overview.dql +0 -23
- package/dist/assets/templates/dashboard/data/pipeline.csv +0 -7
- package/dist/assets/templates/dashboard/dql.config.json +0 -18
- package/dist/assets/templates/dashboard/semantic-layer/.gitkeep +0 -1
- package/dist/assets/templates/dql.config.reference.json +0 -154
- package/dist/assets/templates/duckdb-local/README.md +0 -30
- package/dist/assets/templates/duckdb-local/blocks/orders_by_region.dql +0 -24
- package/dist/assets/templates/duckdb-local/data/orders.csv +0 -7
- package/dist/assets/templates/duckdb-local/dql.config.json +0 -18
- package/dist/assets/templates/duckdb-local/semantic-layer/.gitkeep +0 -1
- package/dist/assets/templates/ecommerce/README.md +0 -33
- package/dist/assets/templates/ecommerce/blocks/repeat_rate.dql +0 -26
- package/dist/assets/templates/ecommerce/blocks/revenue_by_segment.dql +0 -24
- package/dist/assets/templates/ecommerce/dashboards/revenue_command_center.dql +0 -25
- package/dist/assets/templates/ecommerce/data/customers.csv +0 -11
- package/dist/assets/templates/ecommerce/data/funnel.csv +0 -6
- package/dist/assets/templates/ecommerce/data/orders.csv +0 -16
- package/dist/assets/templates/ecommerce/dql.config.json +0 -18
- package/dist/assets/templates/ecommerce/semantic-layer/cubes/customers_cube.yaml +0 -49
- package/dist/assets/templates/ecommerce/semantic-layer/cubes/orders_cube.yaml +0 -70
- package/dist/assets/templates/ecommerce/semantic-layer/dimensions/channel.yaml +0 -8
- package/dist/assets/templates/ecommerce/semantic-layer/dimensions/order_date.yaml +0 -9
- package/dist/assets/templates/ecommerce/semantic-layer/dimensions/region.yaml +0 -9
- package/dist/assets/templates/ecommerce/semantic-layer/dimensions/segment.yaml +0 -8
- package/dist/assets/templates/ecommerce/semantic-layer/hierarchies/customer_geo.yaml +0 -18
- package/dist/assets/templates/ecommerce/semantic-layer/metrics/avg_order_value.yaml +0 -10
- package/dist/assets/templates/ecommerce/semantic-layer/metrics/gmv.yaml +0 -10
- package/dist/assets/templates/ecommerce/semantic-layer/metrics/gross_margin.yaml +0 -10
- package/dist/assets/templates/ecommerce/semantic-layer/metrics/order_count.yaml +0 -10
- package/dist/assets/templates/ecommerce/workbooks/.gitkeep +0 -1
- package/dist/assets/templates/finance-kpi/README.md +0 -31
- package/dist/assets/templates/finance-kpi/blocks/arr_kpi.dql +0 -21
- package/dist/assets/templates/finance-kpi/data/revenue.csv +0 -7
- package/dist/assets/templates/finance-kpi/dql.config.json +0 -18
- package/dist/assets/templates/finance-kpi/semantic-layer/.gitkeep +0 -1
- package/dist/assets/templates/saas/README.md +0 -32
- package/dist/assets/templates/saas/blocks/churn_pressure.dql +0 -25
- package/dist/assets/templates/saas/blocks/revenue_by_segment.dql +0 -25
- package/dist/assets/templates/saas/dashboards/growth_scorecard.dql +0 -25
- package/dist/assets/templates/saas/data/cohorts.csv +0 -7
- package/dist/assets/templates/saas/data/subscriptions.csv +0 -13
- package/dist/assets/templates/saas/dql.config.json +0 -18
- package/dist/assets/templates/saas/semantic-layer/dimensions/owner_segment.yaml +0 -8
- package/dist/assets/templates/saas/semantic-layer/dimensions/plan_tier.yaml +0 -8
- package/dist/assets/templates/saas/semantic-layer/dimensions/risk_bucket.yaml +0 -9
- package/dist/assets/templates/saas/semantic-layer/dimensions/status.yaml +0 -8
- package/dist/assets/templates/saas/semantic-layer/hierarchies/account_segments.yaml +0 -18
- package/dist/assets/templates/saas/semantic-layer/metrics/account_count.yaml +0 -10
- package/dist/assets/templates/saas/semantic-layer/metrics/expansion_mrr.yaml +0 -11
- package/dist/assets/templates/saas/semantic-layer/metrics/mrr.yaml +0 -10
- package/dist/assets/templates/saas/workbooks/.gitkeep +0 -1
- package/dist/assets/templates/starter/README.md +0 -48
- package/dist/assets/templates/starter/blocks/revenue_by_segment.dql +0 -29
- package/dist/assets/templates/starter/blocks/revenue_trend_query_only.dql +0 -20
- package/dist/assets/templates/starter/dashboards/.gitkeep +0 -1
- package/dist/assets/templates/starter/data/revenue.csv +0 -13
- package/dist/assets/templates/starter/dql.config.json +0 -18
- package/dist/assets/templates/starter/notebooks/semantic_layer_tutorial.dqlnb +0 -60
- package/dist/assets/templates/starter/semantic-layer/blocks/revenue_by_segment.yaml +0 -11
- package/dist/assets/templates/starter/semantic-layer/cubes/revenue_cube.yaml +0 -77
- package/dist/assets/templates/starter/semantic-layer/dimensions/segment_tier.yaml +0 -6
- package/dist/assets/templates/starter/semantic-layer/hierarchies/revenue_time.yaml +0 -12
- package/dist/assets/templates/starter/semantic-layer/metrics/revenue.yaml +0 -7
- package/dist/assets/templates/starter/workbooks/.gitkeep +0 -1
- package/dist/assets/templates/taxi/README.md +0 -31
- package/dist/assets/templates/taxi/blocks/airport_mix.dql +0 -25
- package/dist/assets/templates/taxi/blocks/revenue_by_segment.dql +0 -24
- package/dist/assets/templates/taxi/dashboards/city_operations.dql +0 -25
- package/dist/assets/templates/taxi/data/trips.csv +0 -13
- package/dist/assets/templates/taxi/dql.config.json +0 -18
- package/dist/assets/templates/taxi/semantic-layer/.gitkeep +0 -1
- package/dist/assets/templates/taxi/semantic-layer/dimensions/airport_flag.yaml +0 -8
- package/dist/assets/templates/taxi/semantic-layer/dimensions/dropoff_borough.yaml +0 -9
- package/dist/assets/templates/taxi/semantic-layer/dimensions/payment_type.yaml +0 -8
- package/dist/assets/templates/taxi/semantic-layer/dimensions/pickup_borough.yaml +0 -9
- package/dist/assets/templates/taxi/semantic-layer/dimensions/pickup_date.yaml +0 -9
- package/dist/assets/templates/taxi/semantic-layer/hierarchies/trip_route.yaml +0 -14
- package/dist/assets/templates/taxi/semantic-layer/metrics/avg_trip_miles.yaml +0 -10
- package/dist/assets/templates/taxi/semantic-layer/metrics/total_fare.yaml +0 -10
- package/dist/assets/templates/taxi/semantic-layer/metrics/total_tips.yaml +0 -10
- package/dist/assets/templates/taxi/semantic-layer/metrics/trip_count.yaml +0 -10
- package/dist/assets/templates/taxi/workbooks/.gitkeep +0 -1
- package/dist/assets/templates/workbook/README.md +0 -30
- package/dist/assets/templates/workbook/blocks/.gitkeep +0 -1
- package/dist/assets/templates/workbook/data/finance.csv +0 -7
- package/dist/assets/templates/workbook/dql.config.json +0 -18
- package/dist/assets/templates/workbook/semantic-layer/.gitkeep +0 -1
- package/dist/assets/templates/workbook/workbooks/quarterly_business_review.dql +0 -32
|
@@ -1 +0,0 @@
|
|
|
1
|
-
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# Finance KPI
|
|
2
|
-
|
|
3
|
-
Smallest runnable DQL project — a single KPI block over local CSV data.
|
|
4
|
-
|
|
5
|
-
## Scaffold
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
dql init my-project --template finance-kpi
|
|
9
|
-
cd my-project
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
## What it demonstrates
|
|
13
|
-
|
|
14
|
-
- Reusable `custom` block syntax
|
|
15
|
-
- Local CSV-backed query execution
|
|
16
|
-
- KPI visualization
|
|
17
|
-
- Preview, build, and serve flow
|
|
18
|
-
|
|
19
|
-
## Run it
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
dql doctor
|
|
23
|
-
dql preview blocks/arr_kpi.dql --open
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Build it
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
dql build blocks/arr_kpi.dql
|
|
30
|
-
dql serve dist/arr_kpi --open
|
|
31
|
-
```
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
block "ARR KPI" {
|
|
2
|
-
domain = "finance"
|
|
3
|
-
type = "custom"
|
|
4
|
-
description = "Simple ARR KPI block backed by local CSV sample data"
|
|
5
|
-
owner = "dql-example"
|
|
6
|
-
tags = ["finance", "kpi", "local-data"]
|
|
7
|
-
|
|
8
|
-
query = """
|
|
9
|
-
SELECT SUM(amount) AS arr_total
|
|
10
|
-
FROM read_csv_auto('./data/revenue.csv')
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
visualization {
|
|
14
|
-
chart = "kpi"
|
|
15
|
-
y = arr_total
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
tests {
|
|
19
|
-
assert row_count > 0
|
|
20
|
-
}
|
|
21
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"project": "__PROJECT_NAME__",
|
|
3
|
-
"defaultConnection": {
|
|
4
|
-
"driver": "file",
|
|
5
|
-
"filepath": ":memory:"
|
|
6
|
-
},
|
|
7
|
-
"dataDir": "./data",
|
|
8
|
-
|
|
9
|
-
"semanticLayer": {
|
|
10
|
-
"provider": "dql"
|
|
11
|
-
},
|
|
12
|
-
|
|
13
|
-
"preview": {
|
|
14
|
-
"port": 3474,
|
|
15
|
-
"open": true,
|
|
16
|
-
"theme": "dark"
|
|
17
|
-
}
|
|
18
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# __PROJECT_NAME__
|
|
2
|
-
|
|
3
|
-
This template packages a SaaS KPI sandbox focused on MRR, retention, and expansion. It covers recurring revenue tracking, churn pressure analysis, cohort retention, and semantic metrics for subscription businesses.
|
|
4
|
-
|
|
5
|
-
## Included assets
|
|
6
|
-
|
|
7
|
-
- `blocks/revenue_by_segment.dql` — MRR by plan tier
|
|
8
|
-
- `blocks/churn_pressure.dql` — at-risk and churned revenue view
|
|
9
|
-
- `dashboards/growth_scorecard.dql` — executive SaaS KPI dashboard
|
|
10
|
-
- `data/subscriptions.csv` — recurring revenue and expansion sample data
|
|
11
|
-
- `data/cohorts.csv` — cohort retention snapshot
|
|
12
|
-
- `notebooks/welcome.dqlnb` — browser notebook walkthrough
|
|
13
|
-
|
|
14
|
-
## Quick start
|
|
15
|
-
|
|
16
|
-
```bash
|
|
17
|
-
dql doctor
|
|
18
|
-
dql notebook
|
|
19
|
-
dql preview blocks/revenue_by_segment.dql --open
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## What to explore
|
|
23
|
-
|
|
24
|
-
- Track MRR growth and expansion by plan tier
|
|
25
|
-
- Identify at-risk accounts by churn pressure signals
|
|
26
|
-
- Analyze cohort retention curves over rolling periods
|
|
27
|
-
|
|
28
|
-
## Next Steps
|
|
29
|
-
|
|
30
|
-
- [Authoring Blocks](https://github.com/duckcodeailabs/dql/blob/main/docs/authoring-blocks.md) — promote your notebook queries into certified, reusable `.dql` blocks
|
|
31
|
-
- [Semantic Layer Guide](https://github.com/duckcodeailabs/dql/blob/main/docs/semantic-layer-guide.md) — extend the included semantic layer with MRR and churn metrics
|
|
32
|
-
- [Getting Started](https://github.com/duckcodeailabs/dql/blob/main/docs/getting-started.md) — connect to a cloud database or add DQL to an existing repo
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
block "Churn Pressure by Segment" {
|
|
2
|
-
domain = "saas"
|
|
3
|
-
type = "custom"
|
|
4
|
-
description = "MRR currently flagged as at risk or churned"
|
|
5
|
-
tags = ["saas", "churn"]
|
|
6
|
-
owner = "template"
|
|
7
|
-
|
|
8
|
-
query = """
|
|
9
|
-
SELECT risk_bucket, ROUND(SUM(mrr), 2) AS at_risk_mrr
|
|
10
|
-
FROM read_csv_auto('./data/subscriptions.csv')
|
|
11
|
-
WHERE status != 'active' OR risk_bucket IN ('high', 'critical')
|
|
12
|
-
GROUP BY risk_bucket
|
|
13
|
-
ORDER BY at_risk_mrr DESC
|
|
14
|
-
"""
|
|
15
|
-
|
|
16
|
-
visualization {
|
|
17
|
-
chart = "bar"
|
|
18
|
-
x = risk_bucket
|
|
19
|
-
y = at_risk_mrr
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
tests {
|
|
23
|
-
assert row_count > 0
|
|
24
|
-
}
|
|
25
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
block "MRR by Plan Tier" {
|
|
2
|
-
domain = "saas"
|
|
3
|
-
type = "custom"
|
|
4
|
-
description = "Monthly recurring revenue by plan tier"
|
|
5
|
-
tags = ["saas", "mrr"]
|
|
6
|
-
owner = "template"
|
|
7
|
-
|
|
8
|
-
query = """
|
|
9
|
-
SELECT plan_tier, ROUND(SUM(mrr), 2) AS revenue
|
|
10
|
-
FROM read_csv_auto('./data/subscriptions.csv')
|
|
11
|
-
WHERE status = 'active'
|
|
12
|
-
GROUP BY plan_tier
|
|
13
|
-
ORDER BY revenue DESC
|
|
14
|
-
"""
|
|
15
|
-
|
|
16
|
-
visualization {
|
|
17
|
-
chart = "bar"
|
|
18
|
-
x = plan_tier
|
|
19
|
-
y = revenue
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
tests {
|
|
23
|
-
assert row_count > 0
|
|
24
|
-
}
|
|
25
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
dashboard "Growth Scorecard" {
|
|
2
|
-
chart.kpi(
|
|
3
|
-
SELECT ROUND(SUM(mrr), 2) AS active_mrr
|
|
4
|
-
FROM read_csv_auto('./data/subscriptions.csv')
|
|
5
|
-
WHERE status = 'active',
|
|
6
|
-
metrics = ["active_mrr"],
|
|
7
|
-
title = "Active MRR"
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
chart.line(
|
|
11
|
-
SELECT cohort_month, retained_accounts
|
|
12
|
-
FROM read_csv_auto('./data/cohorts.csv')
|
|
13
|
-
ORDER BY cohort_month,
|
|
14
|
-
x = cohort_month,
|
|
15
|
-
y = retained_accounts,
|
|
16
|
-
title = "Retained Accounts by Cohort"
|
|
17
|
-
)
|
|
18
|
-
|
|
19
|
-
chart.table(
|
|
20
|
-
SELECT account_name, owner_segment, plan_tier, status, mrr, expansion_mrr, risk_bucket
|
|
21
|
-
FROM read_csv_auto('./data/subscriptions.csv')
|
|
22
|
-
ORDER BY mrr DESC,
|
|
23
|
-
title = "Account Revenue Snapshot"
|
|
24
|
-
)
|
|
25
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
account_id,account_name,owner_segment,plan_tier,status,mrr,expansion_mrr,risk_bucket,renewal_month
|
|
2
|
-
A-100,Acme Cloud,Enterprise,Enterprise,active,48000,6200,low,2025-06
|
|
3
|
-
A-101,North Ridge,Mid-Market,Growth,active,18400,2400,medium,2025-05
|
|
4
|
-
A-102,Blue Orbit,SMB,Starter,active,3400,200,low,2025-04
|
|
5
|
-
A-103,Helio Systems,Enterprise,Enterprise,at_risk,52100,0,high,2025-03
|
|
6
|
-
A-104,Vector Health,Mid-Market,Growth,active,19600,1800,medium,2025-08
|
|
7
|
-
A-105,Studio Works,SMB,Starter,churned,2200,0,critical,2025-02
|
|
8
|
-
A-106,SignalWare,Enterprise,Enterprise,active,43500,4100,low,2025-07
|
|
9
|
-
A-107,Maple Commerce,Mid-Market,Growth,active,17100,1200,medium,2025-04
|
|
10
|
-
A-108,Linea Labs,SMB,Starter,active,2800,0,medium,2025-06
|
|
11
|
-
A-109,Quartz Energy,Enterprise,Enterprise,active,50300,7300,low,2025-09
|
|
12
|
-
A-110,Summit Bio,Mid-Market,Growth,at_risk,15800,0,high,2025-03
|
|
13
|
-
A-111,Glider Ops,SMB,Starter,active,2600,150,low,2025-05
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"project": "__PROJECT_NAME__",
|
|
3
|
-
"defaultConnection": {
|
|
4
|
-
"driver": "file",
|
|
5
|
-
"filepath": ":memory:"
|
|
6
|
-
},
|
|
7
|
-
"dataDir": "./data",
|
|
8
|
-
|
|
9
|
-
"semanticLayer": {
|
|
10
|
-
"provider": "dql"
|
|
11
|
-
},
|
|
12
|
-
|
|
13
|
-
"preview": {
|
|
14
|
-
"port": 3474,
|
|
15
|
-
"open": true,
|
|
16
|
-
"theme": "dark"
|
|
17
|
-
}
|
|
18
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
name: account_segments
|
|
2
|
-
label: Account Segments
|
|
3
|
-
description: Drill from owner segment to plan tier to risk bucket.
|
|
4
|
-
domain: saas
|
|
5
|
-
levels:
|
|
6
|
-
- name: owner_segment
|
|
7
|
-
label: Owner Segment
|
|
8
|
-
dimension: owner_segment
|
|
9
|
-
order: 1
|
|
10
|
-
- name: plan_tier
|
|
11
|
-
label: Plan Tier
|
|
12
|
-
dimension: plan_tier
|
|
13
|
-
order: 2
|
|
14
|
-
- name: risk_bucket
|
|
15
|
-
label: Risk Bucket
|
|
16
|
-
dimension: risk_bucket
|
|
17
|
-
order: 3
|
|
18
|
-
defaultRollup: sum
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
# __PROJECT_NAME__
|
|
2
|
-
|
|
3
|
-
This starter gives you a local-first DQL project that is ready for parsing,
|
|
4
|
-
previewing, notebook exploration, and experimentation.
|
|
5
|
-
|
|
6
|
-
```text
|
|
7
|
-
blocks/
|
|
8
|
-
data/
|
|
9
|
-
dql.config.json
|
|
10
|
-
notebooks/
|
|
11
|
-
semantic-layer/
|
|
12
|
-
metrics/
|
|
13
|
-
dimensions/
|
|
14
|
-
hierarchies/
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
## Quick Start
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
dql doctor
|
|
21
|
-
dql notebook
|
|
22
|
-
dql new block "Pipeline Health"
|
|
23
|
-
dql parse blocks/pipeline_health.dql
|
|
24
|
-
dql preview blocks/pipeline_health.dql --open
|
|
25
|
-
dql build blocks/pipeline_health.dql
|
|
26
|
-
dql serve dist/pipeline_health
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## What's Included
|
|
30
|
-
|
|
31
|
-
- `blocks/` — example charted and query-only DQL blocks
|
|
32
|
-
- `data/` — sample revenue CSV for local DuckDB/file preview flows
|
|
33
|
-
- `dql.config.json` — starter project configuration
|
|
34
|
-
- `notebooks/welcome.dqlnb` — guided notebook walkthrough for the browser notebook
|
|
35
|
-
- `semantic-layer/` — example metrics, dimensions, hierarchies, and companion metadata
|
|
36
|
-
|
|
37
|
-
## Adopt the Starter Safely
|
|
38
|
-
|
|
39
|
-
- start in local file mode first
|
|
40
|
-
- keep sample datasets under `data/`
|
|
41
|
-
- run `dql doctor` before previewing if setup feels off
|
|
42
|
-
- add tests to every reusable block
|
|
43
|
-
|
|
44
|
-
## Next Steps
|
|
45
|
-
|
|
46
|
-
- [Getting Started](https://github.com/duckcodeailabs/dql/blob/main/docs/getting-started.md) — full install options, tutorials, and your first block
|
|
47
|
-
- [Authoring Blocks](https://github.com/duckcodeailabs/dql/blob/main/docs/authoring-blocks.md) — create, validate, certify, and commit custom and semantic blocks
|
|
48
|
-
- [Semantic Layer Guide](https://github.com/duckcodeailabs/dql/blob/main/docs/semantic-layer-guide.md) — define metrics, dimensions, and cubes in YAML
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
block "Revenue by Segment" {
|
|
2
|
-
domain = "revenue"
|
|
3
|
-
type = "custom"
|
|
4
|
-
description = "Starter block for segment revenue analysis using local CSV sample data"
|
|
5
|
-
tags = ["starter", "revenue"]
|
|
6
|
-
owner = "template"
|
|
7
|
-
|
|
8
|
-
params {
|
|
9
|
-
period = "current_quarter"
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
query = """
|
|
13
|
-
SELECT segment_tier AS segment, SUM(amount) AS revenue
|
|
14
|
-
FROM read_csv_auto('./data/revenue.csv')
|
|
15
|
-
WHERE fiscal_period = ${period}
|
|
16
|
-
GROUP BY segment_tier
|
|
17
|
-
ORDER BY revenue DESC
|
|
18
|
-
"""
|
|
19
|
-
|
|
20
|
-
visualization {
|
|
21
|
-
chart = "bar"
|
|
22
|
-
x = segment
|
|
23
|
-
y = revenue
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
tests {
|
|
27
|
-
assert row_count > 0
|
|
28
|
-
}
|
|
29
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
block "Revenue Trend Query" {
|
|
2
|
-
domain = "revenue"
|
|
3
|
-
type = "custom"
|
|
4
|
-
description = "Starter query-only block for monthly revenue trends using local CSV sample data"
|
|
5
|
-
tags = ["starter", "revenue", "query-only"]
|
|
6
|
-
owner = "template"
|
|
7
|
-
|
|
8
|
-
query = """
|
|
9
|
-
SELECT
|
|
10
|
-
DATE_TRUNC('month', CAST(recognized_at AS DATE)) AS revenue_month,
|
|
11
|
-
SUM(amount) AS total_revenue
|
|
12
|
-
FROM read_csv_auto('./data/revenue.csv')
|
|
13
|
-
GROUP BY 1
|
|
14
|
-
ORDER BY 1
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
tests {
|
|
18
|
-
assert row_count > 0
|
|
19
|
-
}
|
|
20
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
recognized_at,segment_tier,amount,fiscal_period,fiscal_year,fiscal_quarter
|
|
2
|
-
2025-01-03,Enterprise,185000,current_quarter,2025,Q1
|
|
3
|
-
2025-01-14,Mid-Market,92000,current_quarter,2025,Q1
|
|
4
|
-
2025-01-25,SMB,28000,current_quarter,2025,Q1
|
|
5
|
-
2025-02-05,Enterprise,210000,current_quarter,2025,Q1
|
|
6
|
-
2025-02-09,Mid-Market,101000,current_quarter,2025,Q1
|
|
7
|
-
2025-02-18,SMB,31000,current_quarter,2025,Q1
|
|
8
|
-
2025-03-02,Enterprise,223000,current_quarter,2025,Q1
|
|
9
|
-
2025-03-11,Mid-Market,108000,current_quarter,2025,Q1
|
|
10
|
-
2025-03-19,SMB,34000,current_quarter,2025,Q1
|
|
11
|
-
2025-04-07,Enterprise,205000,next_quarter,2025,Q2
|
|
12
|
-
2025-04-16,Mid-Market,99000,next_quarter,2025,Q2
|
|
13
|
-
2025-04-23,SMB,29000,next_quarter,2025,Q2
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"project": "__PROJECT_NAME__",
|
|
3
|
-
"defaultConnection": {
|
|
4
|
-
"driver": "file",
|
|
5
|
-
"filepath": ":memory:"
|
|
6
|
-
},
|
|
7
|
-
"dataDir": "./data",
|
|
8
|
-
|
|
9
|
-
"semanticLayer": {
|
|
10
|
-
"provider": "dql"
|
|
11
|
-
},
|
|
12
|
-
|
|
13
|
-
"preview": {
|
|
14
|
-
"port": 3474,
|
|
15
|
-
"open": true,
|
|
16
|
-
"theme": "dark"
|
|
17
|
-
}
|
|
18
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 1,
|
|
3
|
-
"title": "Semantic Layer Tutorial",
|
|
4
|
-
"cells": [
|
|
5
|
-
{
|
|
6
|
-
"id": "intro_1",
|
|
7
|
-
"type": "markdown",
|
|
8
|
-
"content": "# Semantic Layer Tutorial\n\nThis notebook walks you through setting up and using the DQL semantic layer.\n\nThe semantic layer lets you define **reusable metrics, dimensions, and hierarchies** in YAML files. Once defined, they appear in the sidebar panel and can be queried via the API.\n\n---\n\n## Prerequisites\n\nMake sure your `dql.config.json` has:\n\n```json\n\"semanticLayer\": {\n \"provider\": \"dql\"\n}\n```\n\nAnd you have YAML files in `semantic-layer/metrics/`, `semantic-layer/dimensions/`, etc."
|
|
9
|
-
},
|
|
10
|
-
{
|
|
11
|
-
"id": "check_1",
|
|
12
|
-
"type": "markdown",
|
|
13
|
-
"content": "## Step 1: Verify your data\n\nFirst, let's make sure you have data to work with. The starter template includes `data/revenue.csv`."
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"id": "query_1",
|
|
17
|
-
"type": "sql",
|
|
18
|
-
"name": "preview_data",
|
|
19
|
-
"content": "SELECT * FROM read_csv_auto('./data/revenue.csv') LIMIT 10"
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"id": "step2_md",
|
|
23
|
-
"type": "markdown",
|
|
24
|
-
"content": "## Step 2: Understand the YAML definitions\n\nYour `semantic-layer/` directory should contain:\n\n```\nsemantic-layer/\n├── metrics/\n│ └── revenue.yaml # SUM(amount) as total_revenue\n├── dimensions/\n│ └── segment_tier.yaml # segment_tier column\n├── hierarchies/\n│ └── revenue_time.yaml # fiscal_year → fiscal_quarter drill path\n└── cubes/\n └── revenue_cube.yaml # groups everything into one model\n```\n\n### Metric YAML format\n```yaml\nname: total_revenue\nlabel: Total Revenue\ndescription: Sum of recognized revenue\nsql: SUM(amount) # the SQL aggregate expression\ntype: sum # sum|count|count_distinct|avg|min|max\ntable: fct_revenue # which table this metric belongs to\ntags: [revenue, kpi]\n```\n\n### Dimension YAML format\n```yaml\nname: segment_tier\nlabel: Segment Tier\nsql: segment_tier # the column expression\ntype: string # string|number|date|boolean\ntable: fct_revenue\n```"
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"id": "step3_md",
|
|
28
|
-
"type": "markdown",
|
|
29
|
-
"content": "## Step 3: Query using semantic layer concepts\n\nYou can write SQL queries that use the same columns and aggregates defined in your semantic layer. The metric `total_revenue` is defined as `SUM(amount)` and the dimension `segment_tier` maps to the `segment_tier` column."
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
"id": "query_2",
|
|
33
|
-
"type": "sql",
|
|
34
|
-
"name": "revenue_by_segment",
|
|
35
|
-
"content": "-- This query mirrors the semantic layer definitions:\n-- metric: total_revenue = SUM(amount)\n-- dimension: segment_tier\nSELECT\n segment_tier,\n SUM(amount) AS total_revenue,\n COUNT(*) AS deal_count,\n AVG(amount) AS avg_deal_size\nFROM read_csv_auto('./data/revenue.csv')\nGROUP BY segment_tier\nORDER BY total_revenue DESC"
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
"id": "step4_md",
|
|
39
|
-
"type": "markdown",
|
|
40
|
-
"content": "## Step 4: Use hierarchies for drill-down\n\nThe `revenue_time` hierarchy defines a drill path: **fiscal_year → fiscal_quarter**.\n\nStart at the top level (year), then drill into quarters."
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
"id": "query_3",
|
|
44
|
-
"type": "sql",
|
|
45
|
-
"name": "revenue_by_year",
|
|
46
|
-
"content": "-- Hierarchy level 1: fiscal_year\nSELECT\n fiscal_year,\n SUM(amount) AS total_revenue\nFROM read_csv_auto('./data/revenue.csv')\nGROUP BY fiscal_year\nORDER BY fiscal_year"
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
"id": "query_4",
|
|
50
|
-
"type": "sql",
|
|
51
|
-
"name": "revenue_by_quarter",
|
|
52
|
-
"content": "-- Hierarchy level 2: drill into fiscal_quarter\nSELECT\n fiscal_year,\n fiscal_quarter,\n SUM(amount) AS total_revenue\nFROM read_csv_auto('./data/revenue.csv')\nGROUP BY fiscal_year, fiscal_quarter\nORDER BY fiscal_year, fiscal_quarter"
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
"id": "step5_md",
|
|
56
|
-
"type": "markdown",
|
|
57
|
-
"content": "## Step 5: Explore in the sidebar\n\nClick the **Semantic Layer icon** (3rd icon in the left activity bar) to see:\n\n- **Metrics** — your defined aggregations with type badges (sum, count, avg...)\n- **Dimensions** — grouping columns with type indicators\n- **Hierarchies** — expandable drill paths\n\nYou can search and click any item to see its details.\n\n---\n\n## What's next?\n\n### Connect to dbt\nIf you have a dbt project with `semantic_models`, update `dql.config.json`:\n```json\n\"semanticLayer\": {\n \"provider\": \"dbt\",\n \"projectPath\": \"/path/to/your/dbt-project\"\n}\n```\n\n### Connect to Cube.js\n```json\n\"semanticLayer\": {\n \"provider\": \"cubejs\",\n \"projectPath\": \"/path/to/your/cube-project\"\n}\n```\n\n### Use cubes for multi-table models\nCreate `semantic-layer/cubes/my_cube.yaml` to define measures, dimensions, time dimensions, and joins all in one file. See the Reference panel (Help icon) for the full YAML format.\n\n### Full reference\nClick the **Help icon** (bottom of sidebar) → **Semantic Layer** and **Semantic Layer Providers** sections for complete YAML formats and config examples."
|
|
58
|
-
}
|
|
59
|
-
]
|
|
60
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
name: revenue_by_segment
|
|
2
|
-
block: revenue_by_segment
|
|
3
|
-
domain: revenue
|
|
4
|
-
description: Optional companion metadata for the starter block
|
|
5
|
-
tags:
|
|
6
|
-
- revenue
|
|
7
|
-
- starter
|
|
8
|
-
semanticMappings:
|
|
9
|
-
segment: segment_tier
|
|
10
|
-
revenue: total_revenue
|
|
11
|
-
reviewStatus: draft
|