@@ -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+
126174func (n * Viewlets ) applyViewHintSettings () error {
127175 return n .Each (func (namespace * Viewlet ) error {
128176 return namespace .View .applyHintSettings (namespace )
0 commit comments