github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/internal/query/options/execute.go (about) 1 package options 2 3 import ( 4 "github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Query" 5 "google.golang.org/grpc" 6 7 "github.com/ydb-platform/ydb-go-sdk/v3/internal/params" 8 "github.com/ydb-platform/ydb-go-sdk/v3/internal/query/tx" 9 "github.com/ydb-platform/ydb-go-sdk/v3/internal/stats" 10 "github.com/ydb-platform/ydb-go-sdk/v3/retry" 11 ) 12 13 var ( 14 _ Execute = callOptionsOption(nil) 15 _ Execute = (*txCommitOption)(nil) 16 _ Execute = parametersOption{} 17 _ Execute = (*txControlOption)(nil) 18 _ Execute = syntaxOption(0) 19 _ Execute = statsModeOption{} 20 _ Execute = execModeOption(0) 21 ) 22 23 type ( 24 Syntax Ydb_Query.Syntax 25 ExecMode Ydb_Query.ExecMode 26 StatsMode Ydb_Query.StatsMode 27 28 // executeSettings is a holder for execute settings 29 executeSettings struct { 30 syntax Syntax 31 params params.Parameters 32 execMode ExecMode 33 statsMode StatsMode 34 resourcePool string 35 statsCallback func(queryStats stats.QueryStats) 36 callOptions []grpc.CallOption 37 txControl *tx.Control 38 retryOptions []retry.Option 39 } 40 41 // Execute is an interface for execute method options 42 Execute interface { 43 applyExecuteOption(s *executeSettings) 44 } 45 46 ExecuteNoTx interface { 47 thisOptionIsNotForExecuteOnTx() 48 } 49 50 // execute options 51 callOptionsOption []grpc.CallOption 52 txCommitOption struct{} 53 resourcePool string 54 parametersOption params.Parameters 55 txControlOption tx.Control 56 syntaxOption = Syntax 57 statsModeOption struct { 58 mode StatsMode 59 callback func(stats.QueryStats) 60 } 61 execModeOption = ExecMode 62 ) 63 64 func (poolID resourcePool) applyExecuteOption(s *executeSettings) { 65 s.resourcePool = string(poolID) 66 } 67 68 func (s *executeSettings) RetryOpts() []retry.Option { 69 return s.retryOptions 70 } 71 72 func (s *executeSettings) StatsCallback() func(stats.QueryStats) { 73 return s.statsCallback 74 } 75 76 func (t txCommitOption) applyExecuteOption(s *executeSettings) { 77 s.txControl.Commit = true 78 } 79 80 func (txControl *txControlOption) applyExecuteOption(s *executeSettings) { 81 s.txControl = (*tx.Control)(txControl) 82 } 83 84 func (txControl *txControlOption) thisOptionIsNotForExecuteOnTx() {} 85 86 func (syntax Syntax) applyExecuteOption(s *executeSettings) { 87 s.syntax = syntax 88 } 89 90 const ( 91 SyntaxYQL = Syntax(Ydb_Query.Syntax_SYNTAX_YQL_V1) 92 SyntaxPostgreSQL = Syntax(Ydb_Query.Syntax_SYNTAX_PG) 93 ) 94 95 func (params parametersOption) applyExecuteOption(s *executeSettings) { 96 s.params = append(s.params, params...) 97 } 98 99 func (opts callOptionsOption) applyExecuteOption(s *executeSettings) { 100 s.callOptions = append(s.callOptions, opts...) 101 } 102 103 func (mode StatsMode) applyExecuteOption(s *executeSettings) { 104 s.statsMode = mode 105 } 106 107 func (mode ExecMode) applyExecuteOption(s *executeSettings) { 108 s.execMode = mode 109 } 110 111 const ( 112 ExecModeParse = ExecMode(Ydb_Query.ExecMode_EXEC_MODE_PARSE) 113 ExecModeValidate = ExecMode(Ydb_Query.ExecMode_EXEC_MODE_VALIDATE) 114 ExecModeExplain = ExecMode(Ydb_Query.ExecMode_EXEC_MODE_EXPLAIN) 115 ExecModeExecute = ExecMode(Ydb_Query.ExecMode_EXEC_MODE_EXECUTE) 116 ) 117 118 const ( 119 StatsModeBasic = StatsMode(Ydb_Query.StatsMode_STATS_MODE_BASIC) 120 StatsModeNone = StatsMode(Ydb_Query.StatsMode_STATS_MODE_NONE) 121 StatsModeFull = StatsMode(Ydb_Query.StatsMode_STATS_MODE_FULL) 122 StatsModeProfile = StatsMode(Ydb_Query.StatsMode_STATS_MODE_PROFILE) 123 ) 124 125 func defaultExecuteSettings() executeSettings { 126 return executeSettings{ 127 syntax: SyntaxYQL, 128 execMode: ExecModeExecute, 129 statsMode: StatsModeNone, 130 txControl: tx.DefaultTxControl(), 131 } 132 } 133 134 func ExecuteSettings(opts ...Execute) *executeSettings { 135 settings := defaultExecuteSettings() 136 137 for _, opt := range opts { 138 if opt != nil { 139 opt.applyExecuteOption(&settings) 140 } 141 } 142 143 return &settings 144 } 145 146 func (s *executeSettings) TxControl() *tx.Control { 147 return s.txControl 148 } 149 150 func (s *executeSettings) CallOptions() []grpc.CallOption { 151 return s.callOptions 152 } 153 154 func (s *executeSettings) Syntax() Syntax { 155 return s.syntax 156 } 157 158 func (s *executeSettings) ExecMode() ExecMode { 159 return s.execMode 160 } 161 162 func (s *executeSettings) StatsMode() StatsMode { 163 return s.statsMode 164 } 165 166 func (s *executeSettings) ResourcePool() string { 167 return s.resourcePool 168 } 169 170 func (s *executeSettings) Params() *params.Parameters { 171 if len(s.params) == 0 { 172 return nil 173 } 174 175 return &s.params 176 } 177 178 func WithParameters(parameters *params.Parameters) parametersOption { 179 return parametersOption(*parameters) 180 } 181 182 var ( 183 _ Execute = ExecMode(0) 184 _ Execute = StatsMode(0) 185 _ Execute = ExecMode(0) 186 _ Execute = StatsMode(0) 187 _ Execute = txCommitOption{} 188 _ Execute = (*txControlOption)(nil) 189 _ Execute = resourcePool("") 190 ) 191 192 func WithCommit() txCommitOption { 193 return txCommitOption{} 194 } 195 196 func WithResourcePool(id string) resourcePool { 197 return resourcePool(id) 198 } 199 200 func WithExecMode(mode ExecMode) execModeOption { 201 return mode 202 } 203 204 func WithSyntax(syntax Syntax) syntaxOption { 205 return syntax 206 } 207 208 func (opt statsModeOption) applyExecuteOption(s *executeSettings) { 209 s.statsMode = opt.mode 210 s.statsCallback = opt.callback 211 } 212 213 func WithStatsMode(mode StatsMode, callback func(stats.QueryStats)) statsModeOption { 214 return statsModeOption{ 215 mode: mode, 216 callback: callback, 217 } 218 } 219 220 func WithCallOptions(opts ...grpc.CallOption) callOptionsOption { 221 return opts 222 } 223 224 func WithTxControl(txControl *tx.Control) *txControlOption { 225 return (*txControlOption)(txControl) 226 }