from_clause_translate 0.2.4 → 0.2.5

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
  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