Skip to content

Commit 4db0376

Browse files
Changes
1 parent 97ddddf commit 4db0376

File tree

9 files changed

+253
-83
lines changed

9 files changed

+253
-83
lines changed

README.md

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,18 @@ response.data
6565
client.schema.delete(class_name: 'Question')
6666

6767
# Update settings of an existing schema class.
68+
# Does not support modifying existing properties.
6869
client.schema.update(class_name: 'Question')
6970

71+
# Adding a new property
72+
client.schema.add_property(
73+
class_name: 'Question',
74+
property: {
75+
"dataType": ["boolean"],
76+
"name": "homepage"
77+
}
78+
)
79+
7080
# Inspect the shards of a class
7181
client.schema.shards(class_name: 'Question')
7282
```
@@ -117,7 +127,7 @@ client.objects.update(
117127
)
118128

119129
# Batch create objects
120-
response = client.objects.batch_create(objects: [
130+
client.objects.batch_create(objects: [
121131
{
122132
class: "Question",
123133
properties: {
@@ -134,7 +144,6 @@ response = client.objects.batch_create(objects: [
134144
}
135145
}
136146
])
137-
response.data
138147

139148
# Batch delete objects
140149
client.objects.batch_delete(
@@ -191,7 +200,7 @@ client.query.get class_name: 'Question', fields: 'answer question category _addi
191200
```ruby
192201
client.query.aggs(
193202
class_name: "Question",
194-
fields: 'meta { count }'
203+
fields: 'meta { count }',
195204
group_by: ["category"],
196205
object_limit: "10",
197206
near_text: "{ concepts: [\"knowledge\"] }"

lib/weaviate/objects.rb

Lines changed: 100 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,29 @@ def list(
2323
req.params["sort"] = sort unless sort.nil?
2424
req.params["order"] = order unless order.nil?
2525
end
26-
Response::Collection.from_response(response.body, key: "objects", type: Response::Object)
26+
27+
if response.success?
28+
response.body
29+
else
30+
response.body
31+
end
2732
end
2833

2934
# Create a new data object. The provided meta-data and schema values are validated.
3035
def create(
3136
class_name:,
3237
properties:,
38+
consistency_level: nil,
3339
id: nil,
3440
vector: nil
3541
)
42+
validate_consistency_level!(consistency_level) unless consistency_level.nil?
43+
3644
response = client.connection.post(PATH) do |req|
45+
req.params = {
46+
consistency_level: consistency_level.to_s.upcase
47+
} unless consistency_level.nil?
48+
3749
req.body = {}
3850
req.body["class"] = class_name
3951
req.body["properties"] = properties
@@ -42,44 +54,64 @@ def create(
4254
end
4355

4456
if response.success?
45-
Weaviate::Response::Object.new(response.body)
57+
response.body
4658
else
4759
response.body
4860
end
4961
end
5062

5163
# Batch create objects
52-
def batch_create(objects:)
64+
def batch_create(
65+
objects:,
66+
consistency_level: nil
67+
)
68+
validate_consistency_level!(consistency_level) unless consistency_level.nil?
69+
5370
response = client.connection.post("batch/#{PATH}") do |req|
71+
req.params["consistency_level"] = consistency_level.to_s.upcase unless consistency_level.nil?
5472
req.body = {objects: objects}
5573
end
5674

5775
if response.success?
58-
Response::Collection.from_response(response.body, type: Response::Object)
76+
response.body
77+
else
78+
response.body
5979
end
6080
end
6181

6282
# Get a single data object.
6383
def get(
6484
class_name:,
6585
id:,
66-
include: nil
86+
include: nil,
87+
consistency_level: nil
6788
)
68-
# TODO: validate `include` param values
69-
# include | query | param | string | Include additional information, such as classification info. Allowed values include: classification, vector.
89+
validate_consistency_level!(consistency_level) unless consistency_level.nil?
7090

7191
response = client.connection.get("#{PATH}/#{class_name}/#{id}") do |req|
92+
req.params["consistency_level"] = consistency_level.to_s.upcase unless consistency_level.nil?
7293
req.params["include"] = include unless include.nil?
7394
end
7495

7596
if response.success?
76-
Weaviate::Response::Object.new(response.body)
97+
response.body
98+
else
99+
response.body
77100
end
78101
end
79102

80103
# Check if a data object exists
81-
def exists?(class_name:, id:)
82-
response = client.connection.head("#{PATH}/#{class_name}/#{id}")
104+
def exists?(
105+
class_name:,
106+
id:,
107+
consistency_level: nil
108+
)
109+
validate_consistency_level!(consistency_level) unless consistency_level.nil?
110+
111+
response = client.connection.head("#{PATH}/#{class_name}/#{id}") do |req|
112+
req.params["consistency_level"] = consistency_level.to_s.upcase unless consistency_level.nil?
113+
end
114+
83115
response.status == 204
84116
end
85117

@@ -88,24 +120,45 @@ def update(
88120
class_name:,
89121
id:,
90122
properties:,
91-
vector: nil
123+
vector: nil,
124+
consistency_level: nil
92125
)
126+
validate_consistency_level!(consistency_level) unless consistency_level.nil?
127+
93128
response = client.connection.put("#{PATH}/#{class_name}/#{id}") do |req|
129+
req.params["consistency_level"] = consistency_level.to_s.upcase unless consistency_level.nil?
130+
94131
req.body = {}
95132
req.body["id"] = id
96133
req.body["class"] = class_name
97134
req.body["properties"] = properties
98135
req.body["vector"] = vector unless vector.nil?
99136
end
137+
100138
if response.success?
101-
Weaviate::Response::Object.new(response.body)
139+
response.body
140+
else
141+
response.body
102142
end
103143
end
104144

105145
# Delete an individual data object from Weaviate.
106-
def delete(class_name:, id:)
107-
response = client.connection.delete("#{PATH}/#{class_name}/#{id}")
108-
response.success? && response.body.empty?
146+
def delete(
147+
class_name:,
148+
id:,
149+
consistency_level: nil
150+
)
151+
validate_consistency_level!(consistency_level) unless consistency_level.nil?
152+
153+
response = client.connection.delete("#{PATH}/#{class_name}/#{id}") do |req|
154+
req.params["consistency_level"] = consistency_level.to_s.upcase unless consistency_level.nil?
155+
end
156+
157+
if response.success?
158+
response.body.empty?
159+
else
160+
response.body
161+
end
109162
end
110163

111164
def batch_delete(
@@ -116,7 +169,12 @@ def batch_delete(
116169
dry_run: nil
117170
)
118171
path = "batch/#{PATH}"
119-
path << "?consistency_level=#{consistency_level}" unless consistency_level.nil?
172+
173+
unless consistency_level.nil?
174+
validate_consistency_level!(consistency_level)
175+
176+
path << "?consistency_level=#{consistency_level.to_s.upcase}"
177+
end
120178

121179
response = client.connection.delete(path) do |req|
122180
req.body = {
@@ -133,7 +191,31 @@ def batch_delete(
133191
end
134192

135193
# Validate a data object
136-
# def validate
137-
# end
194+
def validate(
195+
class_name:,
196+
properties:,
197+
id: nil
198+
)
199+
response = client.connection.post("#{PATH}/validate") do |req|
200+
req.body = {}
201+
req.body["class"] = class_name
202+
req.body["properties"] = properties
203+
req.body["id"] = id unless id.nil?
204+
end
205+
206+
if response.success?
207+
response.body.empty?
208+
else
209+
response.body
210+
end
211+
end
212+
213+
private
214+
215+
def validate_consistency_level!(consistency_level)
216+
unless %w[ONE QUORUM ALL].include?(consistency_level.to_s.upcase)
217+
raise ArgumentError, 'consistency_level must be either "ONE" or "QUORUM" OR "ALL"'
218+
end
219+
end
138220
end
139221
end

lib/weaviate/query.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def get(
2828
limit: limit,
2929
offset: offset
3030
)
31-
response.data.get.send(class_name.downcase)
31+
response.original_hash.dig('data', 'Get', class_name)
3232
rescue Graphlient::Errors::ExecutionError => error
3333
raise Weaviate::Error.new(error.response.data.get.errors.messages.to_h)
3434
end
@@ -53,7 +53,7 @@ def aggs(
5353
group_by: group_by,
5454
object_limit: object_limit
5555
)
56-
response.data.aggregate.send(class_name.downcase)
56+
response.original_hash.dig('data', 'Aggregate', class_name)
5757
rescue Graphlient::Errors::ExecutionError => error
5858
raise Weaviate::Error.new(error.response.data.aggregate.errors.messages.to_h)
5959
end
@@ -80,7 +80,7 @@ def explore(
8080
limit: limit,
8181
offset: offset
8282
)
83-
response.data.explore
83+
response.original_hash.dig('data', 'Explore')
8484
rescue Graphlient::Errors::ExecutionError => error
8585
raise Weaviate::Error.new(error.to_s)
8686
end

lib/weaviate/schema.rb

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,33 @@
11
# frozen_string_literal: true
22

3+
require 'pry'
4+
35
module Weaviate
46
class Schema < Base
57
PATH = "schema"
68

79
# Dumps the current Weaviate schema. The result contains an array of objects.
810
def list
911
response = client.connection.get(PATH)
10-
Response::Collection.from_response(response.body, key: "classes", type: Response::Class)
12+
response.body
1113
end
1214

1315
# Get a single class from the schema
1416
def get(class_name:)
1517
response = client.connection.get("#{PATH}/#{class_name}")
1618

1719
if response.success?
18-
Response::Class.new(response.body)
20+
response.body
21+
elsif response.status == 404
22+
response.reason_phrase
1923
end
2024
end
2125

2226
# Create a new data object class in the schema.
2327
def create(
2428
class_name:,
25-
description:,
26-
properties:,
29+
description: nil,
30+
properties: nil,
2731
vector_index_type: nil,
2832
vector_index_config: nil,
2933
vectorizer: nil,
@@ -33,7 +37,7 @@ def create(
3337
)
3438
response = client.connection.post(PATH) do |req|
3539
req.body = {}
36-
req.body["class"] = class_name unless class_name.nil?
40+
req.body["class"] = class_name
3741
req.body["description"] = description unless description.nil?
3842
req.body["vectorIndexType"] = vector_index_type unless vector_index_type.nil?
3943
req.body["vectorIndexConfig"] = vector_index_config unless vector_index_config.nil?
@@ -45,7 +49,7 @@ def create(
4549
end
4650

4751
if response.success?
48-
Response::Class.new(response.body)
52+
response.body
4953
else
5054
response.body
5155
end
@@ -54,10 +58,18 @@ def create(
5458
# Remove a class (and all data in the instances) from the schema.
5559
def delete(class_name:)
5660
response = client.connection.delete("#{PATH}/#{class_name}")
57-
response.success? && response.body.empty?
61+
62+
if response.success?
63+
response.body.empty?
64+
else
65+
response.body
66+
end
5867
end
5968

6069
# Update settings of an existing schema class.
70+
# TODO: Fix it.
71+
# This endpoint keeps returning the following error:
72+
# => {"error"=>[{"message"=>"properties cannot be updated through updating the class. Use the add property feature (e.g. \"POST /v1/schema/{className}/properties\") to add additional properties"}]}
6173
def update(
6274
class_name:,
6375
description: nil,
@@ -83,7 +95,23 @@ def update(
8395
end
8496

8597
if response.success?
86-
Response::Class.new(response.body)
98+
response.body
99+
else
100+
response.body
101+
end
102+
end
103+
104+
# Add a property to an existing schema class.
105+
def add_property(
106+
class_name:,
107+
property:
108+
)
109+
response = client.connection.post("#{PATH}/#{class_name}/properties") do |req|
110+
req.body = property
111+
end
112+
113+
if response.success?
114+
response.body
87115
else
88116
response.body
89117
end

spec/fixtures/class.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"class": "Question",
33
"description": "Information from a Jeopardy! question",
4-
"properties": [
4+
"properties": [
55
{
66
"dataType": ["text"],
77
"description": "The question",

0 commit comments

Comments
 (0)