de 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +18 -0
- data/lib/de/boolean/operator.rb +5 -5
- data/lib/de/de.rb +71 -4
- data/lib/de/sunspot_solr/operator.rb +2 -2
- data/lib/de/sunspot_solr/search.rb +22 -4
- data/lib/de/version.rb +1 -1
- data/test/de_boolean_operator_test.rb +36 -4
- data/test/de_expression_test.rb +21 -2
- data/test/de_operator_test.rb +7 -7
- data/test/test.rb +7 -0
- metadata +6 -4
data/CHANGELOG
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Change log:
|
2
|
+
===========
|
3
|
+
|
4
|
+
Version 0.0.2 (August 30, 2011)
|
5
|
+
===============================
|
6
|
+
Evaluate parametrization possibility is added; parameter page is used for sunspot solr search evaluation
|
7
|
+
|
8
|
+
Version 0.0.3 (September 11, 2011)
|
9
|
+
==================================
|
10
|
+
Date type support added for SunspotSolr::Search
|
11
|
+
|
12
|
+
Version 0.0.4 (September 23, 2011)
|
13
|
+
==================================
|
14
|
+
*) De::Expression#to_s method overriden
|
15
|
+
*) De::Expression @name attribute is writable
|
16
|
+
*) Bug fix: De::Expression prevents error-prone trials to add child with name already existent in tree
|
17
|
+
*) De::SunspotSolr::Search#evaluate support for per_page parameter
|
18
|
+
*) De::SunspotSolr::Search#results method added
|
data/lib/de/boolean/operator.rb
CHANGED
@@ -36,9 +36,9 @@ module De
|
|
36
36
|
# operands<Array>:: (optional) array of Operand objects.
|
37
37
|
# If given they are added as children to current operator
|
38
38
|
#
|
39
|
-
def initialize(name, operands = nil)
|
39
|
+
def initialize(name, content, operands = nil)
|
40
40
|
raise Error::AbstractClassObjectCreationError if instance_of? BooleanOperator
|
41
|
-
super(name, operands)
|
41
|
+
super(name, content, operands)
|
42
42
|
end
|
43
43
|
|
44
44
|
#
|
@@ -67,7 +67,7 @@ module De
|
|
67
67
|
# If given they are added as children to current operator
|
68
68
|
#
|
69
69
|
def initialize(operands = nil)
|
70
|
-
super("AND-#{rand(1000)}", operands)
|
70
|
+
super("AND-#{rand(1000)}", 'AND', operands)
|
71
71
|
end
|
72
72
|
|
73
73
|
def evaluate
|
@@ -92,7 +92,7 @@ module De
|
|
92
92
|
# If given they are added as children to current operator
|
93
93
|
#
|
94
94
|
def initialize(operands = nil)
|
95
|
-
super("OR-#{rand(1000)}", operands)
|
95
|
+
super("OR-#{rand(1000)}", 'OR', operands)
|
96
96
|
end
|
97
97
|
|
98
98
|
def evaluate
|
@@ -117,7 +117,7 @@ module De
|
|
117
117
|
# If given it is added as child to current operator
|
118
118
|
#
|
119
119
|
def initialize(operand = nil)
|
120
|
-
super("NOT-#{rand(1000)}", operand ? [operand] : nil)
|
120
|
+
super("NOT-#{rand(1000)}", 'NOT', operand ? [operand] : nil)
|
121
121
|
end
|
122
122
|
|
123
123
|
def <<(obj)
|
data/lib/de/de.rb
CHANGED
@@ -27,7 +27,9 @@
|
|
27
27
|
# - Sunspot Solr search expressions
|
28
28
|
#
|
29
29
|
|
30
|
+
|
30
31
|
require 'tree'
|
32
|
+
require 'active_support/inflector'
|
31
33
|
require 'de/error'
|
32
34
|
|
33
35
|
module De
|
@@ -52,7 +54,8 @@ module De
|
|
52
54
|
#
|
53
55
|
def <<(obj)
|
54
56
|
raise Error::TypeError unless (obj.is_a?(Operator) or obj.is_a?(Operand))
|
55
|
-
|
57
|
+
added = added_obj(obj)
|
58
|
+
super(added)
|
56
59
|
end
|
57
60
|
|
58
61
|
#
|
@@ -104,6 +107,65 @@ module De
|
|
104
107
|
@content.hash
|
105
108
|
end
|
106
109
|
|
110
|
+
def to_s
|
111
|
+
str = @content.nil? ? '' : @content
|
112
|
+
str += '(%s)' % children.map { |child| child.to_s }.join(', ') if children.length > 0
|
113
|
+
|
114
|
+
str
|
115
|
+
end
|
116
|
+
|
117
|
+
# def to_hash
|
118
|
+
# {
|
119
|
+
# :name => @name,
|
120
|
+
# :content => @content,
|
121
|
+
# :class => self.class.name,
|
122
|
+
# :children => children.map { |child| child.to_hash }
|
123
|
+
# }
|
124
|
+
# end
|
125
|
+
|
126
|
+
class << self
|
127
|
+
|
128
|
+
# def load(hash)
|
129
|
+
# raise Error::InvalidExpressionError if (hash.keys - [:name, :content, :class, :children]).length > 0
|
130
|
+
#
|
131
|
+
# klass = hash[:class].constantize
|
132
|
+
# params = case klass.method(:new).arity
|
133
|
+
# when -1,0 then []
|
134
|
+
# when -2,1 then [hash[:name]]
|
135
|
+
# else [hash[:name], hash[:content]]
|
136
|
+
# end
|
137
|
+
#
|
138
|
+
# obj = klass.send(:new, *params)
|
139
|
+
# hash[:children].each { |child| obj << load(child) }
|
140
|
+
# end
|
141
|
+
end
|
142
|
+
|
143
|
+
private
|
144
|
+
|
145
|
+
#
|
146
|
+
# Object to be added to current one
|
147
|
+
#
|
148
|
+
# Checks and prevents trial to add element with name already existent in objects children
|
149
|
+
#
|
150
|
+
# === Input
|
151
|
+
#
|
152
|
+
# obj <Operator|Operand>:: potential child object
|
153
|
+
#
|
154
|
+
# === Output
|
155
|
+
#
|
156
|
+
# <Operator|Operand>
|
157
|
+
#
|
158
|
+
def added_obj(obj)
|
159
|
+
dup_obj = obj
|
160
|
+
counter = 0
|
161
|
+
while @children_hash.key?(dup_obj.name) && counter < 5
|
162
|
+
dup_obj.name = "#{dup_obj.name}_#{rand(1000000)}"
|
163
|
+
counter += 1
|
164
|
+
end
|
165
|
+
|
166
|
+
dup_obj
|
167
|
+
end
|
168
|
+
|
107
169
|
end
|
108
170
|
|
109
171
|
#
|
@@ -126,9 +188,9 @@ module De
|
|
126
188
|
# operands<Array>:: (optional) array of Operand objects.
|
127
189
|
# If given they are added as children to current operator
|
128
190
|
#
|
129
|
-
def initialize(name, operands = nil)
|
191
|
+
def initialize(name, content, operands = nil)
|
130
192
|
raise Error::AbstractClassObjectCreationError if instance_of? Operator
|
131
|
-
super(name)
|
193
|
+
super(name, content)
|
132
194
|
|
133
195
|
unless operands.nil?
|
134
196
|
raise Error::TypeError unless operands.is_a?(Array)
|
@@ -165,7 +227,7 @@ module De
|
|
165
227
|
# Define hash function to get equal results for operators from the same class and with the equal children
|
166
228
|
#
|
167
229
|
def hash
|
168
|
-
[self.class.name, children.map { |el| el.hash}].hash
|
230
|
+
[self.class.name, children.map { |el| el.hash }].hash
|
169
231
|
end
|
170
232
|
end
|
171
233
|
|
@@ -210,3 +272,8 @@ module De
|
|
210
272
|
|
211
273
|
end
|
212
274
|
|
275
|
+
module Tree
|
276
|
+
class TreeNode
|
277
|
+
attr_accessor :name
|
278
|
+
end
|
279
|
+
end
|
@@ -31,13 +31,13 @@ module De
|
|
31
31
|
|
32
32
|
def initialize(operator, operands = nil)
|
33
33
|
@operator = operator
|
34
|
-
super("#{operator}-#{rand(1000)}", operands)
|
34
|
+
super("#{operator}-#{rand(1000)}", operator, operands)
|
35
35
|
end
|
36
36
|
|
37
37
|
def evaluate
|
38
38
|
super
|
39
39
|
"#{@operator} do
|
40
|
-
#{children.map {|child| child.evaluate + "\n" } }
|
40
|
+
#{children.map { |child| child.evaluate + "\n" } }
|
41
41
|
end"
|
42
42
|
end
|
43
43
|
|
@@ -161,11 +161,13 @@ module De
|
|
161
161
|
#
|
162
162
|
# Evaluator
|
163
163
|
#
|
164
|
+
# === Input
|
165
|
+
#
|
164
166
|
# params<Hash>:: optional parameters hash
|
165
167
|
# Supported hash keys:
|
166
|
-
# :page - gives page for paging
|
167
|
-
#
|
168
|
-
#
|
168
|
+
# :page - gives page for paging (default - 1)
|
169
|
+
# :per_page - gives number of results per page for paging
|
170
|
+
# If not given Number of results per page is defined by @option[:per_page] parameter (default - 10000)
|
169
171
|
#
|
170
172
|
# === Output
|
171
173
|
#
|
@@ -176,7 +178,7 @@ module De
|
|
176
178
|
super
|
177
179
|
|
178
180
|
page = params && params[:page] ? params[:page] : 1
|
179
|
-
per_page = @options[:per_page] || 10000
|
181
|
+
per_page = params && params[:per_page] ? params[:per_page] : @options[:per_page] || 10000
|
180
182
|
|
181
183
|
search_string = "Sunspot.search(#{Kernel.const_get(@klass)}) do
|
182
184
|
#{children.map {|child| child.evaluate + "\n" } }
|
@@ -186,6 +188,22 @@ module De
|
|
186
188
|
|
187
189
|
instance_eval search_string
|
188
190
|
end
|
191
|
+
|
192
|
+
#
|
193
|
+
# Evaluates expression and returns results of obtained sunspot request
|
194
|
+
#
|
195
|
+
# === Input
|
196
|
+
#
|
197
|
+
# params<Hash>:: optional parameters hash passed to evaluate method
|
198
|
+
#
|
199
|
+
# === Output
|
200
|
+
#
|
201
|
+
# <mixed> - object of class @klass Sunspot search is built on
|
202
|
+
#
|
203
|
+
def results(params = nil)
|
204
|
+
evaluate(params).results
|
205
|
+
end
|
206
|
+
|
189
207
|
end
|
190
208
|
end
|
191
209
|
end
|
data/lib/de/version.rb
CHANGED
@@ -9,13 +9,45 @@ class DeBooleanOperatorTest < Test::Unit::TestCase
|
|
9
9
|
class NotSuitableOperand < De::Operand; end
|
10
10
|
|
11
11
|
def test_constructor
|
12
|
-
assert_raise(De::Error::AbstractClassObjectCreationError) { De::Boolean::BooleanOperator.new('first') }
|
13
|
-
assert_nothing_raised(De::Error::AbstractClassObjectCreationError) { SomeOperator.new('some name') }
|
12
|
+
assert_raise(De::Error::AbstractClassObjectCreationError) { De::Boolean::BooleanOperator.new('first', 'some operator') }
|
13
|
+
assert_nothing_raised(De::Error::AbstractClassObjectCreationError) { SomeOperator.new('some name', 'some operator') }
|
14
|
+
end
|
15
|
+
|
16
|
+
# def test_to_hash
|
17
|
+
# and1 = De::Boolean::And.new
|
18
|
+
# operand1 = De::Boolean::Operand.new('some name', true)
|
19
|
+
#
|
20
|
+
# and1 << operand1
|
21
|
+
# assert_equal({
|
22
|
+
# :class => "De::Boolean::And",
|
23
|
+
# :children => [{:class=>"De::Boolean::Operand", :children=>[], :name=>"some name", :content=>true}],
|
24
|
+
# :name => and1.name,
|
25
|
+
# :content => "AND"},
|
26
|
+
# and1.to_hash)
|
27
|
+
# end
|
28
|
+
|
29
|
+
# def test_load
|
30
|
+
# and1 = De::Boolean::And.new
|
31
|
+
# operand1 = De::Boolean::Operand.new('some name', true)
|
32
|
+
#
|
33
|
+
# and1 << operand1
|
34
|
+
# hsh = and1.to_hash
|
35
|
+
# assert_equal(and1, De::Expression.load(hsh))
|
36
|
+
#
|
37
|
+
#
|
38
|
+
# end
|
39
|
+
|
40
|
+
def test_to_s
|
41
|
+
and1 = De::Boolean::And.new
|
42
|
+
operand1 = De::Boolean::Operand.new('some name', true)
|
43
|
+
|
44
|
+
and1 << operand1
|
45
|
+
assert_equal('AND(true)', and1.to_s)
|
14
46
|
end
|
15
47
|
|
16
48
|
def test_add
|
17
|
-
operator = SomeOperator.new('first')
|
18
|
-
operator2 = SomeOperator.new('second')
|
49
|
+
operator = SomeOperator.new('first', 'some operator')
|
50
|
+
operator2 = SomeOperator.new('second', 'some operator')
|
19
51
|
operand = De::Boolean::Operand.new('third', true)
|
20
52
|
not_suitable_operand = NotSuitableOperand.new('four', true)
|
21
53
|
|
data/test/de_expression_test.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'test/unit'
|
2
|
-
require 'de'
|
2
|
+
require File.expand_path('../lib/de.rb', File.dirname(__FILE__))
|
3
3
|
|
4
4
|
class DeExpressionTest < Test::Unit::TestCase
|
5
5
|
class SomeOperator < De::Operator; end
|
@@ -15,7 +15,7 @@ class DeExpressionTest < Test::Unit::TestCase
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def test_add
|
18
|
-
operator = SomeOperator.new('some operator')
|
18
|
+
operator = SomeOperator.new('some operator', 'some operator')
|
19
19
|
assert_nothing_raised(De::Error::TypeError) { @expression << operator }
|
20
20
|
assert_equal(@expression.children[0], operator)
|
21
21
|
|
@@ -26,10 +26,29 @@ class DeExpressionTest < Test::Unit::TestCase
|
|
26
26
|
obj = Object.new
|
27
27
|
assert_raise(De::Error::TypeError, "Cannot add object to expression") { @expression << obj }
|
28
28
|
assert_equal(3, @expression.size)
|
29
|
+
|
30
|
+
old_name = operand.name
|
31
|
+
@expression << operand
|
32
|
+
assert_equal(4, @expression.size)
|
33
|
+
assert_instance_of(SomeOperand, @expression.children[2])
|
34
|
+
assert_equal(operand.name, @expression.children[2].name)
|
35
|
+
assert(old_name != @expression.children[2].name)
|
29
36
|
end
|
30
37
|
|
31
38
|
def test_valid?
|
32
39
|
assert_raise(De::Error::MethodShouldBeOverridenByExtendingClassError, "Cannot add object to expression") { @expression.valid? }
|
33
40
|
end
|
34
41
|
|
42
|
+
def test_to_s
|
43
|
+
assert_equal('some content', @expression.to_s)
|
44
|
+
|
45
|
+
operand = SomeOperand.new('some operand', 'operand content')
|
46
|
+
@expression << operand
|
47
|
+
|
48
|
+
assert_equal('some content(operand content)', @expression.to_s)
|
49
|
+
|
50
|
+
operand = SomeOperand.new('some operand 2', 'operand content 2')
|
51
|
+
@expression << operand
|
52
|
+
assert_equal('some content(operand content, operand content 2)', @expression.to_s)
|
53
|
+
end
|
35
54
|
end
|
data/test/de_operator_test.rb
CHANGED
@@ -16,24 +16,24 @@ class DeOperatorTest < Test::Unit::TestCase
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def test_constructor
|
19
|
-
assert_raise(De::Error::AbstractClassObjectCreationError, "Cannot create operator object") { De::Operator.new('some name') }
|
19
|
+
assert_raise(De::Error::AbstractClassObjectCreationError, "Cannot create operator object") { De::Operator.new('some name', 'some content') }
|
20
20
|
|
21
21
|
assert_nothing_raised(De::Error::AbstractClassObjectCreationError) {
|
22
|
-
operator = SomeOperator.new('some name')
|
22
|
+
operator = SomeOperator.new('some name', 'some operator')
|
23
23
|
assert_equal('some name', operator.name)
|
24
|
-
assert_equal(1, operator.size, 'No children noDes should be
|
24
|
+
assert_equal(1, operator.size, 'No children noDes should be added')
|
25
25
|
|
26
|
-
operator2 = SomeOperator.new('another name', [operator])
|
26
|
+
operator2 = SomeOperator.new('another name', 'some operator', [operator])
|
27
27
|
assert_equal(2, operator2.size, 'First operator should be adDed as child to second one')
|
28
|
-
assert_equal(operator, operator2.children[0], 'First operator should be
|
28
|
+
assert_equal(operator, operator2.children[0], 'First operator should be added as child to second one')
|
29
29
|
}
|
30
30
|
|
31
|
-
assert_raise(De::Error::TypeError, "Cannot create operator object") { SomeOperator.new('some name', 10) }
|
31
|
+
assert_raise(De::Error::TypeError, "Cannot create operator object") { SomeOperator.new('some name', 'some operator', 10) }
|
32
32
|
end
|
33
33
|
|
34
34
|
def test_valid?
|
35
35
|
|
36
|
-
operator = SomeOperator.new('some name')
|
36
|
+
operator = SomeOperator.new('some name', 'some operator')
|
37
37
|
assert_equal(false, operator.valid?)
|
38
38
|
|
39
39
|
operand = SomeValidOperand.new('another name', 5)
|
data/test/test.rb
ADDED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: de
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 4
|
10
|
+
version: 0.0.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Olga Gorun
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-09-
|
18
|
+
date: 2011-09-23 00:00:00 +03:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -78,6 +78,7 @@ extra_rdoc_files: []
|
|
78
78
|
files:
|
79
79
|
- .gitignore
|
80
80
|
- .rvmrc
|
81
|
+
- CHANGELOG
|
81
82
|
- Gemfile
|
82
83
|
- README
|
83
84
|
- Rakefile
|
@@ -107,6 +108,7 @@ files:
|
|
107
108
|
- test/de_sunspot_solr_or_test.rb
|
108
109
|
- test/de_sunspot_solr_search_test.rb
|
109
110
|
- test/de_sunspot_solr_sunspot_operand_test.rb
|
111
|
+
- test/test.rb
|
110
112
|
has_rdoc: true
|
111
113
|
homepage: ""
|
112
114
|
licenses: []
|