15 · 디렉티브 조합하기 (@filter, @sort, @top, @source, @join)
디렉티브가 무엇이고 무엇이 아닌가
디렉티브 (@filter, @sort, @top, @source, @join) 는 데이터 블록 안에 자리잡고, 블록이 순회할 행 집합을 다듬습니다. 소스 셀의 작성 순서와 상관없이 정해진 순서대로 평가됩니다:
@source <Name>— 블록이 어느 소스를 순회할지 정합니다.@join <Source> on ...— 주 소스의 행을 다른 소스의 행과 짝지웁니다.@filter <condition>— 조건이 truthy 인 행만 남깁니다.@sort <column> [asc|desc]— 행을 정렬합니다.@top <N>— 필터링과 정렬이 끝난 뒤 앞에서 N 개만 남깁니다.
작성 팁: 디렉티브를 실행 순서대로 적어 두세요. 스펙이 강제하는 건 아니지만, 템플릿이 훨씬 읽기 좋아집니다.
디렉티브 조합
자주 쓰이는 모양: 서울 의 고액 갱신 상위 5건.
{{ @filter [지역] = "서울" }}
{{ @filter [금액] > 1000 }}
{{ @sort [금액] desc }}
{{ @top 5 }}
{{ [계정] }} | {{ [금액] }}
평가 순서:
- 지역=서울 으로 필터.
- 금액>1000 으로 필터 (AND 로 결합).
- 살아남은 행을 금액 내림차순으로 정렬.
- 앞에서 5건.
여러 @filter 는 AND 로 결합됩니다
ADR-0029 에 따라, 한 블록 안의 여러 @filter 는 서로 AND 로 묶입니다. OR 키워드는 없습니다. OR 을 표현하려면 다음 중 하나를 쓰세요:
IN으로 하나의 필터로 합치기:{{ @filter [지역] in __lists__[활성지역] }}- 두 개의 데이터 블록으로 쪼개기 (각각을 자기 영역에 두고, 양쪽이 렌더링되면서 자연스럽게 행 집합이 union 되게 합니다).
- 위쪽 단계에서 미리 처리하기.
@source + @join 조합
{{ @source 갱신현황 }}
{{ @join 거래처 on 갱신현황[거래처코드] = 거래처[id] }}
{{ @filter 거래처[등급] = "A" }}
{{ @sort 갱신현황[금액] desc }}
{{ @top 10 }}
{{ 갱신현황[거래처코드] }}
{{ 거래처[name] }}
{{ 갱신현황[금액] }}
단계:
- 갱신현황 순회 (
@source가 지정). - id 로 거래처 와 inner join. 매칭 안 된 행은 빠집니다.
- 거래처 의 tier 가 "A" 인 행만 남기기.
- 갱신현황.amount 내림차순 정렬.
- 상위 10건.
@filter 는 어느 쪽 소스의 컬럼이든 참조할 수 있습니다. 컬럼 해석은 대괄호만 쓰는 경우엔 활성 블록의 소스를 쓰고, join 쪽은 명시적으로 Source[Column] 형식을 씁니다.
금지된 조합
ADR-0029 기준:
- 데이터 블록당
@source는 최대 하나. 중복되면xl3/directive/invalid-syntax가 발생합니다. - 데이터 블록당
@join도 최대 하나. 멀티 조인은 지원 범위가 아닙니다. - self-join 금지. 활성 소스가
S일 때@join S on S[a] = S[b]를 쓰면xl3/join/bad-on-clause가 발생합니다.
@sort 다음의 @top
{{ @sort [금액] desc }}
{{ @top 10 }}
정렬 없는 Top-N 은 의미가 없습니다. @sort 없이 @top 을 쓰면 소스에 적힌 순서대로 앞 N 개를 잘라옵니다 — 가끔은 유용할 수 있지만, 작성자가 의도한 결과인 경우는 거의 없습니다.
필터 후 행이 비는 경우
@filter 가 모든 행을 떨어뜨리면, 데이터 블록은 0행으로 expand 됩니다. 템플릿 행의 스타일과 포맷은 결과에 남지만 데이터 행 자체는 생성되지 않습니다. 블록 아래의 footer 행은 그대로 보입니다.
스펙 포인터
- ADR-0029 — 디렉티브 조합 + 소스 엣지 시맨틱.
spec/language.md"Filter", "Sort", "Top", "Source", "Join".@filter in __lists__[…]는 Cookbook 05 참고.@source+@join기본은 Cookbook 07 참고.@sort+@top기본은 Cookbook 09 참고.