11package command
22
33import (
4+ "context"
5+ "os"
46 "path/filepath"
7+ "strings"
58 "testing"
69
710 "github.com/stretchr/testify/assert"
@@ -28,3 +31,70 @@ func TestRoutePathForShape(t *testing.T) {
2831 assert .Equal (t , filepath .ToSlash ("platform/campaign" ), relDir )
2932 assert .Equal (t , "post" , stem )
3033}
34+
35+ func TestTranslateShape_PreservesPredicateBuilderBlocksInGeneratedSQL (t * testing.T ) {
36+ ctx := context .Background ()
37+ projectDir := t .TempDir ()
38+ repoDir := filepath .Join (projectDir , "repo" , "dev" )
39+ dqlDir := filepath .Join (projectDir , "dql" , "opaque" )
40+ sqlDir := filepath .Join (dqlDir , "sql" )
41+ require .NoError (t , os .MkdirAll (sqlDir , 0o755 ))
42+ require .NoError (t , os .MkdirAll (repoDir , 0o755 ))
43+
44+ sqlSource := `SELECT
45+ x0.k_a,
46+ x0.k_b,
47+ z9.m_q,
48+ SUM(x0.v_n) AS agg_alpha,
49+ AVG(z9.v_r) AS agg_beta
50+ FROM
51+ data_alpha x0
52+ LEFT JOIN data_beta z9
53+ ON x0.k_b = z9.k_b
54+
55+ ${predicate.Builder().CombineOr($predicate.FilterGroup(0, "AND")).Build("WHERE")}
56+ GROUP BY
57+ x0.k_a,
58+ x0.k_b,
59+ z9.m_q
60+ ${predicate.Builder().CombineOr($predicate.FilterGroup(1, "HAVING")).Build("HAVING")}`
61+ require .NoError (t , os .WriteFile (filepath .Join (sqlDir , "opaque_source.sql" ), []byte (sqlSource ), 0o600 ))
62+
63+ dqlSource := `/* {"URI":"/opaque/report","Name":"OpaqueReport"} */
64+ #set($_ = $cube())
65+ #set($_ = $Cutoff<string>(query/cutoff).Optional().WithPredicate(0, 'greater_or_equal', 'x0', 'k_a'))
66+ #set($_ = $Threshold<int>(query/threshold).Optional().WithPredicate(1, 'expr', '(SUM(v_n) >= ?)'))
67+
68+ SELECT opaque_root.*,
69+ grouping_enabled(opaque_root),
70+ allow_nulls(opaque_root),
71+ set_limit(opaque_root, 25)
72+ FROM (${embed:sql/opaque_source.sql}) opaque_root`
73+ dqlPath := filepath .Join (dqlDir , "opaque_report.dql" )
74+ require .NoError (t , os .WriteFile (dqlPath , []byte (dqlSource ), 0o600 ))
75+
76+ opts := & options.Options {
77+ Translate : & options.Translate {
78+ Rule : options.Rule {
79+ Project : projectDir ,
80+ Source : []string {dqlPath },
81+ Engine : options .EngineShape ,
82+ },
83+ Repository : options.Repository {
84+ RepositoryURL : repoDir ,
85+ APIPrefix : "/v1/api" ,
86+ },
87+ },
88+ }
89+ require .NoError (t , opts .Init (ctx ))
90+
91+ svc := New ()
92+ require .NoError (t , svc .translateShape (ctx , opts ))
93+
94+ generatedSQLPath := filepath .Join (repoDir , "Datly" , "routes" , "opaque" , "opaque_report" , "opaque_report.sql" )
95+ data , err := os .ReadFile (generatedSQLPath )
96+ require .NoError (t , err )
97+ generated := string (data )
98+ assert .True (t , strings .Contains (generated , `${predicate.Builder().CombineOr($predicate.FilterGroup(0, "AND")).Build("WHERE")}` ))
99+ assert .True (t , strings .Contains (generated , `${predicate.Builder().CombineOr($predicate.FilterGroup(1, "HAVING")).Build("HAVING")}` ))
100+ }
0 commit comments