algolia 2.0.0.pre.alpha.2
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/.circleci/config.yml +146 -0
- data/.github/ISSUE_TEMPLATE.md +20 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +22 -0
- data/.gitignore +38 -0
- data/.rubocop.yml +186 -0
- data/.rubocop_todo.yml +14 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +18 -0
- data/LICENSE +21 -0
- data/README.md +56 -0
- data/Rakefile +45 -0
- data/Steepfile +6 -0
- data/algolia.gemspec +41 -0
- data/bin/console +21 -0
- data/bin/setup +8 -0
- data/lib/algolia.rb +42 -0
- data/lib/algolia/account_client.rb +65 -0
- data/lib/algolia/analytics_client.rb +105 -0
- data/lib/algolia/config/algolia_config.rb +40 -0
- data/lib/algolia/config/analytics_config.rb +20 -0
- data/lib/algolia/config/insights_config.rb +20 -0
- data/lib/algolia/config/recommendation_config.rb +20 -0
- data/lib/algolia/config/search_config.rb +40 -0
- data/lib/algolia/defaults.rb +35 -0
- data/lib/algolia/enums/call_type.rb +4 -0
- data/lib/algolia/enums/retry_outcome_type.rb +5 -0
- data/lib/algolia/error.rb +29 -0
- data/lib/algolia/helpers.rb +83 -0
- data/lib/algolia/http/http_requester.rb +84 -0
- data/lib/algolia/http/response.rb +23 -0
- data/lib/algolia/insights_client.rb +238 -0
- data/lib/algolia/iterators/base_iterator.rb +19 -0
- data/lib/algolia/iterators/object_iterator.rb +27 -0
- data/lib/algolia/iterators/paginator_iterator.rb +44 -0
- data/lib/algolia/iterators/rule_iterator.rb +9 -0
- data/lib/algolia/iterators/synonym_iterator.rb +9 -0
- data/lib/algolia/logger_helper.rb +14 -0
- data/lib/algolia/recommendation_client.rb +60 -0
- data/lib/algolia/responses/add_api_key_response.rb +38 -0
- data/lib/algolia/responses/base_response.rb +9 -0
- data/lib/algolia/responses/delete_api_key_response.rb +40 -0
- data/lib/algolia/responses/indexing_response.rb +28 -0
- data/lib/algolia/responses/multiple_batch_indexing_response.rb +29 -0
- data/lib/algolia/responses/multiple_response.rb +45 -0
- data/lib/algolia/responses/restore_api_key_response.rb +36 -0
- data/lib/algolia/responses/update_api_key_response.rb +39 -0
- data/lib/algolia/search_client.rb +614 -0
- data/lib/algolia/search_index.rb +1094 -0
- data/lib/algolia/transport/request_options.rb +94 -0
- data/lib/algolia/transport/retry_strategy.rb +117 -0
- data/lib/algolia/transport/stateful_host.rb +26 -0
- data/lib/algolia/transport/transport.rb +161 -0
- data/lib/algolia/user_agent.rb +25 -0
- data/lib/algolia/version.rb +3 -0
- data/sig/config/algolia_config.rbs +24 -0
- data/sig/config/analytics_config.rbs +11 -0
- data/sig/config/insights_config.rbs +11 -0
- data/sig/config/recommendation_config.rbs +11 -0
- data/sig/config/search_config.rbs +11 -0
- data/sig/enums/call_type.rbs +5 -0
- data/sig/helpers.rbs +12 -0
- data/sig/http/http_requester.rbs +17 -0
- data/sig/http/response.rbs +14 -0
- data/sig/interfaces/_connection.rbs +16 -0
- data/sig/iterators/base_iterator.rbs +15 -0
- data/sig/iterators/object_iterator.rbs +6 -0
- data/sig/iterators/paginator_iterator.rbs +8 -0
- data/sig/iterators/rule_iterator.rbs +5 -0
- data/sig/iterators/synonym_iterator.rbs +5 -0
- data/sig/transport/request_options.rbs +33 -0
- data/sig/transport/stateful_host.rbs +21 -0
- data/test/algolia/integration/account_client_test.rb +47 -0
- data/test/algolia/integration/analytics_client_test.rb +113 -0
- data/test/algolia/integration/base_test.rb +9 -0
- data/test/algolia/integration/insights_client_test.rb +80 -0
- data/test/algolia/integration/mocks/mock_requester.rb +45 -0
- data/test/algolia/integration/recommendation_client_test.rb +30 -0
- data/test/algolia/integration/search_client_test.rb +361 -0
- data/test/algolia/integration/search_index_test.rb +698 -0
- data/test/algolia/unit/helpers_test.rb +69 -0
- data/test/algolia/unit/retry_strategy_test.rb +139 -0
- data/test/algolia/unit/user_agent_test.rb +16 -0
- data/test/test_helper.rb +89 -0
- data/upgrade_guide.md +595 -0
- metadata +307 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
module Algolia
|
2
|
+
module Analytics
|
3
|
+
class Config < AlgoliaConfig
|
4
|
+
attr_accessor :region, :default_hosts
|
5
|
+
|
6
|
+
# Initialize a config
|
7
|
+
#
|
8
|
+
# @option options [String] :app_id
|
9
|
+
# @option options [String] :api_key
|
10
|
+
# @option options [String] :region
|
11
|
+
#
|
12
|
+
def initialize(opts = {})
|
13
|
+
super(opts)
|
14
|
+
|
15
|
+
@region = opts[:region] || 'us'
|
16
|
+
@default_hosts = [Transport::StatefulHost.new("analytics.#{region}.algolia.com")]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Algolia
|
2
|
+
module Insights
|
3
|
+
class Config < AlgoliaConfig
|
4
|
+
attr_accessor :region, :default_hosts
|
5
|
+
|
6
|
+
# Initialize a config
|
7
|
+
#
|
8
|
+
# @option options [String] :app_id
|
9
|
+
# @option options [String] :api_key
|
10
|
+
# @option options [String] :region
|
11
|
+
#
|
12
|
+
def initialize(opts = {})
|
13
|
+
super(opts)
|
14
|
+
|
15
|
+
@region = opts[:region] || 'us'
|
16
|
+
@default_hosts = [Transport::StatefulHost.new("insights.#{region}.algolia.io")]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Algolia
|
2
|
+
module Recommendation
|
3
|
+
class Config < AlgoliaConfig
|
4
|
+
attr_accessor :region, :default_hosts
|
5
|
+
|
6
|
+
# Initialize a config
|
7
|
+
#
|
8
|
+
# @option options [String] :app_id
|
9
|
+
# @option options [String] :api_key
|
10
|
+
# @option options [String] :region
|
11
|
+
#
|
12
|
+
def initialize(opts = {})
|
13
|
+
super(opts)
|
14
|
+
|
15
|
+
@region = opts[:region] || 'us'
|
16
|
+
@default_hosts = [Transport::StatefulHost.new("recommendation.#{region}.algolia.com")]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
require 'algolia/enums/call_type'
|
5
|
+
|
6
|
+
module Algolia
|
7
|
+
module Search
|
8
|
+
class Config < AlgoliaConfig
|
9
|
+
include CallType
|
10
|
+
attr_accessor :default_hosts
|
11
|
+
|
12
|
+
# Initialize a config
|
13
|
+
#
|
14
|
+
# @option options [String] :app_id
|
15
|
+
# @option options [String] :api_key
|
16
|
+
# @option options [Hash] :custom_hosts
|
17
|
+
#
|
18
|
+
def initialize(opts = {})
|
19
|
+
super(opts)
|
20
|
+
@default_hosts = []
|
21
|
+
hosts = []
|
22
|
+
hosts << Transport::StatefulHost.new("#{app_id}-dsn.algolia.net", accept: READ)
|
23
|
+
hosts << Transport::StatefulHost.new("#{app_id}.algolia.net", accept: WRITE)
|
24
|
+
|
25
|
+
stateful_hosts = 1.upto(3).map do |i|
|
26
|
+
Transport::StatefulHost.new("#{app_id}-#{i}.algolianet.com", accept: READ | WRITE)
|
27
|
+
end.shuffle
|
28
|
+
|
29
|
+
if opts.has_key?(:custom_hosts)
|
30
|
+
opts[:custom_hosts].each do |host|
|
31
|
+
host = Transport::StatefulHost.new(host)
|
32
|
+
@default_hosts.push(host)
|
33
|
+
end
|
34
|
+
else
|
35
|
+
@default_hosts = hosts + stateful_hosts
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Defaults
|
2
|
+
REQUESTER_CLASS = Algolia::Http::HttpRequester
|
3
|
+
ADAPTER = 'net_http_persistent'
|
4
|
+
TTL = 300
|
5
|
+
# The version of the REST API implemented by this module.
|
6
|
+
VERSION = 1
|
7
|
+
|
8
|
+
# HTTP Headers
|
9
|
+
# ----------------------------------------
|
10
|
+
|
11
|
+
# The HTTP header used for passing your application ID to the Algolia API.
|
12
|
+
HEADER_APP_ID = 'X-Algolia-Application-Id'.freeze
|
13
|
+
|
14
|
+
# The HTTP header used for passing your API key to the Algolia API.
|
15
|
+
HEADER_API_KEY = 'X-Algolia-API-Key'.freeze
|
16
|
+
|
17
|
+
# HTTP ERROR CODES
|
18
|
+
# ----------------------------------------
|
19
|
+
|
20
|
+
ERROR_BAD_REQUEST = 400
|
21
|
+
ERROR_FORBIDDEN = 403
|
22
|
+
ERROR_NOT_FOUND = 404
|
23
|
+
ERROR_TIMED_OUT = 408
|
24
|
+
|
25
|
+
BATCH_SIZE = 1000
|
26
|
+
CONNECT_TIMEOUT = 2
|
27
|
+
READ_TIMEOUT = 30
|
28
|
+
WRITE_TIMEOUT = 5
|
29
|
+
USER_AGENT = "Algolia for Ruby (#{Algolia::VERSION}), Ruby (#{RUBY_VERSION})"
|
30
|
+
|
31
|
+
WAIT_TASK_DEFAULT_TIME_BEFORE_RETRY = 100
|
32
|
+
|
33
|
+
GZIP_ENCODING = 'gzip'
|
34
|
+
NONE_ENCODING = 'none'
|
35
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Algolia
|
2
|
+
# Base exception class for errors thrown by the Algolia
|
3
|
+
# client library. AlgoliaError will be raised by any
|
4
|
+
# network operation if Algolia.init() has not been called.
|
5
|
+
# Exception ... why? A:http://www.skorks.com/2009/09/ruby-exceptions-and-exception-handling/
|
6
|
+
#
|
7
|
+
class AlgoliaError < StandardError
|
8
|
+
end
|
9
|
+
|
10
|
+
# Used when hosts are unreachable
|
11
|
+
#
|
12
|
+
class AlgoliaUnreachableHostError < AlgoliaError
|
13
|
+
end
|
14
|
+
|
15
|
+
# An exception class raised when the REST API returns an error.
|
16
|
+
# The error code and message will be parsed out of the HTTP response,
|
17
|
+
# which is also included in the response attribute.
|
18
|
+
#
|
19
|
+
class AlgoliaHttpError < AlgoliaError
|
20
|
+
attr_accessor :code
|
21
|
+
attr_accessor :message
|
22
|
+
|
23
|
+
def initialize(code, message)
|
24
|
+
self.code = code
|
25
|
+
self.message = message
|
26
|
+
super("#{self.code}: #{self.message}")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'multi_json'
|
2
|
+
|
3
|
+
module Helpers
|
4
|
+
# Convert an Hash to json
|
5
|
+
#
|
6
|
+
def to_json(body)
|
7
|
+
body.is_a?(String) ? body : MultiJson.dump(body)
|
8
|
+
end
|
9
|
+
|
10
|
+
# Converts each key of a hash to symbols
|
11
|
+
#
|
12
|
+
def symbolize_hash(hash)
|
13
|
+
hash.each_with_object({}) { |(k, v), h| h[k.to_sym] = v }
|
14
|
+
end
|
15
|
+
|
16
|
+
# Convert params to a full query string
|
17
|
+
#
|
18
|
+
def handle_params(params)
|
19
|
+
params.nil? || params.empty? ? '' : "?#{to_query_string(params)}"
|
20
|
+
end
|
21
|
+
|
22
|
+
# Create a query string from params
|
23
|
+
#
|
24
|
+
def to_query_string(params)
|
25
|
+
params.map do |key, value|
|
26
|
+
"#{CGI.escape(key.to_s)}=#{CGI.escape(value.to_s)}"
|
27
|
+
end.join('&')
|
28
|
+
end
|
29
|
+
|
30
|
+
# Convert a json object to an hash
|
31
|
+
#
|
32
|
+
def json_to_hash(json, symbolize_keys)
|
33
|
+
MultiJson.load(json, symbolize_keys: symbolize_keys)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Retrieve the given value associated with a key, in string or symbol format
|
37
|
+
#
|
38
|
+
def get_option(hash, key)
|
39
|
+
hash[key.to_sym] || hash[key] || nil
|
40
|
+
end
|
41
|
+
|
42
|
+
# Build a path with the given arguments
|
43
|
+
#
|
44
|
+
def path_encode(path, *args)
|
45
|
+
arguments = []
|
46
|
+
args.each do |arg|
|
47
|
+
arguments.push(CGI.escape(CGI.unescape(arg.to_s)))
|
48
|
+
end
|
49
|
+
|
50
|
+
format(path, *arguments)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Support to convert old settings to their new names
|
54
|
+
#
|
55
|
+
def deserialize_settings(data)
|
56
|
+
settings = symbolize_hash(data)
|
57
|
+
keys = {
|
58
|
+
attributesToIndex: 'searchableAttributes',
|
59
|
+
numericAttributesToIndex: 'numericAttributesForFiltering',
|
60
|
+
slaves: 'replicas'
|
61
|
+
}
|
62
|
+
|
63
|
+
keys.each do |deprecated_key, current_key|
|
64
|
+
if settings.has_key?(deprecated_key)
|
65
|
+
settings[current_key.to_sym] = settings.delete(deprecated_key)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
settings
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.included(base)
|
73
|
+
base.extend(Helpers)
|
74
|
+
end
|
75
|
+
|
76
|
+
def hash_includes_subset?(hash, subset)
|
77
|
+
res = true
|
78
|
+
subset.each do |k, v|
|
79
|
+
res &&= hash[k] == v
|
80
|
+
end
|
81
|
+
res
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Algolia
|
2
|
+
module Http
|
3
|
+
class HttpRequester
|
4
|
+
include Helpers
|
5
|
+
attr_accessor :adapter, :logger
|
6
|
+
|
7
|
+
#
|
8
|
+
# @param adapter [Object] adapter used to make requests. Defaults to Net::Http
|
9
|
+
# @param logger [Object] logger used to log requests. Defaults to Algolia::LoggerHelper
|
10
|
+
#
|
11
|
+
def initialize(adapter, logger)
|
12
|
+
@adapter = adapter
|
13
|
+
@logger = logger
|
14
|
+
@connection = nil
|
15
|
+
end
|
16
|
+
|
17
|
+
# Sends request to the engine
|
18
|
+
#
|
19
|
+
# @param host [StatefulHost]
|
20
|
+
# @param method [Symbol]
|
21
|
+
# @param path [String]
|
22
|
+
# @param body [JSON]
|
23
|
+
# @param headers [Hash]
|
24
|
+
#
|
25
|
+
# @return [Http::Response]
|
26
|
+
#
|
27
|
+
def send_request(host, method, path, body, headers, timeout, connect_timeout)
|
28
|
+
connection = connection(host)
|
29
|
+
connection.options.timeout = timeout
|
30
|
+
connection.options.open_timeout = connect_timeout
|
31
|
+
|
32
|
+
if ENV['ALGOLIA_DEBUG']
|
33
|
+
@logger.info("Sending #{method.to_s.upcase!} request to #{path} with body #{body}")
|
34
|
+
end
|
35
|
+
|
36
|
+
response = connection.run_request(method, path, body, headers)
|
37
|
+
|
38
|
+
if response.success?
|
39
|
+
if ENV['ALGOLIA_DEBUG']
|
40
|
+
@logger.info("Request succeeded. Response status: #{response.status}, body: #{response.body}")
|
41
|
+
end
|
42
|
+
return Http::Response.new(status: response.status, body: response.body, headers: response.headers)
|
43
|
+
end
|
44
|
+
|
45
|
+
if ENV['ALGOLIA_DEBUG']
|
46
|
+
@logger.info("Request failed. Response status: #{response.status}, error: #{response.body}")
|
47
|
+
end
|
48
|
+
Http::Response.new(status: response.status, error: response.body, headers: response.headers)
|
49
|
+
rescue Faraday::TimeoutError => e
|
50
|
+
if ENV['ALGOLIA_DEBUG']
|
51
|
+
@logger.info("Request timed out. Error: #{e.message}")
|
52
|
+
end
|
53
|
+
Http::Response.new(error: e.message, has_timed_out: true)
|
54
|
+
rescue ::StandardError => e
|
55
|
+
if ENV['ALGOLIA_DEBUG']
|
56
|
+
@logger.info("Request failed. Error: #{e.message}")
|
57
|
+
end
|
58
|
+
Http::Response.new(error: e.message, network_failure: true)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Retrieve the connection from the @connections
|
62
|
+
#
|
63
|
+
# @param host [StatefulHost]
|
64
|
+
#
|
65
|
+
# @return [Faraday::Connection]
|
66
|
+
#
|
67
|
+
def connection(host)
|
68
|
+
@connection ||= Faraday.new(build_url(host)) do |f|
|
69
|
+
f.adapter @adapter.to_sym
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Build url from host, path and parameters
|
74
|
+
#
|
75
|
+
# @param host [StatefulHost]
|
76
|
+
#
|
77
|
+
# @return [String]
|
78
|
+
#
|
79
|
+
def build_url(host)
|
80
|
+
host.protocol + host.url
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Algolia
|
2
|
+
module Http
|
3
|
+
class Response
|
4
|
+
attr_reader :status, :body, :error, :headers, :has_timed_out, :network_failure
|
5
|
+
|
6
|
+
#
|
7
|
+
# @option status [String] Response status
|
8
|
+
# @option body [String] Response body
|
9
|
+
# @option error [String] Response error or caught error
|
10
|
+
# @option headers [String] Response headers
|
11
|
+
# @option has_timed_out [String] If the request has timed out
|
12
|
+
#
|
13
|
+
def initialize(opts = {})
|
14
|
+
@status = opts[:status]
|
15
|
+
@body = opts[:body] || ''
|
16
|
+
@error = opts[:error] || ''
|
17
|
+
@headers = opts[:headers] || ''
|
18
|
+
@has_timed_out = opts[:has_timed_out] || false
|
19
|
+
@network_failure = opts[:network_failure] || false
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,238 @@
|
|
1
|
+
module Algolia
|
2
|
+
module Insights
|
3
|
+
class Client
|
4
|
+
include Helpers
|
5
|
+
|
6
|
+
# Initializes the Insights client
|
7
|
+
#
|
8
|
+
# @param insights_config [Insights::Config] an Insights::Config object which contains your APP_ID and API_KEY
|
9
|
+
# @option adapter [Object] adapter object used for the connection
|
10
|
+
# @option logger [Object]
|
11
|
+
# @option http_requester [Object] http_requester object used for the connection
|
12
|
+
#
|
13
|
+
def initialize(insights_config, opts = {})
|
14
|
+
@config = insights_config
|
15
|
+
adapter = opts[:adapter] || Defaults::ADAPTER
|
16
|
+
logger = opts[:logger] || LoggerHelper.create('debug.log')
|
17
|
+
requester = opts[:http_requester] || Defaults::REQUESTER_CLASS.new(adapter, logger)
|
18
|
+
@transporter = Transport::Transport.new(@config, requester)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Create a new client providing only app ID and API key
|
22
|
+
#
|
23
|
+
# @param app_id [String] Algolia application ID
|
24
|
+
# @param api_key [String] Algolia API key
|
25
|
+
#
|
26
|
+
# @return self
|
27
|
+
#
|
28
|
+
def self.create(app_id, api_key)
|
29
|
+
config = Insights::Config.new(app_id: app_id, api_key: api_key)
|
30
|
+
create_with_config(config)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Create a new client providing only an Analytics::Config object
|
34
|
+
#
|
35
|
+
# @param config [Insights::Config]
|
36
|
+
#
|
37
|
+
# @return self
|
38
|
+
#
|
39
|
+
def self.create_with_config(config)
|
40
|
+
new(config)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Create a new Insight User Client
|
44
|
+
#
|
45
|
+
# @param user_token [String]
|
46
|
+
#
|
47
|
+
# @return [UserClient]
|
48
|
+
#
|
49
|
+
def user(user_token)
|
50
|
+
UserClient.new(self, user_token)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Push an event to the Insights API.
|
54
|
+
#
|
55
|
+
# @param event [Hash]
|
56
|
+
#
|
57
|
+
# @return [Hash]
|
58
|
+
#
|
59
|
+
def send_event(event, opts = {})
|
60
|
+
send_events([event], opts)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Push an array of events to the Insights API.
|
64
|
+
#
|
65
|
+
# @param events [Array]
|
66
|
+
#
|
67
|
+
# @return [Hash]
|
68
|
+
#
|
69
|
+
def send_events(events, opts = {})
|
70
|
+
@transporter.write(:POST, '/1/events', { events: events }, opts)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
class UserClient
|
75
|
+
# Initializes the Insights userClient
|
76
|
+
#
|
77
|
+
# @param insights_client [Insights::Client] Insights Client used to make API calls
|
78
|
+
# @param user_token [String] user token used to build the client
|
79
|
+
#
|
80
|
+
def initialize(insights_client, user_token)
|
81
|
+
@insights_client = insights_client
|
82
|
+
@user_token = user_token
|
83
|
+
end
|
84
|
+
|
85
|
+
# Send a click event to capture clicked items.
|
86
|
+
#
|
87
|
+
# @param event_name [String] Name of the event.
|
88
|
+
# @param index_name [String] Name of the index related to the click.
|
89
|
+
# @param object_ids [Array] A list of objectIDs (limited to 20)
|
90
|
+
#
|
91
|
+
# @return [Hash]
|
92
|
+
#
|
93
|
+
def clicked_object_ids(event_name, index_name, object_ids, opts = {})
|
94
|
+
@insights_client.send_event({
|
95
|
+
eventType: 'click',
|
96
|
+
eventName: event_name,
|
97
|
+
index: index_name,
|
98
|
+
userToken: @user_token,
|
99
|
+
objectIds: object_ids
|
100
|
+
}, opts)
|
101
|
+
end
|
102
|
+
|
103
|
+
# Send a click event to capture a query and its clicked items and positions.
|
104
|
+
#
|
105
|
+
# @param event_name [String] Name of the event.
|
106
|
+
# @param index_name [String] Name of the index related to the click.
|
107
|
+
# @param object_ids [Array] A list of objectIDs (limited to 20)
|
108
|
+
# @param positions [Array] Position of the click in the list of Algolia search results.
|
109
|
+
# @param query_id [String] Algolia queryID that can be found in the search response when using clickAnalytics
|
110
|
+
#
|
111
|
+
# @return [Hash]
|
112
|
+
#
|
113
|
+
def clicked_object_ids_after_search(event_name, index_name,
|
114
|
+
object_ids, positions, query_id, opts = {})
|
115
|
+
@insights_client.send_event({
|
116
|
+
eventType: 'click',
|
117
|
+
eventName: event_name,
|
118
|
+
index: index_name,
|
119
|
+
userToken: @user_token,
|
120
|
+
objectIds: object_ids,
|
121
|
+
positions: positions,
|
122
|
+
queryId: query_id
|
123
|
+
}, opts)
|
124
|
+
end
|
125
|
+
|
126
|
+
# Send a click event to capture the filters a user clicks on.
|
127
|
+
#
|
128
|
+
# @param event_name [String] Name of the event.
|
129
|
+
# @param index_name [String] Name of the index related to the click.
|
130
|
+
# @param filters [Array] A list of filters (limited to 10)
|
131
|
+
#
|
132
|
+
# @return [Hash]
|
133
|
+
#
|
134
|
+
def clicked_filters(event_name, index_name, filters, opts = {})
|
135
|
+
@insights_client.send_event({
|
136
|
+
eventType: 'click',
|
137
|
+
eventName: event_name,
|
138
|
+
index: index_name,
|
139
|
+
userToken: @user_token,
|
140
|
+
filters: filters
|
141
|
+
}, opts)
|
142
|
+
end
|
143
|
+
|
144
|
+
# Send a conversion event to capture clicked items.
|
145
|
+
#
|
146
|
+
# @param event_name [String] Name of the event.
|
147
|
+
# @param index_name [String] Name of the index related to the click.
|
148
|
+
# @param object_ids [Array] A list of objectIDs (limited to 20)
|
149
|
+
#
|
150
|
+
# @return [Hash]
|
151
|
+
#
|
152
|
+
def converted_object_ids(event_name, index_name, object_ids, opts = {})
|
153
|
+
@insights_client.send_event({
|
154
|
+
eventType: 'conversion',
|
155
|
+
eventName: event_name,
|
156
|
+
index: index_name,
|
157
|
+
userToken: @user_token,
|
158
|
+
objectIds: object_ids
|
159
|
+
}, opts)
|
160
|
+
end
|
161
|
+
|
162
|
+
# Send a conversion event to capture a query and its clicked items.
|
163
|
+
#
|
164
|
+
# @param event_name [String] Name of the event.
|
165
|
+
# @param index_name [String] Name of the index related to the click.
|
166
|
+
# @param object_ids [Array] A list of objectIDs (limited to 20)
|
167
|
+
# @param query_id [String] Algolia queryID, format: [a-z1-9]{32}.
|
168
|
+
#
|
169
|
+
# @return [Hash]
|
170
|
+
#
|
171
|
+
def converted_object_ids_after_search(event_name, index_name,
|
172
|
+
object_ids, query_id, opts = {})
|
173
|
+
@insights_client.send_event({
|
174
|
+
eventType: 'conversion',
|
175
|
+
eventName: event_name,
|
176
|
+
index: index_name,
|
177
|
+
userToken: @user_token,
|
178
|
+
objectIds: object_ids,
|
179
|
+
queryId: query_id
|
180
|
+
}, opts)
|
181
|
+
end
|
182
|
+
|
183
|
+
# Send a conversion event to capture the filters a user uses when converting.
|
184
|
+
#
|
185
|
+
# @param event_name [String] Name of the event.
|
186
|
+
# @param index_name [String] Name of the index related to the click.
|
187
|
+
# @param filters [Array] A list of filters (limited to 10)
|
188
|
+
#
|
189
|
+
# @return [Hash]
|
190
|
+
#
|
191
|
+
def converted_filters(event_name, index_name, filters, opts = {})
|
192
|
+
@insights_client.send_event({
|
193
|
+
eventType: 'conversion',
|
194
|
+
eventName: event_name,
|
195
|
+
index: index_name,
|
196
|
+
userToken: @user_token,
|
197
|
+
filters: filters
|
198
|
+
}, opts)
|
199
|
+
end
|
200
|
+
|
201
|
+
# Send a view event to capture clicked items.
|
202
|
+
#
|
203
|
+
# @param event_name [String] Name of the event.
|
204
|
+
# @param index_name [String] Name of the index related to the click.
|
205
|
+
# @param object_ids [Array] A list of objectIDs (limited to 20)
|
206
|
+
#
|
207
|
+
# @return [Hash]
|
208
|
+
#
|
209
|
+
def viewed_object_ids(event_name, index_name, object_ids, opts = {})
|
210
|
+
@insights_client.send_event({
|
211
|
+
eventType: 'view',
|
212
|
+
eventName: event_name,
|
213
|
+
index: index_name,
|
214
|
+
userToken: @user_token,
|
215
|
+
objectIds: object_ids
|
216
|
+
}, opts)
|
217
|
+
end
|
218
|
+
|
219
|
+
# Send a view event to capture the filters a user uses when viewing.
|
220
|
+
#
|
221
|
+
# @param event_name [String] Name of the event.
|
222
|
+
# @param index_name [String] Name of the index related to the click.
|
223
|
+
# @param filters [Array] A list of filters (limited to 10)
|
224
|
+
#
|
225
|
+
# @return [Hash]
|
226
|
+
#
|
227
|
+
def viewed_filters(event_name, index_name, filters, opts = {})
|
228
|
+
@insights_client.send_event({
|
229
|
+
eventType: 'view',
|
230
|
+
eventName: event_name,
|
231
|
+
index: index_name,
|
232
|
+
userToken: @user_token,
|
233
|
+
filters: filters
|
234
|
+
}, opts)
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|