from_clause_translate 0.2.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 89031b3fa713ad97c38aab959420f0c67544ceae17455030e176025c1f13d87e
4
- data.tar.gz: c647f38f0dbd253869f34b0aa15469b93ac4b6e833c20cc46a6d1f37dd4d4508
3
+ metadata.gz: a49a163f455c3977eebfcb19c3fe4051946f941d4968ee9115bb1616866b1f35
4
+ data.tar.gz: 5f66fc0c7a4900e120c76ef2552294047b8a20bb29af1f6cf00cf3755a3674c5
5
5
  SHA512:
6
- metadata.gz: 5c47f449400389d4057665063c21befc1a9520d0a329c4efafd975ca939848fc5aaaa0ad3f0b6e1586f3e5d309288bfad721052b76c6f71d8ad6dd3b565d90b8
7
- data.tar.gz: d38569db183c16dc2b6847096b365304f61a37c28a1de3c74d7034e4bcff600e3318bc13a1cf88bed39b8fda70a7ac6b8e769d3660f9f933b3cb26c62b5ee0ad
6
+ metadata.gz: dd41de9c31b39e159fac6256e35dc1e5787a42270596b4c2f068c3c5f3819416c35071ed037759409265aa781742feb95e98ace2818d78b49f699329d8df4b2f
7
+ data.tar.gz: c515c69c704ff0363eec07844ba60b9b31deaaa0f5eef9d32382d0ed1aa11a136ace7b1ae03226b72aa60e20170e9a341b9382deb80abc996f01670b26ab468a
@@ -14,27 +14,18 @@ module ActiveRecord::Relation::Extended
14
14
  (@values[:translated] ||= []) << column
15
15
  end
16
16
 
17
- UNSCOPING_VALUES =
18
- ActiveRecord::QueryMethods::VALID_UNSCOPING_VALUES.dup.delete(:joins)
19
-
20
17
  def apply_translates
21
18
  return if @translates_applied || !@klass.const_defined?(:TRANSLATED)
22
19
 
23
20
  @translates_applied = true
24
21
 
25
- @arel ||= build_arel nil
26
-
27
22
  columns = translated_columns_build
28
23
  return unless columns
29
24
 
30
- if @values[:joins]
31
- joins = @values.delete :joins
32
- @arel = build_arel nil
33
- end
25
+ @arel = build_arel nil
34
26
 
35
- rel = unscope(*UNSCOPING_VALUES).select(columns)
27
+ rel = unscoped.select(columns)
36
28
  rel.instance_variable_set(:@translates_applied, true)
37
- rel.instance_variable_get(:@values)[:joins] = joins if joins
38
29
  replace_plurals_in_projections
39
30
  @arel.from("(#{rel.arel.to_sql}) #{@klass.table_name}")
40
31
  end
@@ -7,7 +7,7 @@ module ClassMethods
7
7
  filter_translated_columns(
8
8
  map_translated_columns(columns)
9
9
  ).each do |hash|
10
- column = hash[:column]
10
+ column = hash[:name]
11
11
  self::TRANSLATED[column] = true
12
12
  define_translated_selection column, hash
13
13
  define_translated_column_methods column
@@ -24,11 +24,15 @@ module ClassMethods
24
24
  column = plural.to_s.singularize.to_sym
25
25
  selection = I18n.available_locales.map do |locale|
26
26
  "#{quoted_table_name}.\"#{column}_#{locale}\""
27
- end.join ','
28
- self::TRANSLATED_PLURALS[plural] = selection
27
+ end
29
28
  I18n.available_locales.each do |locale|
30
29
  self::TRANSLATED_SELECTION[locale][plural] = selection
31
30
  end
31
+ selection = selection.join ','
32
+ self::TRANSLATED_PLURALS[plural] = selection
33
+ I18n.available_locales.each do |locale|
34
+ self::TRANSLATED_SELECTION_AS[locale][plural] = selection
35
+ end
32
36
  end
33
37
  end
34
38
 
@@ -46,7 +50,7 @@ module ClassMethods
46
50
 
47
51
  def map_translated_columns columns
48
52
  columns.map! do |column|
49
- hash = column.is_a?(Hash) ? column : {column: column}
53
+ hash = column.is_a?(Hash) ? column : {name: column}
50
54
  translated_fallbacks_set hash
51
55
  hash
52
56
  end
@@ -54,8 +58,8 @@ module ClassMethods
54
58
 
55
59
  def filter_translated_columns columns
56
60
  columns.keep_if do |hash|
57
- !translates?(hash[:column]) &&
58
- column_names.include?("#{hash[:column]}_#{I18n.locale}")
61
+ !translates?(hash[:name]) &&
62
+ column_names.include?("#{hash[:name]}_#{I18n.locale}")
59
63
  end
60
64
  end
61
65
 
@@ -65,7 +69,8 @@ module ClassMethods
65
69
  selection = "#{quoted_table_name}.\"#{column}_#{locale}\""
66
70
  selection = translated_fallbacks_wrap selection, fallback[locale]
67
71
  selection = translated_fallbacks_wrap selection, fallback[:_]
68
- self::TRANSLATED_SELECTION[locale][column] = "#{selection} AS #{column}"
72
+ self::TRANSLATED_SELECTION[locale][column] = selection
73
+ self::TRANSLATED_SELECTION_AS[locale][column] = "#{selection} AS #{column}"
69
74
  end
