aerospike 2.19.0 → 2.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +354 -244
- data/lib/aerospike/atomic/atomic.rb +1 -1
- data/lib/aerospike/cdt/context.rb +137 -70
- data/lib/aerospike/cdt/list_return_type.rb +4 -0
- data/lib/aerospike/cdt/map_operation.rb +6 -6
- data/lib/aerospike/cdt/map_policy.rb +16 -2
- data/lib/aerospike/cdt/map_return_type.rb +13 -1
- data/lib/aerospike/client.rb +137 -115
- data/lib/aerospike/cluster/create_connection.rb +1 -1
- data/lib/aerospike/cluster.rb +41 -4
- data/lib/aerospike/command/admin_command.rb +368 -52
- data/lib/aerospike/command/batch_index_command.rb +4 -8
- data/lib/aerospike/command/batch_index_exists_command.rb +1 -1
- data/lib/aerospike/command/batch_index_node.rb +1 -1
- data/lib/aerospike/command/batch_item.rb +1 -1
- data/lib/aerospike/command/command.rb +180 -123
- data/lib/aerospike/command/field_type.rb +25 -24
- data/lib/aerospike/command/login_command.rb +164 -0
- data/lib/aerospike/command/multi_command.rb +25 -2
- data/lib/aerospike/command/operate_args.rb +99 -0
- data/lib/aerospike/command/operate_command.rb +6 -11
- data/lib/aerospike/command/read_command.rb +2 -2
- data/lib/aerospike/connection/authenticate.rb +36 -3
- data/lib/aerospike/exp/exp.rb +1329 -0
- data/lib/aerospike/exp/exp_bit.rb +388 -0
- data/lib/aerospike/exp/exp_hll.rb +169 -0
- data/lib/aerospike/exp/exp_list.rb +403 -0
- data/lib/aerospike/exp/exp_map.rb +493 -0
- data/lib/aerospike/exp/operation.rb +56 -0
- data/lib/aerospike/features.rb +22 -9
- data/lib/aerospike/host/parse.rb +2 -2
- data/lib/aerospike/key.rb +10 -1
- data/lib/aerospike/node/refresh/info.rb +1 -1
- data/lib/aerospike/node/verify/name.rb +1 -1
- data/lib/aerospike/node/verify/partition_generation.rb +1 -1
- data/lib/aerospike/node/verify/peers_generation.rb +1 -1
- data/lib/aerospike/node/verify/rebalance_generation.rb +1 -1
- data/lib/aerospike/node_validator.rb +6 -1
- data/lib/aerospike/operation.rb +20 -22
- data/lib/aerospike/policy/auth_mode.rb +36 -0
- data/lib/aerospike/policy/client_policy.rb +4 -1
- data/lib/aerospike/policy/policy.rb +29 -13
- data/lib/aerospike/policy/query_policy.rb +35 -2
- data/lib/aerospike/policy/scan_policy.rb +19 -2
- data/lib/aerospike/privilege.rb +133 -0
- data/lib/aerospike/query/filter.rb +44 -32
- data/lib/aerospike/query/node_partitions.rb +39 -0
- data/lib/aerospike/query/partition_filter.rb +66 -0
- data/lib/aerospike/{command/roles.rb → query/partition_status.rb} +16 -19
- data/lib/aerospike/query/partition_tracker.rb +347 -0
- data/lib/aerospike/query/query_command.rb +20 -10
- data/lib/aerospike/query/query_executor.rb +71 -0
- data/lib/aerospike/query/query_partition_command.rb +267 -0
- data/lib/aerospike/query/recordset.rb +9 -9
- data/lib/aerospike/query/scan_command.rb +3 -2
- data/lib/aerospike/query/scan_executor.rb +71 -0
- data/lib/aerospike/query/scan_partition_command.rb +49 -0
- data/lib/aerospike/query/statement.rb +8 -1
- data/lib/aerospike/query/stream_command.rb +17 -0
- data/lib/aerospike/result_code.rb +83 -8
- data/lib/aerospike/role.rb +55 -0
- data/lib/aerospike/task/execute_task.rb +19 -16
- data/lib/aerospike/task/index_task.rb +1 -1
- data/lib/aerospike/user_role.rb +26 -1
- data/lib/aerospike/utils/buffer.rb +93 -29
- data/lib/aerospike/utils/packer.rb +7 -6
- data/lib/aerospike/utils/pool.rb +1 -1
- data/lib/aerospike/value/particle_type.rb +1 -12
- data/lib/aerospike/value/value.rb +35 -60
- data/lib/aerospike/version.rb +1 -1
- data/lib/aerospike.rb +156 -136
- metadata +24 -6
@@ -40,6 +40,7 @@ module Aerospike
|
|
40
40
|
|
41
41
|
def get_hosts(address)
|
42
42
|
aliases = [get_alias(address, host.port)]
|
43
|
+
res = []
|
43
44
|
|
44
45
|
begin
|
45
46
|
conn = Cluster::CreateConnection.(@cluster, Host.new(address, host.port, host.tls_name))
|
@@ -61,11 +62,15 @@ module Aerospike
|
|
61
62
|
unless is_loopback?(address)
|
62
63
|
aliases = info_map[address_command].split(',').map { |addr| get_alias(*addr.split(':')) }
|
63
64
|
end
|
65
|
+
|
66
|
+
res = aliases.map { |al| Host.new(al[:address], al[:port], host.tls_name) }
|
67
|
+
rescue
|
68
|
+
# we don't care about the actual connection error; Just need to continue
|
64
69
|
ensure
|
65
70
|
conn.close if conn
|
66
71
|
end
|
67
72
|
|
68
|
-
|
73
|
+
res
|
69
74
|
end
|
70
75
|
|
71
76
|
def get_alias(address, port)
|
data/lib/aerospike/operation.rb
CHANGED
@@ -14,30 +14,30 @@
|
|
14
14
|
# License for the specific language governing permissions and limitations under
|
15
15
|
# the License.
|
16
16
|
|
17
|
-
require
|
17
|
+
require "aerospike/value/value"
|
18
18
|
|
19
19
|
module Aerospike
|
20
|
-
|
21
20
|
class Operation
|
22
|
-
|
23
21
|
attr_reader :op_type, :bin_name, :bin_value, :ctx
|
24
22
|
|
25
|
-
READ
|
23
|
+
READ = 1
|
26
24
|
READ_HEADER = 1
|
27
|
-
WRITE
|
28
|
-
CDT_READ
|
29
|
-
CDT_MODIFY
|
30
|
-
ADD
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
25
|
+
WRITE = 2
|
26
|
+
CDT_READ = 3
|
27
|
+
CDT_MODIFY = 4
|
28
|
+
ADD = 5
|
29
|
+
EXP_READ = 7
|
30
|
+
EXP_MODIFY = 8
|
31
|
+
APPEND = 9
|
32
|
+
PREPEND = 10
|
33
|
+
TOUCH = 11
|
34
|
+
BIT_READ = 12
|
35
|
+
BIT_MODIFY = 13
|
36
|
+
DELETE = 14
|
37
|
+
HLL_READ = 15
|
38
|
+
HLL_MODIFY = 16
|
39
|
+
|
40
|
+
def initialize(op_type, bin_name = nil, bin_value = NullValue.new, ctx = nil)
|
41
41
|
@op_type = op_type
|
42
42
|
@bin_name = bin_name
|
43
43
|
@bin_value = Value.of(bin_value)
|
@@ -49,11 +49,11 @@ module Aerospike
|
|
49
49
|
Aerospike::Bin.new(bin_name, bin_value) if bin_name && bin_value
|
50
50
|
end
|
51
51
|
|
52
|
-
def self.get(bin_name=nil)
|
52
|
+
def self.get(bin_name = nil)
|
53
53
|
Operation.new(READ, bin_name)
|
54
54
|
end
|
55
55
|
|
56
|
-
def self.get_header(bin_name=nil)
|
56
|
+
def self.get_header(bin_name = nil)
|
57
57
|
Operation.new(READ_HEADER, bin_name)
|
58
58
|
end
|
59
59
|
|
@@ -80,7 +80,5 @@ module Aerospike
|
|
80
80
|
def self.delete
|
81
81
|
Operation.new(DELETE)
|
82
82
|
end
|
83
|
-
|
84
83
|
end
|
85
|
-
|
86
84
|
end # module
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# Copyright 2014-2020 Aerospike, Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http:#www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
module Aerospike
|
17
|
+
|
18
|
+
module AuthMode
|
19
|
+
|
20
|
+
# INTERNAL uses internal authentication only when user/password defined. Hashed password is stored
|
21
|
+
# on the server. Do not send clear password. This is the default.
|
22
|
+
INTERNAL = 0
|
23
|
+
|
24
|
+
# EXTERNAL uses external authentication (like LDAP) when user/password defined. Specific external authentication is
|
25
|
+
# configured on server. If TLS is defined, sends clear password on node login via TLS.
|
26
|
+
# Will raise exception if TLS is not defined.
|
27
|
+
EXTERNAL = 1
|
28
|
+
|
29
|
+
# PKI allows authentication and authorization based on a certificate. No user name or
|
30
|
+
# password needs to be configured. Requires TLS and a client certificate.
|
31
|
+
# Requires server version 5.7.0+
|
32
|
+
PKI = 2
|
33
|
+
|
34
|
+
end # module
|
35
|
+
|
36
|
+
end # module
|
@@ -22,7 +22,7 @@ module Aerospike
|
|
22
22
|
# Container object for client policy command.
|
23
23
|
class ClientPolicy
|
24
24
|
|
25
|
-
attr_accessor :user, :password
|
25
|
+
attr_accessor :user, :password, :auth_mode
|
26
26
|
attr_accessor :timeout, :connection_queue_size, :fail_if_not_connected, :tend_interval
|
27
27
|
attr_accessor :cluster_name
|
28
28
|
attr_accessor :tls
|
@@ -44,6 +44,9 @@ module Aerospike
|
|
44
44
|
# which the client checks for cluster state changes. Minimum interval is 10ms.
|
45
45
|
self.tend_interval = opt[:tend_interval] || 1000 # 1 second
|
46
46
|
|
47
|
+
# Authentication mode
|
48
|
+
@auth_mode = opt[:auth_mode] || AuthMode::INTERNAL
|
49
|
+
|
47
50
|
# user name
|
48
51
|
@user = opt[:user]
|
49
52
|
|
@@ -13,23 +13,44 @@
|
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
15
|
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
19
|
-
|
16
|
+
require "aerospike/policy/priority"
|
17
|
+
require "aerospike/policy/consistency_level"
|
18
|
+
require "aerospike/policy/replica"
|
20
19
|
|
21
20
|
module Aerospike
|
22
21
|
|
23
22
|
# Container object for client policy command.
|
24
23
|
class Policy
|
25
|
-
|
26
|
-
attr_accessor :priority, :timeout, :max_retries, :sleep_between_retries, :consistency_level,
|
24
|
+
attr_accessor :filter_exp, :priority, :timeout, :max_retries, :sleep_between_retries, :consistency_level,
|
27
25
|
:predexp, :fail_on_filtered_out, :replica, :use_compression
|
28
26
|
|
29
|
-
|
27
|
+
alias total_timeout timeout
|
28
|
+
alias total_timeout= timeout=
|
29
|
+
|
30
|
+
def initialize(opt = {})
|
30
31
|
# Container object for transaction policy attributes used in all database
|
31
32
|
# operation calls.
|
32
33
|
|
34
|
+
# Optional expression filter. If filterExp exists and evaluates to false, the
|
35
|
+
# transaction is ignored.
|
36
|
+
#
|
37
|
+
# Default: nil
|
38
|
+
#
|
39
|
+
# ==== Examples:
|
40
|
+
#
|
41
|
+
# p = Policy.new
|
42
|
+
# p.filter_exp = Exp.build(Exp.eq(Exp.int_bin("a"), Exp.int_val(11)));
|
43
|
+
@filter_exp = opt[:filter_exp]
|
44
|
+
|
45
|
+
# Throw exception if {#filter_exp} is defined and that filter evaluates
|
46
|
+
# to false (transaction ignored). The {AerospikeException}
|
47
|
+
# will contain result code {ResultCode::FILTERED_OUT}.
|
48
|
+
#
|
49
|
+
# This field is not applicable to batch, scan or query commands.
|
50
|
+
#
|
51
|
+
# Default: false
|
52
|
+
@fail_on_filtered_out = opt[:fail_on_filtered_out] || false
|
53
|
+
|
33
54
|
# Priority of request relative to other transactions.
|
34
55
|
# Currently, only used for scans.
|
35
56
|
@priority = opt[:priority] || Priority::DEFAULT
|
@@ -71,7 +92,6 @@ module Aerospike
|
|
71
92
|
# ]
|
72
93
|
@predexp = opt[:predexp] || nil
|
73
94
|
|
74
|
-
|
75
95
|
# Throw exception if @predexp is defined and that filter evaluates
|
76
96
|
# to false (transaction ignored). The Aerospike::Exceptions::Aerospike
|
77
97
|
# will contain result code Aerospike::ResultCode::FILTERED_OUT.
|
@@ -83,9 +103,8 @@ module Aerospike
|
|
83
103
|
# read operation.
|
84
104
|
@consistency_level = opt[:consistency_level] || Aerospike::ConsistencyLevel::CONSISTENCY_ONE
|
85
105
|
|
86
|
-
|
87
106
|
# Send read commands to the node containing the key's partition replica type.
|
88
|
-
# Write commands are not affected by this setting, because all writes are directed
|
107
|
+
# Write commands are not affected by this setting, because all writes are directed
|
89
108
|
# to the node containing the key's master partition.
|
90
109
|
#
|
91
110
|
# Default to sending read commands to the node containing the key's master partition.
|
@@ -115,8 +134,5 @@ module Aerospike
|
|
115
134
|
# timeout was not exceeded. Enter zero to skip sleep.
|
116
135
|
@sleep_between_retries = opt[:sleep_between_retries] || 0.5
|
117
136
|
end
|
118
|
-
|
119
|
-
|
120
137
|
end # class
|
121
|
-
|
122
138
|
end # module
|
@@ -22,20 +22,45 @@ module Aerospike
|
|
22
22
|
# Container object for query policy command.
|
23
23
|
class QueryPolicy < Policy
|
24
24
|
|
25
|
+
attr_accessor :concurrent_nodes
|
26
|
+
attr_accessor :max_records
|
25
27
|
attr_accessor :include_bin_data
|
26
28
|
attr_accessor :record_queue_size
|
27
29
|
attr_accessor :records_per_second
|
30
|
+
attr_accessor :socket_timeout
|
31
|
+
attr_accessor :short_query
|
28
32
|
|
29
33
|
def initialize(opt={})
|
30
34
|
super(opt)
|
31
35
|
|
32
|
-
@max_retries = 0
|
33
|
-
|
34
36
|
# Indicates if bin data is retrieved. If false, only record digests (and
|
35
37
|
# user keys if stored on the server) are retrieved.
|
36
38
|
# Default is true.
|
37
39
|
@include_bin_data = opt.fetch(:include_bin_data, true)
|
38
40
|
|
41
|
+
# Approximates the number of records to return to the client. This number is divided by the
|
42
|
+
# number of nodes involved in the query. The actual number of records returned
|
43
|
+
# may be less than MaxRecords if node record counts are small and unbalanced across
|
44
|
+
# nodes.
|
45
|
+
#
|
46
|
+
# This field is supported on server versions >= 4.9.
|
47
|
+
#
|
48
|
+
# Default: 0 (do not limit record count)
|
49
|
+
@max_records = opt.fetch(:max_records) { 0 }
|
50
|
+
|
51
|
+
# Issue scan requests in parallel or serially.
|
52
|
+
@concurrent_nodes = opt.fetch(:concurrent_nodes) { true }
|
53
|
+
|
54
|
+
# Determines network timeout for each attempt.
|
55
|
+
#
|
56
|
+
# If socket_timeout is not zero and socket_timeout is reached before an attempt completes,
|
57
|
+
# the Timeout above is checked. If Timeout is not exceeded, the transaction
|
58
|
+
# is retried. If both socket_timeout and Timeout are non-zero, socket_timeout must be less
|
59
|
+
# than or equal to Timeout, otherwise Timeout will also be used for socket_timeout.
|
60
|
+
#
|
61
|
+
# Default: 30s
|
62
|
+
@socket_timeout = opt[:socket_timeout] || 30000
|
63
|
+
|
39
64
|
# Number of records to place in queue before blocking. Records received
|
40
65
|
# from multiple server nodes will be placed in a queue. A separate thread
|
41
66
|
# consumes these records in parallel. If the queue is full, the producer
|
@@ -49,6 +74,14 @@ module Aerospike
|
|
49
74
|
# Default is 0
|
50
75
|
@records_per_second = opt[:records_per_second] || 0
|
51
76
|
|
77
|
+
# Detemine wether query expected to return less than 100 records.
|
78
|
+
# If true, the server will optimize the query for a small record set.
|
79
|
+
# This field is ignored for aggregation queries, background queries
|
80
|
+
# and server versions 6.0+.
|
81
|
+
#
|
82
|
+
# Default: false
|
83
|
+
@short_query = opt[:short_query] ||false
|
84
|
+
|
52
85
|
self
|
53
86
|
end
|
54
87
|
|
@@ -22,6 +22,7 @@ module Aerospike
|
|
22
22
|
# Container object for scan policy command.
|
23
23
|
class ScanPolicy < Policy
|
24
24
|
|
25
|
+
attr_accessor :max_records
|
25
26
|
attr_accessor :scan_percent
|
26
27
|
attr_accessor :concurrent_nodes
|
27
28
|
attr_accessor :include_bin_data
|
@@ -33,7 +34,15 @@ module Aerospike
|
|
33
34
|
def initialize(opt={})
|
34
35
|
super(opt)
|
35
36
|
|
36
|
-
|
37
|
+
# Approximates the number of records to return to the client. This number is divided by the
|
38
|
+
# number of nodes involved in the query. The actual number of records returned
|
39
|
+
# may be less than MaxRecords if node record counts are small and unbalanced across
|
40
|
+
# nodes.
|
41
|
+
#
|
42
|
+
# This field is supported on server versions >= 4.9.
|
43
|
+
#
|
44
|
+
# Default: 0 (do not limit record count)
|
45
|
+
@max_records = opt.fetch(:max_records) { 0 }
|
37
46
|
|
38
47
|
# Percent of data to scan. Valid integer range is 1 to 100.
|
39
48
|
# Default is 100.
|
@@ -51,7 +60,15 @@ module Aerospike
|
|
51
60
|
# Default is true.
|
52
61
|
@fail_on_cluster_change = opt.fetch(:fail_on_cluster_change) { true }
|
53
62
|
|
54
|
-
|
63
|
+
# Determines network timeout for each attempt.
|
64
|
+
#
|
65
|
+
# If socket_timeout is not zero and socket_timeout is reached before an attempt completes,
|
66
|
+
# the Timeout above is checked. If Timeout is not exceeded, the transaction
|
67
|
+
# is retried. If both socket_timeout and Timeout are non-zero, socket_timeout must be less
|
68
|
+
# than or equal to Timeout, otherwise Timeout will also be used for socket_timeout.
|
69
|
+
#
|
70
|
+
# Default: 30s
|
71
|
+
@socket_timeout = opt[:socket_timeout] || 30000
|
55
72
|
|
56
73
|
# Number of records to place in queue before blocking. Records received
|
57
74
|
# from multiple server nodes will be placed in a queue. A separate thread
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# Copyright 2014-2022 Aerospike, Inc.
|
3
|
+
#
|
4
|
+
# Portions may be licensed to Aerospike, Inc. under one or more contributor
|
5
|
+
# license agreements.
|
6
|
+
#
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
8
|
+
# use this file except in compliance with the License. You may obtain a copy of
|
9
|
+
# the License at http:#www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
13
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
14
|
+
# License for the specific language governing permissions and limitations under
|
15
|
+
# the License.
|
16
|
+
|
17
|
+
module Aerospike
|
18
|
+
|
19
|
+
# Determines user access granularity.
|
20
|
+
class Privilege
|
21
|
+
|
22
|
+
# Role
|
23
|
+
attr_accessor :code
|
24
|
+
|
25
|
+
# Namespace determines namespace scope. Apply permission to this namespace only.
|
26
|
+
# If namespace is zero value, the privilege applies to all namespaces.
|
27
|
+
attr_accessor :namespace
|
28
|
+
|
29
|
+
# Set name scope. Apply permission to this set within namespace only.
|
30
|
+
# If set is zero value, the privilege applies to all sets within namespace.
|
31
|
+
attr_accessor :set_name
|
32
|
+
|
33
|
+
# Manage users and their roles.
|
34
|
+
USER_ADMIN = 'user-admin'
|
35
|
+
|
36
|
+
# Manage indicies, user-defined functions and server configuration.
|
37
|
+
SYS_ADMIN = 'sys-admin'
|
38
|
+
|
39
|
+
# Manage indicies and user defined functions.
|
40
|
+
DATA_ADMIN = 'data-admin'
|
41
|
+
|
42
|
+
# Manage user defined functions.
|
43
|
+
UDF_ADMIN = 'udf-admin'
|
44
|
+
|
45
|
+
# Manage indicies.
|
46
|
+
SINDEX_ADMIN = 'sindex-admin'
|
47
|
+
|
48
|
+
# Allow read, write and UDF transactions with the database.
|
49
|
+
READ_WRITE_UDF = "read-write-udf"
|
50
|
+
|
51
|
+
# Allow read and write transactions with the database.
|
52
|
+
READ_WRITE = 'read-write'
|
53
|
+
|
54
|
+
# Allow read transactions with the database.
|
55
|
+
READ = 'read'
|
56
|
+
|
57
|
+
# Write allows write transactions with the database.
|
58
|
+
WRITE = 'write'
|
59
|
+
|
60
|
+
# Truncate allow issuing truncate commands.
|
61
|
+
TRUNCATE = 'truncate'
|
62
|
+
|
63
|
+
def initialize(opt={})
|
64
|
+
@code = opt[:code]
|
65
|
+
@namespace = opt[:namespace]
|
66
|
+
@set_name = opt[:set_name]
|
67
|
+
end
|
68
|
+
|
69
|
+
def to_s
|
70
|
+
"code: #{@code}, namespace: #{@namespace}, set_name: #{@set_name}"
|
71
|
+
end
|
72
|
+
|
73
|
+
def to_code
|
74
|
+
case @code
|
75
|
+
when USER_ADMIN
|
76
|
+
0
|
77
|
+
when SYS_ADMIN
|
78
|
+
1
|
79
|
+
when DATA_ADMIN
|
80
|
+
2
|
81
|
+
when UDF_ADMIN
|
82
|
+
3
|
83
|
+
when SINDEX_ADMIN
|
84
|
+
4
|
85
|
+
when READ
|
86
|
+
10
|
87
|
+
when READ_WRITE
|
88
|
+
11
|
89
|
+
when READ_WRITE_UDF
|
90
|
+
12
|
91
|
+
when WRITE
|
92
|
+
13
|
93
|
+
when TRUNCATE
|
94
|
+
14
|
95
|
+
else
|
96
|
+
raise Exceptions::Aerospike.new(Aerospike::ResultCode::INVALID_PRIVILEGE, "Invalid role #{@code}")
|
97
|
+
end # case
|
98
|
+
end # def
|
99
|
+
|
100
|
+
def self.from(code)
|
101
|
+
case code
|
102
|
+
when 0
|
103
|
+
USER_ADMIN
|
104
|
+
when 1
|
105
|
+
SYS_ADMIN
|
106
|
+
when 2
|
107
|
+
DATA_ADMIN
|
108
|
+
when 3
|
109
|
+
UDF_ADMIN
|
110
|
+
when 4
|
111
|
+
SINDEX_ADMIN
|
112
|
+
when 10
|
113
|
+
READ
|
114
|
+
when 11
|
115
|
+
READ_WRITE
|
116
|
+
when 12
|
117
|
+
READ_WRITE_UDF
|
118
|
+
when 13
|
119
|
+
WRITE
|
120
|
+
when 14
|
121
|
+
TRUNCATE
|
122
|
+
else
|
123
|
+
raise Exceptions::Aerospike.new(Aerospike::ResultCode::INVALID_PRIVILEGE, "Invalid code #{code}")
|
124
|
+
end # case
|
125
|
+
end # def
|
126
|
+
|
127
|
+
def can_scope?
|
128
|
+
to_code >= 10
|
129
|
+
end
|
130
|
+
|
131
|
+
end # class
|
132
|
+
|
133
|
+
end
|
@@ -15,39 +15,51 @@
|
|
15
15
|
# the License.
|
16
16
|
|
17
17
|
module Aerospike
|
18
|
-
|
19
18
|
class Filter
|
19
|
+
attr_reader :packed_ctx
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
# open up the class to alias the class methods for naming consistency
|
22
|
+
class << self
|
23
|
+
def equal(bin_name, value, ctx: nil)
|
24
|
+
Filter.new(bin_name, value, value, nil, nil, ctx)
|
25
|
+
end
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
-
|
27
|
+
def contains(bin_name, value, col_type, ctx: nil)
|
28
|
+
Filter.new(bin_name, value, value, nil, col_type, ctx)
|
29
|
+
end
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
31
|
+
def range(bin_name, from, to, col_type = nil, ctx: nil)
|
32
|
+
Filter.new(bin_name, from, to, nil, col_type, ctx)
|
33
|
+
end
|
32
34
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
35
|
+
def geo_within_geo_region(bin_name, region, col_type = nil, ctx: nil)
|
36
|
+
region = region.to_json
|
37
|
+
Filter.new(bin_name, region, region, ParticleType::GEOJSON, col_type, ctx)
|
38
|
+
end
|
37
39
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
40
|
+
def geo_within_radius(bin_name, lon, lat, radius_meter, col_type = nil, ctx: nil)
|
41
|
+
region = GeoJSON.new({ type: "AeroCircle", coordinates: [[lon, lat], radius_meter] })
|
42
|
+
geo_within_geo_region(bin_name, region, col_type, ctx: ctx)
|
43
|
+
end
|
42
44
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
45
|
+
def geo_contains_geo_point(bin_name, point, col_type = nil, ctx: nil)
|
46
|
+
point = point.to_json
|
47
|
+
Filter.new(bin_name, point, point, ParticleType::GEOJSON, col_type, ctx)
|
48
|
+
end
|
47
49
|
|
48
|
-
|
49
|
-
|
50
|
-
|
50
|
+
def geo_contains_point(bin_name, lon, lat, col_type = nil, ctx: nil)
|
51
|
+
point = GeoJSON.new({ type: "Point", coordinates: [lon, lat] })
|
52
|
+
geo_contains_geo_point(bin_name, point, col_type, ctx: ctx)
|
53
|
+
end
|
54
|
+
|
55
|
+
# alias the old names for compatibility
|
56
|
+
alias :Equal :equal
|
57
|
+
alias :Contains :contains
|
58
|
+
alias :Range :range
|
59
|
+
alias :geoWithinGeoJSONRegion :geo_within_geo_region
|
60
|
+
alias :geoWithinRadius :geo_within_radius
|
61
|
+
alias :geoContainsGeoJSONPoint :geo_contains_geo_point
|
62
|
+
alias :geoContainsPoint :geo_contains_point
|
51
63
|
end
|
52
64
|
|
53
65
|
def estimate_size
|
@@ -56,21 +68,21 @@ module Aerospike
|
|
56
68
|
|
57
69
|
def write(buf, offset)
|
58
70
|
# Write name.
|
59
|
-
len = buf.write_binary(@name, offset+1)
|
71
|
+
len = buf.write_binary(@name, offset + 1)
|
60
72
|
buf.write_byte(len, offset)
|
61
73
|
offset += len + 1
|
62
74
|
|
63
75
|
# Write particle type.
|
64
76
|
buf.write_byte(@val_type, offset)
|
65
|
-
offset+=1
|
77
|
+
offset += 1
|
66
78
|
|
67
79
|
# Write filter begin.
|
68
|
-
len = @begin.write(buf, offset+4)
|
80
|
+
len = @begin.write(buf, offset + 4)
|
69
81
|
buf.write_int32(len, offset)
|
70
82
|
offset += len + 4
|
71
83
|
|
72
84
|
# Write filter end.
|
73
|
-
len = @end.write(buf, offset+4)
|
85
|
+
len = @end.write(buf, offset + 4)
|
74
86
|
buf.write_int32(len, offset)
|
75
87
|
offset += len + 4
|
76
88
|
|
@@ -98,7 +110,7 @@ module Aerospike
|
|
98
110
|
|
99
111
|
private
|
100
112
|
|
101
|
-
def initialize(bin_name, begin_value, end_value, val_type = nil, col_type = nil)
|
113
|
+
def initialize(bin_name, begin_value, end_value, val_type = nil, col_type = nil, ctx = nil)
|
102
114
|
@name = bin_name
|
103
115
|
@begin = Aerospike::Value.of(begin_value)
|
104
116
|
@end = Aerospike::Value.of(end_value)
|
@@ -107,8 +119,8 @@ module Aerospike
|
|
107
119
|
# but in certain cases caller can override the type.
|
108
120
|
@val_type = val_type || @begin.type
|
109
121
|
@col_type = col_type
|
110
|
-
end
|
111
122
|
|
123
|
+
@packed_ctx = CDT::Context.bytes(ctx)
|
124
|
+
end
|
112
125
|
end # class
|
113
|
-
|
114
126
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2014-2020 Aerospike, Inc.
|
4
|
+
#
|
5
|
+
# Portions may be licensed to Aerospike, Inc. under one or more contributor
|
6
|
+
# license agreements.
|
7
|
+
#
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
9
|
+
# use this file except in compliance with the License. You may obtain a copy of
|
10
|
+
# the License at http:#www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
14
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
15
|
+
# License for the specific language governing permissions and limitations under
|
16
|
+
# the License.
|
17
|
+
|
18
|
+
module Aerospike
|
19
|
+
class NodePartitions
|
20
|
+
attr_accessor :node, :parts_full, :parts_partial, :record_count, :record_max, :parts_unavailable
|
21
|
+
|
22
|
+
def initialize(node)
|
23
|
+
@node= node
|
24
|
+
@parts_full= []
|
25
|
+
@parts_partial= []
|
26
|
+
@record_count= 0
|
27
|
+
@parts_unavailable= 0
|
28
|
+
@record_max= 0
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_s
|
32
|
+
"Node #{@node.inspect}: full: #{@parts_full.length}, partial: #{@parts_partial.length}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_partition(partition_status)
|
36
|
+
partition_status.digest.nil? ? @parts_full << partition_status : @parts_partial << partition_status
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|