linkage 0.0.8 → 0.1.0.pre

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.
Files changed (105) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.yardopts +1 -0
  4. data/Gemfile +1 -19
  5. data/Gemfile-java +3 -0
  6. data/README.markdown +88 -34
  7. data/Rakefile +16 -15
  8. data/TODO +4 -0
  9. data/lib/linkage/comparator.rb +139 -144
  10. data/lib/linkage/comparators/compare.rb +236 -29
  11. data/lib/linkage/comparators/strcompare.rb +85 -0
  12. data/lib/linkage/comparators/within.rb +24 -20
  13. data/lib/linkage/configuration.rb +44 -466
  14. data/lib/linkage/dataset.rb +28 -127
  15. data/lib/linkage/exceptions.rb +5 -0
  16. data/lib/linkage/field.rb +6 -37
  17. data/lib/linkage/field_set.rb +3 -3
  18. data/lib/linkage/match_recorder.rb +22 -0
  19. data/lib/linkage/match_set.rb +34 -0
  20. data/lib/linkage/match_sets/csv.rb +39 -0
  21. data/lib/linkage/match_sets/database.rb +45 -0
  22. data/lib/linkage/matcher.rb +30 -0
  23. data/lib/linkage/result_set.rb +25 -110
  24. data/lib/linkage/result_sets/csv.rb +54 -0
  25. data/lib/linkage/result_sets/database.rb +42 -0
  26. data/lib/linkage/runner.rb +57 -16
  27. data/lib/linkage/score_recorder.rb +30 -0
  28. data/lib/linkage/score_set.rb +49 -0
  29. data/lib/linkage/score_sets/csv.rb +64 -0
  30. data/lib/linkage/score_sets/database.rb +77 -0
  31. data/lib/linkage/version.rb +1 -1
  32. data/lib/linkage.rb +14 -17
  33. data/linkage.gemspec +13 -1
  34. data/linkage.gemspec-java +32 -0
  35. data/test/helper.rb +30 -23
  36. data/test/integration/test_cross_linkage.rb +46 -25
  37. data/test/integration/test_database_result_set.rb +55 -0
  38. data/test/integration/test_dual_linkage.rb +19 -94
  39. data/test/integration/test_self_linkage.rb +100 -203
  40. data/test/integration/test_within_comparator.rb +24 -77
  41. data/test/unit/comparators/test_compare.rb +254 -50
  42. data/test/unit/comparators/test_strcompare.rb +45 -0
  43. data/test/unit/comparators/test_within.rb +14 -26
  44. data/test/unit/match_sets/test_csv.rb +78 -0
  45. data/test/unit/match_sets/test_database.rb +63 -0
  46. data/test/unit/result_sets/test_csv.rb +111 -0
  47. data/test/unit/result_sets/test_database.rb +68 -0
  48. data/test/unit/score_sets/test_csv.rb +151 -0
  49. data/test/unit/score_sets/test_database.rb +149 -0
  50. data/test/unit/test_comparator.rb +46 -83
  51. data/test/unit/test_comparators.rb +4 -0
  52. data/test/unit/test_configuration.rb +99 -145
  53. data/test/unit/test_dataset.rb +52 -73
  54. data/test/unit/test_field.rb +4 -55
  55. data/test/unit/test_field_set.rb +6 -6
  56. data/test/unit/test_match_recorder.rb +23 -0
  57. data/test/unit/test_match_set.rb +23 -0
  58. data/test/unit/test_match_sets.rb +4 -0
  59. data/test/unit/test_matcher.rb +44 -0
  60. data/test/unit/test_result_set.rb +24 -223
  61. data/test/unit/test_result_sets.rb +4 -0
  62. data/test/unit/test_runner.rb +122 -17
  63. data/test/unit/test_runners.rb +4 -0
  64. data/test/unit/test_score_recorder.rb +25 -0
  65. data/test/unit/test_score_set.rb +37 -0
  66. data/test/unit/test_score_sets.rb +4 -0
  67. metadata +183 -90
  68. data/Gemfile.lock +0 -92
  69. data/lib/linkage/comparators/binary.rb +0 -12
  70. data/lib/linkage/data.rb +0 -175
  71. data/lib/linkage/decollation.rb +0 -93
  72. data/lib/linkage/expectation.rb +0 -21
  73. data/lib/linkage/expectations/exhaustive.rb +0 -63
  74. data/lib/linkage/expectations/simple.rb +0 -168
  75. data/lib/linkage/function.rb +0 -148
  76. data/lib/linkage/functions/binary.rb +0 -30
  77. data/lib/linkage/functions/cast.rb +0 -54
  78. data/lib/linkage/functions/length.rb +0 -29
  79. data/lib/linkage/functions/strftime.rb +0 -33
  80. data/lib/linkage/functions/trim.rb +0 -30
  81. data/lib/linkage/group.rb +0 -55
  82. data/lib/linkage/meta_object.rb +0 -139
  83. data/lib/linkage/runner/single_threaded.rb +0 -187
  84. data/lib/linkage/utils.rb +0 -164
  85. data/lib/linkage/warnings.rb +0 -5
  86. data/test/integration/test_collation.rb +0 -45
  87. data/test/integration/test_configuration.rb +0 -268
  88. data/test/integration/test_dataset.rb +0 -116
  89. data/test/integration/test_functions.rb +0 -88
  90. data/test/integration/test_result_set.rb +0 -85
  91. data/test/integration/test_scoring.rb +0 -84
  92. data/test/unit/expectations/test_exhaustive.rb +0 -111
  93. data/test/unit/expectations/test_simple.rb +0 -303
  94. data/test/unit/functions/test_binary.rb +0 -54
  95. data/test/unit/functions/test_cast.rb +0 -98
  96. data/test/unit/functions/test_length.rb +0 -52
  97. data/test/unit/functions/test_strftime.rb +0 -60
  98. data/test/unit/functions/test_trim.rb +0 -43
  99. data/test/unit/runner/test_single_threaded.rb +0 -12
  100. data/test/unit/test_data.rb +0 -445
  101. data/test/unit/test_decollation.rb +0 -201
  102. data/test/unit/test_function.rb +0 -233
  103. data/test/unit/test_group.rb +0 -38
  104. data/test/unit/test_meta_object.rb +0 -208
  105. data/test/unit/test_utils.rb +0 -341
