linkage 0.0.6 → 0.0.8

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 (66) hide show
  1. data/.gitignore +10 -0
  2. data/Gemfile +15 -13
  3. data/Gemfile.lock +67 -37
  4. data/Guardfile +0 -2
  5. data/Rakefile +122 -25
  6. data/lib/linkage/comparator.rb +172 -0
  7. data/lib/linkage/comparators/binary.rb +12 -0
  8. data/lib/linkage/comparators/compare.rb +46 -0
  9. data/lib/linkage/comparators/within.rb +32 -0
  10. data/lib/linkage/configuration.rb +285 -153
  11. data/lib/linkage/data.rb +32 -7
  12. data/lib/linkage/dataset.rb +107 -32
  13. data/lib/linkage/decollation.rb +93 -0
  14. data/lib/linkage/expectation.rb +21 -0
  15. data/lib/linkage/expectations/exhaustive.rb +63 -0
  16. data/lib/linkage/expectations/simple.rb +168 -0
  17. data/lib/linkage/field.rb +30 -4
  18. data/lib/linkage/field_set.rb +6 -3
  19. data/lib/linkage/function.rb +50 -3
  20. data/lib/linkage/functions/binary.rb +30 -0
  21. data/lib/linkage/functions/cast.rb +54 -0
  22. data/lib/linkage/functions/length.rb +29 -0
  23. data/lib/linkage/functions/strftime.rb +12 -11
  24. data/lib/linkage/functions/trim.rb +8 -0
  25. data/lib/linkage/group.rb +20 -0
  26. data/lib/linkage/import_buffer.rb +5 -16
  27. data/lib/linkage/meta_object.rb +139 -0
  28. data/lib/linkage/result_set.rb +74 -17
  29. data/lib/linkage/runner/single_threaded.rb +125 -10
  30. data/lib/linkage/version.rb +3 -0
  31. data/lib/linkage.rb +11 -0
  32. data/linkage.gemspec +16 -121
  33. data/test/config.yml +5 -0
  34. data/test/helper.rb +73 -8
  35. data/test/integration/test_collation.rb +45 -0
  36. data/test/integration/test_configuration.rb +268 -0
  37. data/test/integration/test_cross_linkage.rb +4 -17
  38. data/test/integration/test_dataset.rb +45 -2
  39. data/test/integration/test_dual_linkage.rb +40 -24
  40. data/test/integration/test_functions.rb +22 -0
  41. data/test/integration/test_result_set.rb +85 -0
  42. data/test/integration/test_scoring.rb +84 -0
  43. data/test/integration/test_self_linkage.rb +5 -0
  44. data/test/integration/test_within_comparator.rb +100 -0
  45. data/test/unit/comparators/test_compare.rb +105 -0
  46. data/test/unit/comparators/test_within.rb +57 -0
  47. data/test/unit/expectations/test_exhaustive.rb +111 -0
  48. data/test/unit/expectations/test_simple.rb +303 -0
  49. data/test/unit/functions/test_binary.rb +54 -0
  50. data/test/unit/functions/test_cast.rb +98 -0
  51. data/test/unit/functions/test_length.rb +52 -0
  52. data/test/unit/functions/test_strftime.rb +17 -13
  53. data/test/unit/functions/test_trim.rb +11 -4
  54. data/test/unit/test_comparator.rb +124 -0
  55. data/test/unit/test_configuration.rb +137 -175
  56. data/test/unit/test_data.rb +44 -0
  57. data/test/unit/test_dataset.rb +73 -21
  58. data/test/unit/test_decollation.rb +201 -0
  59. data/test/unit/test_field.rb +38 -14
  60. data/test/unit/test_field_set.rb +12 -8
  61. data/test/unit/test_function.rb +83 -16
  62. data/test/unit/test_group.rb +28 -0
  63. data/test/unit/test_import_buffer.rb +13 -27
  64. data/test/unit/test_meta_object.rb +208 -0
  65. data/test/unit/test_result_set.rb +221 -3
  66. metadata +82 -190
