de 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/README +28 -0
- data/Rakefile +1 -0
- data/de.gemspec +26 -0
- data/lib/de/boolean/operand.rb +46 -0
- data/lib/de/boolean/operator.rb +134 -0
- data/lib/de/boolean.rb +2 -0
- data/lib/de/de.rb +210 -0
- data/lib/de/error.rb +6 -0
- data/lib/de/sunspot_solr/operand.rb +273 -0
- data/lib/de/sunspot_solr/operator.rb +131 -0
- data/lib/de/sunspot_solr/search.rb +179 -0
- data/lib/de/sunspot_solr.rb +9 -0
- data/lib/de/symmetric_operator.rb +31 -0
- data/lib/de/version.rb +3 -0
- data/lib/de.rb +3 -0
- data/test/de_boolean_and_test.rb +51 -0
- data/test/de_boolean_not_test.rb +39 -0
- data/test/de_boolean_operand_test.rb +30 -0
- data/test/de_boolean_operator_test.rb +34 -0
- data/test/de_boolean_or_test.rb +51 -0
- data/test/de_expression_test.rb +35 -0
- data/test/de_operand_test.rb +29 -0
- data/test/de_operator_test.rb +48 -0
- data/test/de_sunspot_solr_and_test.rb +113 -0
- data/test/de_sunspot_solr_not_test.rb +49 -0
- data/test/de_sunspot_solr_or_test.rb +61 -0
- data/test/de_sunspot_solr_search_test.rb +251 -0
- data/test/de_sunspot_solr_sunspot_operand_test.rb +509 -0
- metadata +145 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'de'
|
3
|
+
require 'de/boolean'
|
4
|
+
|
5
|
+
class DeBooleanNotTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_constructor
|
8
|
+
assert_nothing_raised(De::Error::AbstractClassObjectCreationError) { De::Boolean::Not.new }
|
9
|
+
assert_nothing_raised(De::Error::AbstractClassObjectCreationError) { De::Boolean::Not.new(De::Boolean::Operand.new('some name', true)) }
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_add
|
13
|
+
not1 = De::Boolean::Not.new
|
14
|
+
operand1 = De::Boolean::Operand.new('some name', true)
|
15
|
+
|
16
|
+
not1 << operand1
|
17
|
+
assert_equal(2, not1.size)
|
18
|
+
|
19
|
+
not2 = De::Boolean::Not.new
|
20
|
+
or1 = De::Boolean::Or.new
|
21
|
+
not2 << or1
|
22
|
+
assert_equal(1, or1.size)
|
23
|
+
|
24
|
+
assert_raise(De::Error::ArgumentNumerError) { not2 << operand1 }
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_evaluate
|
28
|
+
not1 = De::Boolean::Not.new
|
29
|
+
operand_true1 = De::Boolean::Operand.new('some name', true)
|
30
|
+
operand_false1 = De::Boolean::Operand.new('third name', false)
|
31
|
+
|
32
|
+
not1 << operand_true1
|
33
|
+
assert_equal(false, not1.evaluate)
|
34
|
+
|
35
|
+
not2 = De::Boolean::Not.new(operand_false1)
|
36
|
+
assert_equal(true, not2.evaluate)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'de'
|
3
|
+
require 'de/boolean'
|
4
|
+
|
5
|
+
class DeBooleanOperandTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_constructor
|
8
|
+
assert_nothing_raised(De::Error::AbstractClassObjectCreationError) { De::Boolean::Operand.new('first', true) }
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_valid?
|
12
|
+
operand1 = De::Boolean::Operand.new('first', true)
|
13
|
+
operand2 = De::Boolean::Operand.new('second', false)
|
14
|
+
operand3 = De::Boolean::Operand.new('third', 'some string')
|
15
|
+
|
16
|
+
assert_equal(true, operand1.valid?)
|
17
|
+
assert_equal(true, operand2.valid?)
|
18
|
+
assert_equal(false, operand3.valid?)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_evaluate
|
22
|
+
operand1 = De::Boolean::Operand.new('first', true)
|
23
|
+
operand2 = De::Boolean::Operand.new('second', false)
|
24
|
+
operand3 = De::Boolean::Operand.new('third', 'some string')
|
25
|
+
|
26
|
+
assert_equal(true, operand1.evaluate)
|
27
|
+
assert_equal(false, operand2.evaluate)
|
28
|
+
assert_raise(De::Error::InvalidExpressionError, "Invalid expression") { operand3.evaluate }
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'de'
|
3
|
+
require 'de/boolean'
|
4
|
+
|
5
|
+
class DeBooleanOperatorTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
class SomeOperator < De::Boolean::BooleanOperator; end
|
8
|
+
class SomeOperator < De::Boolean::BooleanOperator; end
|
9
|
+
class NotSuitableOperand < De::Operand; end
|
10
|
+
|
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') }
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_add
|
17
|
+
operator = SomeOperator.new('first')
|
18
|
+
operator2 = SomeOperator.new('second')
|
19
|
+
operand = De::Boolean::Operand.new('third', true)
|
20
|
+
not_suitable_operand = NotSuitableOperand.new('four', true)
|
21
|
+
|
22
|
+
assert_nothing_raised(De::Error::TypeError) {
|
23
|
+
operator << operator2
|
24
|
+
assert_equal(2, operator.size)
|
25
|
+
|
26
|
+
operator << operand
|
27
|
+
assert_equal(3, operator.size)
|
28
|
+
}
|
29
|
+
|
30
|
+
assert_raise(De::Error::TypeError) { operator << not_suitable_operand }
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'de'
|
3
|
+
require 'de/boolean'
|
4
|
+
|
5
|
+
class DeBooleanOrTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_constructor
|
8
|
+
assert_nothing_raised(De::Error::AbstractClassObjectCreationError) { De::Boolean::Or.new }
|
9
|
+
assert_nothing_raised(De::Error::AbstractClassObjectCreationError) { De::Boolean::Or.new([De::Boolean::Operand.new('some name', true)]) }
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_add
|
13
|
+
or1 = De::Boolean::Or.new
|
14
|
+
operand1 = De::Boolean::Operand.new('some name', true)
|
15
|
+
|
16
|
+
or1 << operand1
|
17
|
+
assert_equal(2, or1.size)
|
18
|
+
|
19
|
+
or2 = De::Boolean::Or.new
|
20
|
+
or1 << or2
|
21
|
+
assert_equal(3, or1.size)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_evaluate
|
25
|
+
or1 = De::Boolean::Or.new
|
26
|
+
operand_true1 = De::Boolean::Operand.new('some name', true)
|
27
|
+
operand_true2 = De::Boolean::Operand.new('second name', true)
|
28
|
+
operand_false1 = De::Boolean::Operand.new('third name', false)
|
29
|
+
operand_false2 = De::Boolean::Operand.new('fourth name', false)
|
30
|
+
|
31
|
+
or1 << operand_true1
|
32
|
+
or1 << operand_true2
|
33
|
+
assert_equal(true, or1.evaluate)
|
34
|
+
|
35
|
+
or2 = De::Boolean::Or.new
|
36
|
+
or2 << operand_true1
|
37
|
+
or2 << operand_false1
|
38
|
+
assert_equal(true, or2.evaluate)
|
39
|
+
|
40
|
+
or3 = De::Boolean::Or.new([operand_false1, operand_false2])
|
41
|
+
assert_equal(false, or3.evaluate)
|
42
|
+
|
43
|
+
or1 << or3
|
44
|
+
assert_equal(true, or1.evaluate)
|
45
|
+
|
46
|
+
or4 = De::Boolean::Or.new([operand_true1, operand_true2])
|
47
|
+
or1 << or4
|
48
|
+
assert_equal(true, or1.evaluate)
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'de'
|
3
|
+
|
4
|
+
class DeExpressionTest < Test::Unit::TestCase
|
5
|
+
class SomeOperator < De::Operator; end
|
6
|
+
class SomeOperand < De::Operand; end
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@expression = De::Expression.new('some name', 'some content')
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_expression_create
|
13
|
+
assert_equal('some name', @expression.name)
|
14
|
+
assert_equal('some content', @expression.content)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_add
|
18
|
+
operator = SomeOperator.new('some operator')
|
19
|
+
assert_nothing_raised(De::Error::TypeError) { @expression << operator }
|
20
|
+
assert_equal(@expression.children[0], operator)
|
21
|
+
|
22
|
+
operand = SomeOperand.new('some operand', 'operand content')
|
23
|
+
assert_nothing_raised(De::Error::TypeError) { @expression << operand }
|
24
|
+
assert_equal(@expression.children[1], operand)
|
25
|
+
|
26
|
+
obj = Object.new
|
27
|
+
assert_raise(De::Error::TypeError, "Cannot add object to expression") { @expression << obj }
|
28
|
+
assert_equal(3, @expression.size)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_valid?
|
32
|
+
assert_raise(De::Error::MethodShouldBeOverridenByExtendingClassError, "Cannot add object to expression") { @expression.valid? }
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'de'
|
3
|
+
|
4
|
+
class DeOperandTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
class SomeOperand < De::Operand; end
|
7
|
+
|
8
|
+
def test_constructor
|
9
|
+
assert_raise(De::Error::AbstractClassObjectCreationError, "Cannot create operator object") { De::Operand.new('some name', 'some value') }
|
10
|
+
|
11
|
+
assert_nothing_raised(De::Error::AbstractClassObjectCreationError) {
|
12
|
+
operand = SomeOperand.new('some name', 'some value')
|
13
|
+
assert_equal('some name', operand.name)
|
14
|
+
assert_equal('some value', operand.content)
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_add
|
19
|
+
operand = SomeOperand.new('some name', 'some value')
|
20
|
+
operand2 = SomeOperand.new('another name', 'another value')
|
21
|
+
|
22
|
+
assert_raise(De::Error::TypeError, "Cannot add child to operand") { operand << operand2 }
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_evaluate
|
26
|
+
operand = SomeOperand.new('some name', 'some value')
|
27
|
+
assert_raise(De::Error::MethodShouldBeOverridenByExtendingClassError, "evlauate method should raise Exception") { operand.evaluate }
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'de'
|
3
|
+
|
4
|
+
class DeOperatorTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
class SomeOperator < De::Operator; end
|
7
|
+
class SomeValidOperand < De::Operand;
|
8
|
+
def valid?
|
9
|
+
true
|
10
|
+
end
|
11
|
+
end
|
12
|
+
class SomeInvalidOperand < De::Operand;
|
13
|
+
def valid?
|
14
|
+
false
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_constructor
|
19
|
+
assert_raise(De::Error::AbstractClassObjectCreationError, "Cannot create operator object") { De::Operator.new('some name') }
|
20
|
+
|
21
|
+
assert_nothing_raised(De::Error::AbstractClassObjectCreationError) {
|
22
|
+
operator = SomeOperator.new('some name')
|
23
|
+
assert_equal('some name', operator.name)
|
24
|
+
assert_equal(1, operator.size, 'No children noDes should be adDed')
|
25
|
+
|
26
|
+
operator2 = SomeOperator.new('another name', [operator])
|
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')
|
29
|
+
}
|
30
|
+
|
31
|
+
assert_raise(De::Error::TypeError, "Cannot create operator object") { SomeOperator.new('some name', 10) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_valid?
|
35
|
+
|
36
|
+
operator = SomeOperator.new('some name')
|
37
|
+
assert_equal(false, operator.valid?)
|
38
|
+
|
39
|
+
operand = SomeValidOperand.new('another name', 5)
|
40
|
+
operator << operand
|
41
|
+
assert_equal(true, operator.valid?)
|
42
|
+
|
43
|
+
operand2 = SomeInvalidOperand.new('third name', 7)
|
44
|
+
operator << operand2
|
45
|
+
assert_equal(false, operator.valid?)
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'de'
|
3
|
+
require 'de/sunspot_solr'
|
4
|
+
|
5
|
+
class DeSunspotSolrAndTest < Test::Unit::TestCase
|
6
|
+
include De::SunspotSolr
|
7
|
+
|
8
|
+
def test_constructor
|
9
|
+
assert_nothing_raised(De::Error::AbstractClassObjectCreationError) { And.new }
|
10
|
+
assert_nothing_raised(De::Error::AbstractClassObjectCreationError) { And.new([SunspotOperand.new('some name', :client_id, :equal_to, 42)]) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_equal
|
14
|
+
a = And.new
|
15
|
+
b = And.new
|
16
|
+
c = Or.new
|
17
|
+
assert(a == b)
|
18
|
+
assert(a != c)
|
19
|
+
|
20
|
+
d = And.new([EqualTo.new(:client_id, 42), GreaterThan.new(:price, 200)])
|
21
|
+
e = And.new([EqualTo.new(:client_id, 42), GreaterThan.new(:price, 200)])
|
22
|
+
f = And.new([GreaterThan.new(:price, 200), EqualTo.new(:client_id, 42)])
|
23
|
+
g = And.new([GreaterThan.new(:price, 200), EqualTo.new(:client_id, 42), Without.new(:products_group_id, 188)])
|
24
|
+
assert(d == e)
|
25
|
+
assert(d == f)
|
26
|
+
assert(e != g)
|
27
|
+
|
28
|
+
a << d
|
29
|
+
b << f
|
30
|
+
assert(a == b)
|
31
|
+
|
32
|
+
h = And.new
|
33
|
+
h << g
|
34
|
+
assert(a != h)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_add
|
38
|
+
and1 = And.new
|
39
|
+
operand1 = SunspotOperand.new('some name', :client_id, :eaual_to, 42)
|
40
|
+
|
41
|
+
result = and1 << operand1
|
42
|
+
assert_equal(2, and1.size)
|
43
|
+
assert_equal(operand1, result)
|
44
|
+
|
45
|
+
operand2 = SunspotOperand.new('some name 2', :client_id, :eaual_to, 42)
|
46
|
+
result = and1 << operand2
|
47
|
+
assert_equal(2, and1.size)
|
48
|
+
assert(result === operand1)
|
49
|
+
|
50
|
+
and2 = And.new
|
51
|
+
and1 << and2
|
52
|
+
assert_equal(3, and1.size)
|
53
|
+
|
54
|
+
and3 = And.new
|
55
|
+
and4 = And.new([EqualTo.new(:client_id, 42), GreaterThan.new(:price, 200)])
|
56
|
+
and5 = And.new([GreaterThan.new(:price, 200), EqualTo.new(:client_id, 42)])
|
57
|
+
or1 = Or.new([EqualTo.new(:client_id, 42), GreaterThan.new(:price, 200)])
|
58
|
+
|
59
|
+
and3 << and4
|
60
|
+
assert_equal(4, and3.size)
|
61
|
+
assert_equal(1, and3.children.size)
|
62
|
+
assert_equal(and4, and3.first_child)
|
63
|
+
|
64
|
+
result = and3 << and5
|
65
|
+
assert(and4 === result)
|
66
|
+
assert_equal(4, and3.size)
|
67
|
+
assert_equal(1, and3.children.size)
|
68
|
+
assert_equal(and4, and3.first_child)
|
69
|
+
|
70
|
+
result = and3 << or1
|
71
|
+
assert(or1 === result)
|
72
|
+
assert_equal(7, and3.size)
|
73
|
+
assert_equal(2, and3.children.size)
|
74
|
+
assert_equal(or1, and3.children[1])
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_evaluate
|
78
|
+
and1 = And.new
|
79
|
+
client_operand = EqualTo.new(:client_id, 42)
|
80
|
+
name_operand = SunspotOperand.new('name', :name, :equal_to, 'some name')
|
81
|
+
price_operand = SunspotOperand.new('price', :price, :greater_than, 100)
|
82
|
+
name2_operand = SunspotOperand.new('name2', :name, :equal_to, 'some name 2')
|
83
|
+
search = Search.new('search_product', 'Product', {
|
84
|
+
:properties => {
|
85
|
+
:client_id => {:type => :integer, :dynamic => false},
|
86
|
+
:name => {:type => :string, :dynamic => false},
|
87
|
+
:price => {:type => :integer, :dynamic => true}
|
88
|
+
},
|
89
|
+
:dynamics => {:integer => :int_params, :string => :string_params, :time => :time_params, :text => :string_params}
|
90
|
+
})
|
91
|
+
|
92
|
+
|
93
|
+
and1 << client_operand
|
94
|
+
and1 << name_operand
|
95
|
+
assert_raise (De::Error::InvalidExpressionError) { and1.evaluate }
|
96
|
+
|
97
|
+
search << and1
|
98
|
+
assert_nothing_raised(De::Error::InvalidExpressionError) {
|
99
|
+
assert_equal("all_of do with(:client_id).equal_to(42) with(:name).equal_to('some name') end", and1.evaluate.gsub(/\s+/, ' '))
|
100
|
+
}
|
101
|
+
|
102
|
+
and1 << price_operand
|
103
|
+
assert_equal("all_of do with(:client_id).equal_to(42) with(:name).equal_to('some name') dynamic(:int_params) do with(:price).greater_than(100) end end", and1.evaluate.gsub(/\s+/, ' '))
|
104
|
+
|
105
|
+
and2 = And.new
|
106
|
+
and2 << name2_operand
|
107
|
+
and1 << and2
|
108
|
+
assert_equal("all_of do with(:name).equal_to('some name 2') end", and2.evaluate.gsub(/\s+/, ' '))
|
109
|
+
assert_equal("all_of do with(:client_id).equal_to(42) with(:name).equal_to('some name') dynamic(:int_params) do with(:price).greater_than(100) end all_of do with(:name).equal_to('some name 2') end end", and1.evaluate.gsub(/\s+/, ' '))
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'de'
|
3
|
+
require 'de/sunspot_solr'
|
4
|
+
|
5
|
+
class DeSunspotSolrNotTest < Test::Unit::TestCase
|
6
|
+
include De::SunspotSolr
|
7
|
+
|
8
|
+
def test_constructor
|
9
|
+
assert_nothing_raised(De::Error::AbstractClassObjectCreationError) { Not.new }
|
10
|
+
assert_nothing_raised(De::Error::AbstractClassObjectCreationError) { Not.new(SunspotOperand.new('some name', :client_id, :equal_to, 42)) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_add
|
14
|
+
not1 = Not.new
|
15
|
+
operand1 = SunspotOperand.new('some name', :client_id, :equal_to, 42)
|
16
|
+
|
17
|
+
not1 << operand1
|
18
|
+
assert_equal(2, not1.size)
|
19
|
+
|
20
|
+
or1 = Or.new
|
21
|
+
operand2 = EqualTo.new(:client_id, 42)
|
22
|
+
|
23
|
+
assert_raise(De::Error::TypeError) { not1 << or1 }
|
24
|
+
assert_raise(De::Error::ArgumentNumerError) { not1 << operand2 }
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_evaluate
|
28
|
+
not1 = Not.new(EqualTo.new(:client_id, 42))
|
29
|
+
not2 = Not.new(GreaterThanOrEqual.new(:price, 100))
|
30
|
+
search = Search.new('search_product', 'Product', {
|
31
|
+
:properties => {
|
32
|
+
:client_id => {:type => :integer, :dynamic => false},
|
33
|
+
:name => {:type => :string, :dynamic => false},
|
34
|
+
:price => {:type => :integer, :dynamic => true}
|
35
|
+
},
|
36
|
+
:dynamics => {:integer => :int_params, :string => :string_params, :time => :time_params, :text => :string_params}
|
37
|
+
})
|
38
|
+
|
39
|
+
|
40
|
+
search << not1
|
41
|
+
assert_nothing_raised(De::Error::InvalidExpressionError) {
|
42
|
+
assert_equal("without(:client_id).equal_to(42)", not1.evaluate.gsub(/\s+/, ' '))
|
43
|
+
}
|
44
|
+
|
45
|
+
search << not2
|
46
|
+
assert_equal("dynamic(:int_params) do any_of do without(:price).greater_than(100) without(:price, 100) end end", not2.evaluate.gsub(/\s+/, ' '))
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'de'
|
3
|
+
require 'de/sunspot_solr'
|
4
|
+
|
5
|
+
class DeSunspotSolrOrTest < Test::Unit::TestCase
|
6
|
+
include De::SunspotSolr
|
7
|
+
|
8
|
+
def test_constructor
|
9
|
+
assert_nothing_raised(De::Error::AbstractClassObjectCreationError) { Or.new }
|
10
|
+
assert_nothing_raised(De::Error::AbstractClassObjectCreationError) { Or.new([SunspotOperand.new('some name', :client_id, :equal_to, 42)]) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_add
|
14
|
+
or1 = Or.new
|
15
|
+
operand1 = SunspotOperand.new('some name', :client_id, :equal_to, 42)
|
16
|
+
|
17
|
+
or1 << operand1
|
18
|
+
assert_equal(2, or1.size)
|
19
|
+
|
20
|
+
or2 = Or.new
|
21
|
+
or1 << or2
|
22
|
+
assert_equal(3, or1.size)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_evaluate
|
26
|
+
or1 = Or.new
|
27
|
+
client_operand = EqualTo.new(:client_id, 42)
|
28
|
+
name_operand = SunspotOperand.new('name', :name, :equal_to, 'some name')
|
29
|
+
price_operand = SunspotOperand.new('price', :price, :greater_than, 100)
|
30
|
+
name2_operand = SunspotOperand.new('name2', :name, :equal_to, 'some name 2')
|
31
|
+
search = Search.new('search_product', 'Product', {
|
32
|
+
:properties => {
|
33
|
+
:client_id => {:type => :integer, :dynamic => false},
|
34
|
+
:name => {:type => :string, :dynamic => false},
|
35
|
+
:price => {:type => :integer, :dynamic => true}
|
36
|
+
},
|
37
|
+
:dynamics => {:integer => :int_params, :string => :string_params, :time => :time_params, :text => :string_params}
|
38
|
+
})
|
39
|
+
|
40
|
+
|
41
|
+
or1 << client_operand
|
42
|
+
or1 << name_operand
|
43
|
+
assert_raise (De::Error::InvalidExpressionError) { or1.evaluate }
|
44
|
+
|
45
|
+
search << or1
|
46
|
+
assert_nothing_raised(De::Error::InvalidExpressionError) {
|
47
|
+
assert_equal("any_of do with(:client_id).equal_to(42) with(:name).equal_to('some name') end", or1.evaluate.gsub(/\s+/, ' '))
|
48
|
+
}
|
49
|
+
|
50
|
+
or1 << price_operand
|
51
|
+
assert_equal("any_of do with(:client_id).equal_to(42) with(:name).equal_to('some name') dynamic(:int_params) do with(:price).greater_than(100) end end", or1.evaluate.gsub(/\s+/, ' '))
|
52
|
+
|
53
|
+
and1 = And.new
|
54
|
+
and1 << name2_operand
|
55
|
+
or1 << and1
|
56
|
+
assert_equal("all_of do with(:name).equal_to('some name 2') end", and1.evaluate.gsub(/\s+/, ' '))
|
57
|
+
assert_equal("any_of do with(:client_id).equal_to(42) with(:name).equal_to('some name') dynamic(:int_params) do with(:price).greater_than(100) end all_of do with(:name).equal_to('some name 2') end end", or1.evaluate.gsub(/\s+/, ' '))
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|