azkustodata/queryopts.go (466 lines of code) (raw):
package azkustodata
// queryopts.go holds the varying QueryOption constructors as the list is so long that
// it clogs up the main kusto.go file.
import (
"github.com/Azure/azure-kusto-go/azkustodata/kql"
"time"
"github.com/Azure/azure-kusto-go/azkustodata/value"
)
// requestProperties is a POD used by clients to describe specific needs from the service.
// For more information please look at: https://docs.microsoft.com/en-us/azure/kusto/api/netfx/request-properties
// Not all of the documented options are implemented.
type requestProperties struct {
Options map[string]interface{}
Parameters map[string]string
Application string `json:"-"`
User string `json:"-"`
QueryParameters kql.Parameters `json:"-"`
ClientRequestID string `json:"-"`
}
type queryOptions struct {
requestProperties *requestProperties
queryIngestion bool
v2IoCapacity int
v2RowCapacity int
v2TableCapacity int
}
const ResultsProgressiveEnabledValue = "results_progressive_enabled"
const NoRequestTimeoutValue = "norequesttimeout"
const NoTruncationValue = "notruncation"
const ServerTimeoutValue = "servertimeout"
const DeferPartialQueryFailuresValue = "deferpartialqueryfailures"
const MaxMemoryConsumptionPerQueryPerNodeValue = "max_memory_consumption_per_query_per_node"
const MaxMemoryConsumptionPerIteratorValue = "maxmemoryconsumptionperiterator"
const MaxOutputColumnsValue = "maxoutputcolumns"
const PushSelectionThroughAggregationValue = "push_selection_through_aggregation"
const QueryCursorAfterDefaultValue = "query_cursor_after_default"
const QueryCursorBeforeOrAtDefaultValue = "query_cursor_before_or_at_default"
const QueryCursorCurrentValue = "query_cursor_current"
const QueryCursorDisabledValue = "query_cursor_disabled"
const QueryCursorScopedTablesValue = "query_cursor_scoped_tables"
const QueryDatascopeValue = "query_datascope"
const QueryDateTimeScopeColumnValue = "query_datetimescope_column"
const QueryDateTimeScopeFromValue = "query_datetimescope_from"
const QueryDateTimeScopeToValue = "query_datetimescope_to"
const ClientMaxRedirectCountValue = "client_max_redirect_count"
const MaterializedViewShuffleValue = "materialized_view_shuffle"
const QueryBinAutoAtValue = "query_bin_auto_at"
const QueryBinAutoSizeValue = "query_bin_auto_size"
const QueryDistributionNodesSpanValue = "query_distribution_nodes_span"
const QueryFanoutNodesPercentValue = "query_fanout_nodes_percent"
const QueryFanoutThreadsPercentValue = "query_fanout_threads_percent"
const QueryForceRowLevelSecurityValue = "query_force_row_level_security"
const QueryLanguageValue = "query_language"
const QueryLogQueryParametersValue = "query_log_query_parameters"
const QueryMaxEntitiesInUnionValue = "query_max_entities_in_union"
const QueryNowValue = "query_now"
const QueryPythonDebugValue = "query_python_debug"
const QueryResultsApplyGetschemaValue = "query_results_apply_getschema"
const QueryResultsCacheMaxAgeValue = "query_results_cache_max_age"
const QueryResultsCachePerShardValue = "query_results_cache_per_shard"
const QueryResultsProgressiveRowCountValue = "query_results_progressive_row_count"
const QueryResultsProgressiveUpdatePeriodValue = "query_results_progressive_update_period"
const QueryTakeMaxRecordsValue = "query_take_max_records"
const QueryConsistencyValue = "queryconsistency"
const RequestAppNameValue = "request_app_name"
const RequestBlockRowLevelSecurityValue = "request_block_row_level_security"
const RequestCalloutDisabledValue = "request_callout_disabled"
const RequestDescriptionValue = "request_description"
const RequestExternalTableDisabledValue = "request_external_table_disabled"
const RequestImpersonationDisabledValue = "request_impersonation_disabled"
const RequestReadonlyValue = "request_readonly"
const RequestRemoteEntitiesDisabledValue = "request_remote_entities_disabled"
const RequestSandboxedExecutionDisabledValue = "request_sandboxed_execution_disabled"
const RequestUserValue = "request_user"
const TruncationMaxRecordsValue = "truncationmaxrecords"
const TruncationMaxSizeValue = "truncationmaxsize"
const ValidatePermissionsValue = "validate_permissions"
const V2NewlinesBetweenFramesValue = "results_v2_newlines_between_frames"
const V2FragmentPrimaryTablesValue = "results_v2_fragment_primary_tables"
const ResultsErrorReportingPlacementValue = "results_error_reporting_placement"
const ResultsErrorReportingPlacementInData = "in_data"
const ResultsErrorReportingPlacementEndOfTable = "end_of_table"
const ResultsErrorReportingPlacementEndOfDataset = "end_of_dataset"
// V2IoCapacity sets the size of the buffer, in frames, when reading from the network.
func V2IoCapacity(i int) QueryOption {
return func(q *queryOptions) error {
q.v2IoCapacity = i
return nil
}
}
// V2RowCapacity sets the capacity of the buffer of data rows per table.
func V2RowCapacity(i int) QueryOption {
return func(q *queryOptions) error {
q.v2RowCapacity = i
return nil
}
}
// V2TableCapacity sets the capacity of the buffer of data fragments in the result set.
func V2TableCapacity(i int) QueryOption {
return func(q *queryOptions) error {
q.v2TableCapacity = i
return nil
}
}
// V2NewlinesBetweenFrames Adds new lines between frames in the results, in order to make it easier to parse them.
func V2NewlinesBetweenFrames() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[V2NewlinesBetweenFramesValue] = true
return nil
}
}
// V2FragmentPrimaryTables Causes primary tables to be sent in multiple fragments, each containing a subset of the rows.
func V2FragmentPrimaryTables() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[V2FragmentPrimaryTablesValue] = true
return nil
}
}
// ResultsErrorReportingPlacement Decides the placement of errors in the result set:
// 1. "in_data" (default) - errors are placed in the table or table fragment, within the array of data rows.
// 2. "end_of_table" - errors are placed in the table completion frame, after the array of data rows. Only applies to queries that are progressive or fragmented.
// 3. "end_of_dataset" - errors are placed in the dataset completion frame.
func ResultsErrorReportingPlacement(s string) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[ResultsErrorReportingPlacementValue] = s
return nil
}
}
// ClientRequestID sets the x-ms-client-request-id header, and can be used to identify the request in the `.show queries` output.
func ClientRequestID(clientRequestID string) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.ClientRequestID = clientRequestID
return nil
}
}
// Application sets the x-ms-app header, and can be used to identify the application making the request in the `.show queries` output.
func Application(appName string) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Application = appName
return nil
}
}
// QueryParameters sets the parameters to be used in the query.
func QueryParameters(queryParameters *kql.Parameters) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.QueryParameters = *queryParameters
q.requestProperties.Parameters = queryParameters.ToParameterCollection()
return nil
}
}
// User sets the x-ms-user header, and can be used to identify the user making the request in the `.show queries` output.
func User(userName string) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.User = userName
return nil
}
}
// NoRequestTimeout enables setting the request timeout to its maximum value.
func NoRequestTimeout() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[NoRequestTimeoutValue] = true
return nil
}
}
// NoTruncation enables suppressing truncation of the query results returned to the caller.
func NoTruncation() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[NoTruncationValue] = true
return nil
}
}
// ResultsProgressiveEnabled enables the progressive query stream.
func ResultsProgressiveEnabled() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[ResultsProgressiveEnabledValue] = true
return nil
}
}
// ServerTimeout overrides the default request timeout.
func ServerTimeout(d time.Duration) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[ServerTimeoutValue] = value.TimespanString(d)
return nil
}
}
// CustomQueryOption exists to allow a QueryOption that is not defined in the Go SDK, as all options
// are not defined. Please Note: you should always use the type safe options provided below when available.
// Also note that Kusto does not error on non-existent parameter names or bad values, it simply doesn't
// work as expected.
func CustomQueryOption(paramName string, i interface{}) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[paramName] = i
return nil
}
}
// DeferPartialQueryFailures disables reporting partial query failures as part of the result set.
func DeferPartialQueryFailures() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[DeferPartialQueryFailuresValue] = true
return nil
}
}
// MaxMemoryConsumptionPerQueryPerNode overrides the default maximum amount of memory a whole query
// may allocate per node.
func MaxMemoryConsumptionPerQueryPerNode(i uint64) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[MaxMemoryConsumptionPerQueryPerNodeValue] = i
return nil
}
}
// MaxMemoryConsumptionPerIterator overrides the default maximum amount of memory a query operator may allocate.
func MaxMemoryConsumptionPerIterator(i uint64) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[MaxMemoryConsumptionPerIteratorValue] = i
return nil
}
}
// MaxOutputColumns overrides the default maximum number of columns a query is allowed to produce.
func MaxOutputColumns(i int) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[MaxOutputColumnsValue] = i
return nil
}
}
// PushSelectionThroughAggregation will push simple selection through aggregation .
func PushSelectionThroughAggregation() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[PushSelectionThroughAggregationValue] = true
return nil
}
}
// QueryCursorAfterDefault sets the default parameter value of the cursor_after() function when
// called without parameters.
func QueryCursorAfterDefault(s string) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryCursorAfterDefaultValue] = s
return nil
}
}
// QueryCursorBeforeOrAtDefault sets the default parameter value of the cursor_before_or_at() function when called
// without parameters.
func QueryCursorBeforeOrAtDefault(s string) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryCursorBeforeOrAtDefaultValue] = s
return nil
}
}
// QueryCursorCurrent overrides the cursor value returned by the cursor_current() or current_cursor() functions.
func QueryCursorCurrent(s string) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryCursorCurrentValue] = s
return nil
}
}
// QueryCursorDisabled overrides the cursor value returned by the cursor_current() or current_cursor() functions.
func QueryCursorDisabled(s string) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryCursorDisabledValue] = s
return nil
}
}
// QueryCursorScopedTables is a list of table names that should be scoped to cursor_after_default ..
// cursor_before_or_at_default (upper bound is optional).
func QueryCursorScopedTables(l []string) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryCursorScopedTablesValue] = l
return nil
}
}
// DataScope is used with QueryDataScope() to control a query's datascope.
type DataScope interface {
isDataScope()
}
type dataScope string
func (dataScope) isDataScope() {}
const (
// DSDefault is used to set a query's datascope to default.
DSDefault dataScope = "default"
// DSAll is used to set a query's datascope to all.
DSAll dataScope = "all"
// DSHotCache is used to set a query's datascope to hotcache.
DSHotCache dataScope = "hotcache"
)
// QueryDataScope controls the query's datascope -- whether the query applies to all data or
// just part of it. ['default', 'all', or 'hotcache']
func QueryDataScope(ds DataScope) QueryOption {
if ds == nil {
return func(q *queryOptions) error {
return nil
}
}
return func(q *queryOptions) error {
q.requestProperties.Options[QueryDatascopeValue] = string(ds.(dataScope))
return nil
}
}
// QueryDateTimeScopeColumn controls the column name for the query's datetime scope
// (query_datetimescope_to / query_datetimescope_from)
func QueryDateTimeScopeColumn(s string) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryDateTimeScopeColumnValue] = s
return nil
}
}
// QueryDateTimeScopeFrom controls the query's datetime scope (earliest) -- used as auto-applied filter on
// query_datetimescope_column only (if defined).
func QueryDateTimeScopeFrom(t time.Time) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryDateTimeScopeFromValue] = t.Format(time.RFC3339Nano)
return nil
}
}
// QueryDateTimeScopeTo controls the query's datetime scope (latest) -- used as auto-applied filter on
// query_datetimescope_column only (if defined).
func QueryDateTimeScopeTo(t time.Time) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryDateTimeScopeToValue] = t.Format(time.RFC3339Nano)
return nil
}
}
// ClientMaxRedirectCount If set and positive, indicates the maximum number of HTTP redirects that the client will process.
func ClientMaxRedirectCount(i int64) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[ClientMaxRedirectCountValue] = i
return nil
}
}
// MaterializedViewShuffle A hint to use shuffle strategy for materialized views that are referenced in the query.
// The property is an array of materialized views names and the shuffle keys to use.
// Examples: 'dynamic([ { "Name": "V1", "Keys" : [ "K1", "K2" ] } ])' (shuffle view V1 by K1, K2) or 'dynamic([ { "Name": "V1" } ])' (shuffle view V1 by all keys)
func MaterializedViewShuffle(s string) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[MaterializedViewShuffleValue] = s
return nil
}
}
// QueryBinAutoAt When evaluating the bin_auto() function, the start value to use.
func QueryBinAutoAt(s string) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryBinAutoAtValue] = s
return nil
}
}
// QueryBinAutoSize When evaluating the bin_auto() function, the bin size value to use.
func QueryBinAutoSize(s string) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryBinAutoSizeValue] = s
return nil
}
}
// QueryDistributionNodesSpan If set, controls the way the subquery merge behaves: the executing node will introduce an additional
// level in the query hierarchy for each subgroup of nodes; the size of the subgroup is set by this option.
func QueryDistributionNodesSpan(i int64) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryDistributionNodesSpanValue] = i
return nil
}
}
// QueryFanoutNodesPercent The percentage of nodes to fan out execution to.
func QueryFanoutNodesPercent(i int) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryFanoutNodesPercentValue] = i
return nil
}
}
// QueryFanoutThreadsPercent The percentage of threads to fan out execution to.
func QueryFanoutThreadsPercent(i int) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryFanoutThreadsPercentValue] = i
return nil
}
}
// QueryForceRowLevelSecurity If specified, forces Row Level Security rules, even if row_level_security policy is disabled
func QueryForceRowLevelSecurity() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryForceRowLevelSecurityValue] = true
return nil
}
}
// QueryLanguage Controls how the query text is to be interpreted (Kql or Sql).
func QueryLanguage(s string) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryLanguageValue] = s
return nil
}
}
// QueryLogQueryParameters Enables logging of the query parameters, so that they can be viewed later in the .show queries journal.
func QueryLogQueryParameters() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryLogQueryParametersValue] = true
return nil
}
}
// QueryMaxEntitiesInUnion Overrides the default maximum number of entities in a union.
func QueryMaxEntitiesInUnion(i int64) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryMaxEntitiesInUnionValue] = i
return nil
}
}
// QueryNow Overrides the datetime value returned by the now(0s) function.
func QueryNow(t time.Time) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryNowValue] = t.Format(time.RFC3339Nano)
return nil
}
}
// QueryPythonDebug If set, generate python debug query for the enumerated python node (default first).
func QueryPythonDebug(i int) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryPythonDebugValue] = i
return nil
}
}
// QueryResultsApplyGetschema If set, retrieves the schema of each tabular data in the results of the query instead of the data itself.
func QueryResultsApplyGetschema() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryResultsApplyGetschemaValue] = true
return nil
}
}
// QueryResultsCacheMaxAge If positive, controls the maximum age of the cached query results the service is allowed to return
func QueryResultsCacheMaxAge(d time.Duration) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryResultsCacheMaxAgeValue] = value.TimespanString(d)
return nil
}
}
// QueryResultsCachePerShard If set, enables per-shard query cache.
func QueryResultsCachePerShard() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryResultsCachePerShardValue] = true
return nil
}
}
// QueryResultsProgressiveRowCount Hint for Kusto as to how many records to send in each update (takes effect only if OptionResultsProgressiveEnabled is set)
func QueryResultsProgressiveRowCount(i int64) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryResultsProgressiveRowCountValue] = i
return nil
}
}
// QueryResultsProgressiveUpdatePeriod Hint for Kusto as to how often to send progress frames (takes effect only if OptionResultsProgressiveEnabled is set)
func QueryResultsProgressiveUpdatePeriod(i int32) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryResultsProgressiveUpdatePeriodValue] = i
return nil
}
}
// QueryTakeMaxRecords Enables limiting query results to this number of records.
func QueryTakeMaxRecords(i int64) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryTakeMaxRecordsValue] = i
return nil
}
}
// QueryConsistency Controls query consistency
func QueryConsistency(c string) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[QueryConsistencyValue] = c
return nil
}
}
// RequestAppName Request application name to be used in the reporting (e.g. show queries).
// Does not set the `Application` property in `.show queries`, see `Application` for that.
func RequestAppName(s string) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[RequestAppNameValue] = s
return nil
}
}
// RequestBlockRowLevelSecurity If specified, blocks access to tables for which row_level_security policy is enabled.
func RequestBlockRowLevelSecurity() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[RequestBlockRowLevelSecurityValue] = true
return nil
}
}
// RequestCalloutDisabled If specified, indicates that the request can't call-out to a user-provided service.
func RequestCalloutDisabled() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[RequestCalloutDisabledValue] = true
return nil
}
}
// RequestDescription Arbitrary text that the author of the request wants to include as the request description.
func RequestDescription(s string) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[RequestDescriptionValue] = s
return nil
}
}
// RequestExternalTableDisabled If specified, indicates that the request can't invoke code in the ExternalTable.
func RequestExternalTableDisabled() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[RequestExternalTableDisabledValue] = true
return nil
}
}
// RequestImpersonationDisabled If specified, indicates that the service should not impersonate the caller's identity.
func RequestImpersonationDisabled() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[RequestImpersonationDisabledValue] = true
return nil
}
}
// RequestReadonly If specified, indicates that the request can't write anything.
func RequestReadonly() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[RequestReadonlyValue] = true
return nil
}
}
// RequestRemoteEntitiesDisabled If specified, indicates that the request can't access remote databases and clusters.
func RequestRemoteEntitiesDisabled() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[RequestRemoteEntitiesDisabledValue] = true
return nil
}
}
// RequestSandboxedExecutionDisabled If specified, indicates that the request can't invoke code in the sandbox.
func RequestSandboxedExecutionDisabled() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[RequestSandboxedExecutionDisabledValue] = true
return nil
}
}
// RequestUser Request user to be used in the reporting (e.g. show queries).
// Does not set the `User` property in `.show queries`, see `User` for that.
func RequestUser(s string) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[RequestUserValue] = s
return nil
}
}
// TruncationMaxRecords Overrides the default maximum number of records a query is allowed to return to the caller (truncation).
func TruncationMaxRecords(i int64) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[TruncationMaxRecordsValue] = i
return nil
}
}
// TruncationMaxSize Overrides the default maximum data size a query is allowed to return to the caller (truncation).
func TruncationMaxSize(i int64) QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[TruncationMaxSizeValue] = i
return nil
}
}
// ValidatePermissions Validates user's permissions to perform the query and doesn't run the query itself.
func ValidatePermissions() QueryOption {
return func(q *queryOptions) error {
q.requestProperties.Options[ValidatePermissionsValue] = true
return nil
}
}