@@ -0,0 +1,201 @@
1
+ # encoding: utf-8
2
+ require 'helper'
3
+
4
+ class UnitTests::TestDecollation < Test::Unit::TestCase
5
+ include Linkage::Decollation
6
+
7
+ test "mysql's latin1_swedish_ci handles 'A' letters" do
8
+ # MySQL 6.0.4 collation (http://www.collation-charts.org/mysql60/mysql604.latin1_swedish_ci.html)
9
+ ["A", "a", "À", "Á", "Â", "Ã", "à", "á", "â", "ã"].each do |chr|
10
+ assert_equal "A", decollate(chr, :mysql, "latin1_swedish_ci")
11
+ end
12
+ end
13
+
14
+ test "mysql's latin1_swedish_ci handles 'B' letters" do
15
+ ["B", "b"].each do |chr|
16
+ assert_equal "B", decollate(chr, :mysql, "latin1_swedish_ci")
17
+ end
18
+ end
19
+
20
+ test "mysql's latin1_swedish_ci handles 'C' letters" do
21
+ ["C", "c", "Ç", "ç"].each do |chr|
22
+ assert_equal "C", decollate(chr, :mysql, "latin1_swedish_ci")
23
+ end
24
+ end
25
+
26
+ test "mysql's latin1_swedish_ci handles 'D' letters" do
27
+ ["D", "d", "Ð", "ð"].each do |chr|
28
+ assert_equal "D", decollate(chr, :mysql, "latin1_swedish_ci")
29
+ end
30
+ end
31
+
32
+ test "mysql's latin1_swedish_ci handles 'E' letters" do
33
+ ["E", "e", "È", "É", "Ê", "Ë", "è", "é", "ê", "ë"].each do |chr|
34
+ assert_equal "E", decollate(chr, :mysql, "latin1_swedish_ci")
35
+ end
36
+ end
37
+
38
+ test "mysql's latin1_swedish_ci handles 'F' letters" do
39
+ ["F", "f"].each do |chr|
40
+ assert_equal "F", decollate(chr, :mysql, "latin1_swedish_ci")
41
+ end
42
+ end
43
+
44
+ test "mysql's latin1_swedish_ci handles 'G' letters" do
45
+ ["G", "g"].each do |chr|
46
+ assert_equal "G", decollate(chr, :mysql, "latin1_swedish_ci")
47
+ end
48
+ end
49
+
50
+ test "mysql's latin1_swedish_ci handles 'H' letters" do
51
+ ["H", "h"].each do |chr|
52
+ assert_equal "H", decollate(chr, :mysql, "latin1_swedish_ci")
53
+ end
54
+ end
55
+
56
+ test "mysql's latin1_swedish_ci handles 'I' letters" do
57
+ ["I", "i", "Ì", "Í", "Î", "Ï", "ì", "í", "î", "ï"].each do |chr|
58
+ assert_equal "I", decollate(chr, :mysql, "latin1_swedish_ci")
59
+ end
60
+ end
61
+
62
+ test "mysql's latin1_swedish_ci handles 'J' letters" do
63
+ ["J", "j"].each do |chr|
64
+ assert_equal "J", decollate(chr, :mysql, "latin1_swedish_ci")
65
+ end
66
+ end
67
+
68
+ test "mysql's latin1_swedish_ci handles 'K' letters" do
69
+ ["K", "k"].each do |chr|
70
+ assert_equal "K", decollate(chr, :mysql, "latin1_swedish_ci")
71
+ end
72
+ end
73
+
74
+ test "mysql's latin1_swedish_ci handles 'L' letters" do
75
+ ["L", "l"].each do |chr|
76
+ assert_equal "L", decollate(chr, :mysql, "latin1_swedish_ci")
77
+ end
78
+ end
79
+
80
+ test "mysql's latin1_swedish_ci handles 'M' letters" do
81
+ ["M", "m"].each do |chr|
82
+ assert_equal "M", decollate(chr, :mysql, "latin1_swedish_ci")
83
+ end
84
+ end
85
+
86
+ test "mysql's latin1_swedish_ci handles 'N' letters" do
87
+ ["N", "n", "Ñ", "ñ"].each do |chr|
88
+ assert_equal "N", decollate(chr, :mysql, "latin1_swedish_ci")
89
+ end
90
+ end
91
+
92
+ test "mysql's latin1_swedish_ci handles 'O' letters" do
93
+ ["O", "o", "Ò", "Ó", "Ô", "Õ", "ò", "ó", "ô", "õ"].each do |chr|
94
+ assert_equal "O", decollate(chr, :mysql, "latin1_swedish_ci")
95
+ end
96
+ end
97
+
98
+ test "mysql's latin1_swedish_ci handles 'P' letters" do
99
+ ["P", "p"].each do |chr|
100
+ assert_equal "P", decollate(chr, :mysql, "latin1_swedish_ci")
101
+ end
102
+ end
103
+
104
+ test "mysql's latin1_swedish_ci handles 'Q' letters" do
105
+ ["Q", "q"].each do |chr|
106
+ assert_equal "Q", decollate(chr, :mysql, "latin1_swedish_ci")
107
+ end
108
+ end
109
+
110
+ test "mysql's latin1_swedish_ci handles 'R' letters" do
111
+ ["R", "r"].each do |chr|
112
+ assert_equal "R", decollate(chr, :mysql, "latin1_swedish_ci")
113
+ end
114
+ end
115
+
116
+ test "mysql's latin1_swedish_ci handles 'S' letters" do
117
+ ["S", "s"].each do |chr|
118
+ assert_equal "S", decollate(chr, :mysql, "latin1_swedish_ci")
119
+ end
120
+ end
121
+
122
+ test "mysql's latin1_swedish_ci handles 'T' letters" do
123
+ ["T", "t"].each do |chr|
124
+ assert_equal "T", decollate(chr, :mysql, "latin1_swedish_ci")
125
+ end
126
+ end
127
+
128
+ test "mysql's latin1_swedish_ci handles 'U' letters" do
129
+ ["U", "u", "Ù", "Ú", "Û", "ù", "ú", "û"].each do |chr|
130
+ assert_equal "U", decollate(chr, :mysql, "latin1_swedish_ci")
131
+ end
132
+ end
133
+
134
+ test "mysql's latin1_swedish_ci handles 'V' letters" do
135
+ ["V", "v"].each do |chr|
136
+ assert_equal "V", decollate(chr, :mysql, "latin1_swedish_ci")
137
+ end
138
+ end
139
+
140
+ test "mysql's latin1_swedish_ci handles 'W' letters" do
141
+ ["W", "w"].each do |chr|
142
+ assert_equal "W", decollate(chr, :mysql, "latin1_swedish_ci")
143
+ end
144
+ end
145
+
146
+ test "mysql's latin1_swedish_ci handles 'X' letters" do
147
+ ["X", "x"].each do |chr|
148
+ assert_equal "X", decollate(chr, :mysql, "latin1_swedish_ci")
149
+ end
150
+ end
151
+
152
+ test "mysql's latin1_swedish_ci handles 'Y' letters" do
153
+ ["Y", "y", "Ü", "Ý", "ü", "ý"].each do |chr|
154
+ assert_equal "Y", decollate(chr, :mysql, "latin1_swedish_ci")
155
+ end
156
+ end
157
+
158
+ test "mysql's latin1_swedish_ci handles 'Z' letters" do
159
+ ["Z", "z"].each do |chr|
160
+ assert_equal "Z", decollate(chr, :mysql, "latin1_swedish_ci")
161
+ end
162
+ end
163
+
164
+ test "mysql's latin1_swedish_ci handles '[' letters" do
165
+ ["[", "Å", "å"].each do |chr|
166
+ assert_equal "[", decollate(chr, :mysql, "latin1_swedish_ci")
167
+ end
168
+ end
169
+
170
+ test "mysql's latin1_swedish_ci handles '\\' letters" do
171
+ ["\\", "Ä", "Æ", "ä", "æ"].each do |chr|
172
+ assert_equal "\\", decollate(chr, :mysql, "latin1_swedish_ci")
173
+ end
174
+ end
175
+
176
+ test "mysql's latin1_swedish_ci handles ']' letters" do
177
+ ["]", "Ö", "ö"].each do |chr|
178
+ assert_equal "]", decollate(chr, :mysql, "latin1_swedish_ci")
179
+ end
180
+ end
181
+
182
+ test "mysql's latin1_swedish_ci handles 'Ø' letters" do
183
+ ["Ø", "ø"].each do |chr|
184
+ assert_equal "Ø", decollate(chr, :mysql, "latin1_swedish_ci")
185
+ end
186
+ end
187
+
188
+ test "mysql's latin1_swedish_ci handles 'Þ' letters" do
189
+ ["Þ", "þ"].each do |chr|
190
+ assert_equal "Þ", decollate(chr, :mysql, "latin1_swedish_ci")
191
+ end
192
+ end
193
+
194
+ test "mysql's latin1_swedish_ci ignores trailing spaces" do
195
+ assert_equal "FOO", decollate("foo ", :mysql, "latin1_swedish_ci")
196
+ end
197
+
198
+ test "unknown collation" do
199
+ assert_equal "fOo", decollate("fOo", :foo, :bar)
200
+ end
201
+ end
@@ -6,45 +6,69 @@ class UnitTests::TestField < Test::Unit::TestCase
6
6
  end
