couchbase 3.0.0.alpha.2-universal-darwin-19 → 3.0.0.alpha.3-universal-darwin-19
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/tests-dev-preview.yml +52 -0
- data/.gitmodules +3 -0
- data/.idea/vcs.xml +1 -0
- data/.yardopts +1 -0
- data/README.md +1 -1
- data/Rakefile +5 -1
- data/bin/init-cluster +13 -5
- data/couchbase.gemspec +2 -1
- data/examples/managing_query_indexes.rb +1 -1
- data/examples/managing_search_indexes.rb +62 -0
- data/examples/search.rb +187 -0
- data/ext/.clang-tidy +1 -0
- data/ext/build_version.hxx.in +1 -1
- data/ext/couchbase/bucket.hxx +0 -40
- data/ext/couchbase/couchbase.cxx +2578 -1368
- data/ext/couchbase/io/http_session.hxx +27 -7
- data/ext/couchbase/io/mcbp_parser.hxx +2 -0
- data/ext/couchbase/io/mcbp_session.hxx +53 -24
- data/ext/couchbase/io/session_manager.hxx +6 -1
- data/ext/couchbase/operations.hxx +13 -0
- data/ext/couchbase/operations/bucket_create.hxx +1 -0
- data/ext/couchbase/operations/bucket_drop.hxx +1 -0
- data/ext/couchbase/operations/bucket_flush.hxx +1 -0
- data/ext/couchbase/operations/bucket_get.hxx +1 -0
- data/ext/couchbase/operations/bucket_get_all.hxx +1 -0
- data/ext/couchbase/operations/bucket_update.hxx +1 -0
- data/ext/couchbase/operations/cluster_developer_preview_enable.hxx +1 -0
- data/ext/couchbase/operations/collection_create.hxx +6 -1
- data/ext/couchbase/operations/collection_drop.hxx +1 -0
- data/ext/couchbase/operations/command.hxx +86 -11
- data/ext/couchbase/operations/document_decrement.hxx +1 -0
- data/ext/couchbase/operations/document_exists.hxx +1 -0
- data/ext/couchbase/operations/document_get.hxx +1 -0
- data/ext/couchbase/operations/document_get_and_lock.hxx +1 -0
- data/ext/couchbase/operations/document_get_and_touch.hxx +1 -0
- data/ext/couchbase/operations/document_get_projected.hxx +243 -0
- data/ext/couchbase/operations/document_increment.hxx +4 -1
- data/ext/couchbase/operations/document_insert.hxx +1 -0
- data/ext/couchbase/operations/document_lookup_in.hxx +1 -0
- data/ext/couchbase/operations/document_mutate_in.hxx +1 -0
- data/ext/couchbase/operations/document_query.hxx +13 -2
- data/ext/couchbase/operations/document_remove.hxx +1 -0
- data/ext/couchbase/operations/document_replace.hxx +1 -0
- data/ext/couchbase/operations/document_search.hxx +337 -0
- data/ext/couchbase/operations/document_touch.hxx +1 -0
- data/ext/couchbase/operations/document_unlock.hxx +1 -0
- data/ext/couchbase/operations/document_upsert.hxx +1 -0
- data/ext/couchbase/operations/query_index_build_deferred.hxx +1 -0
- data/ext/couchbase/operations/query_index_create.hxx +1 -0
- data/ext/couchbase/operations/query_index_drop.hxx +1 -0
- data/ext/couchbase/operations/query_index_get_all.hxx +1 -0
- data/ext/couchbase/operations/scope_create.hxx +1 -0
- data/ext/couchbase/operations/scope_drop.hxx +1 -0
- data/ext/couchbase/operations/scope_get_all.hxx +2 -0
- data/ext/couchbase/operations/search_index.hxx +62 -0
- data/ext/couchbase/operations/search_index_analyze_document.hxx +92 -0
- data/ext/couchbase/operations/search_index_control_ingest.hxx +78 -0
- data/ext/couchbase/operations/search_index_control_plan_freeze.hxx +80 -0
- data/ext/couchbase/operations/search_index_control_query.hxx +80 -0
- data/ext/couchbase/operations/search_index_drop.hxx +77 -0
- data/ext/couchbase/operations/search_index_get.hxx +80 -0
- data/ext/couchbase/operations/search_index_get_all.hxx +82 -0
- data/ext/couchbase/operations/search_index_get_documents_count.hxx +81 -0
- data/ext/couchbase/operations/search_index_upsert.hxx +106 -0
- data/ext/couchbase/protocol/client_opcode.hxx +10 -0
- data/ext/couchbase/protocol/cmd_get_collection_id.hxx +117 -0
- data/ext/couchbase/timeout_defaults.hxx +32 -0
- data/ext/couchbase/version.hxx +1 -1
- data/ext/test/main.cxx +5 -5
- data/lib/couchbase/binary_collection.rb +16 -12
- data/lib/couchbase/binary_collection_options.rb +4 -0
- data/lib/couchbase/cluster.rb +88 -8
- data/lib/couchbase/collection.rb +39 -15
- data/lib/couchbase/collection_options.rb +19 -2
- data/lib/couchbase/json_transcoder.rb +2 -2
- data/lib/couchbase/management/bucket_manager.rb +37 -23
- data/lib/couchbase/management/collection_manager.rb +15 -6
- data/lib/couchbase/management/query_index_manager.rb +16 -6
- data/lib/couchbase/management/search_index_manager.rb +61 -14
- data/lib/couchbase/search_options.rb +1492 -0
- data/lib/couchbase/version.rb +1 -1
- metadata +22 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5523baaeabe62572762a0af31a6636401970e9b8f760b071c855a9c59766e7ef
|
4
|
+
data.tar.gz: 860e1fd99369e1e075fbc80629e051f4f1f41515b2ee084a64c5342a35fea7a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7655d328ee6cd5b5b4d830deaf75053b0d5ccdd15ee77eafd188be81841c05f1433c560be08aa71a2b7ab58d59b5ff427fd1cee9ea095fb2874075b39c7b8023
|
7
|
+
data.tar.gz: 85510dc74b15eadecf816aa8b59938dad14d9e1dc118d3f6b665161a581d1d4493faadd5e6cdece784a22bd63e3d036e07f734848de65a13a4857be620501ca7
|
@@ -0,0 +1,52 @@
|
|
1
|
+
name: tests-dev-preview
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ master ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ master ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
test:
|
11
|
+
|
12
|
+
runs-on: ubuntu-latest
|
13
|
+
|
14
|
+
services:
|
15
|
+
couchbase:
|
16
|
+
image: couchbase:enterprise-6.5.1
|
17
|
+
ports:
|
18
|
+
- 8091-8094:8091-8094
|
19
|
+
- 11210:11210
|
20
|
+
|
21
|
+
steps:
|
22
|
+
- name: Install build environment
|
23
|
+
run: sudo apt-get install -y libssl-dev cmake gcc g++ curl
|
24
|
+
|
25
|
+
- uses: actions/checkout@v2
|
26
|
+
with:
|
27
|
+
submodules: recursive
|
28
|
+
|
29
|
+
- name: Set up ruby
|
30
|
+
uses: ruby/setup-ruby@v1
|
31
|
+
with:
|
32
|
+
ruby-version: 2.6
|
33
|
+
|
34
|
+
- name: Install dependencies
|
35
|
+
run: bundle install
|
36
|
+
|
37
|
+
- name: Initialize couchbase
|
38
|
+
run: ./bin/init-cluster
|
39
|
+
env:
|
40
|
+
DEVELOPER_PREVIEW: yes
|
41
|
+
|
42
|
+
- name: Compile extension
|
43
|
+
run: bundle exec rake compile
|
44
|
+
|
45
|
+
- name: Display library version
|
46
|
+
run: bundle exec ruby -I lib -r couchbase -e 'pp Couchbase::VERSION'
|
47
|
+
|
48
|
+
- name: Run tests
|
49
|
+
run: bundle exec rake test
|
50
|
+
env:
|
51
|
+
DEVELOPER_PREVIEW: yes
|
52
|
+
TEST_SERVER_VERSION: 6.5.1
|
data/.gitmodules
CHANGED
data/.idea/vcs.xml
CHANGED
@@ -8,5 +8,6 @@
|
|
8
8
|
<mapping directory="$PROJECT_DIR$/ext/third_party/json" vcs="Git" />
|
9
9
|
<mapping directory="$PROJECT_DIR$/ext/third_party/snappy" vcs="Git" />
|
10
10
|
<mapping directory="$PROJECT_DIR$/ext/third_party/spdlog" vcs="Git" />
|
11
|
+
<mapping directory="$PROJECT_DIR$/test_data/sdk_test_cases" vcs="Git" />
|
11
12
|
</component>
|
12
13
|
</project>
|
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--output-dir doc/couchbase-ruby-client-master lib - README.md
|
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -33,12 +33,16 @@ task :doc do
|
|
33
33
|
input_dir = File.join(__dir__, "lib")
|
34
34
|
output_dir = File.join(__dir__, "doc", "couchbase-ruby-client-#{Couchbase::VERSION[:sdk]}")
|
35
35
|
rm_rf output_dir
|
36
|
-
sh "yard doc --output-dir #{output_dir} #{input_dir}"
|
36
|
+
sh "yard doc --output-dir #{output_dir} #{input_dir} - README.md"
|
37
37
|
puts "#{File.realpath(output_dir)}/index.html"
|
38
38
|
end
|
39
39
|
|
40
40
|
task :docs => :doc
|
41
41
|
|
42
|
+
task :undocumented => :doc do
|
43
|
+
sh "yard stats --list-undoc --compact"
|
44
|
+
end
|
45
|
+
|
42
46
|
task :render_git_revision do
|
43
47
|
build_version_path = File.join(__dir__, 'ext', 'build_version.hxx.in')
|
44
48
|
File.write(build_version_path, File.read(build_version_path).gsub('@BACKEND_GIT_REVISION@', `git rev-parse HEAD`.strip))
|
data/bin/init-cluster
CHANGED
@@ -14,9 +14,12 @@
|
|
14
14
|
# See the License for the specific language governing permissions and
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
|
-
HOST
|
18
|
-
USERNAME
|
19
|
-
PASSWORD
|
17
|
+
HOST=${HOST:-localhost}
|
18
|
+
USERNAME=${USERNAME:-Administrator}
|
19
|
+
PASSWORD=${PASSWOWRD:-password}
|
20
|
+
QUOTA=${QUOTA:-256}
|
21
|
+
DEVELOPER_PREVIEW=${DEVELOPER_PREVIEW:-no}
|
22
|
+
|
20
23
|
CREDS="${USERNAME}:${PASSWORD}"
|
21
24
|
|
22
25
|
sleep 1
|
@@ -33,11 +36,11 @@ curl -sS -w "\n" -u ${CREDS} http://${HOST}:8091/nodes/self/controller/settings
|
|
33
36
|
|
34
37
|
# Setup Services
|
35
38
|
curl -sS -w "\n" -u ${CREDS} http://${HOST}:8091/node/controller/setupServices \
|
36
|
-
-d 'services=kv%2Cn1ql%2Cindex'
|
39
|
+
-d 'services=kv%2Cn1ql%2Cindex%2Cfts'
|
37
40
|
|
38
41
|
# Setup Memory Quotas
|
39
42
|
curl -sS -w "\n" -u ${CREDS} http://${HOST}:8091/pools/default \
|
40
|
-
-d
|
43
|
+
-d "memoryQuota=${QUOTA}" \
|
41
44
|
-d 'indexMemoryQuota=256'
|
42
45
|
|
43
46
|
# Setup Administrator username and password
|
@@ -60,3 +63,8 @@ curl -sS -w "\n" -u ${CREDS} http://${HOST}:8091/pools/default/buckets \
|
|
60
63
|
-d 'ramQuotaMB=100' \
|
61
64
|
-d 'bucketType=membase' \
|
62
65
|
-d 'name=default'
|
66
|
+
|
67
|
+
if [ "x${DEVELOPER_PREVIEW}" != "xno" ]; then
|
68
|
+
curl -sS -w "\n" -u ${CREDS} http://${HOST}:8091/settings/developerPreview \
|
69
|
+
-d "enabled=true"
|
70
|
+
fi
|
data/couchbase.gemspec
CHANGED
@@ -29,9 +29,10 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.metadata["homepage_uri"] = spec.homepage
|
30
30
|
spec.metadata["source_code_uri"] = "https://github.com/couchbase/couchbase-ruby-client"
|
31
31
|
spec.metadata["changelog_uri"] = "#{spec.metadata["source_code_uri"]}/releases"
|
32
|
+
spec.metadata["github_repo"] = "ssh://github.com/couchbase/couchbase-ruby-client"
|
32
33
|
|
33
34
|
spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
|
34
|
-
`git ls-files --recurse-submodules -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
35
|
+
`git ls-files --recurse-submodules -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|test_data)/}) }
|
35
36
|
end
|
36
37
|
spec.bindir = "exe"
|
37
38
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
@@ -28,7 +28,7 @@ bucket_name = "beer-sample"
|
|
28
28
|
|
29
29
|
options = Cluster::ClusterOptions.new
|
30
30
|
options.authenticate("Administrator", "password")
|
31
|
-
cluster = Cluster.connect("couchbase://
|
31
|
+
cluster = Cluster.connect("couchbase://localhost", options)
|
32
32
|
|
33
33
|
display_indexes(cluster.query_indexes.get_all_indexes(bucket_name), bucket_name)
|
34
34
|
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require "couchbase"
|
2
|
+
include Couchbase
|
3
|
+
|
4
|
+
def measure(msg)
|
5
|
+
start = Time.now
|
6
|
+
yield
|
7
|
+
printf "%s in %.2f seconds\n", msg, Time.now - start
|
8
|
+
end
|
9
|
+
|
10
|
+
options = Cluster::ClusterOptions.new
|
11
|
+
options.authenticate("Administrator", "password")
|
12
|
+
cluster = Cluster.connect("couchbase://localhost", options)
|
13
|
+
|
14
|
+
search_indexes = cluster.search_indexes.get_all_indexes
|
15
|
+
puts "There are #{search_indexes.size} search indexes on the cluster"
|
16
|
+
search_indexes.each do |index|
|
17
|
+
num_docs = cluster.search_indexes.get_indexed_documents_count(index.name)
|
18
|
+
puts "* #{index.name.inspect} contains #{num_docs} documents"
|
19
|
+
end
|
20
|
+
|
21
|
+
search_index_name = "my_index"
|
22
|
+
begin
|
23
|
+
index = cluster.search_indexes.get_index(search_index_name)
|
24
|
+
measure("index #{index.name.inspect} has been dropped") do
|
25
|
+
cluster.search_indexes.drop_index(index.name)
|
26
|
+
end
|
27
|
+
rescue Error::IndexNotFound
|
28
|
+
# Ignored
|
29
|
+
end
|
30
|
+
|
31
|
+
index = Management::SearchIndex.new
|
32
|
+
index.type = "fulltext-index"
|
33
|
+
index.name = search_index_name
|
34
|
+
index.source_type = "couchbase"
|
35
|
+
index.source_name = "beer-sample"
|
36
|
+
|
37
|
+
measure("index #{search_index_name.inspect} has been created") do
|
38
|
+
cluster.search_indexes.upsert_index(index)
|
39
|
+
end
|
40
|
+
num_indexed = 0
|
41
|
+
loop do
|
42
|
+
sleep(1)
|
43
|
+
num = cluster.search_indexes.get_indexed_documents_count(search_index_name)
|
44
|
+
break if num_indexed == num
|
45
|
+
num_indexed = num
|
46
|
+
puts "#{index.name.inspect} indexed #{num_indexed}"
|
47
|
+
end
|
48
|
+
|
49
|
+
search_indexes = cluster.search_indexes.get_all_indexes
|
50
|
+
puts "There are #{search_indexes.size} search indexes on the cluster"
|
51
|
+
search_indexes.each do |index|
|
52
|
+
num_docs = cluster.search_indexes.get_indexed_documents_count(index.name)
|
53
|
+
puts "* #{index.name.inspect} contains #{num_docs} documents"
|
54
|
+
end
|
55
|
+
|
56
|
+
document = {
|
57
|
+
title: "Hello world",
|
58
|
+
content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
|
59
|
+
}
|
60
|
+
analysis = cluster.search_indexes.analyze_document(search_index_name, document)
|
61
|
+
puts "Analysis of document using definition of the index #{search_index_name}:"
|
62
|
+
pp analysis
|
data/examples/search.rb
ADDED
@@ -0,0 +1,187 @@
|
|
1
|
+
require 'couchbase'
|
2
|
+
|
3
|
+
include Couchbase
|
4
|
+
|
5
|
+
options = Cluster::ClusterOptions.new
|
6
|
+
options.authenticate("Administrator", "password")
|
7
|
+
cluster = Cluster.connect("couchbase://localhost", options)
|
8
|
+
|
9
|
+
# create index definition, if it does not exist already
|
10
|
+
search_index_name = "beer_search"
|
11
|
+
|
12
|
+
begin
|
13
|
+
cluster.search_indexes.get_index(search_index_name)
|
14
|
+
rescue Error::IndexNotFound
|
15
|
+
index = Management::SearchIndex.new
|
16
|
+
index.type = "fulltext-index"
|
17
|
+
index.name = search_index_name
|
18
|
+
index.source_type = "couchbase"
|
19
|
+
index.source_name = "beer-sample"
|
20
|
+
index.params = {
|
21
|
+
mapping: {
|
22
|
+
default_datetime_parser: "dateTimeOptional",
|
23
|
+
types: {
|
24
|
+
"beer" => {
|
25
|
+
properties: {
|
26
|
+
"abv" => {
|
27
|
+
fields: [
|
28
|
+
{
|
29
|
+
name: "abv",
|
30
|
+
type: "number",
|
31
|
+
include_in_all: true,
|
32
|
+
index: true,
|
33
|
+
store: true,
|
34
|
+
docvalues: true,
|
35
|
+
}
|
36
|
+
]
|
37
|
+
},
|
38
|
+
"category" => {
|
39
|
+
fields: [
|
40
|
+
{
|
41
|
+
name: "category",
|
42
|
+
type: "text",
|
43
|
+
include_in_all: true,
|
44
|
+
include_term_vectors: true,
|
45
|
+
index: true,
|
46
|
+
store: true,
|
47
|
+
docvalues: true,
|
48
|
+
}
|
49
|
+
]
|
50
|
+
},
|
51
|
+
"description" => {
|
52
|
+
fields: [
|
53
|
+
{
|
54
|
+
name: "description",
|
55
|
+
type: "text",
|
56
|
+
include_in_all: true,
|
57
|
+
include_term_vectors: true,
|
58
|
+
index: true,
|
59
|
+
store: true,
|
60
|
+
docvalues: true,
|
61
|
+
}
|
62
|
+
]
|
63
|
+
},
|
64
|
+
"name" => {
|
65
|
+
fields: [
|
66
|
+
{
|
67
|
+
name: "name",
|
68
|
+
type: "text",
|
69
|
+
include_in_all: true,
|
70
|
+
include_term_vectors: true,
|
71
|
+
index: true,
|
72
|
+
store: true,
|
73
|
+
docvalues: true,
|
74
|
+
}
|
75
|
+
]
|
76
|
+
},
|
77
|
+
"style" => {
|
78
|
+
fields: [
|
79
|
+
{
|
80
|
+
name: "style",
|
81
|
+
type: "text",
|
82
|
+
include_in_all: true,
|
83
|
+
include_term_vectors: true,
|
84
|
+
index: true,
|
85
|
+
store: true,
|
86
|
+
docvalues: true,
|
87
|
+
}
|
88
|
+
]
|
89
|
+
},
|
90
|
+
"updated" => {
|
91
|
+
fields: [
|
92
|
+
{
|
93
|
+
name: "updated",
|
94
|
+
type: "datetime",
|
95
|
+
include_in_all: true,
|
96
|
+
index: true,
|
97
|
+
store: true,
|
98
|
+
docvalues: true,
|
99
|
+
}
|
100
|
+
]
|
101
|
+
},
|
102
|
+
}
|
103
|
+
}
|
104
|
+
}
|
105
|
+
}
|
106
|
+
}
|
107
|
+
|
108
|
+
cluster.search_indexes.upsert_index(index)
|
109
|
+
|
110
|
+
num_indexed = 0
|
111
|
+
loop do
|
112
|
+
sleep(1)
|
113
|
+
num = cluster.search_indexes.get_indexed_documents_count(search_index_name)
|
114
|
+
break if num_indexed == num
|
115
|
+
num_indexed = num
|
116
|
+
puts "indexing #{search_index_name.inspect}: #{num_indexed} documents"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# search with facets advanced sort
|
121
|
+
query = Cluster::SearchQuery.match_phrase("hop beer")
|
122
|
+
options = Cluster::SearchOptions.new
|
123
|
+
options.limit = 10
|
124
|
+
options.fields = %w[name]
|
125
|
+
options.highlight_style = :html
|
126
|
+
options.highlight_fields = %w[name description]
|
127
|
+
options.sort = [
|
128
|
+
Cluster::SearchSort.field("abv") do |spec|
|
129
|
+
spec.type = :number
|
130
|
+
end,
|
131
|
+
Cluster::SearchSort.score do |spec|
|
132
|
+
spec.desc = true
|
133
|
+
end,
|
134
|
+
"category",
|
135
|
+
Cluster::SearchSort.id,
|
136
|
+
]
|
137
|
+
|
138
|
+
res = cluster.search_query(search_index_name, query, options)
|
139
|
+
res.rows.each_with_index do |row, idx|
|
140
|
+
document = row.fields
|
141
|
+
puts "\n#{idx}. #{document["name"]} (id: #{row.id.inspect})"
|
142
|
+
row.fragments.each do |field, fragments|
|
143
|
+
puts " * #{field}"
|
144
|
+
fragments.each do |fragment|
|
145
|
+
puts " - #{fragment.gsub(/\n/, ' ')}"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
# search with facets
|
151
|
+
query = Cluster::SearchQuery.term("beer")
|
152
|
+
query.field = "type"
|
153
|
+
|
154
|
+
options = Cluster::SearchOptions.new
|
155
|
+
options.facets = {}
|
156
|
+
|
157
|
+
term_facet = Cluster::SearchFacet.term("name")
|
158
|
+
term_facet.size = 3
|
159
|
+
options.facets["by_name"] = term_facet
|
160
|
+
|
161
|
+
date_facet = Cluster::SearchFacet.date_range("updated")
|
162
|
+
date_facet.add("old", nil, Time.new(2013, 1, 1))
|
163
|
+
date_facet.size = 3
|
164
|
+
options.facets["by_time"] = date_facet
|
165
|
+
|
166
|
+
numeric_facet = Cluster::SearchFacet.numeric_range("abv")
|
167
|
+
numeric_facet.size = 3
|
168
|
+
numeric_facet.add("strong", 4.9, nil)
|
169
|
+
numeric_facet.add("light", nil, 4.89)
|
170
|
+
options.facets["by_strength"] = numeric_facet
|
171
|
+
|
172
|
+
res = cluster.search_query(search_index_name, query, options)
|
173
|
+
|
174
|
+
puts "\n==== Top 3 beer names (out of #{res.facets["by_name"].total}):"
|
175
|
+
res.facets["by_name"].terms.each_with_index do |term, idx|
|
176
|
+
puts "#{idx}. #{term.term} (#{term.count} records)"
|
177
|
+
end
|
178
|
+
|
179
|
+
puts "\n==== Beer by strength (out of #{res.facets["by_strength"].total}):"
|
180
|
+
res.facets["by_strength"].numeric_ranges.each_with_index do |range, idx|
|
181
|
+
puts "#{idx}. #{range.name}, ABV: [#{range.min}..#{range.max}] (#{range.count} records)"
|
182
|
+
end
|
183
|
+
|
184
|
+
puts "\n==== The most recently updated (out of #{res.facets["by_time"].total}):"
|
185
|
+
res.facets["by_time"].date_ranges.each_with_index do |range, idx|
|
186
|
+
puts "#{idx}. #{range.name} [#{range.start_time}..#{range.end_time}] (#{range.count} records)"
|
187
|
+
end
|
data/ext/.clang-tidy
CHANGED
data/ext/build_version.hxx.in
CHANGED
@@ -22,5 +22,5 @@
|
|
22
22
|
#define BACKEND_C_COMPILER "@CMAKE_C_COMPILER_ID@ @CMAKE_C_COMPILER_VERSION@"
|
23
23
|
#define BACKEND_SYSTEM "@CMAKE_SYSTEM@"
|
24
24
|
#define BACKEND_SYSTEM_PROCESSOR "@CMAKE_SYSTEM_PROCESSOR@"
|
25
|
-
#define BACKEND_GIT_REVISION "
|
25
|
+
#define BACKEND_GIT_REVISION "86b887957baf7230bfbe853de48b4507b9c2c18d"
|
26
26
|
|
data/ext/couchbase/bucket.hxx
CHANGED
@@ -24,7 +24,6 @@
|
|
24
24
|
|
25
25
|
namespace couchbase
|
26
26
|
{
|
27
|
-
|
28
27
|
class bucket
|
29
28
|
{
|
30
29
|
public:
|
@@ -51,16 +50,6 @@ class bucket
|
|
51
50
|
return;
|
52
51
|
}
|
53
52
|
|
54
|
-
auto session_manifest = session->manifest();
|
55
|
-
if (!manifest_cache_) {
|
56
|
-
if (session_manifest) {
|
57
|
-
manifest_cache_ = session_manifest.value();
|
58
|
-
}
|
59
|
-
} else {
|
60
|
-
if (session_manifest && session_manifest->uid > manifest_cache_->uid) {
|
61
|
-
manifest_cache_ = session->manifest().value();
|
62
|
-
}
|
63
|
-
}
|
64
53
|
sessions_.emplace(index, std::move(session));
|
65
54
|
}
|
66
55
|
|
@@ -81,14 +70,6 @@ class bucket
|
|
81
70
|
size_t index = 0;
|
82
71
|
std::tie(request.partition, index) = config_.map_key(request.id.key);
|
83
72
|
auto session = sessions_.at(index);
|
84
|
-
if (manifest_cache_) {
|
85
|
-
request.id.collection_uid = get_collection_uid(request.id.collection);
|
86
|
-
} else {
|
87
|
-
if (!request.id.collection.empty() && request.id.collection != "_default._default") {
|
88
|
-
handler(make_response(std::make_error_code(error::common_errc::unsupported_operation), request, {}));
|
89
|
-
return;
|
90
|
-
}
|
91
|
-
}
|
92
73
|
auto cmd = std::make_shared<operations::command<Request>>(ctx_, std::move(request));
|
93
74
|
cmd->send_to(session, std::forward<Handler>(handler));
|
94
75
|
}
|
@@ -105,32 +86,11 @@ class bucket
|
|
105
86
|
}
|
106
87
|
|
107
88
|
private:
|
108
|
-
[[nodiscard]] uint32_t get_collection_uid(const std::string& collection_path)
|
109
|
-
{
|
110
|
-
Expects(manifest_cache_.has_value());
|
111
|
-
Expects(!collection_path.empty());
|
112
|
-
auto dot = collection_path.find('.');
|
113
|
-
Expects(dot != std::string::npos);
|
114
|
-
std::string scope = collection_path.substr(0, dot);
|
115
|
-
std::string collection = collection_path.substr(dot + 1);
|
116
|
-
for (const auto& s : manifest_cache_->scopes) {
|
117
|
-
if (s.name == scope) {
|
118
|
-
for (const auto& c : s.collections) {
|
119
|
-
if (c.name == collection) {
|
120
|
-
return gsl::narrow_cast<std::uint32_t>(c.uid);
|
121
|
-
}
|
122
|
-
}
|
123
|
-
}
|
124
|
-
}
|
125
|
-
Ensures(false); // FIXME: return collection not found
|
126
|
-
return 0;
|
127
|
-
}
|
128
89
|
|
129
90
|
asio::io_context& ctx_;
|
130
91
|
std::string name_;
|
131
92
|
configuration config_;
|
132
93
|
bool closed_{ false };
|
133
|
-
std::optional<collections_manifest> manifest_cache_{};
|
134
94
|
std::map<size_t, std::shared_ptr<io::mcbp_session>> sessions_{};
|
135
95
|
};
|
136
96
|
} // namespace couchbase
|