de 0.0.3 → 0.0.4
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.
- 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: []
|