7
7
 
8
8
  test "initialize with schema info" do
9
+ dataset = stub('dataset')
9
10
  schema = {:allow_null=>true, :default=>nil, :primary_key=>true, :db_type=>"integer", :type=>:integer, :ruby_default=>nil}
10
- field = Linkage::Field.new(:id, schema)
11
+ field = Linkage::Field.new(dataset, :id, schema)
11
12
  assert_equal :id, field.name
12
13
  assert_equal schema, field.schema
13
- end
14
-
15
- test "initialize with ruby type" do
16
- info = {:type => Integer}
17
- field = Linkage::Field.new(:id, nil, info)
18
- assert_equal :id, field.name
19
- assert_equal info, field.ruby_type
14
+ assert_equal dataset, field.dataset
20
15
  end
21
16
 
22
17
  test "static? is always false" do
18
+ dataset = stub('dataset')
23
19
  schema = {:allow_null=>true, :default=>nil, :primary_key=>true, :db_type=>"integer", :type=>:integer, :ruby_default=>nil}
24
- field = Linkage::Field.new(:id, schema)
20
+ field = Linkage::Field.new(dataset, :id, schema)
25
21
  assert !field.static?
26
22
  end
27
23
 
28
24
  test "ruby_type for integer" do
29
- field = Linkage::Field.new(:id, {:allow_null=>true, :default=>nil, :primary_key=>true, :db_type=>"integer", :type=>:integer, :ruby_default=>nil})
25
+ dataset = stub('dataset')
26
+ field = Linkage::Field.new(dataset, :id, {:allow_null=>true, :default=>nil, :primary_key=>true, :db_type=>"integer", :type=>:integer, :ruby_default=>nil})
30
27
  assert_equal({:type => Integer}, field.ruby_type)
