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  }