@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,30 +0,0 @@
|
|
|
1
|
-
# Dashboard
|
|
2
|
-
|
|
3
|
-
Multi-chart dashboard over local CSV data — KPI, bar, and table charts in one file.
|
|
4
|
-
|
|
5
|
-
## Scaffold
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
dql init my-project --template dashboard
|
|
9
|
-
cd my-project
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
## What it demonstrates
|
|
13
|
-
|
|
14
|
-
- Dashboard syntax
|
|
15
|
-
- KPI, bar, and table charts in one file
|
|
16
|
-
- Local file-based preview without warehouse credentials
|
|
17
|
-
|
|
18
|
-
## Run it
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
dql doctor
|
|
22
|
-
dql preview dashboards/pipeline_overview.dql --open
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Build it
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
dql build dashboards/pipeline_overview.dql
|
|
29
|
-
dql serve dist/pipeline_overview --open
|
|
30
|
-
```
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
dashboard "Pipeline Overview" {
|
|
2
|
-
chart.kpi(
|
|
3
|
-
SELECT SUM(amount) AS total_pipeline FROM read_csv_auto('./data/pipeline.csv'),
|
|
4
|
-
metrics = ["total_pipeline"],
|
|
5
|
-
title = "Open Pipeline"
|
|
6
|
-
)
|
|
7
|
-
|
|
8
|
-
chart.bar(
|
|
9
|
-
SELECT stage, SUM(amount) AS pipeline_amount
|
|
10
|
-
FROM read_csv_auto('./data/pipeline.csv')
|
|
11
|
-
GROUP BY stage,
|
|
12
|
-
x = stage,
|
|
13
|
-
y = pipeline_amount,
|
|
14
|
-
title = "Pipeline by Stage"
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
chart.table(
|
|
18
|
-
SELECT rep_name, region, stage, amount, close_month
|
|
19
|
-
FROM read_csv_auto('./data/pipeline.csv')
|
|
20
|
-
ORDER BY amount DESC,
|
|
21
|
-
title = "Top Opportunities"
|
|
22
|
-
)
|
|
23
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
rep_name,region,stage,amount,close_month
|
|
2
|
-
Ava,North America,Qualified,42000,2026-04
|
|
3
|
-
Ava,North America,Proposal,76000,2026-05
|
|
4
|
-
Leo,EMEA,Qualified,52000,2026-04
|
|
5
|
-
Mina,APAC,Negotiation,68000,2026-05
|
|
6
|
-
Omar,EMEA,Proposal,47000,2026-06
|
|
7
|
-
Sara,North America,Negotiation,83000,2026-06
|
|
@@ -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,154 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"_comment": "DQL Config Reference — copy sections you need into your dql.config.json",
|
|
3
|
-
|
|
4
|
-
"project": "my-project-name",
|
|
5
|
-
|
|
6
|
-
"_comment_connections": "=== CONNECTION OPTIONS ===",
|
|
7
|
-
|
|
8
|
-
"_option_1_duckdb_memory": {
|
|
9
|
-
"defaultConnection": {
|
|
10
|
-
"driver": "file",
|
|
11
|
-
"filepath": ":memory:"
|
|
12
|
-
}
|
|
13
|
-
},
|
|
14
|
-
|
|
15
|
-
"_option_2_duckdb_file": {
|
|
16
|
-
"defaultConnection": {
|
|
17
|
-
"driver": "duckdb",
|
|
18
|
-
"filepath": "./data/warehouse.duckdb"
|
|
19
|
-
}
|
|
20
|
-
},
|
|
21
|
-
|
|
22
|
-
"_option_3_snowflake": {
|
|
23
|
-
"defaultConnection": {
|
|
24
|
-
"driver": "snowflake",
|
|
25
|
-
"account": "your-account.snowflakecomputing.com",
|
|
26
|
-
"username": "your_user",
|
|
27
|
-
"password": "${SNOWFLAKE_PASSWORD}",
|
|
28
|
-
"database": "ANALYTICS",
|
|
29
|
-
"schema": "PUBLIC",
|
|
30
|
-
"warehouse": "COMPUTE_WH",
|
|
31
|
-
"role": "ANALYST"
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
|
|
35
|
-
"_option_4_bigquery": {
|
|
36
|
-
"defaultConnection": {
|
|
37
|
-
"driver": "bigquery",
|
|
38
|
-
"project": "your-gcp-project-id",
|
|
39
|
-
"dataset": "analytics",
|
|
40
|
-
"keyFilename": "./service-account.json"
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
|
|
44
|
-
"_option_5_postgres": {
|
|
45
|
-
"defaultConnection": {
|
|
46
|
-
"driver": "postgres",
|
|
47
|
-
"host": "localhost",
|
|
48
|
-
"port": 5432,
|
|
49
|
-
"database": "analytics",
|
|
50
|
-
"username": "your_user",
|
|
51
|
-
"password": "${POSTGRES_PASSWORD}"
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
|
-
|
|
55
|
-
"_option_6_sqlite": {
|
|
56
|
-
"defaultConnection": {
|
|
57
|
-
"driver": "sqlite",
|
|
58
|
-
"database": "./data/analytics.sqlite"
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
|
|
62
|
-
"_comment_semantic": "=== SEMANTIC LAYER OPTIONS ===",
|
|
63
|
-
|
|
64
|
-
"_semantic_option_1_dql_native": {
|
|
65
|
-
"semanticLayer": {
|
|
66
|
-
"provider": "dql"
|
|
67
|
-
},
|
|
68
|
-
"_directory_structure": {
|
|
69
|
-
"semantic-layer/metrics/": "one YAML file per metric",
|
|
70
|
-
"semantic-layer/dimensions/": "one YAML file per dimension",
|
|
71
|
-
"semantic-layer/hierarchies/":"one YAML file per hierarchy",
|
|
72
|
-
"semantic-layer/cubes/": "one YAML file per cube (groups measures + dimensions + joins)"
|
|
73
|
-
}
|
|
74
|
-
},
|
|
75
|
-
|
|
76
|
-
"_semantic_option_2_dql_custom_path": {
|
|
77
|
-
"semanticLayer": {
|
|
78
|
-
"provider": "dql",
|
|
79
|
-
"path": "./my-definitions"
|
|
80
|
-
}
|
|
81
|
-
},
|
|
82
|
-
|
|
83
|
-
"_semantic_option_3_dbt": {
|
|
84
|
-
"semanticLayer": {
|
|
85
|
-
"provider": "dbt",
|
|
86
|
-
"projectPath": "/absolute/path/to/your/dbt-project"
|
|
87
|
-
},
|
|
88
|
-
"_notes": {
|
|
89
|
-
"how_it_works": "Reads semantic_models and metrics from your dbt models/**/*.yml files",
|
|
90
|
-
"requires": "dbt 1.6+ with semantic_models defined in YAML",
|
|
91
|
-
"relative_path": "You can also use a relative path: ../my-dbt-repo"
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
|
-
|
|
95
|
-
"_semantic_option_4_cubejs": {
|
|
96
|
-
"semanticLayer": {
|
|
97
|
-
"provider": "cubejs",
|
|
98
|
-
"projectPath": "/absolute/path/to/your/cube-project"
|
|
99
|
-
},
|
|
100
|
-
"_notes": {
|
|
101
|
-
"how_it_works": "Reads cube definitions from model/ or schema/ directory",
|
|
102
|
-
"relative_path": "You can also use a relative path: ../my-cube-project"
|
|
103
|
-
}
|
|
104
|
-
},
|
|
105
|
-
|
|
106
|
-
"_semantic_option_5_dbt_remote_github": {
|
|
107
|
-
"semanticLayer": {
|
|
108
|
-
"provider": "dbt",
|
|
109
|
-
"source": "github",
|
|
110
|
-
"repoUrl": "https://github.com/your-org/dbt-metrics.git",
|
|
111
|
-
"branch": "main",
|
|
112
|
-
"subPath": "models"
|
|
113
|
-
},
|
|
114
|
-
"_notes": {
|
|
115
|
-
"how_it_works": "Clones the remote repo into ~/.dql/cache/repos/ and reads dbt semantic models from it",
|
|
116
|
-
"auth": "For private repos, set GITHUB_TOKEN environment variable",
|
|
117
|
-
"cache": "Cached for 10 minutes; use 'dql semantic pull' to force refresh"
|
|
118
|
-
}
|
|
119
|
-
},
|
|
120
|
-
|
|
121
|
-
"_semantic_option_6_cubejs_remote_gitlab": {
|
|
122
|
-
"semanticLayer": {
|
|
123
|
-
"provider": "cubejs",
|
|
124
|
-
"source": "gitlab",
|
|
125
|
-
"repoUrl": "https://gitlab.com/your-org/cube-schema.git",
|
|
126
|
-
"branch": "main",
|
|
127
|
-
"subPath": ""
|
|
128
|
-
},
|
|
129
|
-
"_notes": {
|
|
130
|
-
"auth": "For private repos, set GITLAB_TOKEN environment variable"
|
|
131
|
-
}
|
|
132
|
-
},
|
|
133
|
-
|
|
134
|
-
"_semantic_option_7_snowflake": {
|
|
135
|
-
"semanticLayer": {
|
|
136
|
-
"provider": "snowflake",
|
|
137
|
-
"projectPath": "MY_DATABASE"
|
|
138
|
-
},
|
|
139
|
-
"_notes": {
|
|
140
|
-
"how_it_works": "Introspects Snowflake semantic views (SHOW SEMANTIC VIEWS) via the active connection",
|
|
141
|
-
"requires": "Snowflake account with semantic views (CREATE SEMANTIC VIEW) and a configured Snowflake connection",
|
|
142
|
-
"projectPath_usage": "Optional: filters semantic views to a specific database"
|
|
143
|
-
}
|
|
144
|
-
},
|
|
145
|
-
|
|
146
|
-
"_comment_preview": "=== PREVIEW / NOTEBOOK OPTIONS ===",
|
|
147
|
-
|
|
148
|
-
"dataDir": "./data",
|
|
149
|
-
"preview": {
|
|
150
|
-
"port": 3474,
|
|
151
|
-
"open": true,
|
|
152
|
-
"theme": "dark"
|
|
153
|
-
}
|
|
154
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# DuckDB Local
|
|
2
|
-
|
|
3
|
-
Local-first analytics using the `duckdb` driver — no warehouse credentials needed.
|
|
4
|
-
|
|
5
|
-
## Scaffold
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
dql init my-project --template duckdb-local
|
|
9
|
-
cd my-project
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
## What it demonstrates
|
|
13
|
-
|
|
14
|
-
- DuckDB as the default connection
|
|
15
|
-
- Local CSV-backed analytics with DuckDB execution
|
|
16
|
-
- Line chart preview and static export
|
|
17
|
-
|
|
18
|
-
## Run it
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
dql doctor
|
|
22
|
-
dql preview blocks/orders_by_region.dql --open
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Build it
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
dql build blocks/orders_by_region.dql
|
|
29
|
-
dql serve dist/orders_by_region --open
|
|
30
|
-
```
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
block "Orders by Region" {
|
|
2
|
-
domain = "sales"
|
|
3
|
-
type = "custom"
|
|
4
|
-
description = "Local DuckDB-backed revenue trend example"
|
|
5
|
-
owner = "dql-example"
|
|
6
|
-
tags = ["duckdb", "sales", "local-data"]
|
|
7
|
-
|
|
8
|
-
query = """
|
|
9
|
-
SELECT order_month, SUM(revenue) AS total_revenue
|
|
10
|
-
FROM read_csv_auto('./data/orders.csv')
|
|
11
|
-
GROUP BY order_month
|
|
12
|
-
ORDER BY order_month
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
visualization {
|
|
16
|
-
chart = "line"
|
|
17
|
-
x = order_month
|
|
18
|
-
y = total_revenue
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
tests {
|
|
22
|
-
assert row_count > 0
|
|
23
|
-
}
|
|
24
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"project": "__PROJECT_NAME__",
|
|
3
|
-
"defaultConnection": {
|
|
4
|
-
"driver": "duckdb",
|
|
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,33 +0,0 @@
|
|
|
1
|
-
# __PROJECT_NAME__
|
|
2
|
-
|
|
3
|
-
This template packages a realistic e-commerce analytics sandbox for DQL. It covers channel revenue analysis, repeat purchase behavior, funnel analysis, and semantic metrics — a complete starting point for commerce analytics.
|
|
4
|
-
|
|
5
|
-
## Included assets
|
|
6
|
-
|
|
7
|
-
- `blocks/revenue_by_segment.dql` — channel revenue block
|
|
8
|
-
- `blocks/repeat_rate.dql` — repeat purchase mix block
|
|
9
|
-
- `dashboards/revenue_command_center.dql` — KPI + bar + table dashboard
|
|
10
|
-
- `data/orders.csv` — orders with channel, region, and repeat purchase flags
|
|
11
|
-
- `data/funnel.csv` — acquisition and checkout funnel snapshot
|
|
12
|
-
- `data/customers.csv` — customer dimension data
|
|
13
|
-
- `notebooks/welcome.dqlnb` — browser notebook walkthrough
|
|
14
|
-
|
|
15
|
-
## Quick start
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
dql doctor
|
|
19
|
-
dql notebook
|
|
20
|
-
dql preview blocks/revenue_by_segment.dql --open
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## What to explore
|
|
24
|
-
|
|
25
|
-
- Compare performance across paid, partner, organic, and lifecycle channels
|
|
26
|
-
- Track repeat order contribution by region and segment
|
|
27
|
-
- Use the notebook to iterate on funnel SQL before promoting it into reusable blocks
|
|
28
|
-
|
|
29
|
-
## Next Steps
|
|
30
|
-
|
|
31
|
-
- [Authoring Blocks](https://github.com/duckcodeailabs/dql/blob/main/docs/authoring-blocks.md) — promote your notebook queries into certified, reusable `.dql` blocks
|
|
32
|
-
- [Semantic Layer Guide](https://github.com/duckcodeailabs/dql/blob/main/docs/semantic-layer-guide.md) — extend the included semantic layer with your own metrics and dimensions
|
|
33
|
-
- [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,26 +0,0 @@
|
|
|
1
|
-
block "Repeat Revenue Mix" {
|
|
2
|
-
domain = "commerce"
|
|
3
|
-
type = "custom"
|
|
4
|
-
description = "Repeat versus first-time order revenue mix"
|
|
5
|
-
tags = ["commerce", "retention"]
|
|
6
|
-
owner = "template"
|
|
7
|
-
|
|
8
|
-
query = """
|
|
9
|
-
SELECT
|
|
10
|
-
CASE WHEN is_repeat THEN 'Repeat' ELSE 'First Order' END AS order_type,
|
|
11
|
-
ROUND(SUM(order_total), 2) AS revenue
|
|
12
|
-
FROM read_csv_auto('./data/orders.csv')
|
|
13
|
-
GROUP BY order_type
|
|
14
|
-
ORDER BY revenue DESC
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
visualization {
|
|
18
|
-
chart = "bar"
|
|
19
|
-
x = order_type
|
|
20
|
-
y = revenue
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
tests {
|
|
24
|
-
assert row_count > 0
|
|
25
|
-
}
|
|
26
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
block "GMV by Channel" {
|
|
2
|
-
domain = "commerce"
|
|
3
|
-
type = "custom"
|
|
4
|
-
description = "Gross merchandise value by acquisition channel"
|
|
5
|
-
tags = ["commerce", "gmv", "channel"]
|
|
6
|
-
owner = "template"
|
|
7
|
-
|
|
8
|
-
query = """
|
|
9
|
-
SELECT channel, ROUND(SUM(order_total), 2) AS revenue
|
|
10
|
-
FROM read_csv_auto('./data/orders.csv')
|
|
11
|
-
GROUP BY channel
|
|
12
|
-
ORDER BY revenue DESC
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
visualization {
|
|
16
|
-
chart = "bar"
|
|
17
|
-
x = channel
|
|
18
|
-
y = revenue
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
tests {
|
|
22
|
-
assert row_count > 0
|
|
23
|
-
}
|
|
24
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
dashboard "Revenue Command Center" {
|
|
2
|
-
chart.kpi(
|
|
3
|
-
SELECT ROUND(SUM(order_total), 2) AS gmv
|
|
4
|
-
FROM read_csv_auto('./data/orders.csv'),
|
|
5
|
-
metrics = ["gmv"],
|
|
6
|
-
title = "Gross Merchandise Value"
|
|
7
|
-
)
|
|
8
|
-
|
|
9
|
-
chart.bar(
|
|
10
|
-
SELECT channel, ROUND(SUM(order_total), 2) AS revenue
|
|
11
|
-
FROM read_csv_auto('./data/orders.csv')
|
|
12
|
-
GROUP BY channel
|
|
13
|
-
ORDER BY revenue DESC,
|
|
14
|
-
x = channel,
|
|
15
|
-
y = revenue,
|
|
16
|
-
title = "Revenue by Channel"
|
|
17
|
-
)
|
|
18
|
-
|
|
19
|
-
chart.table(
|
|
20
|
-
SELECT order_date, customer_id, channel, region, order_total, is_repeat
|
|
21
|
-
FROM read_csv_auto('./data/orders.csv')
|
|
22
|
-
ORDER BY order_total DESC,
|
|
23
|
-
title = "Top Orders"
|
|
24
|
-
)
|
|
25
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
customer_id,customer_name,segment,region,acquisition_channel,first_order_date,health_score
|
|
2
|
-
C-001,Northstar Health,Enterprise,North America,Paid Search,2025-01-03,92
|
|
3
|
-
C-002,Blue Pine Retail,Mid-Market,EMEA,Organic Search,2024-11-19,87
|
|
4
|
-
C-003,Maple & Co,SMB,North America,Lifecycle,2024-12-01,79
|
|
5
|
-
C-004,Harbor Commerce,Enterprise,APAC,Partner,2025-01-11,90
|
|
6
|
-
C-005,Studio Relay,Mid-Market,North America,Paid Social,2025-01-14,74
|
|
7
|
-
C-006,Rio Goods,SMB,LATAM,Organic Search,2024-10-08,82
|
|
8
|
-
C-007,Vertex Home,Enterprise,North America,Partner,2024-09-22,95
|
|
9
|
-
C-008,Atlas Europe,Mid-Market,EMEA,Paid Search,2025-02-02,71
|
|
10
|
-
C-009,North Loop,SMB,North America,Organic Search,2025-02-06,77
|
|
11
|
-
C-010,Pacific Devices,Enterprise,APAC,Lifecycle,2024-08-12,88
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
order_id,order_date,customer_id,segment,channel,region,order_total,gross_margin,is_repeat,payment_method
|
|
2
|
-
1001,2025-01-03,C-001,Enterprise,Paid Search,North America,12400,0.41,false,Card
|
|
3
|
-
1002,2025-01-05,C-002,Mid-Market,Organic Search,EMEA,8600,0.37,true,Card
|
|
4
|
-
1003,2025-01-08,C-003,SMB,Lifecycle,North America,2400,0.54,true,ACH
|
|
5
|
-
1004,2025-01-11,C-004,Enterprise,Partner,APAC,15200,0.46,false,Wire
|
|
6
|
-
1005,2025-01-14,C-005,Mid-Market,Paid Social,North America,5400,0.35,false,Card
|
|
7
|
-
1006,2025-01-18,C-006,SMB,Organic Search,LATAM,1800,0.51,true,Card
|
|
8
|
-
1007,2025-01-22,C-002,Mid-Market,Lifecycle,EMEA,9200,0.39,true,Card
|
|
9
|
-
1008,2025-01-27,C-007,Enterprise,Partner,North America,17600,0.48,true,Wire
|
|
10
|
-
1009,2025-02-02,C-008,Mid-Market,Paid Search,EMEA,7300,0.36,false,Card
|
|
11
|
-
1010,2025-02-06,C-009,SMB,Organic Search,North America,2100,0.56,false,ACH
|
|
12
|
-
1011,2025-02-10,C-010,Enterprise,Lifecycle,APAC,13800,0.43,true,Card
|
|
13
|
-
1012,2025-02-15,C-011,Mid-Market,Partner,LATAM,6900,0.34,false,Wire
|
|
14
|
-
1013,2025-02-18,C-012,Enterprise,Paid Social,North America,9800,0.38,false,Card
|
|
15
|
-
1014,2025-02-21,C-007,Enterprise,Lifecycle,North America,12100,0.45,true,Wire
|
|
16
|
-
1015,2025-02-25,C-013,SMB,Organic Search,EMEA,1700,0.53,true,Card
|
|
@@ -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,49 +0,0 @@
|
|
|
1
|
-
# Customers cube — joinable from the orders cube.
|
|
2
|
-
|
|
3
|
-
name: customers
|
|
4
|
-
label: Customers Cube
|
|
5
|
-
description: Customer master data.
|
|
6
|
-
table: customers
|
|
7
|
-
domain: commerce
|
|
8
|
-
|
|
9
|
-
measures:
|
|
10
|
-
- name: customer_count
|
|
11
|
-
label: Customer Count
|
|
12
|
-
sql: COUNT(DISTINCT customer_id)
|
|
13
|
-
type: count_distinct
|
|
14
|
-
- name: avg_health_score
|
|
15
|
-
label: Average Health Score
|
|
16
|
-
sql: AVG(health_score)
|
|
17
|
-
type: avg
|
|
18
|
-
|
|
19
|
-
dimensions:
|
|
20
|
-
- name: customer_name
|
|
21
|
-
label: Customer Name
|
|
22
|
-
sql: customer_name
|
|
23
|
-
type: string
|
|
24
|
-
- name: segment
|
|
25
|
-
label: Segment
|
|
26
|
-
sql: segment
|
|
27
|
-
type: string
|
|
28
|
-
- name: region
|
|
29
|
-
label: Region
|
|
30
|
-
sql: region
|
|
31
|
-
type: string
|
|
32
|
-
- name: acquisition_channel
|
|
33
|
-
label: Acquisition Channel
|
|
34
|
-
sql: acquisition_channel
|
|
35
|
-
type: string
|
|
36
|
-
|
|
37
|
-
time_dimensions:
|
|
38
|
-
- name: first_order_date
|
|
39
|
-
label: First Order Date
|
|
40
|
-
sql: first_order_date
|
|
41
|
-
primary_time: true
|
|
42
|
-
granularities:
|
|
43
|
-
- month
|
|
44
|
-
- quarter
|
|
45
|
-
- year
|
|
46
|
-
|
|
47
|
-
tags:
|
|
48
|
-
- commerce
|
|
49
|
-
- customers
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
# Multi-table cube with joins — demonstrates cross-table semantic queries.
|
|
2
|
-
# This cube joins orders with customers to enable queries like:
|
|
3
|
-
# "total GMV by customer health_score and region"
|
|
4
|
-
|
|
5
|
-
name: orders
|
|
6
|
-
label: Orders Cube
|
|
7
|
-
description: E-commerce orders cube with customer join.
|
|
8
|
-
table: orders
|
|
9
|
-
domain: commerce
|
|
10
|
-
|
|
11
|
-
measures:
|
|
12
|
-
- name: gmv
|
|
13
|
-
label: Gross Merchandise Value
|
|
14
|
-
sql: SUM(order_total)
|
|
15
|
-
type: sum
|
|
16
|
-
- name: order_count
|
|
17
|
-
label: Order Count
|
|
18
|
-
sql: COUNT(order_id)
|
|
19
|
-
type: count
|
|
20
|
-
- name: avg_order_value
|
|
21
|
-
label: Average Order Value
|
|
22
|
-
sql: AVG(order_total)
|
|
23
|
-
type: avg
|
|
24
|
-
- name: avg_margin
|
|
25
|
-
label: Average Margin
|
|
26
|
-
sql: AVG(gross_margin)
|
|
27
|
-
type: avg
|
|
28
|
-
|
|
29
|
-
dimensions:
|
|
30
|
-
- name: segment
|
|
31
|
-
label: Segment
|
|
32
|
-
sql: segment
|
|
33
|
-
type: string
|
|
34
|
-
- name: channel
|
|
35
|
-
label: Channel
|
|
36
|
-
sql: channel
|
|
37
|
-
type: string
|
|
38
|
-
- name: region
|
|
39
|
-
label: Region
|
|
40
|
-
sql: region
|
|
41
|
-
type: string
|
|
42
|
-
- name: payment_method
|
|
43
|
-
label: Payment Method
|
|
44
|
-
sql: payment_method
|
|
45
|
-
type: string
|
|
46
|
-
- name: is_repeat
|
|
47
|
-
label: Repeat Customer
|
|
48
|
-
sql: is_repeat
|
|
49
|
-
type: boolean
|
|
50
|
-
|
|
51
|
-
time_dimensions:
|
|
52
|
-
- name: order_date
|
|
53
|
-
label: Order Date
|
|
54
|
-
sql: order_date
|
|
55
|
-
primary_time: true
|
|
56
|
-
granularities:
|
|
57
|
-
- day
|
|
58
|
-
- week
|
|
59
|
-
- month
|
|
60
|
-
- quarter
|
|
61
|
-
- year
|
|
62
|
-
|
|
63
|
-
joins:
|
|
64
|
-
- name: customers
|
|
65
|
-
type: left
|
|
66
|
-
sql: "${left}.customer_id = ${right}.customer_id"
|
|
67
|
-
|
|
68
|
-
tags:
|
|
69
|
-
- commerce
|
|
70
|
-
- ecommerce
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
name: customer_geo
|
|
2
|
-
label: Customer Geography
|
|
3
|
-
description: Drill from region down to customer segment.
|
|
4
|
-
domain: commerce
|
|
5
|
-
levels:
|
|
6
|
-
- name: region
|
|
7
|
-
label: Region
|
|
8
|
-
dimension: region
|
|
9
|
-
order: 1
|
|
10
|
-
- name: segment
|
|
11
|
-
label: Segment
|
|
12
|
-
dimension: segment
|
|
13
|
-
order: 2
|
|
14
|
-
- name: channel
|
|
15
|
-
label: Channel
|
|
16
|
-
dimension: channel
|
|
17
|
-
order: 3
|
|
18
|
-
defaultRollup: sum
|