31
28
  end
32
29
 
33
30
  test "primary_key? returns true if primary key" do
34
- field_1 = Linkage::Field.new(:id, {:allow_null=>true, :default=>nil, :primary_key=>true, :db_type=>"integer", :type=>:integer, :ruby_default=>nil})
31
+ dataset = stub('dataset')
32
+ field_1 = Linkage::Field.new(dataset, :id, {:allow_null=>true, :default=>nil, :primary_key=>true, :db_type=>"integer", :type=>:integer, :ruby_default=>nil})
35
33
  assert field_1.primary_key?
36
34
 
37
- field_2 = Linkage::Field.new(:foo, {:allow_null=>true, :default=>nil, :primary_key=>false, :db_type=>"integer", :type=>:integer, :ruby_default=>nil})
35
+ field_2 = Linkage::Field.new(dataset, :foo, {:allow_null=>true, :default=>nil, :primary_key=>false, :db_type=>"integer", :type=>:integer, :ruby_default=>nil})
38
36
  assert !field_2.primary_key?
39
37
  end
40
38
 
41
39
  test "to_expr returns name" do
42
- field = Linkage::Field.new(:id, {:allow_null=>true, :default=>nil, :primary_key=>true, :db_type=>"integer", :type=>:integer, :ruby_default=>nil})
40
+ dataset = stub('dataset')
41
+ field = Linkage::Field.new(dataset, :id, {:allow_null=>true, :default=>nil, :primary_key=>true, :db_type=>"integer", :type=>:integer, :ruby_default=>nil})
43
42
  assert_equal :id, field.to_expr
44
43
  end
45
44
 
46
45
  test "to_expr ignores adapter argument" do
47
- field = Linkage::Field.new(:id, {:allow_null=>true, :default=>nil, :primary_key=>true, :db_type=>"integer", :type=>:integer, :ruby_default=>nil})
46
+ dataset = stub('dataset')
47
+ field = Linkage::Field.new(dataset, :id, {:allow_null=>true, :default=>nil, :primary_key=>true, :db_type=>"integer", :type=>:integer, :ruby_default=>nil})
48
48
  assert_equal :id, field.to_expr(:foo)
49
49
  end
