sonicsearch 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -0
- data/README.md +4 -9
- data/lib/sonicsearch.rb +30 -2
- data/lib/sonicsearch/control.rb +18 -0
- data/lib/sonicsearch/ingest.rb +51 -0
- data/lib/sonicsearch/search.rb +53 -0
- data/lib/sonicsearch/version.rb +1 -1
- data/sonicsearch.gemspec +5 -1
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 310200a931d056674eaae3a0d968ac41d7d513bff489a3ebd2416c7d411277c4
|
4
|
+
data.tar.gz: 7f2a3eccfc3bd5802f3b8f406777c2f8f5bf47bdadc347604e8f2adb3f9db579
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c7cad55d495e7e5d96f2f8c6161a8368a8aa7df3f2c7f9e241b1dba706488a8fc90efdb113099090bdef8666c26bef7dcaf9053e5a44b336e803f887a1afc78
|
7
|
+
data.tar.gz: 70ce75742ac929b1793fa6c1919fe5e0b3415b36ff04a0927ab01a69e0162f1204d30c3993d47f4a7fd761250e439d53583d4fd2c855b071e33ed7989df15272
|
data/.rubocop.yml
ADDED
data/README.md
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
# Sonic Search
|
2
2
|
|
3
|
-
[![Gem
|
4
|
-
|
5
|
-
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/sonicsearch.svg)](https://badge.fury.io/rb/sonicsearch) [![Build Status](https://travis-ci.org/oshanz/sonicsearch.svg?branch=master)](https://travis-ci.org/oshanz/sonicsearch) [![Code Climate](https://codeclimate.com/github/oshanz/sonicsearch/badges/gpa.svg)](https://codeclimate.com/github/oshanz/sonicsearch)
|
4
|
+
|
5
|
+
Rails friendly driver for the [sonic search](https://github.com/valeriansaliou/sonic) backend.
|
6
|
+
![Alt text](https://gist.githubusercontent.com/oshanz/7b3278dacbcaa82fac9084d9386523c3/raw/c500e27e5e18f0cc20dd5a76fad424ef3d453ce3/colortext.svg?sanitize=true)
|
6
7
|
|
7
8
|
## Installation
|
8
9
|
|
@@ -19,9 +20,3 @@ And then execute:
|
|
19
20
|
## Usage
|
20
21
|
|
21
22
|
- sonarsearch will always try to maintain the API compatibility with [searchkick](https://github.com/ankane/searchkick), so you can switch between search engines with less effort as your requirements.
|
22
|
-
|
23
|
-
## Development
|
24
|
-
|
25
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
26
|
-
|
27
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
data/lib/sonicsearch.rb
CHANGED
@@ -1,6 +1,34 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'sonicsearch/version'
|
4
|
+
require 'async/io'
|
3
5
|
module Sonicsearch
|
4
6
|
class Error < StandardError; end
|
5
|
-
|
7
|
+
|
8
|
+
class ChannelFactory
|
9
|
+
def search_channel
|
10
|
+
connect(mode: 'search')
|
11
|
+
end
|
12
|
+
|
13
|
+
def ingest_channel
|
14
|
+
connect(mode: 'ingest')
|
15
|
+
end
|
16
|
+
|
17
|
+
def control_channel
|
18
|
+
connect(mode: 'control')
|
19
|
+
end
|
20
|
+
|
21
|
+
def connect(mode: nil)
|
22
|
+
client = Async::IO::Endpoint.tcp('localhost', 1491)
|
23
|
+
client.connect do |peer|
|
24
|
+
result = peer.write("START #{mode} password")
|
25
|
+
message = peer.read(512)
|
26
|
+
puts "Sent #{data}, got response: #{message}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def close
|
31
|
+
# tcp_clien.send('QUIT')
|
32
|
+
end
|
33
|
+
end
|
6
34
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sonicsearch
|
4
|
+
class Control
|
5
|
+
def connection
|
6
|
+
ChannelFactory.new.control_channel
|
7
|
+
end
|
8
|
+
|
9
|
+
def trigger(action)
|
10
|
+
connection.connect do |peer|
|
11
|
+
peer.write("TRIGGER #{action}")
|
12
|
+
message = peer.read(512)
|
13
|
+
|
14
|
+
puts "Sent #{data}, got response: #{message}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sonicsearch
|
4
|
+
class Ingest
|
5
|
+
def push(collection_id, bucket_id, object_id, text)
|
6
|
+
cmd = "PUSH #{collection_id} #{bucket_id} #{object_id} #{text}"
|
7
|
+
connection.connect do |peer|
|
8
|
+
peer.write(cmd)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def pop(collection_id, bucket_id, object_id, text)
|
13
|
+
cmd = "POP #{collection_id} #{bucket_id} #{object_id} #{text}"
|
14
|
+
connection.connect do |peer|
|
15
|
+
peer.write(cmd)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def count(collection_id, bucket_id, object_id)
|
20
|
+
cmd = "COUNT #{collection_id} #{bucket_id} #{object_id} #{text}"
|
21
|
+
connection.connect do |peer|
|
22
|
+
peer.write(cmd)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def flushc(collection_id)
|
27
|
+
cmd = "FLUSHC #{collection_id}"
|
28
|
+
connection.connect do |peer|
|
29
|
+
peer.write(cmd)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def flushb(collection_id, _bucket_id)
|
34
|
+
cmd = "FLUSHB #{collection_id}"
|
35
|
+
connection.connect do |peer|
|
36
|
+
peer.write(cmd)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def flusho(collection_id, _bucket_id, _object_id)
|
41
|
+
cmd = "FLUSHO #{collection_id}"
|
42
|
+
connection.connect do |peer|
|
43
|
+
peer.write(cmd)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def connection
|
48
|
+
ChannelFactory.new.ingest_channel
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'async/io'
|
4
|
+
|
5
|
+
module Sonicsearch
|
6
|
+
class Search
|
7
|
+
def connection
|
8
|
+
ChannelFactory.new.search_channel
|
9
|
+
end
|
10
|
+
|
11
|
+
def query(collection_id, bucket_id, terms_text, limit, offset)
|
12
|
+
cmd = "QUERY #{collection_id} #{bucket_id} #{terms_text}"
|
13
|
+
cmd += " LIMIT(#{limit})" unless limit.nil?
|
14
|
+
cmd += " OFFSET(#{limit})" unless offset.nil?
|
15
|
+
connection.connect do |peer|
|
16
|
+
peer.write(cmd)
|
17
|
+
message = peer.read(512) # PENDING CjPvE5t9
|
18
|
+
puts "Sent #{data}, got response: #{message}"
|
19
|
+
end
|
20
|
+
search_done = false
|
21
|
+
while search_done
|
22
|
+
Async do |_task|
|
23
|
+
endpoint.connect do |peer|
|
24
|
+
message = peer.read(512) # received EVENT QUERY CjPvE5t9
|
25
|
+
puts "Sent #{data}, got response: #{message}"
|
26
|
+
search_done = true
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def suggest(collection_id, bucket_id, word_text, limit, offset)
|
33
|
+
cmd = "SUGGEST #{collection_id} #{bucket_id} #{word_text}"
|
34
|
+
cmd += " LIMIT(#{limit})" unless limit.nil?
|
35
|
+
cmd += " OFFSET(#{limit})" unless offset.nil?
|
36
|
+
connection.connect do |peer|
|
37
|
+
peer.write(cmd)
|
38
|
+
message = peer.read(512) # PENDING CjPvE5t9
|
39
|
+
puts "Sent #{data}, got response: #{message}"
|
40
|
+
end
|
41
|
+
search_done = false
|
42
|
+
while search_done
|
43
|
+
Async do |_task|
|
44
|
+
endpoint.connect do |peer|
|
45
|
+
message = peer.read(512) # received EVENT SUGGEST CjPvE5t9
|
46
|
+
puts "Sent #{data}, got response: #{message}"
|
47
|
+
search_done = true
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/sonicsearch/version.rb
CHANGED
data/sonicsearch.gemspec
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
lib = File.expand_path('lib', __dir__)
|
2
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
5
|
require 'sonicsearch/version'
|
@@ -35,7 +37,9 @@ Gem::Specification.new do |spec|
|
|
35
37
|
spec.required_ruby_version = '>= 2.5'
|
36
38
|
|
37
39
|
spec.add_dependency 'activemodel', '>= 4.2'
|
38
|
-
spec.add_dependency '
|
40
|
+
spec.add_dependency 'async-io', '~> 1.20'
|
41
|
+
# spec.add_dependency 'connection_pool', '~> 2.2'
|
42
|
+
# spec.add_dependency 'concurrent-ruby', '~> 1.1'
|
39
43
|
|
40
44
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
41
45
|
spec.add_development_dependency 'rake', '~> 10.0'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sonicsearch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oshan Wisumperuma
|
@@ -25,19 +25,19 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '4.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: async-io
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: '1.20'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: '1.20'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -89,6 +89,7 @@ extra_rdoc_files: []
|
|
89
89
|
files:
|
90
90
|
- ".gitignore"
|
91
91
|
- ".rspec"
|
92
|
+
- ".rubocop.yml"
|
92
93
|
- ".travis.yml"
|
93
94
|
- CHANGELOG.md
|
94
95
|
- CODE_OF_CONDUCT.md
|
@@ -99,6 +100,9 @@ files:
|
|
99
100
|
- bin/console
|
100
101
|
- bin/setup
|
101
102
|
- lib/sonicsearch.rb
|
103
|
+
- lib/sonicsearch/control.rb
|
104
|
+
- lib/sonicsearch/ingest.rb
|
105
|
+
- lib/sonicsearch/search.rb
|
102
106
|
- lib/sonicsearch/version.rb
|
103
107
|
- sonicsearch.gemspec
|
104
108
|
homepage: https://github.com/oshanz/sonicsearch
|