@@ -1,111 +0,0 @@
1
- require 'helper'
2
-
3
- class UnitTests::TestExhaustive < Test::Unit::TestCase
4
- test "initialize with comparator, threshold, and mode" do
5
- comparator = stub('comparator')
6
- exp = Linkage::Expectations::Exhaustive.new(comparator, 100, :min)
7
- assert_equal comparator, exp.comparator
8
- assert_equal 100, exp.threshold
9
- assert_equal :min, exp.mode
10
- end
11
-
12
- test "kind is :self when comparator has same args on both sides" do
13
- meta_object_1 = stub('meta object 1')
14
- meta_object_2 = stub('meta object 2')
15
- meta_object_1.expects(:objects_equal?).with(meta_object_2).returns(true)
16
- comparator = stub('comparator', {
17
- :lhs_args => [meta_object_1], :rhs_args => [meta_object_2]
18
- })
19
- exp = Linkage::Expectations::Exhaustive.new(comparator, 100, :min)
20
- assert_equal :self, exp.kind
21
- end
22
-
23
- test "kind is :cross when comparator has args with same dataset but different number of args" do
24
- meta_object_1 = stub('meta object 1')
25
- meta_object_2 = stub('meta object 2')
26
- meta_object_3 = stub('meta object 3')
27
- meta_object_1.expects(:datasets_equal?).with(meta_object_2).returns(true)
28
- comparator = stub('comparator', {
29
- :lhs_args => [meta_object_1], :rhs_args => [meta_object_2, meta_object_3]
30
- })
31
- exp = Linkage::Expectations::Exhaustive.new(comparator, 100, :min)
32
- assert_equal :cross, exp.kind
33
- end
34
-
35
- test "kind is :cross when comparator has args with same dataset but different objects" do
36
- meta_object_1 = stub('meta object 1')
37
- meta_object_2 = stub('meta object 2')
38
- meta_object_1.expects(:objects_equal?).with(meta_object_2).returns(false)
39
- meta_object_1.expects(:datasets_equal?).with(meta_object_2).returns(true)
40
- comparator = stub('comparator', {
41
- :lhs_args => [meta_object_1], :rhs_args => [meta_object_2]
42
- })
43
- exp = Linkage::Expectations::Exhaustive.new(comparator, 100, :min)
44
- assert_equal :cross, exp.kind
45
- end
46
-
47
- test "kind is :dual when comparator has args with different datasets and different number of args" do
48
- meta_object_1 = stub('meta object 1')
49
- meta_object_2 = stub('meta object 2')
50
- meta_object_3 = stub('meta object 3')
51
- meta_object_1.expects(:datasets_equal?).with(meta_object_2).returns(false)
52
- comparator = stub('comparator', {
53
- :lhs_args => [meta_object_1], :rhs_args => [meta_object_2, meta_object_3]
54
- })
55
- exp = Linkage::Expectations::Exhaustive.new(comparator, 100, :min)
56
- assert_equal :dual, exp.kind
57
- end
58
-
59
- test "kind is :dual when comparator has args with different datasets" do
60
- meta_object_1 = stub('meta object 1')
61
- meta_object_2 = stub('meta object 2')
62
- meta_object_1.expects(:objects_equal?).with(meta_object_2).returns(false)
63
- meta_object_1.expects(:datasets_equal?).with(meta_object_2).returns(false)
64
- comparator = stub('comparator', {
65
- :lhs_args => [meta_object_1], :rhs_args => [meta_object_2]
66
- })
67
- exp = Linkage::Expectations::Exhaustive.new(comparator, 100, :min)
68
- assert_equal :dual, exp.kind
69
- end
70
-
71
- test "apply_to lhs dataset" do
72
- dataset = stub('dataset')
73
- new_dataset = stub('new dataset')
74
- meta_object_1 = stub('meta object 1', :name => :foo, :to_expr => :foo)
75
- meta_object_2 = stub('meta object 2', :name => :bar, :to_expr => :bar)
76
- comparator = stub('comparator', :lhs_args => [meta_object_1], :rhs_args => [meta_object_2])
77
- exp = Linkage::Expectations::Exhaustive.new(comparator, 100, :min)
78
- dataset.expects(:select_more).with(:foo.as(:foo)).returns(new_dataset)
79
- assert_equal new_dataset, exp.apply_to(dataset, :lhs)
80
- end
81
-
82
- test "apply_to rhs dataset" do
83
- dataset = stub('dataset')
84
- new_dataset = stub('new dataset')
85
- meta_object_1 = stub('meta object 1', :name => :foo, :to_expr => :foo)
86
- meta_object_2 = stub('meta object 2', :name => :bar, :to_expr => :bar)
87
- comparator = stub('comparator', :lhs_args => [meta_object_1], :rhs_args => [meta_object_2])
88
- exp = Linkage::Expectations::Exhaustive.new(comparator, 100, :min)
89
- dataset.expects(:select_more).with(:bar.as(:bar)).returns(new_dataset)
90
- assert_equal new_dataset, exp.apply_to(dataset, :rhs)
91
- end
92
-
93
- test "satisfied? with :equal mode" do
94
- meta_object_1 = stub('meta object 1')
95
- meta_object_2 = stub('meta object 2')
96
- comparator = stub('comparator', :lhs_args => [meta_object_1], :rhs_args => [meta_object_2])
97
- exp = Linkage::Expectations::Exhaustive.new(comparator, 50, :equal)
98
- assert exp.satisfied?(50)
99
- assert !exp.satisfied?(123)
100
- end
101
-
102
- test "satisfied? with :min mode" do
103
- meta_object_1 = stub('meta object 1')
104
- meta_object_2 = stub('meta object 2')
105
- comparator = stub('comparator', :lhs_args => [meta_object_1], :rhs_args => [meta_object_2])
106
- exp = Linkage::Expectations::Exhaustive.new(comparator, 50, :min)
107
- assert exp.satisfied?(50)
108
- assert exp.satisfied?(55)
109
- assert !exp.satisfied?(45)
110
- end
111
- end
@@ -1,303 +0,0 @@
1
- require 'helper'
2
-
3
- class UnitTests::TestSimple < Test::Unit::TestCase
4
- test "initialize with invalid operator" do
5
- assert_raises(ArgumentError) do
6
- Linkage::Expectations::Simple.new(stub(), stub(), :foo)
7
- end
8
- end
9
-
10
- test "creating filter expectation from a dynamic object and a static object" do
11
- field = stub('meta field', :static? => false, :side => :lhs)
12
- object = stub('meta object', :static? => true)
13
- exp = Linkage::Expectations::Simple.create(field, object, :==)
14
- assert_kind_of Linkage::Expectations::Filter, exp
15
- assert_equal :lhs, exp.side
16
- end
17
-
18
- test "creating expectation from two static objects raises error" do
19
- object_1 = stub('meta object 1', :static? => true)
20
- object_2 = stub('meta object 2', :static? => true)
21
- assert_raises(ArgumentError) do
22
- Linkage::Expectations::Simple.create(object_1, object_2, :==)
23
- end
24
- end
25
-
26
- test "creating filter expectation from two dynamic objects with the same side" do
27
- field_1 = stub('meta field 1', :static? => false, :side => :lhs)
28
- field_2 = stub('meta field 2', :static? => false, :side => :lhs)
29
- field_1.expects(:datasets_equal?).with(field_2).returns(true)
30
- exp = Linkage::Expectations::Simple.create(field_1, field_2, :==)
31
- assert_kind_of Linkage::Expectations::Filter, exp
32
- assert_equal :lhs, exp.side
33
- end
34
-
35
- test "creating filter expectation from two dynamic objects with the same side but different datasets raises error" do
36
- field_1 = stub('meta field 1', :static? => false, :side => :lhs)
37
- field_2 = stub('meta field 2', :static? => false, :side => :lhs)
38
- field_1.expects(:datasets_equal?).with(field_2).returns(false)
39
- assert_raises(ArgumentError) do
40
- Linkage::Expectations::Simple.create(field_1, field_2, :==)
41
- end
42
- end
43
-
44
- test "creating self expectation from two dynamic objects with different sides" do
45
- object_1 = stub('meta object 1', :static? => false, :side => :lhs)
46
- object_2 = stub('meta object 2', :static? => false, :side => :rhs)
47
- object_1.expects(:objects_equal?).with(object_2).returns(true)
48
- exp = Linkage::Expectations::Simple.create(object_1, object_2, :==)
49
- assert_kind_of Linkage::Expectations::Self, exp
50
- end
51
-
52
- test "creating cross expectation from two dynamic objects with different sides but same dataset" do
53
- object_1 = stub('meta object 1', :static? => false, :side => :lhs)
54
- object_2 = stub('meta object 2', :static? => false, :side => :rhs)
55
- object_1.expects(:objects_equal?).with(object_2).returns(false)
56
- object_1.expects(:datasets_equal?).with(object_2).returns(true)
57
- exp = Linkage::Expectations::Simple.create(object_1, object_2, :==)
58
- assert_kind_of Linkage::Expectations::Cross, exp
59
- end
60
-
61
- test "creating dual expectation from two dynamic objects with different sides and datasets" do
62
- object_1 = stub('meta object 1', :static? => false, :side => :lhs)
63
- object_2 = stub('meta object 2', :static? => false, :side => :rhs)
64
- object_1.expects(:objects_equal?).with(object_2).returns(false)
65
- object_1.expects(:datasets_equal?).with(object_2).returns(false)
66
- exp = Linkage::Expectations::Simple.create(object_1, object_2, :==)
67
- assert_kind_of Linkage::Expectations::Dual, exp
68
- end
69
-
70
- test "apply_to with filter expectation (== operator)" do
71
- dataset = stub('dataset')
72
- meta_field_1 = stub('meta field 1', :static? => false, :side => :lhs)
73
- meta_field_2 = stub('meta field 2', :static? => false, :side => :lhs)
74
- meta_field_1.stubs(:datasets_equal?).with(meta_field_2).returns(true)
75
-
76
- exp = Linkage::Expectations::Simple.create(meta_field_1, meta_field_2, :==)
77
- meta_field_1.expects(:to_expr).returns(:foo)
78
- meta_field_2.expects(:to_expr).returns(:bar)
79
- dataset.expects(:filter).with({:foo => :bar}).returns(dataset)
80
- assert_equal dataset, exp.apply_to(dataset, :lhs)
81
-
82
- dataset.expects(:filter).never
83
- assert_equal dataset, exp.apply_to(dataset, :rhs)
84
- end
85
-
86
- test "apply_to with filter expectation (!= operator)" do
87
- dataset = stub('dataset')
88
- meta_field_1 = stub('meta field 1', :static? => false, :side => :lhs)
89
- meta_field_2 = stub('meta field 2', :static? => false, :side => :lhs)
90
- meta_field_1.stubs(:datasets_equal?).with(meta_field_2).returns(true)
91
-
92
- exp = Linkage::Expectations::Simple.create(meta_field_1, meta_field_2, :'!=')
93
- meta_field_1.expects(:to_expr).returns(:foo)
94
- meta_field_2.expects(:to_expr).returns(:bar)
95
- dataset.expects(:filter).with(~{:foo => :bar}).returns(dataset)
96
- assert_equal dataset, exp.apply_to(dataset, :lhs)
97
-
98
- dataset.expects(:filter).never
99
- assert_equal dataset, exp.apply_to(dataset, :rhs)
100
- end
101
-
102
- test "apply_to with filter expectation (> operator)" do
103
- dataset = stub('dataset')
104
- meta_field_1 = stub('meta field 1', :static? => false, :side => :lhs)
105
- meta_field_2 = stub('meta field 2', :static? => false, :side => :lhs)
106
- meta_field_1.stubs(:datasets_equal?).with(meta_field_2).returns(true)
107
- exp = Linkage::Expectations::Simple.create(meta_field_1, meta_field_2, :>)
108
-
109
- identifier_1 = Sequel::SQL::Identifier.new(:foo)
110
- meta_field_1.expects(:to_identifier).returns(identifier_1)
111
- identifier_2 = Sequel::SQL::Identifier.new(:bar)
112
- meta_field_2.expects(:to_identifier).returns(identifier_2)
113
- expected = Sequel::SQL::BooleanExpression.new(:>, identifier_1, identifier_2)
114
-
115
- dataset.expects(:filter).with(expected).returns(dataset)
116
- assert_equal dataset, exp.apply_to(dataset, :lhs)
117
-
118
- dataset.expects(:filter).never
119
- assert_equal dataset, exp.apply_to(dataset, :rhs)
120
- end
121
-
122
- test "apply_to with self expectation" do
123
- dataset = stub('dataset')
124
- object_1 = stub('meta object 1', {
125
- :static? => false, :side => :lhs, :dataset => dataset,
126
- :to_expr => :foo
127
- })
128
- object_2 = stub('meta object 2', {
129
- :static? => false, :side => :rhs, :dataset => dataset,
130
- :to_expr => :foo
131
- })
132
- object_1.expects(:objects_equal?).with(object_2).returns(true)
133
- exp = Linkage::Expectations::Simple.create(object_1, object_2, :==)
134
-
135
- merged_field = stub('merged field', :name => :foo)
136
- object_1.expects(:merge).with(object_2).returns(merged_field)
137
- dataset.expects(:group_match_more).with({:meta_object => object_1, :alias => :foo}).returns(dataset)
138
- assert_equal dataset, exp.apply_to(dataset, :lhs)
139
-
140
- dataset.expects(:group_match_more).with({:meta_object => object_2, :alias => :foo}).returns(dataset)
141
- assert_equal dataset, exp.apply_to(dataset, :rhs)
142
- end
143
-
144
- test "apply_to with cross expectation" do
145
- dataset = stub('dataset')
146
- object_1 = stub('meta object 1', {
147
- :static? => false, :side => :lhs, :dataset => dataset,
148
- :to_expr => :foo
149
- })
150
- object_2 = stub('meta object 2', {
151
- :static? => false, :side => :rhs, :dataset => dataset,
152
- :to_expr => :bar
153
- })
154
- object_1.stubs(:objects_equal?).with(object_2).returns(false)
155
- object_1.stubs(:datasets_equal?).with(object_2).returns(true)
156
- exp = Linkage::Expectations::Simple.create(object_1, object_2, :==)
157
-
158
- merged_field = stub('merged field', :name => :foo_bar)
159
- object_1.expects(:merge).with(object_2).returns(merged_field)
160
- dataset.expects(:group_match_more).with({:meta_object => object_1, :alias => :foo_bar}).returns(dataset)
161
- assert_equal dataset, exp.apply_to(dataset, :lhs)
162
-
163
- dataset.expects(:group_match_more).with({:meta_object => object_2, :alias => :foo_bar}).returns(dataset)
164
- assert_equal dataset, exp.apply_to(dataset, :rhs)
165
- end
166
-
167
- test "apply_to with dual expectation" do
168
- dataset_1 = stub('dataset 1')
169
- object_1 = stub('meta object 1', {
170
- :static? => false, :side => :lhs, :dataset => dataset_1,
171
- :to_expr => :foo
172
- })
173
- dataset_2 = stub('dataset 2')
174
- object_2 = stub('meta object 2', {
175
- :static? => false, :side => :rhs, :dataset => dataset_2,
176
- :to_expr => :foo
177
- })
178
- object_1.stubs(:objects_equal?).with(object_2).returns(false)
179
- object_1.stubs(:datasets_equal?).with(object_2).returns(false)
180
- exp = Linkage::Expectations::Simple.create(object_1, object_2, :==)
181
-
182
- merged_field = stub('merged field', :name => :foo)
183
- object_1.expects(:merge).with(object_2).returns(merged_field)
184
- dataset_1.expects(:group_match_more).with({:meta_object => object_1, :alias => :foo}).returns(dataset_1)
185
- assert_equal dataset_1, exp.apply_to(dataset_1, :lhs)
186
-
187
- dataset_2.expects(:group_match_more).with({:meta_object => object_2, :alias => :foo}).returns(dataset_2)
188
- assert_equal dataset_2, exp.apply_to(dataset_2, :rhs)
189
- end
190
-
191
- test "exactly! wraps each side inside the binary function" do
192
- dataset_1 = stub('dataset 1')
193
- field_1 = stub_field('field 1', :dataset => dataset_1)
194
- meta_object_1 = stub('meta object 1', :static? => false, :side => :lhs,
195
- :object => field_1, :dataset => dataset_1)
196
-
197
- dataset_2 = stub('dataset 2')
198
- field_2 = stub_field('field 2', :dataset => dataset_2)
199
- meta_object_2 = stub('meta object 2', :static? => false, :side => :rhs,
200
- :object => field_2, :dataset => dataset_2)
201
- meta_object_1.stubs(:objects_equal?).with(meta_object_2).returns(true)
202
-
203
- exp = Linkage::Expectations::Simple.create(meta_object_1, meta_object_2, :==)
204
-
205
- klass = Linkage::Functions::Binary
206
- func_1 = stub('binary function 1')
207
- klass.expects(:new).with(field_1, :dataset => dataset_1).returns(func_1)
208
- func_2 = stub('binary function 2')
209
- klass.expects(:new).with(field_2, :dataset => dataset_2).returns(func_2)
210
-
211
- new_meta_object_1 = stub('new meta object 1')
212
- Linkage::MetaObject.expects(:new).with(func_1, :lhs).returns(new_meta_object_1)
213
- new_meta_object_2 = stub('new meta object 2')
214
- Linkage::MetaObject.expects(:new).with(func_2, :rhs).returns(new_meta_object_2)
215
-
216
- exp.exactly!
217
- # LAZY: assume the expectation set its meta objects appropriately
218
- end
219
-
220
- test "#same_except_side with two filter expectations" do
221
- field = stub_field('foo')
222
- meta_object_1 = stub('meta field 1', {
223
- :static? => false, :side => :lhs, :object => field
224
- })
225
- meta_object_2 = stub('meta object', :static? => true)
226
- meta_object_3 = stub('meta field 2', {
227
- :static? => false, :side => :rhs, :object => field
228
- })
229
-
230
- exp_1 = Linkage::Expectations::Simple.create(meta_object_1, meta_object_2, :==)
231
- exp_2 = Linkage::Expectations::Simple.create(meta_object_3, meta_object_2, :==)
232
-
233
- meta_object_1.expects(:objects_equal?).with(meta_object_3).returns(true)
234
- meta_object_2.expects(:objects_equal?).with(meta_object_2).returns(true)
235
- assert exp_1.same_except_side?(exp_2)
236
- end
237
-
238
- test "#decollation_needed? is false when comparing non-string objects" do
239
- dataset_1 = stub('dataset 1')
240
- object_1 = stub('meta object 1', {
241
- :static? => false, :side => :lhs, :dataset => dataset_1,
242
- })
243
- dataset_2 = stub('dataset 2')
244
- object_2 = stub('meta object 2', {
245
- :static? => false, :side => :rhs, :dataset => dataset_2,
246
- })
247
- merged_field = stub('merged field', :ruby_type => {:type => Fixnum})
248
- object_1.stubs(:merge).with(object_2).returns(merged_field)
249
- exp = Linkage::Expectations::Dual.new(object_1, object_2, :==)
250
- assert !exp.decollation_needed?
251
- end
252
-
253
- test "#decollation_needed? is false when comparing two dynamic string objects with the same database type and same collation" do
254
- dataset_1 = stub('dataset 1')
255
- object_1 = stub('meta object 1', {
256
- :static? => false, :side => :lhs, :dataset => dataset_1,
257
- :collation => 'foo', :database_type => :mysql
258
- })
259
- dataset_2 = stub('dataset 2')
260
- object_2 = stub('meta object 2', {
261
- :static? => false, :side => :rhs, :dataset => dataset_2,
262
- :collation => 'foo', :database_type => :mysql
263
- })
264
- merged_field = stub('merged field', :ruby_type => {:type => String})
265
- object_1.stubs(:merge).with(object_2).returns(merged_field)
266
- exp = Linkage::Expectations::Dual.new(object_1, object_2, :==)
267
- assert !exp.decollation_needed?
268
- end
269
-
270
- test "#decollation_needed? is true when comparing two dynamic string objects with the same database type but different collations" do
271
- dataset_1 = stub('dataset 1')
272
- object_1 = stub('meta object 1', {
273
- :static? => false, :side => :lhs, :dataset => dataset_1,
274
- :collation => 'foo', :database_type => :mysql
275
- })
276
- dataset_2 = stub('dataset 2')
277
- object_2 = stub('meta object 2', {
278
- :static? => false, :side => :rhs, :dataset => dataset_2,
279
- :collation => 'bar', :database_type => :mysql
280
- })
281
- merged_field = stub('merged field', :ruby_type => {:type => String})
282
- object_1.stubs(:merge).with(object_2).returns(merged_field)
283
- exp = Linkage::Expectations::Dual.new(object_1, object_2, :==)
284
- assert exp.decollation_needed?
285
- end
286
-
287
- test "#decollation_needed? is true when comparing two dynamic string objects with same collation but different database types" do
288
- dataset_1 = stub('dataset 1')
289
- object_1 = stub('meta object 1', {
290
- :static? => false, :side => :lhs, :dataset => dataset_1,
291
- :collation => 'foo', :database_type => :foo
292
- })
293
- dataset_2 = stub('dataset 2')
294
- object_2 = stub('meta object 2', {
295
- :static? => false, :side => :rhs, :dataset => dataset_2,
296
- :collation => 'foo', :database_type => :bar
297
- })
298
- merged_field = stub('merged field', :ruby_type => {:type => String})
299
- object_1.stubs(:merge).with(object_2).returns(merged_field)
300
- exp = Linkage::Expectations::Dual.new(object_1, object_2, :==)
301
- assert exp.decollation_needed?
302
- end
303
- end
@@ -1,54 +0,0 @@
1
- require 'helper'
2
-
3
- class UnitTests::TestBinary < Test::Unit::TestCase
4
- def self.const_missing(name)
5
- if Linkage::Functions.const_defined?(name)
6
- Linkage::Functions.const_get(name)
7
- else
8
- super
9
- end
10
- end
11
-
12
- test "subclass of Function" do
13
- assert_equal Linkage::Function, Linkage::Functions::Binary.superclass
14
- end
15
-
16
- test "ruby_type" do
17
- expected = {:type => File}
18
- assert_equal(expected, Linkage::Functions::Binary.new("foo", :dataset => stub('dataset')).ruby_type)
19
- field = stub_field('field 1', :name => :bar, :ruby_type => {:type => String}, :dataset => stub('dataset'))
20
- assert_equal(expected, Linkage::Functions::Binary.new(field).ruby_type)
21
- end
22
-
23
- test "parameters" do
24
- assert_equal [[String]], Linkage::Functions::Binary.parameters
25
- end
26
-
27
- test "name" do
28
- assert_equal "binary", Linkage::Functions::Binary.function_name
29
- end
30
-
31
- test "registers itself" do
32
- assert_equal Linkage::Function["binary"], Linkage::Functions::Binary
33
- end
34
-
35
- test "requires dataset" do
36
- func = Binary.new("foo")
37
- assert_raises(RuntimeError) { func.to_expr }
38
- end
39
-
40
- test "to_expr for sqlite" do
41
- func = Binary.new("foo", :dataset => stub('dataset', :database_type => :sqlite))
42
- assert_equal "foo".cast(:blob), func.to_expr
43
- end
44
-
45
- test "to_expr for mysql" do
46
- func = Binary.new("foo", :dataset => stub('dataset', :database_type => :mysql))
47
- assert_equal "foo".cast(:binary), func.to_expr
48
- end
49
-
50
- test "to_expr for postgresql" do
51
- func = Binary.new("foo", :dataset => stub('dataset', :database_type => :postgres))
52
- assert_equal "foo".cast(:bytea), func.to_expr
53
- end
54
- end
@@ -1,98 +0,0 @@
1
- require 'helper'
2
-
3
- class UnitTests::TestCast < Test::Unit::TestCase
4
- def self.const_missing(name)
5
- if Linkage::Functions.const_defined?(name)
6
- Linkage::Functions.const_get(name)
7
- else
8
- super
9
- end
10
- end
11
-
12
- test "subclass of Function" do
13
- assert_equal Linkage::Function, Linkage::Functions::Cast.superclass
14
- end
15
-
16
- test "parameters" do
17
- assert_equal [[:any], [String]], Linkage::Functions::Cast.parameters
18
- end
19
-
20
- test "name" do
21
- assert_equal "cast", Linkage::Functions::Cast.function_name
22
- end
23
-
24
- test "ruby_type when casting to (signed) integer" do
25
- expected = {:type => Fixnum}
26
- assert_equal(expected, Linkage::Functions::Cast.new('123', 'integer', :dataset => stub('dataset')).ruby_type)
27
- field = stub_field('field 1', :name => :bar, :ruby_type => {:type => String}, :dataset => stub('dataset'))
28
- assert_equal(expected, Linkage::Functions::Cast.new(field, 'integer').ruby_type)
29
- end
30
-
31
- test "ruby_type when casting to binary" do
32
- expected = {:type => File}
33
- assert_equal(expected, Linkage::Functions::Cast.new('123', 'binary', :dataset => stub('dataset')).ruby_type)
34
- field = stub_field('field 1', :name => :bar, :ruby_type => {:type => String}, :dataset => stub('dataset'))
35
- assert_equal(expected, Linkage::Functions::Cast.new(field, 'binary').ruby_type)
36
- end
37
-
38
- test "registers itself" do
39
- assert_equal Linkage::Function["cast"], Linkage::Functions::Cast
40
- end
41
-
42
- test "to_expr for integer (sqlite)" do
43
- func = Cast.new('foo', 'integer', :dataset => stub('dataset', :database_type => :sqlite))
44
- assert_equal 'foo'.cast(:integer), func.to_expr
45
- end
46
-
47
- test "to_expr for integer (mysql)" do
48
- func = Cast.new('foo', 'integer', :dataset => stub('dataset', :database_type => :mysql))
49
- assert_equal 'foo'.cast(:signed), func.to_expr
50
- end
51
-
52
- test "to_expr for integer (postgres)" do
53
- func = Cast.new('foo', 'integer', :dataset => stub('dataset', :database_type => :postgres))
54
- assert_equal 'foo'.cast(:integer), func.to_expr
55
- end
56
-
57
- test "to_expr for integer (h2)" do
58
- func = Cast.new('foo', 'integer', :dataset => stub('dataset', :database_type => :h2))
59
- assert_equal 'foo'.cast(:integer), func.to_expr
60
- end
61
-
62
- test "to_expr for binary (sqlite)" do
63
- func = Cast.new('foo', 'binary', :dataset => stub('dataset', :database_type => :sqlite))
64
- assert_equal 'foo'.cast(:blob), func.to_expr
65
- end
66
-
67
- test "to_expr for binary (mysql)" do
68
- func = Cast.new('foo', 'binary', :dataset => stub('dataset', :database_type => :mysql))
69
- assert_equal 'foo'.cast(:binary), func.to_expr
70
- end
71
-
72
- test "to_expr for binary (postgres)" do
73
- func = Cast.new('foo', 'binary', :dataset => stub('dataset', :database_type => :postgres))
74
- assert_equal 'foo'.cast(:bytea), func.to_expr
75
- end
76
-
77
- test "to_expr for binary (h2)" do
78
- func = Cast.new('foo', 'binary', :dataset => stub('dataset', :database_type => :h2))
79
- assert_equal 'foo'.cast(:binary), func.to_expr
80
- end
81
-
82
- =begin
83
- test "to_expr for sqlite" do
84
- func = Cast.new("foo", :dataset => stub('dataset', :database_type => :sqlite))
85
- assert_equal "foo".cast(:blob), func.to_expr
86
- end
87
-
88
- test "to_expr for mysql" do
89
- func = Cast.new("foo", :dataset => stub('dataset', :database_type => :mysql))
90
- assert_equal "foo".cast(:binary), func.to_expr
91
- end
92
-
93
- test "to_expr for postgresql" do
94
- func = Cast.new("foo", :dataset => stub('dataset', :database_type => :postgres))
95
- assert_equal "foo".cast(:bytea), func.to_expr
96
- end
97
- =end
98
- end
@@ -1,52 +0,0 @@
1
- require 'helper'
2
-
3
- class UnitTests::TestLength < Test::Unit::TestCase
4
- test "subclass of Function" do
5
- assert_equal Linkage::Function, Linkage::Functions::Length.superclass
6
- end
7
-
8
- test "ruby_type for string literal" do
9
- length = Linkage::Functions::Length.new("foo", :dataset => stub('dataset'))
10
- assert_equal({:type => Fixnum}, length.ruby_type)
11
- end
12
-
13
- test "ruby_type for string field" do
14
- field_1 = stub_field('field 1', :name => :bar, :ruby_type => {:type => String}, :dataset => stub('dataset'))
15
- assert_equal({:type => Fixnum}, Linkage::Functions::Length.new(field_1).ruby_type)
16
-
17
- field_2 = stub_field('field 2', :name => :bar, :ruby_type => {:type => String, :opts => {:size => 123}}, :dataset => stub('dataset'))
18
- assert_equal({:type => Fixnum}, Linkage::Functions::Length.new(field_2).ruby_type)
19
- end
20
-
21
- test "ruby_type for string function" do
22
- func = new_function('foo', {:type => String, :opts => {:junk => '123'}})
23
- assert_equal({:type => Fixnum}, Linkage::Functions::Length.new(func.new(:dataset => stub('dataset'))).ruby_type)
24
- end
25
-
26
- test "parameters" do
27
- assert_equal [[String]], Linkage::Functions::Length.parameters
28
- end
29
-
30
- test "name" do
31
- assert_equal "length", Linkage::Functions::Length.function_name
32
- end
33
-
34
- test "to_expr for sqlite" do
35
- func = Linkage::Functions::Length.new("foo bar", :dataset => stub('dataset', :database_type => :sqlite))
36
- assert_equal :length.sql_function("foo bar"), func.to_expr
37
- end
38
-
39
- test "to_expr for mysql" do
40
- func = Linkage::Functions::Length.new("foo bar", :dataset => stub('dataset', :database_type => :mysql))
41
- assert_equal :char_length.sql_function("foo bar"), func.to_expr
42
- end
43
-
44
- test "to_expr for postgresql" do
45
- func = Linkage::Functions::Length.new("foo bar", :dataset => stub('dataset', :database_type => :postgres))
46
- assert_equal :char_length.sql_function("foo bar"), func.to_expr
47
- end
48
-
49
- test "registers itself" do
50
- assert_equal Linkage::Function["length"], Linkage::Functions::Length
51
- end
52
- end
@@ -1,60 +0,0 @@
1
- require 'helper'
2
-
3
- class UnitTests::TestStrftime < Test::Unit::TestCase
4
- def self.const_missing(name)
5
- if Linkage::Functions.const_defined?(name)
6
- Linkage::Functions.const_get(name)
7
- else
8
- super
9
- end
10
- end
11
-
12
- test "subclass of Function" do
13
- assert_equal Linkage::Function, Linkage::Functions::Strftime.superclass
14
- end
15
-
16
- test "ruby_type" do
17
- expected = {:type => String}
18
- format = "%Y-%m-%d"
19
- assert_equal(expected, Linkage::Functions::Strftime.new(Time.now, format, :dataset => stub('dataset')).ruby_type)
20
- field = stub_field('field 1', :name => :bar, :ruby_type => {:type => Time})
21
- assert_equal(expected, Linkage::Functions::Strftime.new(field, format, :dataset => stub('dataset')).ruby_type)
22
- func = new_function('foo', {:type => Time, :opts => {:junk => '123'}})
23
- assert_equal(expected, Linkage::Functions::Strftime.new(func.new(:dataset => stub('dataset')), format).ruby_type)
24
- end
25
-
26
- test "parameters" do
27
- assert_equal [[Date, Time, DateTime], [String]], Linkage::Functions::Strftime.parameters
28
- end
29
-
30
- test "name" do
31
- assert_equal "strftime", Linkage::Functions::Strftime.function_name
32
- end
33
-
34
- test "registers itself" do
35
- assert_equal Linkage::Function["strftime"], Linkage::Functions::Strftime
36
- end
37
-
38
- test "requires dataset" do
39
- func = Strftime.new(Time.now, "%Y-%m-%d")
40
- assert_raises(RuntimeError) { func.to_expr }
41
- end
42
-
43
- test "to_expr for sqlite" do
44
- now = Time.now
45
- func = Strftime.new(now, "%Y-%m-%d", :dataset => stub('dataset', :database_type => :sqlite))
46
- assert_equal :strftime.sql_function("%Y-%m-%d", now), func.to_expr
47
- end
48
-
49
- test "to_expr for mysql" do
50
- now = Time.now
51
- func = Strftime.new(now, "%Y-%m-%d", :dataset => stub('dataset', :database_type => :mysql))
52
- assert_equal :date_format.sql_function(now, "%Y-%m-%d"), func.to_expr
53
- end
54
-
55
- test "to_expr for postgresql" do
56
- now = Time.now
57
- func = Strftime.new(now, "%Y-%m-%d", :dataset => stub('dataset', :database_type => :postgres))
58
- assert_equal :to_char.sql_function(now, "%Y-%m-%d"), func.to_expr
59
- end
60
- end