50
+
51
+ test "collation" do
52
+ dataset = stub('dataset')
53
+ field = Linkage::Field.new(dataset, :foo, {:allow_null=>true, :default=>nil, :primary_key=>false, :db_type=>"varchar(255)", :type=>:string, :collation=>"latin1_general_cs", :ruby_default=>nil})
54
+ assert_equal "latin1_general_cs", field.collation
55
+ assert_equal "latin1_general_cs", field.ruby_type[:opts][:collate]
56
+ end
57
+
58
+ test "initialize MergeField with ruby type" do
59
+ info = {:type => Integer}
60
+ field = Linkage::MergeField.new(:id, info)
61
+ assert_equal :id, field.name
62
+ assert_equal info, field.ruby_type
63
+ assert_nil field.schema
64
+ assert_nil field.dataset
65
+ end
66
+
67
+ test "MergeField#database_type accessor" do
68
+ field_1 = Linkage::MergeField.new(:id, {:type => Integer})
69
+ assert_nil field_1.database_type
70
+
71
+ field_2 = Linkage::MergeField.new(:id, {:type => Integer}, :mysql)
72
+ assert_equal :mysql, field_2.database_type
73
+ end
50
74
  end
@@ -15,14 +15,16 @@ class UnitTests::TestFieldSet < Test::Unit::TestCase
15
15
  end
16
16
 
17
17
  test "creates fields on initialization" do
18
+ dataset = mock('dataset', :schema => @schema)
19
+
18
20
  field_1 = stub('id field')
19
21
  field_2 = stub('first_name field')
20
22
  field_3 = stub('last_name field')
21
- Linkage::Field.expects(:new).with(:id, @schema[:id]).returns(field_1)
22
- Linkage::Field.expects(:new).with(:first_name, @schema[:first_name]).returns(field_2)
23
- Linkage::Field.expects(:new).with(:last_name, @schema[:last_name]).returns(field_3)
23
+ Linkage::Field.expects(:new).with(dataset, :id, @schema[:id]).returns(field_1)
24
+ Linkage::Field.expects(:new).with(dataset, :first_name, @schema[:first_name]).returns(field_2)
25
+ Linkage::Field.expects(:new).with(dataset, :last_name, @schema[:last_name]).returns(field_3)
24
26
 
25
- fs = Linkage::FieldSet.new(@schema)
27
+ fs = Linkage::FieldSet.new(dataset)
26
28
  assert_equal field_1, fs.primary_key
27
29
  assert_equal field_1, fs[:id]
28
30
  assert_equal field_2, fs[:first_name]
@@ -30,14 +32,16 @@ class UnitTests::TestFieldSet < Test::Unit::TestCase
30
32
  end
31
33
 
32
34
  test "case-insensitive names" do
35
+ dataset = stub('dataset', :schema => @schema)
36
+
33
37
  field_1 = stub('id field')
34
38
  field_2 = stub('first_name field')
35
39
  field_3 = stub('last_name field')
36
- Linkage::Field.stubs(:new).with(:id, @schema[:id]).returns(field_1)
37
- Linkage::Field.stubs(:new).with(:first_name, @schema[:first_name]).returns(field_2)
38
- Linkage::Field.stubs(:new).with(:last_name, @schema[:last_name]).returns(field_3)
40
+ Linkage::Field.stubs(:new).with(dataset, :id, @schema[:id]).returns(field_1)
41
+ Linkage::Field.stubs(:new).with(dataset, :first_name, @schema[:first_name]).returns(field_2)
42
+ Linkage::Field.stubs(:new).with(dataset, :last_name, @schema[:last_name]).returns(field_3)
39
43
 
40
- fs = Linkage::FieldSet.new(@schema)
44
+ fs = Linkage::FieldSet.new(dataset)
41
45
  assert_equal field_1, fs.primary_key
42
46
  assert_equal field_1, fs[:Id]
43
47
  assert_equal field_2, fs[:fIrst_name]
@@ -23,7 +23,8 @@ class UnitTests::TestFunction < Test::Unit::TestCase
23
23
  test "ruby_type raises not implemented error in base class" do
24
24
  klass = Class.new(Linkage::Function)
25
25
  klass.send(:define_singleton_method, :function_name) { "foo" }
26
- f = klass.new
26
+ dataset = stub('dataset')
27
+ f = klass.new(:dataset => dataset)
27
28
  assert_raises(NotImplementedError) { f.ruby_type }
28
29
  end
29
30
 
@@ -39,7 +40,7 @@ class UnitTests::TestFunction < Test::Unit::TestCase
39
40
 
40
41
  test "function with no arguments" do
41
42
  klass = new_function('foo', {:type => String})
42
- f = klass.new
43
+ f = klass.new(:dataset => stub('dataset'))
43
44
  assert_equal :foo, f.name
44
45
  assert_equal :foo.sql_function, f.to_expr
45
46
  assert f.static?
@@ -47,7 +48,7 @@ class UnitTests::TestFunction < Test::Unit::TestCase
47
48
 
48
49
  test "function with static value" do
