Loading...
Loading...
Compare original and translation side by side
cat models/<path>/<model_name>.sqlcat models/<path>/<model_name>.sqlundefinedundefined
**Report to user:** "Found X downstream models: [list]. These will be affected by changes."
**向用户报告:“发现X个下游模型:[列表]。这些模型会受到更改的影响。”**undefinedundefined
If downstream models reference specific columns, you MUST ensure those columns remain available after refactoring.
如果下游模型引用了特定列,你必须确保这些列在重构后仍然可用。| Opportunity | Strategy |
|---|---|
| Long CTE | Extract to intermediate model |
| Repeated logic | Create macro in |
| Complex join | Split into intermediate models |
| Multiple concerns | Separate into focused models |
| 重构机会 | 策略 |
|---|---|
| 长CTE | 提取为中间模型 |
| 重复逻辑 | 在 |
| 复杂关联 | 拆分为中间模型 |
| 多关注点 | 拆分为专注单一职责的模型 |
-- orders.sql (200 lines)
with customer_metrics as (
-- 50 lines of complex logic
),
order_enriched as (
select ...
from orders
join customer_metrics on ...
)
select * from order_enriched-- customer_metrics.sql (new file)
select
customer_id,
-- complex logic here
from {{ ref('customers') }}
-- orders.sql (simplified)
with order_enriched as (
select ...
from {{ ref('raw_orders') }} orders
join {{ ref('customer_metrics') }} cm on ...
)
select * from order_enriched-- orders.sql(200行)
with customer_metrics as (
-- 50行复杂逻辑
),
order_enriched as (
select ...
from orders
join customer_metrics on ...
)
select * from order_enriched-- customer_metrics.sql(新文件)
select
customer_id,
-- 复杂逻辑写在这里
from {{ ref('customers') }}
-- orders.sql(简化后)
with order_enriched as (
select ...
from {{ ref('raw_orders') }} orders
join {{ ref('customer_metrics') }} cm on ...
)
select * from order_enrichedcase
when amount < 0 then 'refund'
when amount = 0 then 'zero'
else 'positive'
end as amount_category-- macros/categorize_amount.sql
{% macro categorize_amount(column_name) %}
case
when {{ column_name }} < 0 then 'refund'
when {{ column_name }} = 0 then 'zero'
else 'positive'
end
{% endmacro %}
-- In models:
{{ categorize_amount('amount') }} as amount_categorycase
when amount < 0 then 'refund'
when amount = 0 then 'zero'
else 'positive'
end as amount_category-- macros/categorize_amount.sql
{% macro categorize_amount(column_name) %}
case
when {{ column_name }} < 0 then 'refund'
when {{ column_name }} = 0 then 'zero'
else 'positive'
end
{% endmacro %}
-- 在模型中使用:
{{ categorize_amount('amount') }} as amount_categoryundefinedundefinedundefinedundefinedundefinedundefinedundefinedundefined| Symptom | Refactoring |
|---|---|
| Model > 200 lines | Extract CTEs to models |
| Same logic in 3+ models | Extract to macro |
| 5+ joins in one model | Create intermediate models |
| Hard to understand | Add CTEs with clear names |
| Slow performance | Split to allow parallelization |
| 症状 | 重构方式 |
|---|---|
| 模型超过200行 | 将CTE提取为独立模型 |
| 相同逻辑出现在3个及以上模型中 | 提取为宏 |
| 单个模型中有5次及以上关联 | 创建中间模型 |
| 难以理解 | 添加命名清晰的CTE |
| 性能缓慢 | 拆分以支持并行处理 |