70
75
  end
71
76
 
@@ -13,6 +13,7 @@ class FromClauseTranslate::TranslatedColumnsBuilder
13
13
  add_translated_columns_from_values
14
14
  add_translated_columns_from_projections
15
15
  add_translated_columns_from_cores
16
+ add_translated_columns_from_joins
16
17
  add_translated_columns_from_orders
17
18
 
18
19
  @columns if @has_translated
@@ -26,15 +27,11 @@ class FromClauseTranslate::TranslatedColumnsBuilder
26
27
 
27
28
  @has_translated = true
28
29
  translated.each do |column|
29
- if column.is_a? Hash
30
- column.each do |key, value|
31
- @skip_translated << key.to_s
32
- @columns << "#{value} AS #{key}"
33
- end
34
- elsif (selection = translated_selection(column))
35
- @columns << selection
36
- else
37
- @columns << column
30
+ next translated_selection(column) if !column.is_a? Hash
31
+
32
+ column.each do |key, value|
33
+ @skip_translated << key.to_s
34
+ @columns << "#{value} AS #{key}" unless value.nil?
38
35
  end
39
36
  end
40
37
  end
@@ -43,19 +40,28 @@ class FromClauseTranslate::TranslatedColumnsBuilder
43
40
  return if @without_projections
44
41
 
45
42
  @arel.projections.each do |column|
46
- selection = arel_projection_translation(column)
47
- @columns << selection if selection
43
+ arel_projection_translation column
48
44
  end
49
45
  end
50
46
 
51
47
  def arel_projection_translation column
48
+ return if column.is_a?(String) && column[0] != '"'
49
+
52
50
  column = column.name if column.is_a? Arel::Attributes::Attribute
53
51
  column = column.to_s unless column.is_a? String
54
52
 
55
- name = column.first == '"' ? column[1...-1] : column
53
+ if column.first == '"'
54
+ name = column[1...-1]
55
+ elsif column == '*'
56
+ @select_all = true
57
+ return column
58
+ else
59
+ name = column
60
+ end
61
+
56
62
  return if @skip_translated.include? name
57
63
 
58
- translated_selection(name) || column
64
+ translated_selection name, column
59
65
  end
60
66
 
61
67
  def add_translated_columns_from_cores
@@ -70,8 +76,7 @@ class FromClauseTranslate::TranslatedColumnsBuilder
70
76
  core.groups.each do |group|
71
77
  expr = group.expr
72
78
  name = expr[0] == '"' ? expr[1...-1] : expr
73
- selection = translated_selection name
74
- @columns << selection if selection
79
+ translated_selection name
75
80
  end
76
81
  end
77
82
 
@@ -80,24 +85,42 @@ class FromClauseTranslate::TranslatedColumnsBuilder
80
85
  node.children.each do |child|
81
86
  next unless child.respond_to? :left
82
87
 
83
- name = child.left.name
84
- selection = translated_selection name
85
- @columns << (selection || name)
88
+ left = child.left
89
+ next if left.relation.table_name != @klass.table_name
90
+
91
+ translated_selection left.name
86
92
  end
87
93
  end
88
94
  end
89
95
 
96
+ def add_translated_columns_from_joins
97
+ joins = @relation.instance_variable_get(:@values)[:joins]
98
+ return unless joins
99
+
100
+ joins.each do |join|
101
+ ref = @klass.reflections[join.to_s]
102
+ next if !ref || !ref.is_a?(ActiveRecord::Reflection::BelongsToReflection)
103
+
104
+ translated_selection ref.join_keys.foreign_key
105
+ end
106
+ end
107
+
90
108
  def add_translated_columns_from_orders
91
109
  @arel.ast.orders.each do |name|
92
- name = name.respond_to?(:expr) ? name.expr.name : name.to_sym
93
- selection = translated_selection name
94
- @columns << selection if selection
110
+ name = name.respond_to?(:expr) ? name.expr.name : name
111
+ translated_selection name
95
112
  end
96
113
  end
97
114
 
98
- def translated_selection name
99
- translates = @klass.translates? name
100
- @has_translated = true if translates
101
- translates ? @klass::TRANSLATED_SELECTION[I18n.locale][name.to_sym] : false
115
+ def translated_selection name, original = nil
116
+ sym = name.to_sym
117
+ translates = @klass.translates? sym
118
+ @has_translated = true
119
+ select = translates ? @klass::TRANSLATED_SELECTION[I18n.locale][sym] : false
120
+ if select
121
+ @columns << select
122
+ elsif !@select_all && @klass.columns_hash[name.to_s]
123
+ @columns << (original || name)
124
+ end
102
125
  end
103
126
  end
@@ -1,3 +1,3 @@
1
1
  module FromClauseTranslate
2
- VERSION = '0.2.4'.freeze
2
+ VERSION = '0.2.5'.freeze
3
3
  end
@@ -11,5 +11,6 @@ module FromClauseTranslate
11
11
  model.const_set :TRANSLATED_SELECTION, Hash[
12
12
  I18n.available_locales.map { |locale| [locale, {}] }
13
13
  ]
14
+ model.const_set :TRANSLATED_SELECTION_AS, model::TRANSLATED_SELECTION.dup
14
15
  end
15
16
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: from_clause_translate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roman Kushin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-03 00:00:00.000000000 Z
11
+ date: 2018-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails