mongery 1.0.1 → 1.0.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 03d8acfca1ec4e920360fd762c038d5418f2cfaf
4
- data.tar.gz: 66f7ec10c8e575b4bbdfbed72a35405c2fb40a4c
3
+ metadata.gz: c654aa684e186267a8ad90f66b57a7c000e2529b
4
+ data.tar.gz: 31e9d9fab939af0b876f68782ae44950da8ecda6
5
5
  SHA512:
6
- metadata.gz: 16ccca0d85eed4fe6c7f2cbdf391b26485196a9051d04be639f9a6b3dbb175e701d724c8edff4a0c972649ad5dad84cd702901a10991bee175aa6c29ed350c26
7
- data.tar.gz: aa49ffa0ba15edc1a5a2efc4fc108c49845155ae7f033797e57e8ca4091da951f4062c4a7516e5582f6c20f8cf49754d2a8549781dc55c96f2fb511007e2d481
6
+ metadata.gz: 627d0288cfc9409bd7f00f374b2a50ec0c6acdbaaaac90e47855a0cf57b99b427e24cec0a2fd6b485131a56b3b8f507c02c221db2c2afe9552960543d46fc0fd
7
+ data.tar.gz: 5768a7da04168ee460e1e88cdb05a28d576d46cbd422819ffc5370a2a6569b6ba14cdd2958a8f29291e3a2c1878c9c130edf6fd998e24efdb9c96531b07c8518
@@ -1,3 +1,7 @@
1
+ ## 1.0.2 (2015/01/09)
2
+ - Support mapped_properties to map system columns on Postgres
3
+ - Look up all values using string keys rather than symbol. Make sure you use indifferent_access, or stringify_key before passing the value hash to Mongery
4
+
1
5
  ## 1.0.1 (2014/12/22)
2
6
  - Force string comparison on non-typed property
3
7
 
@@ -4,29 +4,40 @@ require "arel"
4
4
 
5
5
  module Mongery
6
6
  class Builder
7
- attr_reader :model, :table, :schema
7
+ attr_reader :model, :table, :schema, :mapped_properties
8
8
 
9
9
  def initialize(model, engine = ActiveRecord::Base, schema = nil)
10
10
  @model = model
11
11
  @table = Arel::Table.new(model, engine)
12
12
  @schema = Schema.new(schema) if schema
13
+ @mapped_properties = {}
14
+ end
15
+
16
+ def mapped_properties=(value)
17
+ case value
18
+ when Array
19
+ @mapped_properties = Hash[ value.map { |v| [v.to_s, v] } ]
20
+ else
21
+ @mapped_properties = value
22
+ end
13
23
  end
14
24
 
15
25
  def find(*args)
16
- Query.new(table, schema).where(*args)
26
+ Query.new(table, schema, mapped_properties).where(*args)
17
27
  end
18
28
 
19
29
  def insert(*args)
20
- Query.new(table, schema).insert(*args)
30
+ Query.new(table, schema, mapped_properties).insert(*args)
21
31
  end
22
32
  end
23
33
 
24
34
  class Query
25
- attr_reader :table, :schema
35
+ attr_reader :table, :schema, :mapped_properties
26
36
 
27
- def initialize(table, schema)
37
+ def initialize(table, schema, mapped_properties)
28
38
  @table = table
29
39
  @schema = schema
40
+ @mapped_properties = mapped_properties
30
41
  @condition = nil
31
42
  end
32
43
 
@@ -70,17 +81,26 @@ module Mongery
70
81
  self
71
82
  end
72
83
 
84
+ def mapped_values(args)
85
+ pairs = []
86
+ mapped_properties.each do |key, column|
87
+ pairs.push([table[column], args[key]]) if args.key?(key)
88
+ end
89
+ pairs
90
+ end
91
+ private :mapped_values
92
+
73
93
  def insert(args)
74
94
  Arel::InsertManager.new(table.engine).tap do |manager|
75
95
  manager.into(table)
76
- manager.insert([[table[:id], args[:_id]], [table[:data], args.to_json]])
96
+ manager.insert([[table[:id], args['_id']], [table[:data], args.to_json], *mapped_values(args)])
77
97
  end
78
98
  end
79
99
 
80
100
  def update(args)
