rails-simple-search 1.1.10 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/lib/sql_handler.rb +31 -13
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7bbf2eecbbb512c647a434d6f6d1f928652cfeafa00c8c52226a88c1ec6bc23c
4
- data.tar.gz: 8b32419b7e0daa8baa581dfd96e04b08513960bbc1a628bda321c12493de6a08
3
+ metadata.gz: 290634cd836385acaa327ac5b5971e75a716291d51629d8c54dc3c8db728e466
4
+ data.tar.gz: 9a8c7d6985147d3669c9cf1d98cf41fed6854e1039bdddf7fc271b6b4c4d5f01
5
5
  SHA512:
6
- metadata.gz: 9032b02b2027ee62b51680ed8310ccf7579a8eef33494f6536dfc91f414f853bff2496ee53fb875dccfd52f84e60dacea7d3221eba27d51bc5ceafc73873be63
7
- data.tar.gz: 796835f0e60438a36e52783eac52e0fdecf9e4ff3fd9789aa53f95396cdae797d1567c9477dea2fb3e773893950bc8aea54b3ed1f7f0c54b4c164deab0c1c28f
6
+ metadata.gz: 890be5b99ab922d000adad63885a50a4bd678a1294b4915c32db93d808ac89774934626a0b73b3dd117728beb7d6b62a2df15c3b9353fb0113a80a05f11a57fa
7
+ data.tar.gz: 2e72fd3aef31f0b0b3fdf7b34e80a5f1035cac36b869a62d543d178c5bee132a78caf00605bd1bc93e60e675b52ced76a9fffffb0d22be23acad1e65adf0269b
data/README.md CHANGED
@@ -89,7 +89,7 @@ The following is how we implement this searching function with rails-simple-sear
89
89
  <%=f.text_field "address.city" %> <!-- address is an association of model User -->
90
90
 
91
91
  <%=f.label "name of any one who commented to my posts" %>
92
- <%=f.text_field "posts.comments.author.first_name_or_posts.comments.author.last_name" %>
92
+ <%=f.text_field "posts.comments.user.first_name_or_posts.comments.user.last_name" %>
93
93
  <!-- the associations could go even deeper, isn't it POWERFUL? -->
94
94
 
95
95
  <%=f.submit %>
@@ -122,7 +122,7 @@ From version 1.1.0 on, we started to support the "or" relation, e.g., we can use
122
122
 
123
123
  From version 1.1.3 on, we started to support Rails 5.
124
124
 
125
- For Rails 7, please use version 1.1.9.
125
+ For Rails 7, please use version 1.2.0.
126
126
 
127
127
  ## License
128
128
 
data/lib/sql_handler.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module RailsSimpleSearch
2
2
  module SqlHandler
3
3
  def init
4
- @table_name = @model_class.table_name
4
+ @model_table_name = @model_class.table_name
5
5
  @joins = {}
6
6
  end
7
7
 
@@ -36,7 +36,7 @@ module RailsSimpleSearch
36
36
  joins.each do |j|
37
37
  table = j[1]
38
38
  constrain = j[2]
39
- @joins_str << " inner join #{table} on #{constrain}"
39
+ @joins_str << format(" inner join #{table} AS A%02d on #{constrain}", j[0])
40
40
  end
41
41
  end
42
42
 
@@ -45,16 +45,17 @@ module RailsSimpleSearch
45
45
  @condition_group.set_relation(:and)
46
46
 
47
47
  @criteria.each do |key, value|
48
- @condition_group.add(parse_attribute(key, value))
48
+ @condition_group.add(parse_search_parameters(key, value))
49
49
  end
50
50
 
51
51
  make_joins
52
52
  end
53
53
 
54
- def insert_condition(base_class, field, value)
54
+ def build_single_condition(base_class, association_alias, field, value)
55
55
  field, operator = parse_field_name(field)
56
56
  table = base_class.table_name
57
57
  key = "#{table}.#{field}"
58
+ final_key = "#{association_alias}.#{field}"
58
59
 
59
60
  column = base_class.columns_hash[field.to_s]
60
61
  return nil unless column
@@ -65,14 +66,18 @@ module RailsSimpleSearch
65
66
  verb = 'in'
66
67
  elsif operator
67
68
  verb = operator
