Skip to content

Commit 5e41c4e

Browse files
committed
- fixed multi preficate builders
1 parent 6df954e commit 5e41c4e

3 files changed

Lines changed: 54 additions & 6 deletions

File tree

internal/translator/service.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,8 @@ func (s *Service) buildExecutorView(ctx context.Context, resource *Resource, DSQ
194194
}
195195

196196
func (s *Service) translateReaderDSQL(ctx context.Context, resource *Resource, dSQL string) error {
197-
aQuery, err := sqlparser.ParseQuery(dSQL, parser.OnVeltyExpression())
197+
parseSQL := resource.State.Expand(dSQL)
198+
aQuery, err := sqlparser.ParseQuery(parseSQL, parser.OnVeltyExpression())
198199
if err != nil {
199200
return err
200201
}
@@ -206,7 +207,7 @@ func (s *Service) translateReaderDSQL(ctx context.Context, resource *Resource, d
206207
if err = s.updateCodecParameters(ctx, resource); err != nil {
207208
return err
208209
}
209-
if err = resource.Rule.Viewlets.Init(ctx, aQuery, resource, s.initReaderViewlet, s.buildQueryViewletType); err != nil {
210+
if err = resource.Rule.Viewlets.Init(ctx, aQuery, dSQL, resource, s.initReaderViewlet, s.buildQueryViewletType); err != nil {
210211
return err
211212
}
212213

@@ -586,7 +587,6 @@ func (s *Service) buildQueryViewletType(ctx context.Context, viewlet *Viewlet) e
586587
}
587588

588589
func (s *Service) buildViewletType(ctx context.Context, db *sql.DB, viewlet *Viewlet) (err error) {
589-
590590
shared.EnsureArgs(viewlet.Expanded.Query, &viewlet.Expanded.Args)
591591
viewlet.Spec, err = inference.NewSpec(ctx, db, &s.Repository.Messages, viewlet.Table.Name, viewlet.ColumnConfig, viewlet.Expanded.Query, viewlet.Expanded.Args...)
592592
if err != nil {

internal/translator/view.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,8 +251,8 @@ func (v *View) buildTemplate(namespace *Viewlet, rule *Rule) {
251251
isRoot := rule.Root == v.Name
252252
resource := namespace.Resource
253253
v.EnsureTemplate()
254-
v.Template.Source = namespace.SanitizedSQL
255-
v.Template.Parameters = v.matchParameters(namespace.SanitizedSQL, resource.State, isRoot)
254+
v.Template.Source = namespace.SQL
255+
v.Template.Parameters = v.matchParameters(namespace.SQL, resource.State, isRoot)
256256
}
257257

258258
// matchParameters matches parameter used by SQL, and add explicit parameter for root view

internal/translator/viewlets.go

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,15 @@ func (n *Viewlets) Append(viewlet *Viewlet) {
4242
n.registry[viewlet.Name] = viewlet
4343
n.keys = append(n.keys, viewlet.Name)
4444
}
45-
func (n *Viewlets) Init(ctx context.Context, aQuery *query.Select, resource *Resource, initFn, setType func(ctx context.Context, n *Viewlet) error) error {
45+
func (n *Viewlets) Init(ctx context.Context, aQuery *query.Select, rootSQL string, resource *Resource, initFn, setType func(ctx context.Context, n *Viewlet) error) error {
4646

4747
SQL, err := SafeQueryStringify(aQuery)
4848
if err != nil {
4949
return err
5050
}
51+
if extracted := extractRootViewletSQL(rootSQL, aQuery.From.Alias); extracted != "" {
52+
SQL = extracted
53+
}
5154
root := NewViewlet(aQuery.From.Alias, SQL, nil, resource)
5255
root.ViewJSONHint = aQuery.From.Comments
5356
if root.ViewJSONHint == "" && aQuery.From.X != nil {
@@ -123,6 +126,51 @@ func SafeQueryStringify(aQuery *query.Select) (SQL string, err error) {
123126
return SQL, err
124127
}
125128

129+
func extractRootViewletSQL(SQL, alias string) string {
130+
SQL = strings.TrimSpace(SQL)
131+
alias = strings.TrimSpace(alias)
132+
if SQL == "" || alias == "" {
133+
return ""
134+
}
135+
lowerSQL := strings.ToLower(SQL)
136+
lowerAlias := strings.ToLower(alias)
137+
aliasPos := strings.LastIndex(lowerSQL, lowerAlias)
138+
if aliasPos == -1 {
139+
return ""
140+
}
141+
closePos := aliasPos - 1
142+
for closePos >= 0 {
143+
switch SQL[closePos] {
144+
case ' ', '\n', '\t', '\r':
145+
closePos--
146+
continue
147+
case ')':
148+
goto scan
149+
default:
150+
return ""
151+
}
152+
}
153+
return ""
154+
155+
scan:
156+
if closePos < 0 {
157+
return ""
158+
}
159+
depth := 1
160+
for i := closePos - 1; i >= 0; i-- {
161+
switch SQL[i] {
162+
case ')':
163+
depth++
164+
case '(':
165+
depth--
166+
if depth == 0 {
167+
return strings.TrimSpace(SQL[i : closePos+1])
168+
}
169+
}
170+
}
171+
return ""
172+
}
173+
126174
func (n *Viewlets) applyViewHintSettings() error {
127175
return n.Each(func(namespace *Viewlet) error {
128176
return namespace.View.applyHintSettings(namespace)

0 commit comments

Comments
 (0)