Skip to content

Commit 3492a80

Browse files
better-aot-value (#569)
Summary: - `any-sdk` supports improved AOT analysis. - Includes AOT resource namespace expansion at resource dereference. - Cut over to using namesspaces to locate methods. - Cleaner new interface. - Method analyser removed.
1 parent 123c7ae commit 3492a80

File tree

31 files changed

+24448
-311
lines changed

31 files changed

+24448
-311
lines changed

.vscode/launch.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,14 @@
178178
"insert into google.storage.buckets( project, data__name) select 'testing-project', 'silly-bucket' returning projectNumber;",
179179
"insert /*+ AWAIT */ into google.compute.networks(project, data__name, data__autoCreateSubnetworks) select 'mutable-project', 'auto-test-01', false returning creationTimestamp, name;",
180180
"registry pull google 'v0.1.2'; show resources in google.storage; registry pull google 'v0.1.1-alpha01'; show resources in google.storage; registry pull google 'v0.1.0'; show resources in google.storage;",
181-
],
181+
"select * from aws.iam.user_policies where region = 'us-east-1' and UserName = 'joe.blow' order by member asc;",
182+
"replace /*+ AWAIT */ google.compute.firewalls set data__disabled = 'true' where project = 'mutable-project' and firewall = 'replacable-firewall' returning *;",
183+
"delete from aws.transfer.servers where data__ServerId = 's-0000000001' and region = 'ap-southeast-2';",
184+
"replace google.compute.firewalls set data__disabled = 'true' where project = 'mutable-project' and firewall = 'replacable-firewall' returning *;",
185+
"replace /*+ AWAIT */ google.compute.firewalls set data__disabled = 'true' where project = 'mutable-project' and firewall = 'replacable-firewall' returning *;",
186+
"select role_name from pgi.information_schema.applicable_roles order by role_name desc;",
187+
"SELECT * FROM datadog.organization.users;",
188+
],
182189
"default": "show providers;"
183190
},
184191
{

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ require (
1616
github.com/spf13/cobra v1.4.0
1717
github.com/spf13/pflag v1.0.5
1818
github.com/spf13/viper v1.10.1
19-
github.com/stackql/any-sdk v0.2.2-alpha01
19+
github.com/stackql/any-sdk v0.2.2-beta01
2020
github.com/stackql/go-suffix-map v0.0.1-alpha01
2121
github.com/stackql/psql-wire v0.1.1-beta23
2222
github.com/stackql/stackql-parser v0.0.15-alpha06

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -461,8 +461,8 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
461461
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
462462
github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk=
463463
github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU=
464-
github.com/stackql/any-sdk v0.2.2-alpha01 h1:fk0HHaJ5pHXpCSAOe0TtqywRYzy5KP786ibZUP3/bmI=
465-
github.com/stackql/any-sdk v0.2.2-alpha01/go.mod h1:m1o5TCfyKkdt2bREB3itwPv1MhM+lk4eu24KpPohFoY=
464+
github.com/stackql/any-sdk v0.2.2-beta01 h1:h5VIvulaqujDmFAN0j0KS0VONE3pwARIzPs6EFiM5G0=
465+
github.com/stackql/any-sdk v0.2.2-beta01/go.mod h1:m1o5TCfyKkdt2bREB3itwPv1MhM+lk4eu24KpPohFoY=
466466
github.com/stackql/go-suffix-map v0.0.1-alpha01 h1:TDUDS8bySu41Oo9p0eniUeCm43mnRM6zFEd6j6VUaz8=
467467
github.com/stackql/go-suffix-map v0.0.1-alpha01/go.mod h1:QAi+SKukOyf4dBtWy8UMy+hsXXV+yyEE4vmBkji2V7g=
468468
github.com/stackql/psql-wire v0.1.1-beta23 h1:1ayYMjZArfDcIMyEOKnm+Bp1zRCISw8pguvTFuUhhVQ=

internal/stackql/astanalysis/annotatedast/annotated_ast.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ func NewAnnotatedAst(parent AnnotatedAst, ast sqlparser.Statement) (AnnotatedAst
2727

2828
type AnnotatedAst interface {
2929
GetAST() sqlparser.Statement
30+
IsAwait(sqlparser.SQLNode) bool
3031
GetIndirect(sqlparser.SQLNode) (astindirect.Indirect, bool)
3132
GetIndirects() map[string]astindirect.Indirect
3233
GetMaterializedView(sqlparser.SQLNode) (astindirect.Indirect, bool)
@@ -65,6 +66,31 @@ type standardAnnotatedAst struct {
6566
execIndirectCache map[*sqlparser.Exec]astindirect.Indirect
6667
}
6768

69+
func hasAwaitComment(comments sqlparser.Comments) bool {
70+
if comments != nil {
71+
commentDirectives := sqlparser.ExtractCommentDirectives(comments)
72+
if commentDirectives.IsSet("AWAIT") {
73+
return true
74+
}
75+
}
76+
return false
77+
}
78+
79+
func (aa *standardAnnotatedAst) IsAwait(node sqlparser.SQLNode) bool {
80+
switch n := node.(type) {
81+
case *sqlparser.Exec:
82+
return hasAwaitComment(n.Comments)
83+
case *sqlparser.Insert:
84+
return hasAwaitComment(n.Comments)
85+
case *sqlparser.Update:
86+
return hasAwaitComment(n.Comments)
87+
case *sqlparser.Delete:
88+
return hasAwaitComment(n.Comments)
89+
default:
90+
return false
91+
}
92+
}
93+
6894
func (aa *standardAnnotatedAst) GetExecIndirect(selNode *sqlparser.Exec) (astindirect.Indirect, bool) {
6995
rv, ok := aa.execIndirectCache[selNode]
7096
return rv, ok

internal/stackql/astanalysis/routeanalysis/select_route_analysis.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ func (sp *standardSelectRoutePass) RoutePass() error {
153153

154154
// TODO: Do the proper SOLID treatment on router, etc.
155155
// Might need to split into multiple passes.
156-
v := router.NewTableRouteAstVisitor(pbi.GetHandlerCtx(), paramRouter)
156+
v := router.NewTableRouteAstVisitor(pbi.GetHandlerCtx(), paramRouter, false)
157157

158158
err := v.Visit(node)
159159

internal/stackql/bundle/bundle.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ import (
55

66
"github.com/stackql/any-sdk/pkg/db/sqlcontrol"
77
"github.com/stackql/any-sdk/pkg/dto"
8+
sdk_persistence "github.com/stackql/any-sdk/public/persistence"
89
"github.com/stackql/any-sdk/public/sqlengine"
910
"github.com/stackql/stackql-parser/go/vt/sqlparser"
1011
"github.com/stackql/stackql/internal/stackql/acid/txn_context"
1112
"github.com/stackql/stackql/internal/stackql/datasource/sql_datasource"
1213
"github.com/stackql/stackql/internal/stackql/dbmsinternal"
1314
"github.com/stackql/stackql/internal/stackql/garbagecollector"
1415
"github.com/stackql/stackql/internal/stackql/kstore"
16+
"github.com/stackql/stackql/internal/stackql/persistence"
1517
"github.com/stackql/stackql/internal/stackql/sql_system"
1618
"github.com/stackql/stackql/internal/stackql/tablenamespace"
1719
"github.com/stackql/stackql/internal/stackql/typing"
@@ -26,6 +28,7 @@ type Bundle interface {
2628
GetDBMSInternalRouter() dbmsinternal.Router
2729
GetSQLDataSources() map[string]sql_datasource.SQLDataSource
2830
GetSQLSystem() sql_system.SQLSystem
31+
GetPersistenceSystem() sdk_persistence.PersistenceSystem
2932
GetSQLEngine() sqlengine.SQLEngine
3033
GetTxnCounterManager() txncounter.Manager
3134
GetTxnStore() kstore.KStore
@@ -58,6 +61,7 @@ func NewBundle(
5861
namespaces: namespaces,
5962
sqlEngine: sqlEngine,
6063
sqlSystem: sqlSystem,
64+
persistenceSystem: persistence.NewSQLPersistenceSystem(sqlSystem),
6165
controlAttributes: controlAttributes,
6266
txnStore: txnStore,
6367
txnCtrMgr: txnCtrMgr,
@@ -77,6 +81,7 @@ type simpleBundle struct {
7781
namespaces tablenamespace.Collection
7882
sqlEngine sqlengine.SQLEngine
7983
sqlSystem sql_system.SQLSystem
84+
persistenceSystem sdk_persistence.PersistenceSystem
8085
txnStore kstore.KStore
8186
txnCtrMgr txncounter.Manager
8287
typCfg typing.Config
@@ -120,6 +125,10 @@ func (sb *simpleBundle) GetSQLDataSources() map[string]sql_datasource.SQLDataSou
120125
return sb.sqlDataSources
121126
}
122127

128+
func (sb *simpleBundle) GetPersistenceSystem() sdk_persistence.PersistenceSystem {
129+
return sb.persistenceSystem
130+
}
131+
123132
func (sb *simpleBundle) GetAuthContexts() map[string]*dto.AuthCtx {
124133
return sb.authContexts
125134
}

internal/stackql/dependencyplanner/dependencyplanner.go

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -324,8 +324,9 @@ func (dp *standardDependencyPlanner) Plan() error {
324324
return err
325325
}
326326
logging.GetLogger().Debugf("rewrittenWhereStr = '%s'", rewrittenWhereStr)
327-
drmCfg, err := drm.GetDRMConfig(
327+
drmCfg, err := drm.GenerateDRMConfig(
328328
dp.handlerCtx.GetSQLSystem(),
329+
dp.handlerCtx.GetPersistenceSystem(),
329330
dp.handlerCtx.GetTypingConfig(),
330331
dp.handlerCtx.GetNamespaceCollection(),
331332
dp.handlerCtx.GetControlAttributes())
@@ -397,8 +398,11 @@ func (dp *standardDependencyPlanner) processOrphan(
397398
if err != nil {
398399
return nil, nil, err
399400
}
401+
402+
tableMetadata := annotationCtx.GetTableMeta()
403+
400404
_, isSQLDataSource := annotationCtx.GetTableMeta().GetSQLDataSource()
401-
var opStore anysdk.OperationStore
405+
var opStore anysdk.StandardOperationStore
402406
if !isSQLDataSource {
403407
opStore, err = annotationCtx.GetTableMeta().GetMethod()
404408
if err != nil {
@@ -407,16 +411,50 @@ func (dp *standardDependencyPlanner) processOrphan(
407411
} else {
408412
// Persist SQL mirror table here prior to generating insert DML
409413
drmCfg := dp.handlerCtx.GetDrmConfig()
410-
ddl, ddlErr := drmCfg.GenerateDDL(anTab, opStore, 0, false, false)
414+
ddl, ddlErr := drmCfg.GenerateDDL(anTab, nil, nil, nil, opStore, annotationCtx.IsAwait(), 0, false, false)
411415
if ddlErr != nil {
412416
return nil, nil, ddlErr
413417
}
414418
err = dp.handlerCtx.GetSQLEngine().ExecInTxn(ddl)
415419
if err != nil {
416420
return nil, nil, err
417421
}
422+
423+
insPsc, insPscErr := dp.primitiveComposer.GetDRMConfig().GenerateInsertDML(
424+
anTab,
425+
nil,
426+
nil,
427+
nil,
428+
opStore,
429+
tcc,
430+
false,
431+
annotationCtx.IsAwait(),
432+
)
433+
return insPsc, tcc, insPscErr
418434
}
419-
insPsc, err := dp.primitiveComposer.GetDRMConfig().GenerateInsertDML(anTab, opStore, tcc, false)
435+
436+
anySdkProv, anySdkPrvErr := tableMetadata.GetProviderObject()
437+
if anySdkPrvErr != nil {
438+
return nil, nil, anySdkPrvErr
439+
}
440+
svc, svcErr := tableMetadata.GetService()
441+
if svcErr != nil {
442+
return nil, nil, svcErr
443+
}
444+
resource, resourceErr := tableMetadata.GetResource()
445+
if resourceErr != nil {
446+
return nil, nil, resourceErr
447+
}
448+
insPsc, err := dp.primitiveComposer.GetDRMConfig().GenerateInsertDML(
449+
anTab,
450+
anySdkProv,
451+
svc,
452+
resource,
453+
opStore,
454+
tcc,
455+
false,
456+
annotationCtx.IsAwait(),
457+
)
420458
return insPsc, tcc, err
421459
}
422460

@@ -495,7 +533,7 @@ func (dp *standardDependencyPlanner) orchestrate(
495533
return idx, err
496534
}
497535

498-
//nolint:gocognit // live with it
536+
//nolint:gocognit,funlen // live with it
499537
func (dp *standardDependencyPlanner) processAcquire(
500538
sqlNode sqlparser.SQLNode,
501539
annotationCtx taxonomy.AnnotationCtx,
@@ -528,6 +566,14 @@ func (dp *standardDependencyPlanner) processAcquire(
528566
if err != nil {
529567
return util.NewAnnotatedTabulation(nil, nil, "", ""), nil, err
530568
}
569+
svc, err := annotationCtx.GetTableMeta().GetService()
570+
if err != nil {
571+
return util.NewAnnotatedTabulation(nil, nil, "", ""), nil, err
572+
}
573+
resource, rscErr := annotationCtx.GetTableMeta().GetResource()
574+
if rscErr != nil {
575+
return util.NewAnnotatedTabulation(nil, nil, "", ""), nil, rscErr
576+
}
531577
m, err := annotationCtx.GetTableMeta().GetMethod()
532578
if err != nil {
533579
return util.NewAnnotatedTabulation(nil, nil, "", ""), nil, err
@@ -557,13 +603,18 @@ func (dp *standardDependencyPlanner) processAcquire(
557603
annotationCtx.GetTableMeta().GetAlias()).WithParameters(annotationCtx.GetParameters())
558604

559605
discoGenID, err := docparser.OpenapiStackQLTabulationsPersistor(
606+
prov,
607+
svc,
608+
resource,
560609
m,
610+
annotationCtx.IsAwait(),
561611
[]util.AnnotatedTabulation{anTab},
562612
dp.primitiveComposer.GetSQLEngine(),
563613
prov.GetName(),
564614
dp.handlerCtx.GetNamespaceCollection(),
565615
dp.handlerCtx.GetControlAttributes(),
566616
dp.handlerCtx.GetSQLSystem(),
617+
dp.handlerCtx.GetPersistenceSystem(),
567618
dp.handlerCtx.GetTypingConfig(),
568619
)
569620
if err != nil {

internal/stackql/docparser/doc_parser.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"github.com/stackql/any-sdk/anysdk"
77
"github.com/stackql/any-sdk/pkg/db/sqlcontrol"
88
"github.com/stackql/any-sdk/pkg/logging"
9+
sdk_persistence "github.com/stackql/any-sdk/public/persistence"
910
"github.com/stackql/any-sdk/public/sqlengine"
1011
"github.com/stackql/stackql/internal/stackql/drm"
1112
"github.com/stackql/stackql/internal/stackql/sql_system"
@@ -33,16 +34,22 @@ func TranslateServiceKeyIqlToGenericProvider(serviceKey string) string {
3334
}
3435

3536
func OpenapiStackQLTabulationsPersistor(
36-
m anysdk.OperationStore,
37+
prov anysdk.Provider,
38+
svc anysdk.Service,
39+
resource anysdk.Resource,
40+
m anysdk.StandardOperationStore,
41+
isAwait bool,
3742
tabluationsAnnotated []util.AnnotatedTabulation,
3843
dbEngine sqlengine.SQLEngine,
3944
prefix string,
4045
namespaceCollection tablenamespace.Collection,
4146
controlAttributes sqlcontrol.ControlAttributes,
4247
sqlSystem sql_system.SQLSystem,
48+
persistenceSystem sdk_persistence.PersistenceSystem,
4349
typCfg typing.Config,
4450
) (int, error) {
45-
drmCfg, err := drm.GetDRMConfig(sqlSystem, typCfg, namespaceCollection, controlAttributes)
51+
drmCfg, err := drm.GenerateDRMConfig(sqlSystem, persistenceSystem,
52+
typCfg, namespaceCollection, controlAttributes)
4653
if err != nil {
4754
return 0, err
4855
}
@@ -62,7 +69,7 @@ func OpenapiStackQLTabulationsPersistor(
6269
return discoveryGenerationID, err
6370
}
6471
for _, tblt := range tabluationsAnnotated {
65-
ddl, ddlErr := drmCfg.GenerateDDL(tblt, m, discoveryGenerationID, false, true)
72+
ddl, ddlErr := drmCfg.GenerateDDL(tblt, prov, svc, resource, m, isAwait, discoveryGenerationID, false, true)
6673
if ddlErr != nil {
6774
displayErr := fmt.Errorf("error generating DDL: %w", err)
6875
logging.GetLogger().Infoln(displayErr.Error())

0 commit comments

Comments
 (0)