lableb_sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lableb_sdk.gemspec +14 -0
- data/lib/lableb_client.rb +63 -0
- data/lib/lableb_sdk.rb +231 -0
- metadata +46 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 939511b56c642e7cd8edaa7e2d2a69ea94ad4d69e03de67917a95d7c5d9bb47f
|
4
|
+
data.tar.gz: bb30281e4d485a6aca6d16df53f15ae341fd166cc32f1890beaa5baa1443eb14
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a2c729ba7b71a790530fe827d59564d779d3c460cbe58ff4bc0ad1f45ca2db0e32b08084df2ff1402429fd02f982b2512dfa96db34c9aaf25dff63031c7f4be2
|
7
|
+
data.tar.gz: b5caed6a6c4175c3a7b83427df78fc5a7e13e7690920ac81c47ebebf303b37aa15e2193f79906eec65efe06a2afcfcf2732ecf56f7e4ff3c9ded71746ae41c96
|
data/lableb_sdk.gemspec
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "lableb_sdk"
|
3
|
+
s.version = "1.0.0"
|
4
|
+
s.date = "2019-06-01"
|
5
|
+
s.summary = "lableb cloud search sdk"
|
6
|
+
s.description = "Lableb cloud search api sdk"
|
7
|
+
s.homepage = "https://gitlab.com/cse-sdk/ruby-sdk"
|
8
|
+
s.authors = ["Lableb"]
|
9
|
+
s.email = "support@lableb.com"
|
10
|
+
s.files = %w(lableb_sdk.gemspec) + Dir["lib/**/*.rb"]
|
11
|
+
s.require_paths = ["lib"]
|
12
|
+
s.required_ruby_version = ">=2.0.0"
|
13
|
+
s.license = "MIT"
|
14
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require "net/http"
|
2
|
+
require "net/https"
|
3
|
+
require "json"
|
4
|
+
|
5
|
+
module Lableb
|
6
|
+
class Client
|
7
|
+
def createRequest(url, headers)
|
8
|
+
http = Net::HTTP.new(url.host, url.port)
|
9
|
+
headers.each do | key, value |
|
10
|
+
req[key] = value
|
11
|
+
end
|
12
|
+
http.use_ssl = true
|
13
|
+
return http
|
14
|
+
end
|
15
|
+
|
16
|
+
def getJSON(url, qs = {}, headers = {})
|
17
|
+
uri = URI("#{url}?#{self.buildQueryString(qs)}")
|
18
|
+
http = self.createRequest(uri, headers)
|
19
|
+
req = Net::HTTP::Get.new(uri)
|
20
|
+
response = http.request(req)
|
21
|
+
return response
|
22
|
+
end
|
23
|
+
|
24
|
+
def postJSON(url, body = {}, qs = {}, headers = {})
|
25
|
+
uri = URI("#{url}?#{self.buildQueryString(qs)}")
|
26
|
+
http = self.createRequest(uri, headers)
|
27
|
+
req = Net::HTTP::Post.new(uri, { 'Content-Type': 'application/json' })
|
28
|
+
req.body = body.to_json
|
29
|
+
response = http.request(req)
|
30
|
+
return response
|
31
|
+
end
|
32
|
+
|
33
|
+
def deleteJSON(url, qs = {}, headers = {})
|
34
|
+
uri = URI("#{url}?#{self.buildQueryString(qs)}")
|
35
|
+
http = self.createRequest(uri, headers)
|
36
|
+
req = Net::HTTP::Delete.new(uri)
|
37
|
+
response = http.request(req)
|
38
|
+
return response
|
39
|
+
end
|
40
|
+
|
41
|
+
def buildQueryString(params)
|
42
|
+
res = []
|
43
|
+
params.each do | key, value |
|
44
|
+
if value.kind_of? Array
|
45
|
+
res.push(value.map{|el| "#{key}=#{el}"})
|
46
|
+
elsif value.is_a? Hash
|
47
|
+
value.each do | key2, val2 |
|
48
|
+
temp = {}
|
49
|
+
if val2.is_a? String
|
50
|
+
temp[key] = "#{key2}:\"#{val2}\""
|
51
|
+
elsif val2.is_a? Array
|
52
|
+
temp[key] = val2.map{|el| "#{key2}:\"#{el}\""}
|
53
|
+
end
|
54
|
+
res.push(buildQueryString(temp))
|
55
|
+
end
|
56
|
+
else
|
57
|
+
res.push("#{key}=#{value.to_s}")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
res.join("&")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/lib/lableb_sdk.rb
ADDED
@@ -0,0 +1,231 @@
|
|
1
|
+
require "json"
|
2
|
+
require "date"
|
3
|
+
require "./lib/lableb_client"
|
4
|
+
|
5
|
+
module Lableb
|
6
|
+
class SDK
|
7
|
+
def initialize(projectName, searchToken, indexingToken)
|
8
|
+
@projectName = projectName
|
9
|
+
@searchToken = searchToken
|
10
|
+
@indexingToken = indexingToken
|
11
|
+
@apiURL = "https://api-bahuth.lableb.com/api/v1"
|
12
|
+
@baseURL = "#{@apiURL}/#{@projectName}/collections"
|
13
|
+
@client = Lableb::Client.new
|
14
|
+
@customSessionID = nil
|
15
|
+
end
|
16
|
+
|
17
|
+
# Indexes documents to Lableb
|
18
|
+
# @param collection {String} - collection name in Lableb index
|
19
|
+
# @param document {Hash | Array} - docuemnts to index
|
20
|
+
def index(collection, documents)
|
21
|
+
docs = nil
|
22
|
+
if documents.kind_of? Array
|
23
|
+
docs = documents.map{|document| self.convertDates(document)}
|
24
|
+
else
|
25
|
+
docs = [self.convertDates(documents)]
|
26
|
+
end
|
27
|
+
url = "#{@baseURL}/#{collection}/documents"
|
28
|
+
response = @client.postJSON(url, docs, { token: @indexingToken })
|
29
|
+
indexed = response.code.to_i < 400
|
30
|
+
return indexed, response.code.to_i
|
31
|
+
end
|
32
|
+
|
33
|
+
# Searches documents on Lableb
|
34
|
+
# @param collection {String} - collection name in Lableb index
|
35
|
+
# @param params {Hash} - query string parameters
|
36
|
+
# @param handler {String} - search handler name
|
37
|
+
def search(collection, params, handler="default")
|
38
|
+
params['token'] = @searchToken
|
39
|
+
params['session_id'] = self.getSessionID()
|
40
|
+
url = "#{@baseURL}/#{collection}/search/#{handler}"
|
41
|
+
response = @client.getJSON(url, params)
|
42
|
+
code = response.code.to_i
|
43
|
+
data = JSON.parse(response.body)
|
44
|
+
|
45
|
+
if code >= 400
|
46
|
+
return data['response'], code
|
47
|
+
end
|
48
|
+
|
49
|
+
facets = {}
|
50
|
+
data['response']['facets'].map do |facet|
|
51
|
+
if facet[0] != "count"
|
52
|
+
facets[facet[0]] = facet[1]['buckets']
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
docuemntsWithFeedbackUrl = data['response']['results'].map.with_index do |document, idx|
|
57
|
+
document['feedbackUrl'] = self.generateSearchFeedbackUrl(collection, handler, document, idx + 1, params[:q])
|
58
|
+
document
|
59
|
+
end
|
60
|
+
|
61
|
+
return {
|
62
|
+
totalDocuments: data['response']['found_documents'],
|
63
|
+
documents: docuemntsWithFeedbackUrl,
|
64
|
+
facets: facets
|
65
|
+
}, code
|
66
|
+
end
|
67
|
+
|
68
|
+
# generates a feedback url for a search result
|
69
|
+
def generateSearchFeedbackUrl(collection, handler, document, order, query)
|
70
|
+
qs = @client.buildQueryString({
|
71
|
+
session_id: self.getSessionID(),
|
72
|
+
token: @searchToken,
|
73
|
+
query: query,
|
74
|
+
item_id: document['id'],
|
75
|
+
item_order: order,
|
76
|
+
url: document['url']
|
77
|
+
})
|
78
|
+
url = "#{@baseURL}/#{collection}/search/#{handler}/feedback/hits?#{qs}"
|
79
|
+
return url
|
80
|
+
end
|
81
|
+
|
82
|
+
# Gets autcomplete suggestions
|
83
|
+
# @param collection {String} - collection name in Lableb index
|
84
|
+
# @param params {Hash} - query string parameters
|
85
|
+
# @param handler {String} - autocomplete handler name
|
86
|
+
def autocomplete(collection, params, handler="suggest")
|
87
|
+
params['token'] = @searchToken
|
88
|
+
params['session_id'] = self.getSessionID()
|
89
|
+
url = "#{@baseURL}/#{collection}/autocomplete/#{handler}"
|
90
|
+
response = @client.getJSON(url, params)
|
91
|
+
data = JSON.parse(response.body)
|
92
|
+
code = response.code.to_i
|
93
|
+
|
94
|
+
if code >= 400
|
95
|
+
return data['response'], code
|
96
|
+
end
|
97
|
+
|
98
|
+
suggestionsWithFeedbackUrl = data['response']['results'].map.with_index do |suggestion, idx|
|
99
|
+
suggestion['feedbackUrl'] = self.generateAutocompleteFeedbackUrl(collection, handler, suggestion, idx + 1, params[:q])
|
100
|
+
suggestion
|
101
|
+
end
|
102
|
+
|
103
|
+
return {
|
104
|
+
totalSuggestions: data['response']['found_documents'],
|
105
|
+
suggestions: suggestionsWithFeedbackUrl
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
109
|
+
# generates autocomplete feedback url for an autocomplete suggestion
|
110
|
+
def generateAutocompleteFeedbackUrl(collection, handler, suggestion, order, query)
|
111
|
+
params = {
|
112
|
+
session_id: self.getSessionID(),
|
113
|
+
token: @searchToken,
|
114
|
+
query: query,
|
115
|
+
item_order: order
|
116
|
+
}
|
117
|
+
|
118
|
+
if suggestion['url']
|
119
|
+
params['url'] = suggestion['url']
|
120
|
+
end
|
121
|
+
|
122
|
+
qs = @client.buildQueryString(params)
|
123
|
+
url = "#{@baseURL}/#{collection}/autocomplete/#{handler}/feedback/hits?#{qs}"
|
124
|
+
return url
|
125
|
+
end
|
126
|
+
|
127
|
+
# Gets related posts to the specified one in passed params
|
128
|
+
# @param collection {String} - collection name in Lableb index
|
129
|
+
# @param params {Hash} - query string parameters
|
130
|
+
# @param handler {String} - recommendation handler name
|
131
|
+
def recommend(collection, params, handler="recommend")
|
132
|
+
params['token'] = @searchToken
|
133
|
+
params['session_id'] = self.getSessionID()
|
134
|
+
url = "#{@baseURL}/#{collection}/recommend/#{handler}"
|
135
|
+
response = @client.getJSON(url, params)
|
136
|
+
data = JSON.parse(response.body)
|
137
|
+
code = response.code.to_i
|
138
|
+
|
139
|
+
if code >= 400
|
140
|
+
return data['response'], code
|
141
|
+
end
|
142
|
+
|
143
|
+
recommendationsWithFeedbackUrl = data['response']['results'].map.with_index do |recommendation, idx|
|
144
|
+
recommendation['feedbackUrl'] = self.generateRecommendationFeedbackUrl(collection, handler, recommendation, idx + 1)
|
145
|
+
recommendation
|
146
|
+
end
|
147
|
+
|
148
|
+
return {
|
149
|
+
totalDocuments: data['response']['found_documents'],
|
150
|
+
documents: recommendationsWithFeedbackUrl
|
151
|
+
}
|
152
|
+
end
|
153
|
+
|
154
|
+
# generates recommendation hit feedback url, but the url needs to be completed with
|
155
|
+
# the source document params
|
156
|
+
def generateRecommendationFeedbackUrl(collection, handler, target, order)
|
157
|
+
params = {
|
158
|
+
session_id: self.getSessionID(),
|
159
|
+
token: @searchToken,
|
160
|
+
target_id: target['id'],
|
161
|
+
item_order: order
|
162
|
+
}
|
163
|
+
|
164
|
+
if target['url']
|
165
|
+
params['target_url'] = target['url']
|
166
|
+
end
|
167
|
+
|
168
|
+
if target['title']
|
169
|
+
params['target_title'] = target['title']
|
170
|
+
end
|
171
|
+
|
172
|
+
qs = @client.buildQueryString(params)
|
173
|
+
url = "#{@baseURL}/#{collection}/recommend/#{handler}/feedback/hits?#{qs}"
|
174
|
+
return url
|
175
|
+
end
|
176
|
+
|
177
|
+
# Deletes a document from Lableb index by id
|
178
|
+
# @param collection {String} - collection name in Lableb index
|
179
|
+
# @param id {String} - id of the document to be deleted
|
180
|
+
def delete(collection, id)
|
181
|
+
url = "#{@baseURL}/#{collection}/documents/#{id}"
|
182
|
+
response = @client.deleteJSON(url, { token: @indexingToken })
|
183
|
+
data = JSON.parse(response.body)
|
184
|
+
code = response.code.to_i
|
185
|
+
|
186
|
+
if code >= 400
|
187
|
+
return data['response'], code
|
188
|
+
end
|
189
|
+
|
190
|
+
return true, code
|
191
|
+
end
|
192
|
+
|
193
|
+
# covert each date in a document to ISO8601 date string
|
194
|
+
def convertDates(doc)
|
195
|
+
doc.each do | key, value |
|
196
|
+
if key[-2..key.length] == "dt"
|
197
|
+
doc[key] = self.toISODateString(value)
|
198
|
+
elsif key[-3..key.length] == "dta"
|
199
|
+
doc[key] = value.map{ | date | self.toISODateString(date) }
|
200
|
+
end
|
201
|
+
end
|
202
|
+
doc
|
203
|
+
end
|
204
|
+
|
205
|
+
# convert a date object or a date string into ISO8601 date string
|
206
|
+
def toISODateString(date)
|
207
|
+
str = ""
|
208
|
+
if (date.kind_of? Date)
|
209
|
+
str = date.to_s
|
210
|
+
elsif date.is_a? String
|
211
|
+
str = date
|
212
|
+
end
|
213
|
+
dt = DateTime.parse(str).iso8601.split('+')[0] + "Z"
|
214
|
+
dt
|
215
|
+
end
|
216
|
+
|
217
|
+
# sets custom session id generator
|
218
|
+
def setSessionIDGenerator(method)
|
219
|
+
@customSessionID = method
|
220
|
+
end
|
221
|
+
|
222
|
+
# returns the custom session id generator if it exists
|
223
|
+
# else generates and returns a random string
|
224
|
+
def getSessionID()
|
225
|
+
if @customSessionID
|
226
|
+
return @customSessionID.call()
|
227
|
+
end
|
228
|
+
return rand(7958661109946400884391936).to_s(36)
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
metadata
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lableb_sdk
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Lableb
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-06-01 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Lableb cloud search api sdk
|
14
|
+
email: support@lableb.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lableb_sdk.gemspec
|
20
|
+
- lib/lableb_client.rb
|
21
|
+
- lib/lableb_sdk.rb
|
22
|
+
homepage: https://gitlab.com/cse-sdk/ruby-sdk
|
23
|
+
licenses:
|
24
|
+
- MIT
|
25
|
+
metadata: {}
|
26
|
+
post_install_message:
|
27
|
+
rdoc_options: []
|
28
|
+
require_paths:
|
29
|
+
- lib
|
30
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 2.0.0
|
35
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
requirements: []
|
41
|
+
rubyforge_project:
|
42
|
+
rubygems_version: 2.7.6
|
43
|
+
signing_key:
|
44
|
+
specification_version: 4
|
45
|
+
summary: lableb cloud search sdk
|
46
|
+
test_files: []
|