params_ready_rails5 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/arel/cte_name.rb +20 -0
- data/lib/params_ready/builder.rb +161 -0
- data/lib/params_ready/error.rb +31 -0
- data/lib/params_ready/extensions/class_reader_writer.rb +33 -0
- data/lib/params_ready/extensions/collection.rb +43 -0
- data/lib/params_ready/extensions/delegation.rb +25 -0
- data/lib/params_ready/extensions/finalizer.rb +26 -0
- data/lib/params_ready/extensions/freezer.rb +49 -0
- data/lib/params_ready/extensions/hash.rb +46 -0
- data/lib/params_ready/extensions/late_init.rb +38 -0
- data/lib/params_ready/extensions/registry.rb +44 -0
- data/lib/params_ready/extensions/undefined.rb +23 -0
- data/lib/params_ready/format.rb +132 -0
- data/lib/params_ready/helpers/arel_builder.rb +68 -0
- data/lib/params_ready/helpers/callable.rb +14 -0
- data/lib/params_ready/helpers/conditional_block.rb +31 -0
- data/lib/params_ready/helpers/find_in_hash.rb +22 -0
- data/lib/params_ready/helpers/interface_definer.rb +48 -0
- data/lib/params_ready/helpers/key_map.rb +176 -0
- data/lib/params_ready/helpers/memo.rb +41 -0
- data/lib/params_ready/helpers/options.rb +107 -0
- data/lib/params_ready/helpers/parameter_definer_class_methods.rb +39 -0
- data/lib/params_ready/helpers/parameter_storage_class_methods.rb +63 -0
- data/lib/params_ready/helpers/parameter_user_class_methods.rb +35 -0
- data/lib/params_ready/helpers/relation_builder_wrapper.rb +35 -0
- data/lib/params_ready/helpers/rule.rb +76 -0
- data/lib/params_ready/helpers/storage.rb +30 -0
- data/lib/params_ready/helpers/usage_rule.rb +36 -0
- data/lib/params_ready/input_context.rb +31 -0
- data/lib/params_ready/intent.rb +70 -0
- data/lib/params_ready/marshaller/array_marshallers.rb +132 -0
- data/lib/params_ready/marshaller/builder_module.rb +9 -0
- data/lib/params_ready/marshaller/collection.rb +165 -0
- data/lib/params_ready/marshaller/definition_module.rb +63 -0
- data/lib/params_ready/marshaller/enum_set_marshallers.rb +96 -0
- data/lib/params_ready/marshaller/parameter_module.rb +11 -0
- data/lib/params_ready/marshaller/polymorph_marshallers.rb +67 -0
- data/lib/params_ready/marshaller/struct_marshallers.rb +100 -0
- data/lib/params_ready/marshaller/tuple_marshallers.rb +103 -0
- data/lib/params_ready/ordering/column.rb +60 -0
- data/lib/params_ready/ordering/ordering.rb +276 -0
- data/lib/params_ready/output_parameters.rb +138 -0
- data/lib/params_ready/pagination/abstract_pagination.rb +18 -0
- data/lib/params_ready/pagination/cursor.rb +171 -0
- data/lib/params_ready/pagination/direction.rb +148 -0
- data/lib/params_ready/pagination/keyset_pagination.rb +254 -0
- data/lib/params_ready/pagination/keysets.rb +70 -0
- data/lib/params_ready/pagination/nulls.rb +31 -0
- data/lib/params_ready/pagination/offset_pagination.rb +130 -0
- data/lib/params_ready/pagination/tendency.rb +28 -0
- data/lib/params_ready/parameter/abstract_struct_parameter.rb +204 -0
- data/lib/params_ready/parameter/array_parameter.rb +197 -0
- data/lib/params_ready/parameter/definition.rb +272 -0
- data/lib/params_ready/parameter/enum_set_parameter.rb +102 -0
- data/lib/params_ready/parameter/parameter.rb +475 -0
- data/lib/params_ready/parameter/polymorph_parameter.rb +172 -0
- data/lib/params_ready/parameter/state.rb +132 -0
- data/lib/params_ready/parameter/struct_parameter.rb +64 -0
- data/lib/params_ready/parameter/tuple_parameter.rb +152 -0
- data/lib/params_ready/parameter/value_parameter.rb +186 -0
- data/lib/params_ready/parameter_definer.rb +14 -0
- data/lib/params_ready/parameter_user.rb +35 -0
- data/lib/params_ready/query/array_grouping.rb +68 -0
- data/lib/params_ready/query/custom_predicate.rb +102 -0
- data/lib/params_ready/query/exists_predicate.rb +103 -0
- data/lib/params_ready/query/fixed_operator_predicate.rb +77 -0
- data/lib/params_ready/query/grouping.rb +177 -0
- data/lib/params_ready/query/join_clause.rb +87 -0
- data/lib/params_ready/query/nullness_predicate.rb +71 -0
- data/lib/params_ready/query/polymorph_predicate.rb +77 -0
- data/lib/params_ready/query/predicate.rb +203 -0
- data/lib/params_ready/query/predicate_operator.rb +132 -0
- data/lib/params_ready/query/relation.rb +337 -0
- data/lib/params_ready/query/structured_grouping.rb +58 -0
- data/lib/params_ready/query/variable_operator_predicate.rb +125 -0
- data/lib/params_ready/query_context.rb +21 -0
- data/lib/params_ready/restriction.rb +252 -0
- data/lib/params_ready/result.rb +109 -0
- data/lib/params_ready/value/coder.rb +210 -0
- data/lib/params_ready/value/constraint.rb +198 -0
- data/lib/params_ready/value/custom.rb +56 -0
- data/lib/params_ready/value/validator.rb +81 -0
- data/lib/params_ready/version.rb +7 -0
- data/lib/params_ready.rb +28 -0
- metadata +227 -0
@@ -0,0 +1,71 @@
|
|
1
|
+
require_relative 'predicate'
|
2
|
+
require_relative '../parameter/value_parameter'
|
3
|
+
|
4
|
+
module ParamsReady
|
5
|
+
module Query
|
6
|
+
class NullnessPredicate < Parameter::AbstractParameter
|
7
|
+
include Predicate::DelegatingPredicate
|
8
|
+
include Predicate::HavingAttribute
|
9
|
+
|
10
|
+
def initialize(definition)
|
11
|
+
super definition
|
12
|
+
@data = definition.value_parameter.create
|
13
|
+
end
|
14
|
+
|
15
|
+
def build_query(select_expression, context: nil)
|
16
|
+
query = select_expression.eq(nil)
|
17
|
+
if !unwrap
|
18
|
+
query.not
|
19
|
+
else
|
20
|
+
query
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def perform_test(record, attribute_name)
|
25
|
+
if unwrap
|
26
|
+
return true if record.nil?
|
27
|
+
record.send(attribute_name).nil?
|
28
|
+
else
|
29
|
+
return false if record.nil?
|
30
|
+
!record.send(attribute_name).nil?
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def inspect_content
|
35
|
+
"#{definition.attribute_name} is_null? #{@data.inspect}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class NullnessPredicateBuilder < AbstractPredicateBuilder
|
40
|
+
include HavingAttribute
|
41
|
+
PredicateRegistry.register_predicate :nullness_predicate, self
|
42
|
+
|
43
|
+
include HavingValue
|
44
|
+
|
45
|
+
def self.instance(name, altn: nil, attr: nil)
|
46
|
+
new NullnessPredicateDefinition.new name, altn: altn, attribute_name: attr
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class NullnessPredicateDefinition < AbstractPredicateDefinition
|
51
|
+
include HavingAttribute
|
52
|
+
include Parameter::DelegatingDefinition[:value_parameter]
|
53
|
+
|
54
|
+
attr_reader :value_parameter
|
55
|
+
freeze_variables :value_parameter
|
56
|
+
|
57
|
+
def initialize(*args, attribute_name: nil, **opts)
|
58
|
+
super *args, **opts
|
59
|
+
@attribute_name = attribute_name
|
60
|
+
@value_parameter = Builder.builder(:boolean).instance(self.name, altn: self.altn).fetch
|
61
|
+
end
|
62
|
+
|
63
|
+
def finish
|
64
|
+
@value_parameter.finish
|
65
|
+
super
|
66
|
+
end
|
67
|
+
|
68
|
+
parameter_class NullnessPredicate
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require_relative 'predicate'
|
3
|
+
require_relative '../parameter/polymorph_parameter'
|
4
|
+
|
5
|
+
module ParamsReady
|
6
|
+
module Query
|
7
|
+
class PolymorphPredicate < Parameter::AbstractParameter
|
8
|
+
include Predicate::DelegatingPredicate
|
9
|
+
include Predicate::HavingChildren
|
10
|
+
|
11
|
+
def_delegators :@data,
|
12
|
+
:intent_for_children,
|
13
|
+
:permission_depends_on
|
14
|
+
|
15
|
+
def initialize(definition, **_)
|
16
|
+
super definition
|
17
|
+
@data = definition.polymorph_parameter.create
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_query(arel_table, context: Restriction.blanket_permission)
|
21
|
+
data[data.type].to_query_if_eligible(arel_table, context: context)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test(record)
|
25
|
+
return nil unless is_definite?
|
26
|
+
|
27
|
+
data[data.type].test(record)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class PolymorphPredicateBuilder < AbstractPredicateBuilder
|
32
|
+
PredicateRegistry.register_predicate :polymorph_predicate, self
|
33
|
+
include HavingValue
|
34
|
+
|
35
|
+
def self.instance(name, altn: nil)
|
36
|
+
new PolymorphPredicateDefinition.new name, altn: altn
|
37
|
+
end
|
38
|
+
|
39
|
+
def type(type_name, *args, **opts, &block)
|
40
|
+
builder = PredicateRegistry.predicate(type_name).instance(*args, **opts)
|
41
|
+
builder.instance_eval(&block) unless block.nil?
|
42
|
+
type = builder.build
|
43
|
+
@definition.add_type type
|
44
|
+
end
|
45
|
+
|
46
|
+
def identifier(identifier)
|
47
|
+
@definition.set_identifier(identifier)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class PolymorphPredicateDefinition < AbstractPredicateDefinition
|
52
|
+
extend Forwardable
|
53
|
+
|
54
|
+
attr_reader :polymorph_parameter, :name, :altn
|
55
|
+
freeze_variable :polymorph_parameter
|
56
|
+
def_delegators :@polymorph_parameter,
|
57
|
+
:add_type,
|
58
|
+
:set_optional,
|
59
|
+
:set_default,
|
60
|
+
:set_identifier,
|
61
|
+
:set_marshaller
|
62
|
+
|
63
|
+
def initialize(*args, **opts)
|
64
|
+
super
|
65
|
+
@polymorph_parameter = Parameter::PolymorphParameterDefinition.new(name, altn: altn)
|
66
|
+
@optional = false
|
67
|
+
end
|
68
|
+
|
69
|
+
def finish
|
70
|
+
@polymorph_parameter.finish
|
71
|
+
super
|
72
|
+
end
|
73
|
+
|
74
|
+
parameter_class PolymorphPredicate
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,203 @@
|
|
1
|
+
require_relative '../extensions/registry'
|
2
|
+
require_relative '../parameter/array_parameter'
|
3
|
+
require_relative '../parameter/enum_set_parameter'
|
4
|
+
require_relative '../helpers/arel_builder'
|
5
|
+
|
6
|
+
module ParamsReady
|
7
|
+
module Query
|
8
|
+
class AbstractPredicateBuilder < AbstractBuilder
|
9
|
+
module HavingType
|
10
|
+
def type(type_name, *args, **opts, &block)
|
11
|
+
name, altn = data_object_handles
|
12
|
+
builder = type_builder_instance(type_name, name, *args, altn: altn, **opts)
|
13
|
+
builder.instance_eval(&block) unless block.nil?
|
14
|
+
@definition.set_type builder.fetch
|
15
|
+
end
|
16
|
+
|
17
|
+
def type_builder_instance(type_name, name, *args, altn:, **opts)
|
18
|
+
AbstractPredicateBuilder.type(type_name)
|
19
|
+
.instance(name, *args, altn: altn, **opts)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module HavingAttribute
|
24
|
+
def associations(*arr)
|
25
|
+
arr.each do |name|
|
26
|
+
@definition.add_association name
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def attribute(name: nil, expression: nil, &block)
|
31
|
+
expression = if expression
|
32
|
+
raise ParamsReadyError, 'Block unexpected' unless block.nil?
|
33
|
+
expression
|
34
|
+
else
|
35
|
+
raise ParamsReadyError, 'Expression unexpected' unless expression.nil?
|
36
|
+
block
|
37
|
+
end
|
38
|
+
@definition.set_attribute(name, expression)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
include HavingArelTable
|
43
|
+
|
44
|
+
extend Extensions::Registry
|
45
|
+
registry :types, as: :type, getter: true
|
46
|
+
register_type :value, Parameter::ValueParameterBuilder
|
47
|
+
register_type :array, Parameter::ArrayParameterBuilder
|
48
|
+
register_type :enum_set, Parameter::EnumSetParameterBuilder
|
49
|
+
end
|
50
|
+
|
51
|
+
class AbstractPredicateDefinition < Parameter::AbstractDefinition
|
52
|
+
late_init :arel_table, obligatory: false, freeze: false
|
53
|
+
|
54
|
+
module HavingAttribute
|
55
|
+
def self.included(base)
|
56
|
+
base.collection :associations, :association
|
57
|
+
end
|
58
|
+
|
59
|
+
def set_attribute(name, select_expression)
|
60
|
+
@attribute_name = name
|
61
|
+
@select_expression = select_expression
|
62
|
+
end
|
63
|
+
|
64
|
+
def attribute_name
|
65
|
+
@attribute_name || @name
|
66
|
+
end
|
67
|
+
|
68
|
+
def select_expression
|
69
|
+
@select_expression || attribute_name
|
70
|
+
end
|
71
|
+
|
72
|
+
def build_select_expression(arel_table, context)
|
73
|
+
arel_builder = Helpers::ArelBuilder.instance(select_expression, arel_table: @arel_table)
|
74
|
+
arel = arel_builder.to_arel(arel_table, context, self)
|
75
|
+
|
76
|
+
arel
|
77
|
+
end
|
78
|
+
|
79
|
+
def alias_select_expression(arel_table, context)
|
80
|
+
build_select_expression(arel_table, context).as(attribute_name.to_s)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
module Predicate
|
86
|
+
module HavingChildren
|
87
|
+
def context_for_predicates(context)
|
88
|
+
intent_for_children(context)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
module HavingAssociations
|
93
|
+
def dig(record, associations)
|
94
|
+
associations.reduce(record) do |record, assoc|
|
95
|
+
next record if record.nil?
|
96
|
+
|
97
|
+
record.send assoc
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
module HavingAttribute
|
103
|
+
extend Forwardable
|
104
|
+
def_delegators :definition, :build_select_expression, :alias_select_expression
|
105
|
+
include HavingAssociations
|
106
|
+
|
107
|
+
def to_query(arel_table, context: Restriction.blanket_permission)
|
108
|
+
table = definition.arel_table || arel_table
|
109
|
+
select_expression = build_select_expression(table, context)
|
110
|
+
build_query(select_expression, context: context)
|
111
|
+
end
|
112
|
+
|
113
|
+
def context_for_predicates(context)
|
114
|
+
# We consider a an attribute having parameter atomic
|
115
|
+
# so it's permitted per se including its contents
|
116
|
+
context.permit_all
|
117
|
+
end
|
118
|
+
|
119
|
+
def test(record)
|
120
|
+
return nil unless is_definite?
|
121
|
+
|
122
|
+
attribute_name = definition.attribute_name
|
123
|
+
record = dig(record, definition.associations)
|
124
|
+
|
125
|
+
perform_test(record, attribute_name)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
module DelegatingPredicate
|
130
|
+
def self.included(base)
|
131
|
+
base.include Parameter::DelegatingParameter
|
132
|
+
end
|
133
|
+
|
134
|
+
def eligible_for_query?(_table, context)
|
135
|
+
return false unless context.permitted? self
|
136
|
+
|
137
|
+
is_definite?
|
138
|
+
end
|
139
|
+
|
140
|
+
def to_query_if_eligible(arel_table, context:)
|
141
|
+
return unless eligible_for_query?(arel_table, context)
|
142
|
+
|
143
|
+
context = context_for_predicates(context)
|
144
|
+
to_query(arel_table, context: context)
|
145
|
+
end
|
146
|
+
attr_reader :data
|
147
|
+
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
class PredicateRegistry
|
152
|
+
extend Extensions::Registry
|
153
|
+
|
154
|
+
registry :operator_names, as: :operator_by_name, name_method: :name
|
155
|
+
registry :operator_alt_names, as: :operator_by_alt_name, name_method: :altn
|
156
|
+
registry :predicates, as: :predicate, getter: true
|
157
|
+
|
158
|
+
def self.operator_by(identifier, format)
|
159
|
+
if format.alternative?
|
160
|
+
@@operator_alt_names[identifier]
|
161
|
+
else
|
162
|
+
@@operator_names[identifier]
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def self.operator(identifier, format, collision_check = false)
|
167
|
+
operator = find_operator(identifier, format, collision_check)
|
168
|
+
if operator.nil? && !collision_check
|
169
|
+
raise("No such operator: #{identifier}")
|
170
|
+
end
|
171
|
+
|
172
|
+
operator
|
173
|
+
end
|
174
|
+
|
175
|
+
def self.find_operator(identifier, format, collision_check)
|
176
|
+
operator = operator_by(identifier, format)
|
177
|
+
if operator.nil?
|
178
|
+
name_as_string = identifier.to_s
|
179
|
+
invertor = if format.alternative?
|
180
|
+
'n_'
|
181
|
+
else
|
182
|
+
'not_'
|
183
|
+
end
|
184
|
+
if !collision_check && name_as_string.start_with?(invertor)
|
185
|
+
bare_name = name_as_string[invertor.length..-1].to_sym
|
186
|
+
inverted = PredicateRegistry.operator(bare_name, format)
|
187
|
+
if inverted.nil?
|
188
|
+
nil
|
189
|
+
elsif inverted.inverse_of.nil?
|
190
|
+
Not.new(inverted)
|
191
|
+
else
|
192
|
+
operator(inverted.inverse_of, format)
|
193
|
+
end
|
194
|
+
else
|
195
|
+
nil
|
196
|
+
end
|
197
|
+
else
|
198
|
+
operator
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require_relative 'predicate'
|
2
|
+
|
3
|
+
module ParamsReady
|
4
|
+
module Query
|
5
|
+
class PredicateOperator
|
6
|
+
def self.dup
|
7
|
+
self
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.define_operator(name, altn, arel: nil, test: nil, inverse_of: nil)
|
11
|
+
define_singleton_method :name do
|
12
|
+
name
|
13
|
+
end
|
14
|
+
|
15
|
+
define_singleton_method :altn do
|
16
|
+
altn
|
17
|
+
end
|
18
|
+
|
19
|
+
if arel
|
20
|
+
define_singleton_method :to_query do |attribute, value|
|
21
|
+
attribute.send(arel, value)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
if test
|
26
|
+
define_singleton_method :test do |record, attribute_name, value|
|
27
|
+
attribute = record.send attribute_name
|
28
|
+
attribute.send test, value
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
define_singleton_method :inverse_of do
|
33
|
+
inverse_of
|
34
|
+
end
|
35
|
+
|
36
|
+
unless PredicateRegistry.operator(self.name, Format.instance(:backend), true).nil?
|
37
|
+
raise ParamsReadyError, "Operator name taken #{self.name}"
|
38
|
+
end
|
39
|
+
|
40
|
+
unless PredicateRegistry.operator(self.altn, Format.instance(:frontend), true).nil?
|
41
|
+
raise ParamsReadyError, "Operator altn taken #{self.name}"
|
42
|
+
end
|
43
|
+
|
44
|
+
PredicateRegistry.register_operator_by_name self
|
45
|
+
PredicateRegistry.register_operator_by_alt_name self
|
46
|
+
end
|
47
|
+
|
48
|
+
def altn
|
49
|
+
self.class.altn
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class In < PredicateOperator
|
54
|
+
define_operator :in, :in, arel: :in
|
55
|
+
|
56
|
+
def self.test(record, attribute_name, values)
|
57
|
+
attribute = record.send attribute_name
|
58
|
+
values.include? attribute
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
class ComparisonPredicateOperator < PredicateOperator; end
|
64
|
+
|
65
|
+
class Like < ComparisonPredicateOperator
|
66
|
+
define_operator :like, :lk
|
67
|
+
|
68
|
+
def self.to_query(attribute_name, value)
|
69
|
+
attribute_name.matches("%#{value}%")
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.test(record, attribute_name, value)
|
73
|
+
attribute = record.send attribute_name
|
74
|
+
result = Regexp.new(value, Regexp::IGNORECASE) =~ attribute
|
75
|
+
result.nil? ? false : true
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class Equal < ComparisonPredicateOperator
|
80
|
+
define_operator :equal, :eq, arel: :eq, test: :==
|
81
|
+
end
|
82
|
+
|
83
|
+
class NotEqual < ComparisonPredicateOperator
|
84
|
+
define_operator :not_equal, :neq, arel: :not_eq, test: :!=
|
85
|
+
end
|
86
|
+
|
87
|
+
class GreaterThan < ComparisonPredicateOperator
|
88
|
+
define_operator :greater_than, :gt, arel: :gt, test: :>, inverse_of: :less_than_or_equal
|
89
|
+
|
90
|
+
def self.test(record, attribute_name, value)
|
91
|
+
attribute = record.send attribute_name
|
92
|
+
attribute > value
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
class LessThan < ComparisonPredicateOperator
|
97
|
+
define_operator :less_than, :lt, arel: :lt, test: :<, inverse_of: :greater_than_or_equal
|
98
|
+
end
|
99
|
+
|
100
|
+
class GraterThanOrEqual < ComparisonPredicateOperator
|
101
|
+
define_operator :greater_than_or_equal, :gteq, arel: :gteq, test: :>=, inverse_of: :less_than
|
102
|
+
end
|
103
|
+
|
104
|
+
class LessThanOrEqual < ComparisonPredicateOperator
|
105
|
+
define_operator :less_than_or_equal, :lteq, arel: :lteq, test: :<=, inverse_of: :greater_than
|
106
|
+
end
|
107
|
+
|
108
|
+
class Not
|
109
|
+
def initialize(operator)
|
110
|
+
@operator = operator
|
111
|
+
end
|
112
|
+
|
113
|
+
def name
|
114
|
+
"not_#{@operator.name}"
|
115
|
+
end
|
116
|
+
|
117
|
+
def altn
|
118
|
+
"n#{@operator.altn}"
|
119
|
+
end
|
120
|
+
|
121
|
+
def test(*args)
|
122
|
+
result = @operator.test *args
|
123
|
+
!result
|
124
|
+
end
|
125
|
+
|
126
|
+
def to_query(*args)
|
127
|
+
result = @operator.to_query(*args)
|
128
|
+
result.not
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|