Skip to content

Commit b16589e

Browse files
Merge pull request #29 from obie/main
Adds support for multitenancy
2 parents 7e82627 + 6fc9fb3 commit b16589e

File tree

8 files changed

+69
-2
lines changed

8 files changed

+69
-2
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@
99

1010
# rspec failure tracking
1111
.rspec_status
12+
.rubocop.yml

Gemfile.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ GEM
9393
yard (0.9.34)
9494

9595
PLATFORMS
96+
arm64-darwin-21
9697
x86_64-darwin-19
9798
x86_64-linux
9899

lib/weaviate/objects.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ class Objects < Base
88
def list(
99
class_name: nil,
1010
limit: nil,
11+
tenant: nil,
1112
offset: nil,
1213
after: nil,
1314
include: nil,
@@ -16,6 +17,7 @@ def list(
1617
)
1718
response = client.connection.get(PATH) do |req|
1819
req.params["class"] = class_name unless class_name.nil?
20+
req.params["tenant"] = tenant unless tenant.nil?
1921
req.params["limit"] = limit unless limit.nil?
2022
req.params["offset"] = offset unless offset.nil?
2123
req.params["after"] = after unless after.nil?
@@ -31,6 +33,7 @@ def list(
3133
def create(
3234
class_name:,
3335
properties:,
36+
tenant: nil,
3437
consistency_level: nil,
3538
id: nil,
3639
vector: nil
@@ -47,6 +50,7 @@ def create(
4750
req.body = {}
4851
req.body["class"] = class_name
4952
req.body["properties"] = properties
53+
req.body["tenant"] = tenant unless tenant.blank?
5054
req.body["id"] = id unless id.nil?
5155
req.body["vector"] = vector unless vector.nil?
5256
end

lib/weaviate/query.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ def get(
66
class_name:,
77
fields:,
88
after: nil,
9+
tenant: nil,
910
limit: nil,
1011
offset: nil,
1112
sort: nil,
@@ -21,6 +22,7 @@ def get(
2122
response = client.graphql.execute(
2223
get_query(
2324
class_name: class_name,
25+
tenant: tenant,
2426
fields: fields,
2527
sort: sort,
2628
where: where,
@@ -131,7 +133,7 @@ def explore_query(
131133

132134
def get_query(
133135
class_name:,
134-
fields:,
136+
fields:, tenant: nil,
135137
where: nil,
136138
near_text: nil,
137139
near_vector: nil,
@@ -153,6 +155,7 @@ def get_query(
153155
after: $after,
154156
limit: $limit,
155157
offset: $offset,
158+
#{tenant.present? ? "tenant: #{tenant}" : ""}
156159
#{near_text.present? ? "nearText: #{near_text}" : ""},
157160
#{near_vector.present? ? "nearVector: #{near_vector}" : ""},
158161
#{near_image.present? ? "nearImage: #{near_image}" : ""},

lib/weaviate/schema.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ def create(
2626
class_name:,
2727
description: nil,
2828
properties: nil,
29+
multi_tenant: nil,
2930
vector_index_type: nil,
3031
vector_index_config: nil,
3132
vectorizer: nil,
@@ -42,6 +43,7 @@ def create(
4243
req.body["vectorizer"] = vectorizer unless vectorizer.nil?
4344
req.body["moduleConfig"] = module_config unless module_config.nil?
4445
req.body["properties"] = properties unless properties.nil?
46+
req.body["multiTenancyConfig"] = {enabled: true} unless multi_tenant.nil?
4547
req.body["invertedIndexConfig"] = inverted_index_config unless inverted_index_config.nil?
4648
req.body["replicationConfig"] = replication_config unless replication_config.nil?
4749
end
@@ -93,6 +95,38 @@ def update(
9395
response.body
9496
end
9597

98+
# Adds one or more tenants to a class.
99+
def add_tenants(
100+
class_name:,
101+
tenants:
102+
)
103+
client.connection.post("#{PATH}/#{class_name}/tenants") do |req|
104+
tenants_str = tenants.map { |t| %({"name": "#{t}"}) }.join(", ")
105+
req.body = "[#{tenants_str}]"
106+
end
107+
end
108+
109+
# List tenants of a class.
110+
def list_tenants(class_name:)
111+
response = client.connection.get("#{PATH}/#{class_name}/tenants")
112+
response.body
113+
end
114+
115+
# Remove one or more tenants from a class.
116+
def remove_tenants(
117+
class_name:,
118+
tenants:
119+
)
120+
response = client.connection.delete("#{PATH}/#{class_name}/tenants") do |req|
121+
req.body = tenants
122+
end
123+
124+
if response.success?
125+
end
126+
127+
response.body
128+
end
129+
96130
# Add a property to an existing schema class.
97131
def add_property(
98132
class_name:,

spec/weaviate/objects_spec.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
it "creates an object" do
2727
response = objects.create(
2828
class_name: "Question",
29+
tenant: "tenant_name",
2930
properties: {
3031
answer: "42",
3132
question: "What is the meaning of life?",

spec/weaviate/query_spec.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
class_name: "Question",
5656
fields: "question, category",
5757
near_text: "{ concepts: [\"biology\"] }",
58+
tenant: "tenant_name",
5859
limit: "1"
5960
)
6061

spec/weaviate/schema_spec.rb

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
response = schema.create(
5858
class_name: "Question",
5959
description: "Information from a Jeopardy! question",
60+
multi_tenant: true,
6061
properties: [
6162
{
6263
dataType: ["text"],
@@ -111,9 +112,30 @@
111112
end
112113
end
113114

114-
xdescribe "#add_property" do
115+
describe "#add_property"
116+
117+
describe "#add_tenants" do
118+
let(:response) { OpenStruct.new(success?: true, body: class_fixture) }
119+
120+
before do
121+
allow_any_instance_of(Faraday::Connection).to receive(:post)
122+
.with("schema/Question/tenants")
123+
.and_return(response)
124+
end
125+
126+
it "returns the schema" do
127+
response = schema.add_tenants(
128+
class_name: "Question",
129+
tenants: ["tenant1", "tenant2"]
130+
)
131+
expect(response.dig("class")).to eq("Question")
132+
end
115133
end
116134

135+
describe "#list_tenants"
136+
137+
describe "#remove_tenants"
138+
117139
describe "#shards" do
118140
let(:response) { OpenStruct.new(success?: true, body: shard_fixture) }
119141

0 commit comments

Comments
 (0)