surus 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,34 +0,0 @@
1
- require 'benchmark_helper'
2
-
3
- options = {}
4
- optparse = OptionParser.new do |opts|
5
- options[:elements] = 10
6
- opts.on '-e NUM', '--elements NUM', Integer, 'Number of elements per array' do |n|
7
- options[:elements] = n
8
- end
9
- end
10
-
11
- optparse.parse!
12
-
13
- clean_database
14
-
15
- num_elements = options[:elements]
16
- array = num_elements.times.map { SecureRandom.hex(4) }
17
-
18
- SurusTextArrayRecord.create! :names => array
19
- YamlArrayRecord.create! :names => array
20
-
21
- num_reads = 3_000
22
-
23
- puts
24
- puts "Reading a single record with a #{num_elements} element array #{num_reads} times"
25
-
26
- Benchmark.bm(8) do |x|
27
- x.report("Surus") do
28
- num_reads.times { SurusTextArrayRecord.first.names }
29
- end
30
-
31
- x.report("YAML") do
32
- num_reads.times { YamlArrayRecord.first.names }
33
- end
34
- end
@@ -1,57 +0,0 @@
1
- require 'benchmark_helper'
2
-
3
- options = {}
4
- optparse = OptionParser.new do |opts|
5
- options[:records] = 200
6
- opts.on '-r NUM', '--records NUM', Integer, 'Number of records to create' do |n|
7
- options[:records] = n
8
- end
9
-
10
- options[:pairs] = 5
11
- opts.on '-p NUM', '--pairs NUM', Integer, 'Number of key/value pairs' do |n|
12
- options[:pairs] = n
13
- end
14
- end
15
-
16
- optparse.parse!
17
-
18
- clean_database
19
- GC.disable
20
-
21
- num_records = options[:records]
22
- num_key_value_pairs = options[:pairs]
23
-
24
- key_value_pairs = num_records.times.map do
25
- num_key_value_pairs.times.each_with_object({}) do |n, hash|
26
- hash[SecureRandom.hex(4)] = SecureRandom.hex(4)
27
- end
28
- end
29
-
30
- puts
31
- puts "Writing #{num_records} records with #{num_key_value_pairs} string key/value pairs"
32
-
33
- Benchmark.bm(8) do |x|
34
- x.report("EAV") do
35
- EavMasterRecord.transaction do
36
- num_records.times do |i|
37
- EavMasterRecord.create! :properties => key_value_pairs[i]
38
- end
39
- end
40
- end
41
-
42
- x.report("Surus") do
43
- SurusKeyValueRecord.transaction do
44
- num_records.times do |i|
45
- SurusKeyValueRecord.create! :properties => key_value_pairs[i]
46
- end
47
- end
48
- end
49
-
50
- x.report("YAML") do
51
- YamlKeyValueRecord.transaction do
52
- num_records.times do |i|
53
- YamlKeyValueRecord.create! :properties => key_value_pairs[i]
54
- end
55
- end
56
- end
57
- end
@@ -1,42 +0,0 @@
1
- require 'benchmark_helper'
2
-
3
- options = {}
4
- optparse = OptionParser.new do |opts|
5
- options[:pairs] = 5
6
- opts.on '-p NUM', '--pairs NUM', Integer, 'Number of key/value pairs' do |n|
7
- options[:pairs] = n
8
- end
9
- end
10
-
11
- optparse.parse!
12
-
13
- clean_database
14
-
15
- num_key_value_pairs = options[:pairs]
16
-
17
- key_value_pair = num_key_value_pairs.times.each_with_object({}) do |n, hash|
18
- hash[SecureRandom.hex(4)] = SecureRandom.hex(4)
19
- end
20
-
21
- EavMasterRecord.create! :properties => key_value_pair
22
- SurusKeyValueRecord.create! :properties => key_value_pair
23
- YamlKeyValueRecord.create! :properties => key_value_pair
24
-
25
- num_reads = 3_000
26
-
27
- puts
28
- puts "Reading a single record with #{num_key_value_pairs} string key/value pairs #{num_reads} times"
29
-
30
- Benchmark.bm(8) do |x|
31
- x.report("EAV") do
32
- num_reads.times { EavMasterRecord.first.properties }
33
- end
34
-
35
- x.report("Surus") do
36
- num_reads.times { SurusKeyValueRecord.first.properties }
37
- end
38
-
39
- x.report("YAML") do
40
- num_reads.times { YamlKeyValueRecord.first.properties }
41
- end
42
- end
@@ -1,28 +0,0 @@
1
- module Surus
2
- module Array
3
- class DecimalSerializer
4
- ARRAY_REGEX = %r{
5
- (?<=[\{,]) (?# All elements are prefixed with either the opening brace or a comma)
6
- \-?\d+\.?\d*
7
- |
8
- NULL
9
- }x
10
-
11
- def load(string)
12
- return unless string
13
- string.scan(ARRAY_REGEX).map do |match|
14
- match == "NULL" ? nil : BigDecimal(match)
15
- end
16
- end
17
-
18
- def dump(array)
19
- return unless array
20
- '{' + array.map { |s| format(s) }.join(",") + '}'
21
- end
22
-
23
- def format(value)
24
- value == nil ? "NULL" : value
25
- end
26
- end
27
- end
28
- end
@@ -1,28 +0,0 @@
1
- module Surus
2
- module Array
3
- class FloatSerializer
4
- ARRAY_REGEX = %r{
5
- (?<=[\{,]) (?# All elements are prefixed with either the opening brace or a comma)
6
- \-?\d+(?:\.\d+)?(?:e[+-])?\d*
7
- |
8
- NULL
9
- }x
10
-
11
- def load(string)
12
- return unless string
13
- string.scan(ARRAY_REGEX).map do |match|
14
- match == "NULL" ? nil : Float(match)
15
- end
16
- end
17
-
18
- def dump(array)
19
- return unless array
20
- '{' + array.map { |s| format(s) }.join(",") + '}'
21
- end
22
-
23
- def format(value)
24
- value == nil ? "NULL" : value
25
- end
26
- end
27
- end
28
- end
@@ -1,28 +0,0 @@
1
- module Surus
2
- module Array
3
- class IntegerSerializer
4
- ARRAY_REGEX = %r{
5
- (?<=[\{,]) (?# All elements are prefixed with either the opening brace or a comma)
6
- \-?\d+
7
- |
8
- NULL
9
- }x
10
-
11
- def load(string)
12
- return unless string
13
- string.scan(ARRAY_REGEX).map do |match|
14
- match == "NULL" ? nil : Integer(match)
15
- end
16
- end
17
-
18
- def dump(array)
19
- return unless array
20
- '{' + array.map { |s| format(s) }.join(",") + '}'
21
- end
22
-
23
- def format(value)
24
- value == nil ? "NULL" : value
25
- end
26
- end
27
- end
28
- end
@@ -1,47 +0,0 @@
1
- module Surus
2
- module Array
3
- class TextSerializer
4
- ARRAY_REGEX = %r{
5
- [{,] (?# All elements are prefixed with either the opening brace or a comma)
6
- (?:
7
- "
8
- (?<quoted_string>(?:[^"\\]|\\.)*)
9
- "
10
- |
11
- (?<null>NULL)
12
- |
13
- (?<unquoted_string>[^,}]+)
14
- )
15
- }x
16
-
17
- def load(string)
18
- return unless string
19
- string.scan(ARRAY_REGEX).map do |quoted_string, null, unquoted_string|
20
- element = quoted_string || unquoted_string
21
- element ? unescape(element) : nil
22
- end
23
- end
24
-
25
- def dump(array)
26
- return unless array
27
- '{' + array.map { |s| format(s) }.join(",") + '}'
28
- end
29
-
30
- def format(value)
31
- value == nil ? "NULL" : '"' + escape(value) + '"'
32
- end
33
-
34
- def escape(value)
35
- value
36
- .gsub('\\', '\\\\\\')
37
- .gsub('"', '\\"')
38
- end
39
-
40
- def unescape(value)
41
- value
42
- .gsub('\\\\', '\\')
43
- .gsub('\\"', '"')
44
- end
45
- end
46
- end
47
- end
@@ -1,46 +0,0 @@
1
- require 'active_record/connection_adapters/postgresql_adapter'
2
-
3
- ActiveRecord::ConnectionAdapters::PostgreSQLColumn.class_eval do
4
- def simplified_type_with_hstore(field_type)
5
- field_type == 'hstore' ? :hstore : simplified_type_without_hstore(field_type)
6
- end
7
-
8
- alias_method_chain :simplified_type, :hstore
9
- end
10
-
11
-
12
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
13
- def native_database_types_with_hstore
14
- native_database_types_without_hstore.merge({:hstore => { :name => "hstore" }})
15
- end
16
-
17
- alias_method_chain :native_database_types, :hstore
18
- end
19
-
20
- ActiveRecord::ConnectionAdapters::TableDefinition.class_eval do
21
- # Adds hstore type for migrations. So you can add columns to a table like:
22
- # create_table :people do |t|
23
- # ...
24
- # t.hstore :info
25
- # ...
26
- # end
27
- def hstore(*args)
28
- options = args.extract_options!
29
- column_names = args
30
- column_names.each { |name| column(name, 'hstore', options) }
31
- end
32
- end
33
-
34
- ActiveRecord::ConnectionAdapters::Table.class_eval do
35
- # Adds hstore type for migrations. So you can add columns to a table like:
36
- # change_table :people do |t|
37
- # ...
38
- # t.hstore :info
39
- # ...
40
- # end
41
- def hstore(*args)
42
- options = args.extract_options!
43
- column_names = args
44
- column_names.each { |name| column(name, 'hstore', options) }
45
- end
46
- end
@@ -1,46 +0,0 @@
1
- require 'active_record/connection_adapters/postgresql_adapter'
2
-
3
- ActiveRecord::ConnectionAdapters::PostgreSQLColumn.class_eval do
4
- def simplified_type_with_json(field_type)
5
- field_type == 'json' ? :json : simplified_type_without_json(field_type)
6
- end
7
-
8
- alias_method_chain :simplified_type, :json
9
- end
10
-
11
-
12
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
13
- def native_database_types_with_json
14
- native_database_types_without_json.merge({:json => { :name => "json" }})
15
- end
16
-
17
- alias_method_chain :native_database_types, :json
18
- end
19
-
20
- ActiveRecord::ConnectionAdapters::TableDefinition.class_eval do
21
- # Adds json type for migrations. So you can add columns to a table like:
22
- # create_table :people do |t|
23
- # ...
24
- # t.json :info
25
- # ...
26
- # end
27
- def json(*args)
28
- options = args.extract_options!
29
- column_names = args
30
- column_names.each { |name| column(name, 'json', options) }
31
- end
32
- end
33
-
34
- ActiveRecord::ConnectionAdapters::Table.class_eval do
35
- # Adds json type for migrations. So you can add columns to a table like:
36
- # change_table :people do |t|
37
- # ...
38
- # t.json :info
39
- # ...
40
- # end
41
- def json(*args)
42
- options = args.extract_options!
43
- column_names = args
44
- column_names.each { |name| column(name, 'json', options) }
45
- end
46
- end
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Surus::Array::DecimalSerializer do
4
- round_trip_examples = [
5
- [nil, "nil"],
6
- [[], "empty array"],
7
- [[BigDecimal("0.0")], "single element"],
8
- [[BigDecimal("1.0"), BigDecimal("2.0")], "multiple elements"],
9
- [[BigDecimal("-1.0"), BigDecimal("-2.0")], "negative element"],
10
- [[BigDecimal("1232493289348929843.323422349274382923")], "high magnitude element"],
11
- [[BigDecimal("1.0"), BigDecimal("2.0"), BigDecimal("2.0")], "duplicated elements"],
12
- [[BigDecimal("1.0"), nil], "an element is nil"],
13
- [(10_000.times.map { |n| n * BigDecimal("1.13312") }).to_a, "huge array"]
14
- ]
15
-
16
- round_trip_examples.each do |value, description|
17
- it "round trips when #{description}" do
18
- r = DecimalArrayRecord.create! :decimals => value
19
- r.reload
20
- expect(r.decimals).to eq(value)
21
- end
22
- end
23
- end
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Surus::Array::FloatSerializer do
4
- round_trip_examples = [
5
- [nil, "nil"],
6
- [[], "empty array"],
7
- [[0.0], "single element"],
8
- [[1.0, 2.0], "multiple elements"],
9
- [[-1.0, -2.0], "negative element"],
10
- [[4.4325349e+45, 1.2324323e+77, 1.1242342e-57, 3e99], "high magnitude elements"],
11
- [[1.0, 2.0, 2.0, 2.0], "duplicated elements"],
12
- [[1.0, nil], "an element is nil"],
13
- [(10_000.times.map { |n| n * 1.0 }).to_a, "huge array"]
14
- ]
15
-
16
- round_trip_examples.each do |value, description|
17
- it "round trips when #{description}" do
18
- r = FloatArrayRecord.create! :floats => value
19
- r.reload
20
- expect(r.floats).to eq(value)
21
- end
22
- end
23
- end
@@ -1,22 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Surus::Array::IntegerSerializer do
4
- round_trip_examples = [
5
- [nil, "nil"],
6
- [[], "empty array"],
7
- [[0], "single element"],
8
- [[1, 2], "multiple elements"],
9
- [[-1, -2], "negative element"],
10
- [[1, 2, 2, 2], "duplicated elements"],
11
- [[1, nil], "an element is nil"],
12
- [(1..10_000).to_a, "huge array"]
13
- ]
14
-
15
- round_trip_examples.each do |value, description|
16
- it "round trips when #{description}" do
17
- r = IntegerArrayRecord.create! :integers => value
18
- r.reload
19
- expect(r.integers).to eq(value)
20
- end
21
- end
22
- end
@@ -1,29 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Surus::Array::TextSerializer do
4
- round_trip_examples = [
5
- [nil, "nil"],
6
- [[], "empty array"],
7
- [["foo"], "single element"],
8
- [["foo", "bar"], "multiple elements"],
9
- [["foo", "bar", "bar", "bar"], "duplicated elements"],
10
- [["foo bar", nil], "an element is nil"],
11
- [["foo bar", 'NULL'], "an element is the string 'NULL'"],
12
- [["foo bar", "baz"], "an element has a space"],
13
- [["foo,bar", "baz"], "an element has a comma (,)"],
14
- [["foo'bar", "baz"], "an element has a single quote (')"],
15
- [['foo"bar', "baz"], "an element has a double quote (\")"],
16
- [['foo\\bar', "baz"], "an element has a backslash (\\)"],
17
- [['foo{}bar', "{baz}"], "an element has a braces ({})"],
18
- [[%q~foo \\ / " ; ' ( ) {}bar \\'~, "bar"], "an element many special characters"],
19
- [("aaa".."zzz").to_a, "huge array"]
20
- ]
21
-
22
- round_trip_examples.each do |value, description|
23
- it "round trips when #{description}" do
24
- r = TextArrayRecord.create! :texts => value
25
- r.reload
26
- expect(r.texts).to eq(value)
27
- end
28
- end
29
- end