49
50
  klass = new_function('foo', {:type => String})
50
- f = klass.new(123)
51
+ f = klass.new(123, :dataset => stub('dataset'))
51
52
  assert_equal :foo.sql_function(123), f.to_expr
52
53
  assert_equal :foo_123, f.name
53
54
  assert f.static?
@@ -55,18 +56,47 @@ class UnitTests::TestFunction < Test::Unit::TestCase
55
56
 
56
57
  test "function with field" do
57
58
  klass = new_function('foo', {:type => String})
58
- field = stub_field('field', :name => :bar, :to_expr => :bar, :ruby_type => {:type => String})
59
+
60
+ dataset = stub('dataset')
61
+ field = stub_field('field', {
62
+ :name => :bar, :to_expr => :bar,
63
+ :ruby_type => {:type => String}, :dataset => dataset
64
+ })
59
65
  f = klass.new(field)
60
66
  assert_equal :foo_bar, f.name
61
67
  assert_equal :foo.sql_function(:bar), f.to_expr
68
+ assert_equal dataset, f.dataset
62
69
  assert !f.static?
63
70
  end
64
71
 
72
+ test "creating function with conflicting datasets raises exception" do
73
+ klass = new_function('foo', {:type => String}, [[String], [String]])
74
+
75
+ dataset_1 = stub('dataset')
76
+ field_1 = stub_field('field 1', {
77
+ :name => :foo, :to_expr => :foo,
78
+ :ruby_type => {:type => String}, :dataset => dataset_1
79
+ })
80
+ dataset_2 = stub('dataset')
81
+ field_2 = stub_field('field 2', {
82
+ :name => :bar, :to_expr => :bar,
83
+ :ruby_type => {:type => String}, :dataset => dataset_2
84
+ })
85
+
86
+ assert_raises(ArgumentError) { klass.new(field_1, field_2) }
87
+ end
88
+
89
+ test "getting dataset for a static function without dataset raises exception" do
90
+ klass = new_function('foo', {:type => String})
91
+ func = klass.new
92
+ assert_raises(RuntimeError) { func.dataset }
93
+ end
94
+
65
95
  test "function with dynamic function" do
66
96
  klass_1 = new_function('foo', {:type => String})
67
97
  klass_2 = new_function('bar', {:type => String})
68
98
 
69
- field = stub_field('field', :name => :baz, :to_expr => :baz, :ruby_type => {:type => String})
99
+ field = stub_field('field', :name => :baz, :to_expr => :baz, :ruby_type => {:type => String}, :dataset => stub('dataset'))
70
100
  func_1 = klass_1.new(field)
71
101
  assert_equal :foo_baz, func_1.name
72
102
  assert !func_1.static?
@@ -81,7 +111,7 @@ class UnitTests::TestFunction < Test::Unit::TestCase
81
111
  klass_1 = new_function('foo', {:type => String})
82
112
  klass_2 = new_function('bar', {:type => String})
83
113
 
84
- func_1 = klass_1.new(123)
114
+ func_1 = klass_1.new(123, :dataset => stub('dataset'))
85
115
  assert_equal :foo_123, func_1.name
86
116
  assert func_1.static?
87
117
 
@@ -96,11 +126,12 @@ class UnitTests::TestFunction < Test::Unit::TestCase
96
126
  klass_2 = new_function('bar', {:type => String})
97
127
  klass_3 = new_function('baz', {:type => String})
98
128
 
99
- func_1 = klass_1.new(123)
129
+ dataset = stub('dataset')
130
+ func_1 = klass_1.new(123, :dataset => dataset)
100
131
  assert_equal :foo_123, func_1.name
101
132
  assert func_1.static?
102
133
 
103
- field = stub_field('field', :name => :quux, :to_expr => :quux, :ruby_type => {:type => String})
134
+ field = stub_field('field', :name => :quux, :to_expr => :quux, :ruby_type => {:type => String}, :dataset => dataset)
104
135
  func_2 = klass_2.new(field)
105
136
  assert_equal :bar_quux, func_2.name
106
137
  assert !func_2.static?
@@ -113,8 +144,9 @@ class UnitTests::TestFunction < Test::Unit::TestCase
113
144
 
114
145
  test "function with multiple fields" do
115
146
  klass = new_function('foo', {:type => String})