68
- elsif text_column?(column) && ! @config[:exact_match].include?((@table_name == table) ? field : key)
69
+ elsif text_column?(column) && ! @config[:exact_match].include?((@model_table_name == table) ? field : key)
69
70
  verb = 'like'
70
71
  value = "%#{value}%"
71
72
  else
72
73
  verb = '='
73
74
  end
74
75
 
75
- ConditionGroup.new(ConditionItem.new(key, verb, value))
76
+ ConditionGroup.new(ConditionItem.new(final_key, verb, value))
77
+ end
78
+
79
+ def table_name_to_alias(table_name)
80
+ format('A%02d', @joins[table_name][0])
76
81
  end
77
82
 
78
83
  def insert_join(base_class, asso_ref)
@@ -84,31 +89,39 @@ module RailsSimpleSearch
84
89
  return unless @joins[asso_table].nil?
85
90
 
86
91
  @join_count += 1
92
+ base_table_alias = @join_count < 2 ? base_table : table_name_to_alias(base_table)
93
+ asso_table_alias = format('A%02d', @join_count)
94
+
87
95
  if asso_ref.belongs_to?
88
- @joins[asso_table] =[@join_count, asso_table, "#{base_table}.#{asso_ref.foreign_key} = #{asso_table}.#{asso_ref.klass.primary_key}"]
96
+ @joins[asso_table] =[@join_count, asso_table, "#{base_table_alias}.#{asso_ref.foreign_key} = #{asso_table_alias}.#{asso_ref.klass.primary_key}"]
89
97
  else
90
- join_cond = "#{base_table}.#{base_class.primary_key} = #{asso_table}.#{asso_ref.foreign_key}"
91
- join_cond = "#{asso_table}.#{asso_ref.type} = '#{base_class.name}' and #{join_cond}" if asso_ref.type
98
+ join_cond = "#{base_table_alias}.#{base_class.primary_key} = #{asso_table_alias}.#{asso_ref.foreign_key}"
99
+ join_cond = "#{asso_table_alias}.#{asso_ref.type} = '#{base_class.name}' and #{join_cond}" if asso_ref.type
92
100
  @joins[asso_table] = [@join_count, asso_table, join_cond]
93
101
  end
94
102
  end
95
103
 
96
- def parse_attribute(attribute, value)
104
+ # This method parse a search parameter and its value
105
+ # then produce a ConditionGroup
106
+ def parse_search_parameters(attribute, value)
107
+ # handle _or_ parameters
97
108
  attributes = attribute.split(@config[:or_separator])
98
109
  if attributes.size > 1
99
110
  cg = ConditionGroup.new
100
111
  cg.set_relation(:or)
101
112
  attributes.each do |a|
102
- cg.add(parse_attribute(a, value))
113
+ cg.add(parse_search_parameters(a, value))
103
114
  end
104
115
  return cg
105
116
  end
106
117
 
118
+ # handle direct fields
107
119
  unless attribute =~ /\./
108
- condition = insert_condition(@model_class, attribute, value)
120
+ condition = build_single_condition(@model_class, @model_class.table_name, attribute, value)
109
121
  return condition
110
122
  end
111
123
 
124
+ # handle association fields
112
125
  association_fields = attribute.split(/\./)
113
126
  field = association_fields.pop
114
127
 
@@ -119,10 +132,12 @@ module RailsSimpleSearch
119
132
  base_class = association_fields.shift.klass
120
133
  end
121
134
 
122
- insert_condition(base_class, field, value)
135
+ association_alias = table_name_to_alias(base_class.table_name)
136
+ build_single_condition(base_class, association_alias, field, value)
123
137
  end
124
138
  end
125
139
 
140
+ # This class holds a single condition
126
141
  class ConditionItem
127
142
  attr_reader :field, :verb, :value
128
143
 
@@ -133,6 +148,9 @@ module RailsSimpleSearch
133
148
  end
134
149
  end
135
150
 
151
+ # This class holds a ConditionGroup
152
+ # One ConditionGroup can hold one or more
153
+ # conditions
136
154
  class ConditionGroup
137
155
  def initialize(item = nil)
138
156
  if item
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-simple-search
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.10
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yi Zhang
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-26 00:00:00.000000000 Z
11
+ date: 2023-12-27 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: rails-simple-search is a light and easy to use gem. It could help developers
14
14
  quickly build a search page.