de 0.0.1
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/.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
|