gummi 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/gummi.gemspec +7 -6
- data/lib/gummi.rb +32 -26
- data/lib/gummi/api.rb +3 -1
- data/lib/gummi/db_layer/default_index.rb +15 -0
- data/lib/gummi/db_layer/document.rb +206 -0
- data/lib/gummi/db_layer/document/attributes.rb +40 -0
- data/lib/gummi/db_layer/document/object.rb +15 -0
- data/lib/gummi/db_layer/document/search/filtered.rb +42 -0
- data/lib/gummi/db_layer/document/search/raw.rb +12 -0
- data/lib/gummi/db_layer/document/search/result.rb +34 -0
- data/lib/gummi/db_layer/document/search/searching.rb +51 -0
- data/lib/gummi/db_layer/fields/boolean.rb +13 -0
- data/lib/gummi/db_layer/fields/integer.rb +16 -0
- data/lib/gummi/db_layer/fields/keyword.rb +15 -0
- data/lib/gummi/db_layer/fields/ngram_and_plain.rb +20 -0
- data/lib/gummi/db_layer/fields/path_hierarchy.rb +15 -0
- data/lib/gummi/db_layer/fields/positive_integer.rb +21 -0
- data/lib/gummi/db_layer/fields/sanitized_string.rb +30 -0
- data/lib/gummi/db_layer/fields/string.rb +17 -0
- data/lib/gummi/db_layer/fields/time.rb +17 -0
- data/lib/gummi/db_layer/index.rb +150 -0
- data/lib/gummi/entity_layer/entity.rb +22 -0
- data/lib/gummi/errors.rb +7 -0
- data/lib/gummi/repository_layer/repository.rb +39 -0
- data/lib/gummi/repository_layer/repository/result.rb +42 -0
- data/lib/gummi/version.rb +1 -1
- data/lib/repobahn/repository.rb +25 -33
- data/lib/repobahn/repository/active_record.rb +17 -0
- data/spec/fixtures/admin/auto.rb +6 -0
- data/spec/fixtures/admin/cars.rb +12 -0
- data/spec/fixtures/admin/countries.rb +9 -0
- data/spec/fixtures/admin/country.rb +6 -0
- data/spec/fixtures/admin/db/country.rb +7 -0
- data/spec/fixtures/admin/db/vehicle.rb +7 -0
- data/spec/fixtures/cities.rb +7 -0
- data/spec/fixtures/city.rb +6 -0
- data/spec/fixtures/db/animal.rb +9 -0
- data/spec/fixtures/db/boat.rb +9 -0
- data/spec/fixtures/db/car.rb +9 -0
- data/spec/fixtures/db/city.rb +8 -0
- data/spec/fixtures/db/enemy.rb +10 -0
- data/spec/fixtures/db/game.rb +7 -0
- data/spec/fixtures/db/person.rb +15 -0
- data/spec/fixtures/db/rating.rb +11 -0
- data/spec/fixtures/db/ship.rb +18 -0
- data/spec/{models → fixtures}/people.rb +6 -2
- data/spec/{models → fixtures}/person.rb +3 -2
- data/spec/lib/gummi/db_layer/document_spec.rb +124 -0
- data/spec/lib/gummi/{entity_spec.rb → entity_layer/entity_spec.rb} +3 -1
- data/spec/lib/gummi/repository_layer/repository_spec.rb +63 -0
- data/spec/lib/repobahn/repository_spec.rb +72 -0
- data/spec/spec_helper.rb +37 -9
- metadata +87 -37
- data/lib/gummi/default_index.rb +0 -13
- data/lib/gummi/document.rb +0 -139
- data/lib/gummi/document/attributes.rb +0 -28
- data/lib/gummi/document/object.rb +0 -12
- data/lib/gummi/document/search/filtered.rb +0 -39
- data/lib/gummi/document/search/raw.rb +0 -9
- data/lib/gummi/document/search/result.rb +0 -25
- data/lib/gummi/document/search/searching.rb +0 -45
- data/lib/gummi/entity.rb +0 -20
- data/lib/gummi/fields/boolean.rb +0 -10
- data/lib/gummi/fields/integer.rb +0 -14
- data/lib/gummi/fields/keyword.rb +0 -13
- data/lib/gummi/fields/ngram_and_plain.rb +0 -18
- data/lib/gummi/fields/path_hierarchy.rb +0 -13
- data/lib/gummi/fields/positive_integer.rb +0 -19
- data/lib/gummi/fields/sanitized_string.rb +0 -28
- data/lib/gummi/fields/string.rb +0 -15
- data/lib/gummi/fields/time.rb +0 -15
- data/lib/gummi/index.rb +0 -146
- data/lib/gummi/repository.rb +0 -38
- data/lib/gummi/repository/result.rb +0 -30
- data/spec/lib/gummi/document_spec.rb +0 -73
- data/spec/lib/gummi/repository/result_spec.rb +0 -18
- data/spec/lib/gummi/repository_spec.rb +0 -81
- data/spec/models/db/person.rb +0 -15
data/lib/gummi/repository.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
|
2
|
-
module Gummi
|
3
|
-
module Repository
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
included do
|
7
|
-
include Repobahn::Repository
|
8
|
-
after_conversion :set_id_and_version
|
9
|
-
end
|
10
|
-
|
11
|
-
|
12
|
-
module ClassMethods
|
13
|
-
|
14
|
-
def get(id)
|
15
|
-
record = db_model.get id
|
16
|
-
to_entity_from_db record if record
|
17
|
-
end
|
18
|
-
|
19
|
-
def search(&block)
|
20
|
-
filtered_search = db_model.new_filtered_search
|
21
|
-
yield filtered_search
|
22
|
-
result = filtered_search.execute
|
23
|
-
Repository::Result.new(result, self, filtered_search.per_page, filtered_search.page)
|
24
|
-
end
|
25
|
-
|
26
|
-
def overwrite(entity)
|
27
|
-
return false unless entity.valid?
|
28
|
-
db_record = db_model.new(entity.attributes)
|
29
|
-
db_record.overwrite
|
30
|
-
end
|
31
|
-
|
32
|
-
def set_id_and_version(entity, db)
|
33
|
-
entity.id = db.id
|
34
|
-
entity.version = db.version
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Gummi
|
2
|
-
module Repository
|
3
|
-
class Result
|
4
|
-
|
5
|
-
attr_reader :took, :total, :hits
|
6
|
-
|
7
|
-
def initialize(db_result, repository, per_page, page)
|
8
|
-
@took = db_result.took
|
9
|
-
@total = db_result.total
|
10
|
-
@hits = db_result.hits
|
11
|
-
@facets = db_result.facets
|
12
|
-
@db_records = db_result.records
|
13
|
-
@repository = repository
|
14
|
-
@per_page = per_page
|
15
|
-
@page = page
|
16
|
-
end
|
17
|
-
|
18
|
-
def facets
|
19
|
-
@facets.each_with_object({}) do |(name, content), facets|
|
20
|
-
facets[name] = Hash[content["terms"].collect{|term| term.values}]
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def records
|
25
|
-
entities = Array(@repository.to_entity_from_db(@db_records)) if @db_records
|
26
|
-
Leaflet::Collection.new entities, page: @page, total: total, per_page: @per_page
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
class GummiDummyDocument
|
4
|
-
include Gummi::Document
|
5
|
-
|
6
|
-
attribute :test, String
|
7
|
-
end
|
8
|
-
|
9
|
-
describe Gummi::Document do
|
10
|
-
|
11
|
-
context "included" do
|
12
|
-
it "adds accessors for id and version" do
|
13
|
-
m = GummiDummyDocument.new
|
14
|
-
m.respond_to?(:version).should be_true
|
15
|
-
m.respond_to?(:id).should be_true
|
16
|
-
end
|
17
|
-
|
18
|
-
it "adds attributes methods" do
|
19
|
-
m = GummiDummyDocument.new(test: 'hello')
|
20
|
-
m.test.should == 'hello'
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
context "attributes" do
|
25
|
-
|
26
|
-
context "date times" do
|
27
|
-
it "coerces from elastics strings to real Time" do
|
28
|
-
time = Time.now
|
29
|
-
person = DB::Person.new(born_at: time)
|
30
|
-
person.overwrite
|
31
|
-
person_from_es = DB::Person.get person.id
|
32
|
-
person_from_es.born_at.should be_a Time
|
33
|
-
end
|
34
|
-
|
35
|
-
it "always stores time in UTC" do
|
36
|
-
time = Time.now.in_time_zone 'CET'
|
37
|
-
|
38
|
-
person = DB::Person.new(born_at: time)
|
39
|
-
person.born_at.zone.should == 'UTC'
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
context "computed_attributes" do
|
44
|
-
|
45
|
-
let(:person) { DB::Person.new}
|
46
|
-
|
47
|
-
it "adds them to the attributes hash" do
|
48
|
-
person.name = "olof palme"
|
49
|
-
person.attributes[:computed_name].should == 'OLOF PALME'
|
50
|
-
end
|
51
|
-
|
52
|
-
it "computes every time" do
|
53
|
-
person.name = "olof palme"
|
54
|
-
person.computed_name.should == person.name.upcase
|
55
|
-
person.name = "carl bildt"
|
56
|
-
person.computed_name.should == person.name.upcase
|
57
|
-
end
|
58
|
-
|
59
|
-
it "provides a mapping" do
|
60
|
-
DB::Person.mapping.should include(:computed_name => {:type=>"string"})
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
context 'getting from elastic' do
|
66
|
-
let (:person) { DB::Person.create(name: 'Buzz Lightyear') }
|
67
|
-
|
68
|
-
it "returns an instance of the db_model" do
|
69
|
-
person_from_es = DB::Person.get(person.id)
|
70
|
-
person_from_es.should be_a DB::Person
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Gummi::Repository::Result do
|
4
|
-
|
5
|
-
describe "#facets" do
|
6
|
-
it "returns the relevant terms with counts" do
|
7
|
-
db_result = OpenStruct.new(facets: {"categories"=>
|
8
|
-
{"_type"=>"terms",
|
9
|
-
"missing"=>0,
|
10
|
-
"total"=>3,
|
11
|
-
"other"=>0,
|
12
|
-
"terms"=>[{"term"=>"design", "count"=>2}, {"term"=>"silver", "count"=>1}]}})
|
13
|
-
|
14
|
-
result = Gummi::Repository::Result.new(db_result, nil, nil, nil)
|
15
|
-
result.facets.should == {"categories" => {"design" => 2, "silver" => 1}}
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,81 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Gummi::Repository do
|
4
|
-
|
5
|
-
let(:repository_model) { People }
|
6
|
-
let(:entity_model) { Person }
|
7
|
-
let(:db_model) { DB::Person }
|
8
|
-
|
9
|
-
describe ".entity_model" do
|
10
|
-
it "should default to singular version of repository_model" do
|
11
|
-
People.entity_model.should == Person
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
describe ".db_model" do
|
16
|
-
it "should default to singular version of repository_model in the DB namespace" do
|
17
|
-
People.db_model.should == DB::Person
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
context "converting from db to entity" do
|
22
|
-
|
23
|
-
let (:db_person) { DB::Person.new(name: 'Buzz Lightyear') }
|
24
|
-
|
25
|
-
it "should map the attributes from db to entity" do
|
26
|
-
person = People.to_entity_from_db(db_person)
|
27
|
-
person.name.should == 'Buzz Lightyear'
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should run hook for after_conversion" do
|
31
|
-
person = People.to_entity_from_db(db_person)
|
32
|
-
person.converted_name.should == db_person.name.reverse
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
describe ".get" do
|
37
|
-
context "existing record" do
|
38
|
-
|
39
|
-
let (:db_person) { DB::Person.create(name: 'Buzz Lightyear') }
|
40
|
-
|
41
|
-
it "should return an entity" do
|
42
|
-
person = People.get(db_person.id)
|
43
|
-
person.id.should == db_person.id
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
context "missing record" do
|
48
|
-
it "returns nil" do
|
49
|
-
person = People.get('missing_id')
|
50
|
-
person.should be_nil
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
describe ".search" do
|
56
|
-
|
57
|
-
before(:each) do
|
58
|
-
DB::Person.create(name: 'Buzz Lightyear')
|
59
|
-
DB::Person.create(name: 'Woody')
|
60
|
-
Gummi::DefaultIndex.refresh
|
61
|
-
end
|
62
|
-
|
63
|
-
it "should find the correct documents" do
|
64
|
-
result = People.search do |search|
|
65
|
-
search.query_string = "Woody"
|
66
|
-
end
|
67
|
-
result.total.should == 1
|
68
|
-
result.records.first.name.should == "Woody"
|
69
|
-
end
|
70
|
-
|
71
|
-
it "should convert the result to entities" do
|
72
|
-
result = People.search do |search|
|
73
|
-
search.query_string = "Woody"
|
74
|
-
end
|
75
|
-
woody = result.records.first
|
76
|
-
woody.converted_name.should == 'ydooW'
|
77
|
-
woody.should be_a Person
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
end
|
data/spec/models/db/person.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
# example db model
|
2
|
-
|
3
|
-
module DB
|
4
|
-
class Person
|
5
|
-
include Gummi::Document
|
6
|
-
|
7
|
-
attribute :name, Gummi::Fields::String
|
8
|
-
attribute :computed_name, Gummi::Fields::String
|
9
|
-
attribute :born_at, Gummi::Fields::Time
|
10
|
-
|
11
|
-
def computed_name
|
12
|
-
name.upcase if name
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|