Skip to content

Commit 1e5b066

Browse files
committed
Added support for upserts in import endpoint
1 parent 08c759f commit 1e5b066

4 files changed

Lines changed: 44 additions & 17 deletions

File tree

lib/typesense/api_call.rb

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,22 @@ def initialize(configuration)
2525
end
2626

2727
def post(endpoint, parameters = {})
28-
headers, body = extract_headers_and_body_from(parameters)
28+
headers, query, body = split_post_put_parameters(parameters)
2929

3030
perform_request :post,
3131
endpoint,
3232
headers,
33+
params: query,
3334
body: body
3435
end
3536

3637
def put(endpoint, parameters = {})
37-
headers, body = extract_headers_and_body_from(parameters)
38+
headers, query, body = split_post_put_parameters(parameters)
3839

3940
perform_request :put,
4041
endpoint,
4142
headers,
43+
params: query,
4244
body: body
4345
end
4446

@@ -110,15 +112,17 @@ def perform_request(method, endpoint, headers = {}, options = {})
110112

111113
private
112114

113-
def extract_headers_and_body_from(parameters)
115+
def split_post_put_parameters(parameters)
114116
if json_request?(parameters)
115117
headers = { 'Content-Type' => 'application/json' }
118+
query = parameters[:query]
116119
body = Oj.dump(sanitize_parameters(parameters))
117120
else
118121
headers = {}
122+
query = parameters[:query]
119123
body = parameters[:body]
120124
end
121-
[headers, body]
125+
[headers, query, body]
122126
end
123127

124128
def extract_headers_and_query_from(parameters)

lib/typesense/documents.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@ def create_many(documents)
2222
results_in_jsonl_format.split("\n").map { |r| Oj.load(r) }
2323
end
2424

25-
def import(documents_in_jsonl_format)
26-
@api_call.post(endpoint_path('import'), as_json: false, body: documents_in_jsonl_format)
25+
def import(documents_in_jsonl_format, query_parameters = {})
26+
@api_call.post(endpoint_path('import'),
27+
as_json: false,
28+
query: query_parameters,
29+
body: documents_in_jsonl_format)
2730
end
2831

2932
def export

lib/typesense/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# frozen_string_literal: true
22

33
module Typesense
4-
VERSION = '0.7.0'
4+
VERSION = '0.8.0pre'
55
end

spec/typesense/documents_spec.rb

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,37 @@
7474
end
7575

7676
describe '#import' do
77-
it 'imports documents in JSONL format' do
78-
stub_request(:post, Typesense::ApiCall.new(typesense.configuration).send(:uri_for, '/collections/companies/documents/import', typesense.configuration.nodes[0]))
79-
.with(body: "#{JSON.dump(document)}\n#{JSON.dump(document)}",
80-
headers: {
81-
'X-Typesense-Api-Key' => typesense.configuration.api_key
82-
})
83-
.to_return(status: 200, body: '{}', headers: { 'Content-Type': 'application/json' })
84-
85-
result = companies_documents.import("#{JSON.dump(document)}\n#{JSON.dump(document)}")
77+
context 'when upsert is not specified' do
78+
it 'imports documents in JSONL format' do
79+
stub_request(:post, Typesense::ApiCall.new(typesense.configuration).send(:uri_for, '/collections/companies/documents/import', typesense.configuration.nodes[0]))
80+
.with(body: "#{JSON.dump(document)}\n#{JSON.dump(document)}",
81+
headers: {
82+
'X-Typesense-Api-Key' => typesense.configuration.api_key
83+
})
84+
.to_return(status: 200, body: '{}', headers: { 'Content-Type': 'application/json' })
85+
86+
result = companies_documents.import("#{JSON.dump(document)}\n#{JSON.dump(document)}")
87+
88+
expect(result).to eq({})
89+
end
90+
end
8691

87-
expect(result).to eq({})
92+
context 'when upsert is true' do
93+
it 'imports documents in JSONL format, with upsert query parameter' do
94+
stub_request(:post, Typesense::ApiCall.new(typesense.configuration).send(:uri_for, '/collections/companies/documents/import', typesense.configuration.nodes[0]))
95+
.with(body: "#{JSON.dump(document)}\n#{JSON.dump(document)}",
96+
headers: {
97+
'X-Typesense-Api-Key' => typesense.configuration.api_key
98+
},
99+
query: {
100+
'upsert' => 'true'
101+
})
102+
.to_return(status: 200, body: '{}', headers: { 'Content-Type': 'application/json' })
103+
104+
result = companies_documents.import("#{JSON.dump(document)}\n#{JSON.dump(document)}", upsert: true)
105+
106+
expect(result).to eq({})
107+
end
88108
end
89109
end
90110

0 commit comments

Comments
 (0)