116
- field_1 = stub_field('field', :name => :bar, :to_expr => :bar, :ruby_type => {:type => String})
117
- field_2 = stub_field('field', :name => :baz, :to_expr => :baz, :ruby_type => {:type => String})
147
+ dataset = stub('dataset')
148
+ field_1 = stub_field('field', :name => :bar, :to_expr => :bar, :ruby_type => {:type => String}, :dataset => dataset)
149
+ field_2 = stub_field('field', :name => :baz, :to_expr => :baz, :ruby_type => {:type => String}, :dataset => dataset)
118
150
  func = klass.new(field_1, field_2)
119
151
  assert_equal :foo_bar_baz, func.name
120
152
  assert_equal :foo.sql_function(:bar, :baz), func.to_expr
@@ -123,7 +155,7 @@ class UnitTests::TestFunction < Test::Unit::TestCase
123
155
 
124
156
  test "function with multiple mixed arguments" do
125
157
  klass = new_function('foo', {:type => String})
126
- field = stub_field('field', :name => :bar, :to_expr => :bar, :ruby_type => {:type => String})
158
+ field = stub_field('field', :name => :bar, :to_expr => :bar, :ruby_type => {:type => String}, :dataset => stub('dataset'))
127
159
  f = klass.new(field, 123, 'abc')
128
160
  assert_equal :foo_bar_123_abc, f.name
129
161
  assert_equal :foo.sql_function(:bar, 123, 'abc'), f.to_expr
@@ -136,11 +168,12 @@ class UnitTests::TestFunction < Test::Unit::TestCase
136
168
  end
137
169
 
138
170
  test "valid parameters" do
139
- func = new_function('foo', {:type => String}, [[String]])
140
- assert_equal :foo.sql_function("foo"), func.new("foo").to_expr
171
+ klass = new_function('foo', {:type => String}, [[String]])
172
+ dataset = stub('dataset')
173
+ assert_equal :foo.sql_function("foo"), klass.new("foo", :dataset => dataset).to_expr
141
174
  field = stub_field('field', :name => :bar, :to_expr => :bar, :ruby_type => {:type => String})
142
- assert_equal :foo.sql_function(:bar), func.new(field).to_expr
143
- assert_equal :foo.sql_function(:foo.sql_function("hey")), func.new(func.new("hey")).to_expr
175
+ assert_equal :foo.sql_function(:bar), klass.new(field, :dataset => dataset).to_expr
176
+ assert_equal :foo.sql_function(:foo.sql_function("hey")), klass.new(klass.new("hey", :dataset => dataset)).to_expr
144
177
  end
145
178
 
146
179
  test "invalid parameters" do
@@ -153,8 +186,9 @@ class UnitTests::TestFunction < Test::Unit::TestCase
153
186
  func.new(field)
154
187
  end
155
188
  func2 = new_function('bar', {:type => Integer})
189
+ dataset = stub('dataset')
156
190
  assert_raises(TypeError) do
157
- func.new(func2.new)
191
+ func.new(func2.new(:dataset => dataset))
158
192
  end
159
193
  assert_raises(ArgumentError) do
160
194
  func.new("123", "456")
@@ -163,4 +197,37 @@ class UnitTests::TestFunction < Test::Unit::TestCase
163
197
  func.new
164
198
  end
165
199
  end
200
+
201
+ test "two functions with the same name and arguments and datasets are equal" do
202
+ klass = new_function('foo', {:type => String}, [[String]])
203
+ dataset = stub('dataset')
204
+ field = stub_field('field', :dataset => dataset, :ruby_type => {:type => String})
205
+
206
+ func_1 = klass.new(field)
207
+ func_2 = klass.new(field)
208
+ assert func_1 == func_2
209
+ end
210
+
211
+ test "#== with two static functions" do
212
+ klass = new_function('foo', {:type => String}, [[String]])
213
+ dataset = stub('dataset')
214
+ func_1 = klass.new('foo', :dataset => dataset)
215
+ func_2 = klass.new('foo', :dataset => dataset)
216
+ assert func_1 == func_2
217
+ end
218
+
219
+ test "collation returns nil by default" do
220
+ klass = new_function('foo', {:type => String}, [[String]])
221
+ dataset = stub('dataset')
222
+ func = klass.new('foo', :dataset => dataset)
223
+ assert_nil func.collation
224
+ end
225
+
226
+ test "special :any parameter" do
227
+ klass = new_function('foo', {:type => String}, [[:any]])
228
+ dataset = stub('dataset')
229
+ assert_nothing_raised do
230
+ klass.new('foo', :dataset => dataset)
231
+ end
232
+ end
166
233
  end
@@ -7,4 +7,32 @@ class UnitTests::TestGroup < Test::Unit::TestCase
7
7
  assert_equal 1, g.count
