This repository has been archived by the owner on Feb 11, 2022. It is now read-only.
forked from aerospike/aerospike-client-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
statement.go
137 lines (118 loc) · 4.16 KB
/
statement.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// Copyright 2013-2020 Aerospike, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aerospike
import xornd "github.com/aerospike/aerospike-client-go/types/rand"
// Statement encapsulates query statement parameters.
type Statement struct {
// Namespace determines query Namespace
Namespace string
// SetName determines query Set name (Optional)
SetName string
// IndexName determines query index name (Optional)
// If not set, the server will determine the index from the filter's bin name.
IndexName string
// BinNames detemines bin names (optional)
BinNames []string
// Filter determines query index filter (Optional).
// This filter is applied to the secondary index on query.
// Query index filters must reference a bin which has a secondary index defined.
Filter *Filter
packageName string
functionName string
functionArgs []Value
// Ordered list of predicate expressions
predExps []PredExp
// TaskId determines query task id. (Optional)
TaskId uint64
// determines if the query should return data
returnData bool
}
// NewStatement initializes a new Statement instance.
func NewStatement(ns string, set string, binNames ...string) *Statement {
return &Statement{
Namespace: ns,
SetName: set,
BinNames: binNames,
returnData: true,
TaskId: uint64(xornd.Int64()),
}
}
// SetFilter Sets a filter for the statement.
// Aerospike Server currently only supports using a single filter per statement/query.
func (stmt *Statement) SetFilter(filter *Filter) error {
stmt.Filter = filter
return nil
}
// SetPredExp sets low-level predicate expressions for the statement in postfix notation.
// Supported only by Aerospike Server v3.12+.
// Predicate expression filters are applied on the query results on the server.
// Predicate expression filters may occur on any bin in the record.
// To learn how to use this API, consult predexp_test.go file.
//
// Postfix notation is described here: http://wiki.c2.com/?PostfixNotation
//
// Example: (c >= 11 and c <= 20) or (d > 3 and (d < 5)
//
// stmt.SetPredExp(
// NewPredExpIntegerValue(11),
// NewPredExpIntegerBin("c"),
// NewPredExpIntegerGreaterEq(),
// NewPredExpIntegerValue(20),
// NewPredExpIntegerBin("c"),
// NewPredExpIntegerLessEq(),
// NewPredExpAnd(2),
// NewPredExpIntegerValue(3),
// NewPredExpIntegerBin("d"),
// NewPredExpIntegerGreater(),
// NewPredExpIntegerValue(5),
// NewPredExpIntegerBin("d"),
// NewPredExpIntegerLess(),
// NewPredExpAnd(2),
// NewPredExpOr(2)
// );
//
// // Record last update time > 2017-01-15
// stmt.SetPredExp(
// NewIntegerValue(time.Date(2017, 0, 15, 0, 0, 0, 0, time.UTC).UnixNano()),
// NewPredExpLastUpdate(),
// NewPredExpIntegerGreater(),
// );
func (stmt *Statement) SetPredExp(predexp ...PredExp) error {
stmt.predExps = predexp
return nil
}
// SetAggregateFunction sets aggregation function parameters.
// This function will be called on both the server
// and client for each selected item.
func (stmt *Statement) SetAggregateFunction(packageName string, functionName string, functionArgs []Value, returnData bool) {
stmt.packageName = packageName
stmt.functionName = functionName
stmt.functionArgs = functionArgs
stmt.returnData = returnData
}
// IsScan determines is the Statement is a full namespace/set scan or a selective Query.
func (stmt *Statement) IsScan() bool {
return stmt.Filter == nil
}
// Always set the taskID client-side to a non-zero random value
func (stmt *Statement) setTaskID() {
for stmt.TaskId == 0 {
stmt.TaskId = uint64(xornd.Int64())
}
}
// Always set the taskID client-side to a non-zero random value
func (stmt *Statement) prepare(returnData bool) {
stmt.returnData = returnData
stmt.setTaskID()
}