ransack 2.1.1 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +13 -1
- data/CHANGELOG.md +24 -0
- data/Gemfile +4 -12
- data/README.md +5 -3
- data/lib/ransack.rb +1 -0
- data/lib/ransack/adapters/active_record/context.rb +40 -12
- data/lib/ransack/adapters/active_record/ransack/constants.rb +5 -2
- data/lib/ransack/adapters/active_record/ransack/nodes/condition.rb +1 -1
- data/lib/ransack/adapters/active_record/ransack/translate.rb +1 -1
- data/lib/ransack/constants.rb +1 -0
- data/lib/ransack/context.rb +19 -18
- data/lib/ransack/helpers/form_helper.rb +1 -1
- data/lib/ransack/locale/az.yml +1 -1
- data/lib/ransack/locale/ca.yml +70 -0
- data/lib/ransack/locale/es.yml +22 -22
- data/lib/ransack/locale/fa.yml +70 -0
- data/lib/ransack/locale/fi.yml +71 -0
- data/lib/ransack/translate.rb +115 -115
- data/lib/ransack/version.rb +1 -1
- data/{lib → polyamorous/lib}/polyamorous.rb +7 -3
- data/{lib → polyamorous/lib}/polyamorous/activerecord_5.0_ruby_2/join_association.rb +0 -0
- data/{lib → polyamorous/lib}/polyamorous/activerecord_5.0_ruby_2/join_dependency.rb +0 -0
- data/{lib → polyamorous/lib}/polyamorous/activerecord_5.1_ruby_2/join_association.rb +1 -2
- data/{lib → polyamorous/lib}/polyamorous/activerecord_5.1_ruby_2/join_dependency.rb +0 -0
- data/{lib → polyamorous/lib}/polyamorous/activerecord_5.2.0_ruby_2/join_association.rb +2 -3
- data/{lib → polyamorous/lib}/polyamorous/activerecord_5.2.0_ruby_2/join_dependency.rb +1 -2
- data/polyamorous/lib/polyamorous/activerecord_5.2.0_ruby_2/reflection.rb +12 -0
- data/{lib → polyamorous/lib}/polyamorous/activerecord_5.2.1_ruby_2/join_association.rb +0 -9
- data/{lib → polyamorous/lib}/polyamorous/activerecord_5.2.1_ruby_2/join_dependency.rb +25 -1
- data/polyamorous/lib/polyamorous/activerecord_5.2.1_ruby_2/reflection.rb +2 -0
- data/polyamorous/lib/polyamorous/activerecord_6.0_ruby_2/join_association.rb +2 -0
- data/polyamorous/lib/polyamorous/activerecord_6.0_ruby_2/join_dependency.rb +81 -0
- data/polyamorous/lib/polyamorous/activerecord_6.0_ruby_2/reflection.rb +2 -0
- data/polyamorous/lib/polyamorous/activerecord_6.1_ruby_2/join_association.rb +2 -0
- data/polyamorous/lib/polyamorous/activerecord_6.1_ruby_2/join_dependency.rb +2 -0
- data/polyamorous/lib/polyamorous/activerecord_6.1_ruby_2/reflection.rb +2 -0
- data/{lib → polyamorous/lib}/polyamorous/join.rb +0 -0
- data/{lib → polyamorous/lib}/polyamorous/swapping_reflection_class.rb +0 -0
- data/{lib → polyamorous/lib}/polyamorous/tree_node.rb +0 -0
- data/polyamorous/lib/polyamorous/version.rb +3 -0
- data/polyamorous/polyamorous.gemspec +35 -0
- data/ransack.gemspec +3 -3
- data/spec/helpers/polyamorous_helper.rb +6 -2
- data/spec/ransack/adapters/active_record/context_spec.rb +41 -0
- data/spec/ransack/join_dependency_spec.rb +18 -7
- data/spec/ransack/predicate_spec.rb +16 -2
- data/spec/ransack/search_spec.rb +26 -2
- data/spec/spec_helper.rb +1 -0
- data/spec/support/schema.rb +6 -0
- metadata +58 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be6fda6bbab697d2f125847b2761df81991190d8d9799b5480ac2044441978a0
|
4
|
+
data.tar.gz: 9f39f157e148aa2c4638b8e9c7ab5a8b14221f315e880c04e5f76f3db2a1b473
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2fc2082431692f609ddb39171876ade4e1eb4ce715ad917f196db6714a1f55872852c61dec20a047bf48b31f9cab812417fb94f1e9ae9786771320cbd6bc54a4
|
7
|
+
data.tar.gz: ea1ed1a393fe699432f7012facf66e01b48725d73eb7c8956f17435b447ce745fb65c235425cc28079ba1b1c74d64ba758710f25793f738ea92a49f5409abb68
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -3,9 +3,20 @@ language: ruby
|
|
3
3
|
sudo: false
|
4
4
|
|
5
5
|
rvm:
|
6
|
-
- 2.
|
6
|
+
- 2.6.0
|
7
|
+
|
8
|
+
services:
|
9
|
+
- mysql
|
7
10
|
|
8
11
|
env:
|
12
|
+
- RAILS=6-0-stable DB=sqlite3
|
13
|
+
- RAILS=6-0-stable DB=mysql
|
14
|
+
- RAILS=6-0-stable DB=postgres
|
15
|
+
|
16
|
+
- RAILS=v6.0.0 DB=sqlite3
|
17
|
+
- RAILS=v6.0.0 DB=mysql
|
18
|
+
- RAILS=v6.0.0 DB=postgres
|
19
|
+
|
9
20
|
- RAILS=5-2-stable DB=sqlite3
|
10
21
|
- RAILS=5-2-stable DB=mysql
|
11
22
|
- RAILS=5-2-stable DB=postgres
|
@@ -35,3 +46,4 @@ before_script:
|
|
35
46
|
addons:
|
36
47
|
code_climate:
|
37
48
|
repo_token: 8b701c4364d51a0217105e08c06922d600cec3d9e60d546a89e3ddfe46e0664e
|
49
|
+
postgresql: "9.6"
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,30 @@
|
|
2
2
|
|
3
3
|
## Unreleased
|
4
4
|
|
5
|
+
## 2.3.0 - 2019-08-18
|
6
|
+
|
7
|
+
* Arabic translations PR [979](https://github.com/activerecord-hackery/ransack/pull/979)
|
8
|
+
|
9
|
+
* Rails 6 PR [1027](https://github.com/activerecord-hackery/ransack/pull/1027)
|
10
|
+
*vrodokanakis*
|
11
|
+
|
12
|
+
* Make polyamorous a separate gem PR [1002](https://github.com/activerecord-hackery/ransack/pull/1002)
|
13
|
+
|
14
|
+
* Catalan translations PR[1007](https://github.com/activerecord-hackery/ransack/pull/1007)
|
15
|
+
*roslavych*
|
16
|
+
|
17
|
+
* Don't escape period characters with wildcard searches in mysql2 PR [1013](https://github.com/activerecord-hackery/ransack/pull/1013)
|
18
|
+
*daflip*
|
19
|
+
|
20
|
+
* Farsi translations PR [1030](https://github.com/activerecord-hackery/ransack/pull/1030)
|
21
|
+
|
22
|
+
* Finnish translations PR [1049](https://github.com/activerecord-hackery/ransack/pull/1049)
|
23
|
+
|
24
|
+
* Fix wrong table alias when using nested join. for ActiveRecord >= 5.2
|
25
|
+
PR [374](https://github.com/activerecord-hackery/ransack/pull/374)
|
26
|
+
|
27
|
+
*hiichan*
|
28
|
+
|
5
29
|
## Version 2.1.1 - 2018-12-05
|
6
30
|
|
7
31
|
* Add `arabic` translation
|
data/Gemfile
CHANGED
@@ -3,7 +3,7 @@ gemspec
|
|
3
3
|
|
4
4
|
gem 'rake'
|
5
5
|
|
6
|
-
rails = ENV['RAILS'] || '
|
6
|
+
rails = ENV['RAILS'] || '6-0-stable'
|
7
7
|
|
8
8
|
gem 'pry'
|
9
9
|
|
@@ -16,29 +16,21 @@ when /\// # A path
|
|
16
16
|
gem 'activerecord', path: "#{rails}/activerecord", require: false
|
17
17
|
gem 'actionpack', path: "#{rails}/actionpack"
|
18
18
|
when /^v/ # A tagged version
|
19
|
-
git '
|
19
|
+
git 'https://github.com/rails/rails.git', :tag => rails do
|
20
20
|
gem 'activesupport'
|
21
21
|
gem 'activemodel'
|
22
22
|
gem 'activerecord', require: false
|
23
23
|
gem 'actionpack'
|
24
24
|
end
|
25
|
-
if rails >= 'v5.2.0'
|
26
|
-
gem 'mysql2', '~> 0.4.4'
|
27
|
-
end
|
28
25
|
else
|
29
|
-
git '
|
26
|
+
git 'https://github.com/rails/rails.git', :branch => rails do
|
30
27
|
gem 'activesupport'
|
31
28
|
gem 'activemodel'
|
32
29
|
gem 'activerecord', require: false
|
33
30
|
gem 'actionpack'
|
34
31
|
end
|
35
|
-
if rails == '3-0-stable'
|
36
|
-
gem 'mysql2', '< 0.3'
|
37
|
-
end
|
38
|
-
if rails == '5-2-stable'
|
39
|
-
gem 'mysql2', '~> 0.4.4'
|
40
|
-
end
|
41
32
|
end
|
33
|
+
gem 'mysql2', '~> 0.5.2'
|
42
34
|
|
43
35
|
group :test do
|
44
36
|
# TestUnit was removed from Ruby 2.2 but still needed for testing Rails 3.x.
|
data/README.md
CHANGED
@@ -30,9 +30,13 @@ If you're viewing this at
|
|
30
30
|
you're reading the documentation for the master branch with the latest features.
|
31
31
|
[View documentation for the last release (2.0.0).](https://github.com/activerecord-hackery/ransack/tree/v2.0.0)
|
32
32
|
|
33
|
+
## Rails 6 Support
|
34
|
+
|
35
|
+
Rails 6 is right around the corner, but not yet released. Ransack master branch supports ```6.0.0.rc2```. Full Rails 6 support will be provided after the official Rails 6 release. See [this issue](https://github.com/activerecord-hackery/ransack/issues/1032) for details.
|
36
|
+
|
33
37
|
## Getting started
|
34
38
|
|
35
|
-
Ransack is compatible with Rails 5.0, 5.1 and 5.2 on Ruby 2.2 and later.
|
39
|
+
Ransack is compatible with Rails 6.0.0.rc2, 5.0, 5.1 and 5.2 on Ruby 2.2 and later.
|
36
40
|
If you are using Rails <5.0 use the 1.8 line of Ransack.
|
37
41
|
If you are using Ruby 1.8 or an earlier JRuby and run into compatibility
|
38
42
|
issues, you can use an earlier version of Ransack, say, up to 1.3.0.
|
@@ -717,8 +721,6 @@ class Employee < ActiveRecord::Base
|
|
717
721
|
%i(activated hired_since)
|
718
722
|
end
|
719
723
|
end
|
720
|
-
|
721
|
-
private_class_method :ransackable_scopes
|
722
724
|
end
|
723
725
|
|
724
726
|
Employee.ransack({ activated: true, hired_since: '2013-01-01' })
|
data/lib/ransack.rb
CHANGED
@@ -107,9 +107,15 @@ module Ransack
|
|
107
107
|
base, joins =
|
108
108
|
if ::ActiveRecord::VERSION::STRING > Constants::RAILS_5_2_0
|
109
109
|
alias_tracker = ::ActiveRecord::Associations::AliasTracker.create(self.klass.connection, @object.table.name, [])
|
110
|
+
constraints = if ::Gem::Version.new(::ActiveRecord::VERSION::STRING) >= ::Gem::Version.new(Constants::RAILS_6_0)
|
111
|
+
@join_dependency.join_constraints(@object.joins_values, alias_tracker)
|
112
|
+
else
|
113
|
+
@join_dependency.join_constraints(@object.joins_values, @join_type, alias_tracker)
|
114
|
+
end
|
115
|
+
|
110
116
|
[
|
111
117
|
Arel::SelectManager.new(@object.table),
|
112
|
-
|
118
|
+
constraints
|
113
119
|
]
|
114
120
|
else
|
115
121
|
[
|
@@ -163,7 +169,7 @@ module Ransack
|
|
163
169
|
def build_correlated_subquery(association)
|
164
170
|
join_constraints = extract_joins(association)
|
165
171
|
join_root = join_constraints.shift
|
166
|
-
correlated_key = join_root
|
172
|
+
correlated_key = extract_correlated_key(join_root)
|
167
173
|
subquery = Arel::SelectManager.new(association.base_klass)
|
168
174
|
subquery.from(join_root.left)
|
169
175
|
subquery.project(correlated_key)
|
@@ -179,6 +185,20 @@ module Ransack
|
|
179
185
|
|
180
186
|
private
|
181
187
|
|
188
|
+
def extract_correlated_key(join_root)
|
189
|
+
correlated_key = join_root.right.expr.left
|
190
|
+
|
191
|
+
if correlated_key.is_a? Arel::Nodes::And
|
192
|
+
correlated_key = correlated_key.left.left
|
193
|
+
elsif correlated_key.is_a? Arel::Nodes::Equality
|
194
|
+
correlated_key = correlated_key.left
|
195
|
+
elsif correlated_key.is_a? Arel::Nodes::Grouping
|
196
|
+
correlated_key = join_root.right.expr.right.left
|
197
|
+
else
|
198
|
+
correlated_key
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
182
202
|
def get_parent_and_attribute_name(str, parent = @base)
|
183
203
|
attr_name = nil
|
184
204
|
|
@@ -261,7 +281,11 @@ module Ransack
|
|
261
281
|
end
|
262
282
|
else
|
263
283
|
alias_tracker = ::ActiveRecord::Associations::AliasTracker.create(self.klass.connection, relation.table.name, join_list)
|
264
|
-
join_dependency =
|
284
|
+
join_dependency = if ::Gem::Version.new(::ActiveRecord::VERSION::STRING) >= ::Gem::Version.new(Constants::RAILS_6_0)
|
285
|
+
Polyamorous::JoinDependency.new(relation.klass, relation.table, association_joins, Arel::Nodes::OuterJoin)
|
286
|
+
else
|
287
|
+
Polyamorous::JoinDependency.new(relation.klass, relation.table, association_joins)
|
288
|
+
end
|
265
289
|
join_dependency.instance_variable_set(:@alias_tracker, alias_tracker)
|
266
290
|
join_nodes.each do |join|
|
267
291
|
join_dependency.send(:alias_tracker).aliases[join.left.name.downcase] = 1
|
@@ -289,7 +313,15 @@ module Ransack
|
|
289
313
|
end
|
290
314
|
|
291
315
|
def build_association(name, parent = @base, klass = nil)
|
292
|
-
if ::ActiveRecord::VERSION::STRING
|
316
|
+
if ::Gem::Version.new(::ActiveRecord::VERSION::STRING) >= ::Gem::Version.new(Constants::RAILS_6_0)
|
317
|
+
jd = Polyamorous::JoinDependency.new(
|
318
|
+
parent.base_klass,
|
319
|
+
parent.table,
|
320
|
+
Polyamorous::Join.new(name, @join_type, klass),
|
321
|
+
@join_type
|
322
|
+
)
|
323
|
+
found_association = jd.instance_variable_get(:@join_root).children.last
|
324
|
+
elsif ::Gem::Version.new(::ActiveRecord::VERSION::STRING) < ::Gem::Version.new(Constants::RAILS_5_2_0)
|
293
325
|
jd = Polyamorous::JoinDependency.new(
|
294
326
|
parent.base_klass,
|
295
327
|
Polyamorous::Join.new(name, @join_type, klass),
|
@@ -300,7 +332,7 @@ module Ransack
|
|
300
332
|
alias_tracker = ::ActiveRecord::Associations::AliasTracker.create(self.klass.connection, parent.table.name, [])
|
301
333
|
jd = Polyamorous::JoinDependency.new(
|
302
334
|
parent.base_klass,
|
303
|
-
parent.
|
335
|
+
parent.table,
|
304
336
|
Polyamorous::Join.new(name, @join_type, klass),
|
305
337
|
alias_tracker
|
306
338
|
)
|
@@ -308,13 +340,12 @@ module Ransack
|
|
308
340
|
else
|
309
341
|
jd = Polyamorous::JoinDependency.new(
|
310
342
|
parent.base_klass,
|
311
|
-
parent.
|
312
|
-
Polyamorous::Join.new(name, @join_type, klass)
|
343
|
+
parent.table,
|
344
|
+
Polyamorous::Join.new(name, @join_type, klass)
|
313
345
|
)
|
314
346
|
found_association = jd.instance_variable_get(:@join_root).children.last
|
315
347
|
end
|
316
348
|
|
317
|
-
|
318
349
|
@associations_pot[found_association] = parent
|
319
350
|
|
320
351
|
# TODO maybe we dont need to push associations here, we could loop
|
@@ -325,14 +356,11 @@ module Ransack
|
|
325
356
|
if ::ActiveRecord::VERSION::STRING > Constants::RAILS_5_2_0
|
326
357
|
@join_dependency.send(:construct_tables!, jd.instance_variable_get(:@join_root))
|
327
358
|
else
|
328
|
-
@join_dependency.send(
|
329
|
-
:construct_tables!, jd.instance_variable_get(:@join_root), found_association
|
330
|
-
)
|
359
|
+
@join_dependency.send(:construct_tables!, jd.instance_variable_get(:@join_root), found_association)
|
331
360
|
end
|
332
361
|
|
333
362
|
# Leverage the stashed association functionality in AR
|
334
363
|
@object = @object.joins(jd)
|
335
|
-
|
336
364
|
found_association
|
337
365
|
end
|
338
366
|
|
@@ -102,8 +102,11 @@ module Ransack
|
|
102
102
|
# replace % \ to \% \\
|
103
103
|
def escape_wildcards(unescaped)
|
104
104
|
case ActiveRecord::Base.connection.adapter_name
|
105
|
-
when "Mysql2".freeze
|
106
|
-
# Necessary for
|
105
|
+
when "Mysql2".freeze
|
106
|
+
# Necessary for MySQL
|
107
|
+
unescaped.to_s.gsub(/([\\%_])/, '\\\\\\1')
|
108
|
+
when "PostgreSQL".freeze
|
109
|
+
# Necessary for PostgreSQL
|
107
110
|
unescaped.to_s.gsub(/([\\%_.])/, '\\\\\\1')
|
108
111
|
else
|
109
112
|
unescaped
|
data/lib/ransack/constants.rb
CHANGED
@@ -48,6 +48,7 @@ module Ransack
|
|
48
48
|
RAILS_5_1 = '5.1'.freeze
|
49
49
|
RAILS_5_2 = '5.2'.freeze
|
50
50
|
RAILS_5_2_0 = '5.2.0'.freeze
|
51
|
+
RAILS_6_0 = '6.0.0'.freeze
|
51
52
|
|
52
53
|
RANSACK_SLASH_SEARCHES = 'ransack/searches'.freeze
|
53
54
|
RANSACK_SLASH_SEARCHES_SLASH_SEARCH = 'ransack/searches/search'.freeze
|
data/lib/ransack/context.rb
CHANGED
@@ -64,26 +64,28 @@ module Ransack
|
|
64
64
|
|
65
65
|
def traverse(str, base = @base)
|
66
66
|
str ||= ''.freeze
|
67
|
-
|
68
|
-
|
67
|
+
segments = str.split(Constants::UNDERSCORE)
|
68
|
+
unless segments.empty?
|
69
69
|
remainder = []
|
70
70
|
found_assoc = nil
|
71
|
-
|
71
|
+
until found_assoc || segments.empty?
|
72
72
|
# Strip the _of_Model_type text from the association name, but hold
|
73
73
|
# onto it in klass, for use as the next base
|
74
74
|
assoc, klass = unpolymorphize_association(
|
75
75
|
segments.join(Constants::UNDERSCORE)
|
76
|
-
|
76
|
+
)
|
77
77
|
if found_assoc = get_association(assoc, base)
|
78
78
|
base = traverse(
|
79
79
|
remainder.join(Constants::UNDERSCORE), klass || found_assoc.klass
|
80
|
-
|
80
|
+
)
|
81
81
|
end
|
82
82
|
|
83
83
|
remainder.unshift segments.pop
|
84
84
|
end
|
85
|
-
|
86
|
-
|
85
|
+
unless found_assoc
|
86
|
+
raise(UntraversableAssociationError,
|
87
|
+
"No association matches #{str}")
|
88
|
+
end
|
87
89
|
end
|
88
90
|
|
89
91
|
klassify(base)
|
@@ -95,18 +97,17 @@ module Ransack
|
|
95
97
|
path = []
|
96
98
|
segments = str.split(Constants::UNDERSCORE)
|
97
99
|
association_parts = []
|
98
|
-
|
99
|
-
while segments.
|
100
|
-
|
101
|
-
|
100
|
+
unless segments.empty?
|
101
|
+
while !segments.empty? &&
|
102
|
+
!base.columns_hash[segments.join(Constants::UNDERSCORE)] &&
|
103
|
+
association_parts << segments.shift
|
102
104
|
assoc, klass = unpolymorphize_association(
|
103
105
|
association_parts.join(Constants::UNDERSCORE)
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
end
|
106
|
+
)
|
107
|
+
next unless found_assoc = get_association(assoc, base)
|
108
|
+
path += association_parts
|
109
|
+
association_parts = []
|
110
|
+
base = klassify(klass || found_assoc)
|
110
111
|
end
|
111
112
|
end
|
112
113
|
|
@@ -127,7 +128,7 @@ module Ransack
|
|
127
128
|
|
128
129
|
def ransackable_attribute?(str, klass)
|
129
130
|
klass.ransackable_attributes(auth_object).include?(str) ||
|
130
|
-
|
131
|
+
klass.ransortable_attributes(auth_object).include?(str)
|
131
132
|
end
|
132
133
|
|
133
134
|
def ransackable_association?(str, klass)
|
@@ -145,7 +145,7 @@ module Ransack
|
|
145
145
|
private
|
146
146
|
|
147
147
|
def parameters_hash(params)
|
148
|
-
if ::ActiveRecord::VERSION::MAJOR
|
148
|
+
if ::ActiveRecord::VERSION::MAJOR >= 5 && params.respond_to?(:to_unsafe_h)
|
149
149
|
params.to_unsafe_h
|
150
150
|
else
|
151
151
|
params
|
data/lib/ransack/locale/az.yml
CHANGED
@@ -0,0 +1,70 @@
|
|
1
|
+
ca:
|
2
|
+
ransack:
|
3
|
+
search: "cercar"
|
4
|
+
predicate: "predicat"
|
5
|
+
and: "i"
|
6
|
+
or: "o"
|
7
|
+
any: "qualsevol"
|
8
|
+
all: "tots"
|
9
|
+
combinator: "combinador"
|
10
|
+
attribute: "atribut"
|
11
|
+
value: "valor"
|
12
|
+
condition: "condició"
|
13
|
+
sort: "ordenar"
|
14
|
+
asc: "ascendent"
|
15
|
+
desc: "descendent"
|
16
|
+
predicates:
|
17
|
+
eq: "és igual a"
|
18
|
+
eq_any: "és igual a qualsevol"
|
19
|
+
eq_all: "és igual a tots"
|
20
|
+
not_eq: "no és igual a"
|
21
|
+
not_eq_any: "no és igual a qualsevol"
|
22
|
+
not_eq_all: "no és igual a tots"
|
23
|
+
matches: "coincideix"
|
24
|
+
matches_any: "coincideix a qualsevol"
|
25
|
+
matches_all: "coincideix a tots"
|
26
|
+
does_not_match: "no coincideix"
|
27
|
+
does_not_match_any: "no coincideix amb cap"
|
28
|
+
does_not_match_all: "no coincideix amb tots"
|
29
|
+
lt: "menor que"
|
30
|
+
lt_any: "menor que qualsevol"
|
31
|
+
lt_all: "menor o igual a"
|
32
|
+
lteq: "menor que o igual a"
|
33
|
+
lteq_any: "menor o igual a qualsevol"
|
34
|
+
lteq_all: "menor o igual a tots"
|
35
|
+
gt: "major que"
|
36
|
+
gt_any: "major que qualsevol"
|
37
|
+
gt_all: "major que tots"
|
38
|
+
gteq: "major que o igual a"
|
39
|
+
gteq_any: "major que o igual a qualsevol"
|
40
|
+
gteq_all: "major que o igual a tots"
|
41
|
+
in: "en"
|
42
|
+
in_any: "en qualsevol"
|
43
|
+
in_all: "en tots"
|
44
|
+
not_in: "no en"
|
45
|
+
not_in_any: "no en qualsevol"
|
46
|
+
not_in_all: "no en tots"
|
47
|
+
cont: "conté"
|
48
|
+
cont_any: "conté qualsevol"
|
49
|
+
cont_all: "conté tots"
|
50
|
+
not_cont: "no conté"
|
51
|
+
not_cont_any: "no conté cap"
|
52
|
+
not_cont_all: "no conté tota"
|
53
|
+
start: "comença per"
|
54
|
+
start_any: "comença per qualsevol"
|
55
|
+
start_all: "comença per tot"
|
56
|
+
not_start: "no comença per"
|
57
|
+
not_start_any: "no comença per qualsevol"
|
58
|
+
not_start_all: "no comença per tot"
|
59
|
+
end: "acaba en"
|
60
|
+
end_any: "acaba en qualsevol"
|
61
|
+
end_all: "acaba en tot"
|
62
|
+
not_end: "no acaba en"
|
63
|
+
not_end_any: "no acaba en qualsevol"
|
64
|
+
not_end_all: "no acaba en tot"
|
65
|
+
'true': "és verdader"
|
66
|
+
'false': "és fals"
|
67
|
+
present: "és present"
|
68
|
+
blank: "està en blanc"
|
69
|
+
'null': "és nul"
|
70
|
+
not_null: "no és nul"
|