8
8
  assert_equal 456, g.id
9
9
  end
10
+
11
+ test "decollate strings" do
12
+ test_ruby_type = { :type => String, :opts => { :collate => "latin1_swedish_ci" } }
13
+ group = Linkage::Group.new({:test => 'TeSt '}, {
14
+ :count => 1, :id => 456, :ruby_types => { :test => test_ruby_type },
15
+ :database_type => :mysql
16
+ })
17
+ assert_equal({:test => "TEST"}, group.decollated_values)
18
+ end
19
+
20
+ test "don't decollate non-strings or strings without collation information" do
21
+ ruby_types = {
22
+ :foo => {
23
+ :type => String, :opts => { :collate => "latin1_swedish_ci" }
24
+ },
25
+ :bar => {
26
+ :type => Fixnum
27
+ },
28
+ :baz => {
29
+ :type => String
30
+ }
31
+ }
32
+ group = Linkage::Group.new({:foo => 'foO', :bar => 123, :baz => "foO"}, {
33
+ :count => 1, :id => 456, :ruby_types => ruby_types,
34
+ :database_type => :mysql
35
+ })
36
+ assert_equal({:foo => "FOO", :bar => 123, :baz => "foO"}, group.decollated_values)
37
+ end
10
38
  end
@@ -2,50 +2,36 @@ require 'helper'
2
2
 
3
3
  class UnitTests::TestImportBuffer < Test::Unit::TestCase
4
4
  test "basic usage" do
5
- buf = Linkage::ImportBuffer.new('foo:/bar/db', 'baz_table', [:qux, :thud])
5
+ database = stub('database')
6
+ dataset = stub('dataset', :db => database)
7
+
8
+ buf = Linkage::ImportBuffer.new(dataset, [:qux, :thud])
6
9
  buf.add([123, 456])
7
10
  buf.add(['test', 'junk'])
8
11
 
9
- database = mock('database')
10
- Sequel.expects(:connect).with('foo:/bar/db', {}).yields(database)
11
- dataset = mock('dataset')
12
- database.expects(:[]).with(:baz_table).returns(dataset)
12
+ database.expects(:synchronize).yields
13
13
  dataset.expects(:import).with([:qux, :thud], [[123, 456], ['test', 'junk']])
14
14
  buf.flush
15
15
  end
16
16
 
17
17
  test "flush performs a no-op when buffer is empty" do
18
- Sequel.expects(:connect).never
19
- buf = Linkage::ImportBuffer.new('foo:/bar/db', 'baz_table', [:qux, :thud])
18
+ database = stub('database')
19
+ dataset = stub('dataset', :db => database)
20
+ dataset.expects(:import).never
21
+ buf = Linkage::ImportBuffer.new(dataset, [:qux, :thud])
20
22
  buf.flush
21
23
  end
22
24
 
23
25
  test "auto-flush" do
24
- uri = 'foo:/bar/db'
25
- table = 'baz_table'
26
+ database = stub('database')
27
+ dataset = stub('dataset', :db => database)
26
28
  headers = [:qux, :thud]
27
29
  limit = 3
28
- buf = Linkage::ImportBuffer.new(uri, table, headers, {}, limit)
30
+ buf = Linkage::ImportBuffer.new(dataset, headers, limit)
29
31
  2.times { |i| buf.add([123, 456]) }
30
32
 
31
- database = mock('database')
32
- Sequel.expects(:connect).with('foo:/bar/db', {}).yields(database)
33
- dataset = mock('dataset')
34
- database.expects(:[]).with(:baz_table).returns(dataset)
33
+ database.expects(:synchronize).yields
35
34
  dataset.expects(:import).with([:qux, :thud], [[123, 456], [123, 456], ['test', 'junk']])
36
35
  buf.add(['test', 'junk'])
37
36
  end
38
-
39
- test "accepts Sequel.connect options" do
40
- buf = Linkage::ImportBuffer.new('foo:/bar/db', 'baz_table', [:qux, :thud], :foo => 123)
41
- buf.add([123, 456])
42
- buf.add(['test', 'junk'])
43
-
44
- database = mock('database')
45
- Sequel.expects(:connect).with('foo:/bar/db', :foo => 123).yields(database)
46
- dataset = mock('dataset')
47
- database.expects(:[]).with(:baz_table).returns(dataset)
48
- dataset.expects(:import).with([:qux, :thud], [[123, 456], ['test', 'junk']])
49
- buf.flush
50
- end
51
37
  end