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 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
@@ -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
- super(obj)
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
- # Number of results per page is defined by @option[:per_page] parameter
168
- # Default values: page - 1, per_page - 10000
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
@@ -1,3 +1,3 @@
1
1
  module De
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -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
 
@@ -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
@@ -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 adDed')
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 adDed as child to second one')
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
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+
3
+ dir = File.expand_path(File.dirname(__FILE__))
4
+ Dir.glob("#{dir}/*.rb").each do |file|
5
+ require file unless file =~ /\/test\.rb$/
6
+ end
7
+
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: 25
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 3
10
- version: 0.0.3
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-12 00:00:00 +03:00
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: []