hadouken-json 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +21 -0
- data/lib/hadouken/json.rb +7 -1
- data/lib/hadouken/sql_builder.rb +17 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62fef84a45118f2f47cbd64a3634580aac3a563a172badedc5cc546afd560e54
|
4
|
+
data.tar.gz: a9350818a683f0b13f8ec0cdc1ed7b0f3c8d4d3932968713669f9382344977e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 915c7205d38b350c6120eac7cb4aaec445e79d70601143ec08fdbeb2866b56e3aa23bd27520273b84bb7f5a8c57ba1b08eee46596d030f1e0bca64fc134dcce8
|
7
|
+
data.tar.gz: 20cd69fb5a7045761e111c630037caca265f89dba328e352895bf801079d0ce75789e61197458255f5526f9ee169d6ca484c105f28e8e9d76acf40306e2329a4
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2021 Roman
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/lib/hadouken/json.rb
CHANGED
@@ -18,7 +18,7 @@ class Hadouken::Json
|
|
18
18
|
options = args[0] || {}
|
19
19
|
|
20
20
|
Hadouken::SqlBuilder.call(
|
21
|
-
main_class: relation.klass,
|
21
|
+
main_class: (relation_for(options[:jsonb_field_from]) || relation).klass,
|
22
22
|
scope: options[:for],
|
23
23
|
schema: json_schema,
|
24
24
|
decorator: (options[:decorate_with].is_a?(Hadouken::Decorator) ? options[:decorate_with] : nil)
|
@@ -27,6 +27,12 @@ class Hadouken::Json
|
|
27
27
|
|
28
28
|
private
|
29
29
|
|
30
|
+
def relation_for(scope)
|
31
|
+
return unless scope
|
32
|
+
|
33
|
+
scope.is_a?(ActiveRecord::Relation) ? scope : relation.klass.new(id: 1).instance_eval(scope)
|
34
|
+
end
|
35
|
+
|
30
36
|
def execute_query(sql_query)
|
31
37
|
ActiveRecord::Base.connection.execute(sql_query).values.first.first
|
32
38
|
end
|
data/lib/hadouken/sql_builder.rb
CHANGED
@@ -5,6 +5,7 @@ class Hadouken::SqlBuilder
|
|
5
5
|
attribute :scope
|
6
6
|
attribute :schema, Hash, default: {}
|
7
7
|
attribute :decorator, Hadouken::Decorator
|
8
|
+
|
8
9
|
def self.call(*args)
|
9
10
|
new(*args).call
|
10
11
|
end
|
@@ -49,6 +50,7 @@ class Hadouken::SqlBuilder
|
|
49
50
|
|
50
51
|
def build_relation
|
51
52
|
fail 'Scope should be ActiveRecord::Relation or string' if [ActiveRecord::Relation, String].none? { |klass| scope.is_a?( klass ) }
|
53
|
+
return main_class.from(unwound_jsonb_table) if scope_is_jsonb_array?
|
52
54
|
|
53
55
|
scope.is_a?(ActiveRecord::Relation) ? scope : main_class.new(id: sample_id).instance_eval(scope)
|
54
56
|
end
|
@@ -57,7 +59,7 @@ class Hadouken::SqlBuilder
|
|
57
59
|
schema.extract!(*schema.select{ |_,v| v.is_a?(String) }.keys)
|
58
60
|
.inject({}) do |h, (field, column)|
|
59
61
|
col = (@relation&.klass&.column_names||[]).include?(column) ? [@relation.klass.table_name, column].join('.') : column
|
60
|
-
h.merge(field => col)
|
62
|
+
scope_is_jsonb_array? ? h.merge(field => "#{unwound_jsonb_table_name}.#{column.split('::')[0]}") : h.merge(field => col)
|
61
63
|
end
|
62
64
|
end
|
63
65
|
|
@@ -108,4 +110,18 @@ class Hadouken::SqlBuilder
|
|
108
110
|
column_name.scan(/[.]/).length <= 1 ? "\"#{column_name.split('.').join('"."')}\"" : "(#{column_name})"
|
109
111
|
end
|
110
112
|
|
113
|
+
def scope_is_jsonb_array?
|
114
|
+
db_column = main_class.columns_hash[scope]
|
115
|
+
db_column&.type == :jsonb && JSON.parse(db_column.default.to_s).is_a?(Array)
|
116
|
+
end
|
117
|
+
|
118
|
+
def unwound_jsonb_table_name
|
119
|
+
@unwound_jsonb_table_name ||= ['array_from_', scope].join
|
120
|
+
end
|
121
|
+
|
122
|
+
def unwound_jsonb_table
|
123
|
+
table_structure = schema.values.map { |v| v.split('::').push('text')[0..1].join(' ') }.join(', ')
|
124
|
+
"jsonb_to_recordset(#{main_class.table_name}.#{scope}) AS #{unwound_jsonb_table_name}(#{table_structure})"
|
125
|
+
end
|
126
|
+
|
111
127
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hadouken-json
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roman Zaytsev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-09-
|
11
|
+
date: 2021-09-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: virtus
|
@@ -50,6 +50,7 @@ executables: []
|
|
50
50
|
extensions: []
|
51
51
|
extra_rdoc_files: []
|
52
52
|
files:
|
53
|
+
- LICENSE
|
53
54
|
- lib/hadouken-json.rb
|
54
55
|
- lib/hadouken/decorator.rb
|
55
56
|
- lib/hadouken/json.rb
|