81
101
  Arel::UpdateManager.new(table.engine).tap do |manager|
82
102
  manager.table(table)
83
- manager.set([[table[:data], args.to_json]])
103
+ manager.set([[table[:data], args.to_json], *mapped_values(args)])
84
104
  manager.where(condition) if condition
85
105
  end
86
106
  end
@@ -94,6 +114,10 @@ module Mongery
94
114
 
95
115
  private
96
116
 
117
+ def mapped_keys
118
+ mapped_properties.keys
119
+ end
120
+
97
121
  def condition
98
122
  @condition ||= translate(@where)
99
123
  end
@@ -118,6 +142,8 @@ module Mongery
118
142
  raise UnsupportedQuery, "Unsupported operator #{col}"
119
143
  when "_id"
120
144
  translate_value(table[:id], value)
145
+ when *mapped_keys
146
+ translate_value(table[mapped_properties[col.to_s]], value)
121
147
  else
122
148
  if schema
123
149
  translate_value_schema(col, sql_json_path(col), value)
@@ -1,3 +1,3 @@
1
1
  module Mongery
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  end
@@ -103,3 +103,4 @@ describe Mongery::Builder do
103
103
  end
104
104
  end
105
105
  end
106
+
@@ -0,0 +1,34 @@
1
+ require 'active_support/core_ext/hash/indifferent_access'
2
+
3
+ describe "#mapped_properties" do
4
+ let(:builder) {
5
+ Mongery::Builder.new(:test).tap do |builder|
6
+ builder.mapped_properties = [:user_id, :created_at, :updated_at]
7
+ end
8
+ }
9
+
10
+ let(:args) {
11
+ { '_id' => 1, 'user_id' => 2, 'created_at' => Time.now, 'foo' => "bar" }.with_indifferent_access
12
+ }
13
+
14
+ it 'generates INSERT' do
15
+ expect(builder.insert(args).to_sql).to match /VALUES \(1, '{.*?}', 2, '\d{4}-\d{2}-\d{2} .*'\)$/
16
+ end
17
+
18
+ it 'generates UPDATE' do
19
+ expect(builder.find(_id: 1).update(args).to_sql).to match /SET "data" = .*, "user_id" = 2, "created_at" = '\d{4}-.*' WHERE/;
20
+ end
21
+
22
+ it 'searches WHERE with symbol' do
23
+ expect(builder.find(:user_id => '2').to_sql).to match /WHERE "test"\."user_id" = '2'/;
24
+ end
25
+
26
+ it 'searches WHERE with string' do
27
+ expect(builder.find("user_id" => '2').to_sql).to match /WHERE "test"\."user_id" = '2'/;
28
+ end
29
+
30
+ it 'searches WHERE with operators' do
31
+ expect(builder.find("created_at" => {'$in' => ['2014-01-01', '2015-01-01']}, "foo" => "bar").to_sql)
32
+ .to match /WHERE "test"\."created_at" IN \('2014-01-01', '2015-01-01'\) AND data#>>'{foo}' = 'bar'/;
33
+ end
34
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongery
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tatsuhiko Miyagawa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-22 00:00:00.000000000 Z
11
+ date: 2015-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: arel
@@ -127,6 +127,7 @@ files:
127
127
  - mongery.gemspec
128
128
  - spec/mongery/builder_schema_spec.rb
129
129
  - spec/mongery/builder_spec.rb
130
+ - spec/mongery/mapped_properties_spec.rb
130
131
  - spec/spec_helper.rb
131
132
  homepage: https://github.com/miyagawa/mongery
132
133
  licenses:
@@ -148,12 +149,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
148
149
  version: '0'
149
150
  requirements: []
150
151
  rubyforge_project:
151
- rubygems_version: 2.4.3
152
+ rubygems_version: 2.4.5
152
153
  signing_key:
153
154
  specification_version: 4
154
155
  summary: Convert MongoDB query to Arel for PostgreSQL + JSON
155
156
  test_files:
156
157
  - spec/mongery/builder_schema_spec.rb
157
158
  - spec/mongery/builder_spec.rb
159
+ - spec/mongery/mapped_properties_spec.rb
158
160
  - spec/spec_helper.rb
159
- has_rdoc: