couchbase 3.4.1 → 3.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/ext/couchbase/CMakeLists.txt +2 -0
- data/ext/couchbase/cmake/ThirdPartyDependencies.cmake +4 -0
- data/ext/couchbase/core/cluster_options.hxx +0 -1
- data/ext/couchbase/core/config_profile.cxx +23 -1
- data/ext/couchbase/core/config_profile.hxx +2 -12
- data/ext/couchbase/core/impl/analytics.cxx +236 -0
- data/ext/couchbase/core/impl/cluster.cxx +0 -1
- data/ext/couchbase/core/impl/dns_srv_tracker.cxx +5 -3
- data/ext/couchbase/core/impl/query.cxx +5 -5
- data/ext/couchbase/core/io/dns_client.cxx +225 -0
- data/ext/couchbase/core/io/dns_client.hxx +19 -188
- data/ext/couchbase/core/transactions/active_transaction_record.hxx +2 -2
- data/ext/couchbase/core/transactions/attempt_context_impl.cxx +3 -0
- data/ext/couchbase/core/transactions/attempt_context_impl.hxx +1 -1
- data/ext/couchbase/core/transactions/internal/transaction_context.hxx +12 -12
- data/ext/couchbase/core/transactions/internal/transactions_cleanup.hxx +7 -1
- data/ext/couchbase/core/transactions/transaction_context.cxx +1 -0
- data/ext/couchbase/core/transactions/transactions_cleanup.cxx +144 -155
- data/ext/couchbase/core/utils/connection_string.cxx +10 -3
- data/ext/couchbase/core/utils/connection_string.hxx +3 -3
- data/ext/couchbase/couchbase/analytics_error_context.hxx +143 -0
- data/ext/couchbase/couchbase/analytics_meta_data.hxx +155 -0
- data/ext/couchbase/couchbase/analytics_metrics.hxx +163 -0
- data/ext/couchbase/couchbase/analytics_options.hxx +359 -0
- data/ext/couchbase/couchbase/analytics_result.hxx +102 -0
- data/ext/couchbase/couchbase/analytics_scan_consistency.hxx +46 -0
- data/ext/couchbase/couchbase/analytics_status.hxx +41 -0
- data/ext/couchbase/couchbase/analytics_warning.hxx +85 -0
- data/ext/couchbase/couchbase/cluster.hxx +33 -0
- data/ext/couchbase/couchbase/fmt/analytics_status.hxx +76 -0
- data/ext/couchbase/couchbase/query_options.hxx +0 -1
- data/ext/couchbase/couchbase/scope.hxx +33 -0
- data/ext/couchbase/couchbase/transactions/attempt_context.hxx +1 -1
- data/ext/couchbase/test/CMakeLists.txt +1 -2
- data/ext/couchbase/test/test_helper.hxx +1 -1
- data/ext/couchbase/test/test_integration_analytics.cxx +289 -13
- data/ext/couchbase/test/test_integration_crud.cxx +8 -1
- data/ext/couchbase/test/test_integration_examples.cxx +41 -0
- data/ext/couchbase/test/test_integration_management.cxx +15 -3
- data/ext/couchbase/test/test_integration_search.cxx +601 -0
- data/ext/couchbase/test/test_transaction_transaction_simple.cxx +73 -0
- data/ext/couchbase/test/test_unit_config_profiles.cxx +12 -12
- data/ext/couchbase/test/test_unit_connection_string.cxx +35 -0
- data/ext/couchbase/third_party/snappy/CMakeLists.txt +150 -27
- data/ext/couchbase/third_party/snappy/cmake/config.h.in +28 -24
- data/ext/couchbase/third_party/snappy/snappy-internal.h +189 -25
- data/ext/couchbase/third_party/snappy/snappy-sinksource.cc +26 -9
- data/ext/couchbase/third_party/snappy/snappy-sinksource.h +11 -11
- data/ext/couchbase/third_party/snappy/snappy-stubs-internal.cc +1 -1
- data/ext/couchbase/third_party/snappy/snappy-stubs-internal.h +227 -308
- data/ext/couchbase/third_party/snappy/snappy-stubs-public.h.in +0 -11
- data/ext/couchbase/third_party/snappy/snappy.cc +1176 -410
- data/ext/couchbase/third_party/snappy/snappy.h +19 -4
- data/ext/couchbase.cxx +27 -6
- data/ext/revisions.rb +3 -3
- data/lib/couchbase/cluster.rb +13 -9
- data/lib/couchbase/cluster_registry.rb +7 -2
- data/lib/couchbase/configuration.rb +3 -4
- data/lib/couchbase/options.rb +85 -2
- data/lib/couchbase/search_options.rb +158 -240
- data/lib/couchbase/version.rb +1 -1
- metadata +17 -6
- data/ext/couchbase/core/CMakeLists.txt +0 -0
@@ -0,0 +1,155 @@
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
2
|
+
/*
|
3
|
+
* Copyright 2020-Present Couchbase, Inc.
|
4
|
+
*
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
* you may not use this file except in compliance with the License.
|
7
|
+
* You may obtain a copy of the License at
|
8
|
+
*
|
9
|
+
* 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,
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
* See the License for the specific language governing permissions and
|
15
|
+
* limitations under the License.
|
16
|
+
*/
|
17
|
+
|
18
|
+
#pragma once
|
19
|
+
|
20
|
+
#include <couchbase/analytics_metrics.hxx>
|
21
|
+
#include <couchbase/analytics_status.hxx>
|
22
|
+
#include <couchbase/analytics_warning.hxx>
|
23
|
+
#include <couchbase/codec/json_transcoder.hxx>
|
24
|
+
|
25
|
+
#include <cinttypes>
|
26
|
+
#include <optional>
|
27
|
+
#include <vector>
|
28
|
+
|
29
|
+
namespace couchbase
|
30
|
+
{
|
31
|
+
|
32
|
+
/**
|
33
|
+
* Stores any non-rows results related to the execution of a particular Analytics query.
|
34
|
+
*
|
35
|
+
* @since 1.0.0
|
36
|
+
* @committed
|
37
|
+
*/
|
38
|
+
class analytics_meta_data
|
39
|
+
{
|
40
|
+
public:
|
41
|
+
/**
|
42
|
+
* @since 1.0.0
|
43
|
+
* @internal
|
44
|
+
*/
|
45
|
+
analytics_meta_data() = default;
|
46
|
+
|
47
|
+
/**
|
48
|
+
* @since 1.0.0
|
49
|
+
* @volatile
|
50
|
+
*/
|
51
|
+
analytics_meta_data(std::string request_id,
|
52
|
+
std::string client_context_id,
|
53
|
+
analytics_status status,
|
54
|
+
std::vector<analytics_warning> warnings,
|
55
|
+
analytics_metrics metrics,
|
56
|
+
std::optional<codec::binary> signature)
|
57
|
+
: request_id_{ std::move(request_id) }
|
58
|
+
, client_context_id_{ std::move(client_context_id) }
|
59
|
+
, status_{ status }
|
60
|
+
, warnings_{ std::move(warnings) }
|
61
|
+
, metrics_{ std::move(metrics) }
|
62
|
+
, signature_{ std::move(signature) }
|
63
|
+
{
|
64
|
+
}
|
65
|
+
|
66
|
+
/**
|
67
|
+
* Returns the request identifier string of the query request
|
68
|
+
*
|
69
|
+
* @return The request identifier string
|
70
|
+
*
|
71
|
+
* @since 1.0.0
|
72
|
+
* @committed
|
73
|
+
*/
|
74
|
+
[[nodiscard]] auto request_id() const -> const std::string&
|
75
|
+
{
|
76
|
+
return request_id_;
|
77
|
+
}
|
78
|
+
|
79
|
+
/**
|
80
|
+
* Returns the client context identifier string set on the query request.
|
81
|
+
*
|
82
|
+
* @return client context identifier
|
83
|
+
*
|
84
|
+
* @since 1.0.0
|
85
|
+
* @committed
|
86
|
+
*/
|
87
|
+
[[nodiscard]] auto client_context_id() const -> const std::string&
|
88
|
+
{
|
89
|
+
return client_context_id_;
|
90
|
+
}
|
91
|
+
|
92
|
+
/**
|
93
|
+
* Returns the raw query execution status as returned by the query engine
|
94
|
+
*
|
95
|
+
* @return query execution status
|
96
|
+
*
|
97
|
+
* @since 1.0.0
|
98
|
+
* @committed
|
99
|
+
*/
|
100
|
+
[[nodiscard]] auto status() const -> analytics_status
|
101
|
+
{
|
102
|
+
return status_;
|
103
|
+
}
|
104
|
+
|
105
|
+
/**
|
106
|
+
* Returns any warnings returned by the analytics engine.
|
107
|
+
*
|
108
|
+
* It returns an empty vector if no warnings were returned.
|
109
|
+
*
|
110
|
+
* @return vector of the reported warnings.
|
111
|
+
*
|
112
|
+
* @since 1.0.0
|
113
|
+
* @committed
|
114
|
+
*/
|
115
|
+
[[nodiscard]] auto warnings() const -> const std::vector<analytics_warning>&
|
116
|
+
{
|
117
|
+
return warnings_;
|
118
|
+
}
|
119
|
+
|
120
|
+
/**
|
121
|
+
* Returns the {@link analytics_metrics} as returned by the analytics engine if enabled.
|
122
|
+
*
|
123
|
+
* @return metrics
|
124
|
+
*
|
125
|
+
* @since 1.0.0
|
126
|
+
* @committed
|
127
|
+
*/
|
128
|
+
[[nodiscard]] auto metrics() const -> const analytics_metrics&
|
129
|
+
{
|
130
|
+
return metrics_;
|
131
|
+
}
|
132
|
+
|
133
|
+
/**
|
134
|
+
* Returns the signature as returned by the analytics engine.
|
135
|
+
*
|
136
|
+
* @return optional byte string containing JSON encoded signature
|
137
|
+
*
|
138
|
+
* @since 1.0.0
|
139
|
+
* @committed
|
140
|
+
*/
|
141
|
+
[[nodiscard]] auto signature() const -> const std::optional<codec::binary>&
|
142
|
+
{
|
143
|
+
return signature_;
|
144
|
+
}
|
145
|
+
|
146
|
+
private:
|
147
|
+
std::string request_id_{};
|
148
|
+
std::string client_context_id_{};
|
149
|
+
analytics_status status_{};
|
150
|
+
std::vector<analytics_warning> warnings_{};
|
151
|
+
analytics_metrics metrics_{};
|
152
|
+
std::optional<codec::binary> signature_{};
|
153
|
+
};
|
154
|
+
|
155
|
+
} // namespace couchbase
|
@@ -0,0 +1,163 @@
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
2
|
+
/*
|
3
|
+
* Copyright 2020-Present Couchbase, Inc.
|
4
|
+
*
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
* you may not use this file except in compliance with the License.
|
7
|
+
* You may obtain a copy of the License at
|
8
|
+
*
|
9
|
+
* 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,
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
* See the License for the specific language governing permissions and
|
15
|
+
* limitations under the License.
|
16
|
+
*/
|
17
|
+
|
18
|
+
#pragma once
|
19
|
+
|
20
|
+
#include <chrono>
|
21
|
+
#include <cinttypes>
|
22
|
+
|
23
|
+
namespace couchbase
|
24
|
+
{
|
25
|
+
|
26
|
+
/**
|
27
|
+
* Analytics Metrics contains the query result metrics containing counts and timings
|
28
|
+
*
|
29
|
+
* @since 1.0.0
|
30
|
+
* @committed
|
31
|
+
*/
|
32
|
+
class analytics_metrics
|
33
|
+
{
|
34
|
+
public:
|
35
|
+
/**
|
36
|
+
* @since 1.0.0
|
37
|
+
* @internal
|
38
|
+
*/
|
39
|
+
analytics_metrics() = default;
|
40
|
+
|
41
|
+
/**
|
42
|
+
* @since 1.0.0
|
43
|
+
* @volatile
|
44
|
+
*/
|
45
|
+
analytics_metrics(std::chrono::nanoseconds elapsed_time,
|
46
|
+
std::chrono::nanoseconds execution_time,
|
47
|
+
std::uint64_t result_count,
|
48
|
+
std::uint64_t result_size,
|
49
|
+
std::uint64_t processed_objects,
|
50
|
+
std::uint64_t error_count,
|
51
|
+
std::uint64_t warning_count)
|
52
|
+
: elapsed_time_{ elapsed_time }
|
53
|
+
, execution_time_{ execution_time }
|
54
|
+
, result_count_{ result_count }
|
55
|
+
, result_size_{ result_size }
|
56
|
+
, processed_objects_{ processed_objects }
|
57
|
+
, error_count_{ error_count }
|
58
|
+
, warning_count_{ warning_count }
|
59
|
+
{
|
60
|
+
}
|
61
|
+
|
62
|
+
/**
|
63
|
+
* The total time taken for the request, that is the time from when the request was received until the results were returned.
|
64
|
+
*
|
65
|
+
* @return total time duration
|
66
|
+
*
|
67
|
+
* @since 1.0.0
|
68
|
+
* @committed
|
69
|
+
*/
|
70
|
+
[[nodiscard]] auto elapsed_time() const -> std::chrono::nanoseconds
|
71
|
+
{
|
72
|
+
return elapsed_time_;
|
73
|
+
}
|
74
|
+
|
75
|
+
/**
|
76
|
+
* The time taken for the execution of the request, that is the time from when query execution started until the results were returned.
|
77
|
+
*
|
78
|
+
* @return the execution time duration
|
79
|
+
*
|
80
|
+
* @since 1.0.0
|
81
|
+
* @committed
|
82
|
+
*/
|
83
|
+
[[nodiscard]] auto execution_time() const -> std::chrono::nanoseconds
|
84
|
+
{
|
85
|
+
return execution_time_;
|
86
|
+
}
|
87
|
+
|
88
|
+
/**
|
89
|
+
* The total number of objects in the results.
|
90
|
+
*
|
91
|
+
* @return number of results
|
92
|
+
*
|
93
|
+
* @since 1.0.0
|
94
|
+
* @committed
|
95
|
+
*/
|
96
|
+
[[nodiscard]] auto result_count() const -> std::uint64_t
|
97
|
+
{
|
98
|
+
return result_count_;
|
99
|
+
}
|
100
|
+
|
101
|
+
/**
|
102
|
+
* The total number of bytes in the results
|
103
|
+
*
|
104
|
+
* @return number of bytes
|
105
|
+
*
|
106
|
+
* @since 1.0.0
|
107
|
+
* @committed
|
108
|
+
*/
|
109
|
+
[[nodiscard]] auto result_size() const -> std::uint64_t
|
110
|
+
{
|
111
|
+
return result_size_;
|
112
|
+
}
|
113
|
+
|
114
|
+
/**
|
115
|
+
* The number of processed objects for the request.
|
116
|
+
*
|
117
|
+
* @return number of objects
|
118
|
+
*
|
119
|
+
* @since 1.0.0
|
120
|
+
* @committed
|
121
|
+
*/
|
122
|
+
[[nodiscard]] auto processed_objects() const -> std::uint64_t
|
123
|
+
{
|
124
|
+
return processed_objects_;
|
125
|
+
}
|
126
|
+
|
127
|
+
/**
|
128
|
+
* The number of errors that occurred during the request
|
129
|
+
*
|
130
|
+
* @return number of errors
|
131
|
+
*
|
132
|
+
* @since 1.0.0
|
133
|
+
* @committed
|
134
|
+
*/
|
135
|
+
[[nodiscard]] auto error_count() const -> std::uint64_t
|
136
|
+
{
|
137
|
+
return error_count_;
|
138
|
+
}
|
139
|
+
|
140
|
+
/**
|
141
|
+
* The number of warnings that occurred during the request.
|
142
|
+
*
|
143
|
+
* @return number of warnings
|
144
|
+
*
|
145
|
+
* @since 1.0.0
|
146
|
+
* @committed
|
147
|
+
*/
|
148
|
+
[[nodiscard]] auto warning_count() const -> std::uint64_t
|
149
|
+
{
|
150
|
+
return warning_count_;
|
151
|
+
}
|
152
|
+
|
153
|
+
private:
|
154
|
+
std::chrono::nanoseconds elapsed_time_{};
|
155
|
+
std::chrono::nanoseconds execution_time_{};
|
156
|
+
std::uint64_t result_count_{};
|
157
|
+
std::uint64_t result_size_{};
|
158
|
+
std::uint64_t processed_objects_{};
|
159
|
+
std::uint64_t error_count_{};
|
160
|
+
std::uint64_t warning_count_{};
|
161
|
+
};
|
162
|
+
|
163
|
+
} // namespace couchbase
|
@@ -0,0 +1,359 @@
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
2
|
+
/*
|
3
|
+
* Copyright 2020-Present Couchbase, Inc.
|
4
|
+
*
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
* you may not use this file except in compliance with the License.
|
7
|
+
* You may obtain a copy of the License at
|
8
|
+
*
|
9
|
+
* 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,
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
* See the License for the specific language governing permissions and
|
15
|
+
* limitations under the License.
|
16
|
+
*/
|
17
|
+
|
18
|
+
#pragma once
|
19
|
+
|
20
|
+
#include <couchbase/analytics_error_context.hxx>
|
21
|
+
#include <couchbase/analytics_result.hxx>
|
22
|
+
#include <couchbase/analytics_scan_consistency.hxx>
|
23
|
+
#include <couchbase/codec/tao_json_serializer.hxx>
|
24
|
+
#include <couchbase/common_options.hxx>
|
25
|
+
#include <couchbase/mutation_state.hxx>
|
26
|
+
|
27
|
+
#include <chrono>
|
28
|
+
#include <functional>
|
29
|
+
#include <memory>
|
30
|
+
#include <optional>
|
31
|
+
|
32
|
+
namespace couchbase
|
33
|
+
{
|
34
|
+
/**
|
35
|
+
* Options for cluster#analytics_query() and scope#analytics_query().
|
36
|
+
*
|
37
|
+
* @since 1.0.0
|
38
|
+
* @committed
|
39
|
+
*/
|
40
|
+
struct analytics_options : public common_options<analytics_options> {
|
41
|
+
/**
|
42
|
+
* Immutable value object representing consistent options.
|
43
|
+
*
|
44
|
+
* @since 1.0.0
|
45
|
+
* @internal
|
46
|
+
*/
|
47
|
+
struct built : public common_options<analytics_options>::built {
|
48
|
+
std::optional<std::string> client_context_id;
|
49
|
+
const bool priority;
|
50
|
+
const bool readonly;
|
51
|
+
std::optional<analytics_scan_consistency> scan_consistency;
|
52
|
+
std::optional<std::chrono::milliseconds> scan_wait;
|
53
|
+
std::vector<mutation_token> mutation_state;
|
54
|
+
std::vector<codec::binary> positional_parameters;
|
55
|
+
std::map<std::string, codec::binary, std::less<>> named_parameters;
|
56
|
+
std::map<std::string, codec::binary, std::less<>> raw;
|
57
|
+
};
|
58
|
+
|
59
|
+
/**
|
60
|
+
* Validates options and returns them as an immutable value.
|
61
|
+
*
|
62
|
+
* @return consistent options as an immutable value
|
63
|
+
*
|
64
|
+
* @exception std::system_error with code errc::common::invalid_argument if the options are not valid
|
65
|
+
*
|
66
|
+
* @since 1.0.0
|
67
|
+
* @internal
|
68
|
+
*/
|
69
|
+
[[nodiscard]] auto build() const -> built
|
70
|
+
{
|
71
|
+
return {
|
72
|
+
build_common_options(), client_context_id_, priority_, readonly_, scan_consistency_, scan_wait_,
|
73
|
+
mutation_state_, positional_parameters_, named_parameters_, raw_,
|
74
|
+
};
|
75
|
+
}
|
76
|
+
|
77
|
+
/**
|
78
|
+
* Allows to give certain requests higher priority than others.
|
79
|
+
*
|
80
|
+
* @param prioritized if set to true this query will be treated with a higher priority by the service.
|
81
|
+
* @return this options builder for chaining purposes.
|
82
|
+
*
|
83
|
+
* @since 1.0.0
|
84
|
+
* @committed
|
85
|
+
*/
|
86
|
+
auto priority(bool prioritized) -> analytics_options&
|
87
|
+
{
|
88
|
+
priority_ = prioritized;
|
89
|
+
return self();
|
90
|
+
}
|
91
|
+
|
92
|
+
/**
|
93
|
+
* Allows explicitly marking a query as being readonly and not mutating and documents on the server side.
|
94
|
+
*
|
95
|
+
* In addition to providing some security in that you are not accidentally modifying data, setting this flag to true also helps the
|
96
|
+
* client to more proactively retry and re-dispatch a query since then it can be sure it is idempotent. As a result, if your query is
|
97
|
+
* readonly then it is a good idea to set this flag.
|
98
|
+
*
|
99
|
+
* @param readonly true if readonly should be set, false is the default and will use the server side default.
|
100
|
+
* @return this options builder for chaining purposes.
|
101
|
+
*
|
102
|
+
* @since 1.0.0
|
103
|
+
* @committed
|
104
|
+
*/
|
105
|
+
auto readonly(bool readonly) -> analytics_options&
|
106
|
+
{
|
107
|
+
readonly_ = readonly;
|
108
|
+
return self();
|
109
|
+
}
|
110
|
+
|
111
|
+
/**
|
112
|
+
* Allows customizing how long the query engine is willing to wait until the index catches up to whatever scan
|
113
|
+
* consistency is asked for in this query.
|
114
|
+
*
|
115
|
+
* @note that if {@link analytics_scan_consistency::not_bounded} is used, this method doesn't do anything at all. If no value is
|
116
|
+
* provided to this method, the server default is used.
|
117
|
+
*
|
118
|
+
* @param wait the maximum duration the query engine is willing to wait before failing.
|
119
|
+
* @return this options builder for chaining purposes.
|
120
|
+
*
|
121
|
+
* @since 1.0.0
|
122
|
+
* @committed
|
123
|
+
*/
|
124
|
+
auto scan_wait(std::chrono::milliseconds wait) -> analytics_options&
|
125
|
+
{
|
126
|
+
if (scan_consistency_ == analytics_scan_consistency::not_bounded) {
|
127
|
+
scan_wait_.reset();
|
128
|
+
} else {
|
129
|
+
scan_wait_ = wait;
|
130
|
+
}
|
131
|
+
return self();
|
132
|
+
}
|
133
|
+
|
134
|
+
/**
|
135
|
+
* Supports providing a custom client context ID for this query.
|
136
|
+
*
|
137
|
+
* If no client context ID is provided by the user, a UUID is generated and sent automatically so by default it is always possible to
|
138
|
+
* identify a query when debugging.
|
139
|
+
*
|
140
|
+
* @param client_context_id the client context ID
|
141
|
+
* @return this options builder for chaining purposes.
|
142
|
+
*
|
143
|
+
* @since 1.0.0
|
144
|
+
* @committed
|
145
|
+
*/
|
146
|
+
auto client_context_id(std::string client_context_id) -> analytics_options&
|
147
|
+
{
|
148
|
+
if (client_context_id.empty()) {
|
149
|
+
client_context_id_.reset();
|
150
|
+
} else {
|
151
|
+
client_context_id_ = std::move(client_context_id);
|
152
|
+
}
|
153
|
+
return self();
|
154
|
+
}
|
155
|
+
|
156
|
+
/**
|
157
|
+
* Customizes the consistency guarantees for this query.
|
158
|
+
*
|
159
|
+
* Tuning the scan consistency allows to trade data "freshness" for latency and vice versa. By default
|
160
|
+
* {@link analytics_scan_consistency::not_bounded} is used, which means that the server returns the data it has in the index right away.
|
161
|
+
* This is fast, but might not include the most recent mutations. If you want to include all the mutations up to the point of the query,
|
162
|
+
* use {@link analytics_scan_consistency::request_plus}.
|
163
|
+
*
|
164
|
+
* Note that you cannot use this method and {@link #consistent_with(const mutation_state&)} at the same time, since they are mutually
|
165
|
+
* exclusive. As a rule of thumb, if you only care to be consistent with the mutation you just wrote on the same thread/app, use
|
166
|
+
* {@link #consistent_with(const mutation_state&)}. If you need "global" scan consistency, use
|
167
|
+
* {@link analytics_scan_consistency::request_plus} on this method.
|
168
|
+
*
|
169
|
+
* @param scan_consistency the index scan consistency to be used for this query
|
170
|
+
* @return this options builder for chaining purposes.
|
171
|
+
*
|
172
|
+
* @since 1.0.0
|
173
|
+
* @committed
|
174
|
+
*/
|
175
|
+
auto scan_consistency(analytics_scan_consistency scan_consistency) -> analytics_options&
|
176
|
+
{
|
177
|
+
scan_consistency_ = scan_consistency;
|
178
|
+
mutation_state_.clear();
|
179
|
+
return self();
|
180
|
+
}
|
181
|
+
|
182
|
+
/**
|
183
|
+
* Sets the {@link mutation_token}s this query should be consistent with.
|
184
|
+
*
|
185
|
+
* These mutation tokens are returned from mutations (i.e. as part of a {@link mutation_result}) and if you want your
|
186
|
+
* N1QL query to include those you need to pass the mutation tokens into a {@link mutation_state}.
|
187
|
+
*
|
188
|
+
* Note that you cannot use this method and {@link #scan_consistency(analytics_scan_consistency)} at the same time, since
|
189
|
+
* they are mutually exclusive. As a rule of thumb, if you only care to be consistent with the mutation you just wrote
|
190
|
+
* on the same thread/app, use this method. If you need "global" scan consistency, use
|
191
|
+
* {@link analytics_scan_consistency#request_plus} on {@link #scan_consistency(analytics_scan_consistency)}.
|
192
|
+
*
|
193
|
+
* @param state the mutation state containing the mutation tokens.
|
194
|
+
* @return this options builder for chaining purposes.
|
195
|
+
*
|
196
|
+
* @since 1.0.0
|
197
|
+
* @committed
|
198
|
+
*/
|
199
|
+
auto consistent_with(const mutation_state& state) -> analytics_options&
|
200
|
+
{
|
201
|
+
mutation_state_ = state.tokens();
|
202
|
+
scan_consistency_.reset();
|
203
|
+
return self();
|
204
|
+
}
|
205
|
+
|
206
|
+
/**
|
207
|
+
*
|
208
|
+
* @tparam Value
|
209
|
+
* @param name
|
210
|
+
* @param value
|
211
|
+
* @return this options builder for chaining purposes.
|
212
|
+
*
|
213
|
+
* @since 1.0.0
|
214
|
+
* @committed
|
215
|
+
*/
|
216
|
+
template<typename Value>
|
217
|
+
auto raw(std::string name, const Value& value) -> analytics_options&
|
218
|
+
{
|
219
|
+
raw_[std::move(name)] = std::move(codec::tao_json_serializer::serialize(value));
|
220
|
+
return self();
|
221
|
+
}
|
222
|
+
|
223
|
+
/**
|
224
|
+
* Set list of positional parameters for a query.
|
225
|
+
*
|
226
|
+
* @tparam Parameters types for the parameters
|
227
|
+
* @param parameters the sequence of positional parameters. Each entry will be encoded into JSON.
|
228
|
+
* @return this options builder for chaining purposes.
|
229
|
+
*
|
230
|
+
* @since 1.0.0
|
231
|
+
* @committed
|
232
|
+
*/
|
233
|
+
template<typename... Parameters>
|
234
|
+
auto positional_parameters(const Parameters&... parameters) -> analytics_options&
|
235
|
+
{
|
236
|
+
named_parameters_.clear();
|
237
|
+
positional_parameters_.clear();
|
238
|
+
encode_positional_parameters(parameters...);
|
239
|
+
return self();
|
240
|
+
}
|
241
|
+
|
242
|
+
/**
|
243
|
+
* Set list of named parameters for a query.
|
244
|
+
*
|
245
|
+
* @tparam Parameters types for the parameter pairs
|
246
|
+
* @param parameters the sequence of name-value pairs. Each value will be encoded into JSON.
|
247
|
+
* @return this options builder for chaining purposes.
|
248
|
+
*
|
249
|
+
* @since 1.0.0
|
250
|
+
* @committed
|
251
|
+
*/
|
252
|
+
template<typename... Parameters>
|
253
|
+
auto named_parameters(const Parameters&... parameters) -> analytics_options&
|
254
|
+
{
|
255
|
+
named_parameters_.clear();
|
256
|
+
positional_parameters_.clear();
|
257
|
+
encode_named_parameters(parameters...);
|
258
|
+
return self();
|
259
|
+
}
|
260
|
+
|
261
|
+
/**
|
262
|
+
* Set map of raw options for a query.
|
263
|
+
*
|
264
|
+
* This function expects that all parameters encoded into pairs containing mapping names of the parameter to valid JSON values encoded
|
265
|
+
* as string.
|
266
|
+
*
|
267
|
+
* @note This function is low-level, and instead @ref raw() should be considered.
|
268
|
+
*
|
269
|
+
* @param options mapping of pairs, where each entry contains string with valid JSON value.
|
270
|
+
* @return this options builder for chaining purposes.
|
271
|
+
*
|
272
|
+
* @since 1.0.0
|
273
|
+
* @uncommitted
|
274
|
+
*/
|
275
|
+
auto encoded_raw_options(std::map<std::string, codec::binary, std::less<>> options) -> analytics_options&
|
276
|
+
{
|
277
|
+
raw_ = std::move(options);
|
278
|
+
return self();
|
279
|
+
}
|
280
|
+
|
281
|
+
/**
|
282
|
+
* Set list of positional parameters for a query.
|
283
|
+
*
|
284
|
+
* This function expects that all parameters encoded into byte strings containing valid JSON values.
|
285
|
+
*
|
286
|
+
* @note This function is low-level, and instead @ref positional_parameters() should be considered.
|
287
|
+
*
|
288
|
+
* @param parameters vector of binaries, where each entry contains string with valid JSON value.
|
289
|
+
* @return this options builder for chaining purposes.
|
290
|
+
*
|
291
|
+
* @since 1.0.0
|
292
|
+
* @uncommitted
|
293
|
+
*/
|
294
|
+
auto encoded_positional_parameters(std::vector<codec::binary> parameters) -> analytics_options&
|
295
|
+
{
|
296
|
+
named_parameters_.clear();
|
297
|
+
positional_parameters_ = std::move(parameters);
|
298
|
+
return self();
|
299
|
+
}
|
300
|
+
|
301
|
+
/**
|
302
|
+
* Set map of named parameters for a query.
|
303
|
+
*
|
304
|
+
* This function expects that all parameters encoded into pairs containing mapping names of the parameter to valid JSON values encoded
|
305
|
+
* as string.
|
306
|
+
*
|
307
|
+
* @note This function is low-level, and instead @ref named_parameters() should be considered.
|
308
|
+
*
|
309
|
+
* @param parameters mapping of pairs, where each entry contains string with valid JSON value.
|
310
|
+
* @return this options builder for chaining purposes.
|
311
|
+
*
|
312
|
+
* @since 1.0.0
|
313
|
+
* @uncommitted
|
314
|
+
*/
|
315
|
+
auto encoded_named_parameters(std::map<std::string, codec::binary, std::less<>> parameters) -> analytics_options&
|
316
|
+
{
|
317
|
+
named_parameters_ = std::move(parameters);
|
318
|
+
positional_parameters_.clear();
|
319
|
+
return self();
|
320
|
+
}
|
321
|
+
|
322
|
+
private:
|
323
|
+
template<typename Parameter, typename... Rest>
|
324
|
+
void encode_positional_parameters(const Parameter& parameter, Rest... args)
|
325
|
+
{
|
326
|
+
positional_parameters_.emplace_back(std::move(codec::tao_json_serializer::serialize(parameter)));
|
327
|
+
if constexpr (sizeof...(args) > 0) {
|
328
|
+
encode_positional_parameters(args...);
|
329
|
+
}
|
330
|
+
}
|
331
|
+
|
332
|
+
template<typename Name, typename Parameter, typename... Rest>
|
333
|
+
void encode_named_parameters(const std::pair<Name, Parameter>& parameter, Rest... args)
|
334
|
+
{
|
335
|
+
named_parameters_[parameter.first] = std::move(codec::tao_json_serializer::serialize(parameter.second));
|
336
|
+
if constexpr (sizeof...(args) > 0) {
|
337
|
+
encode_named_parameters(args...);
|
338
|
+
}
|
339
|
+
}
|
340
|
+
|
341
|
+
bool priority_{ true };
|
342
|
+
bool readonly_{ false };
|
343
|
+
std::optional<std::string> client_context_id_{};
|
344
|
+
std::optional<std::chrono::milliseconds> scan_wait_{};
|
345
|
+
std::optional<analytics_scan_consistency> scan_consistency_{};
|
346
|
+
std::vector<mutation_token> mutation_state_{};
|
347
|
+
std::vector<codec::binary> positional_parameters_{};
|
348
|
+
std::map<std::string, codec::binary, std::less<>> raw_{};
|
349
|
+
std::map<std::string, codec::binary, std::less<>> named_parameters_{};
|
350
|
+
};
|
351
|
+
|
352
|
+
/**
|
353
|
+
* The signature for the handler of the @ref cluster#analytics_query() and @ref scope#analytics_query() operations
|
354
|
+
*
|
355
|
+
* @since 1.0.0
|
356
|
+
* @uncommitted
|
357
|
+
*/
|
358
|
+
using analytics_handler = std::function<void(couchbase::analytics_error_context, analytics_result)>;
|
359
|
+
} // namespace couchbase
|