Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Computed fields #2

Merged
merged 27 commits into from
Nov 9, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
19dcb14
add computed fields in grammar
diegosenarruzza Oct 28, 2020
3b7de27
integrate computed field with the rest of nodes in nql
diegosenarruzza Oct 28, 2020
5035975
add computed fields hash in collections and apply use in nql method
diegosenarruzza Oct 28, 2020
d92c6f4
add module for computed fields and relationship computed
diegosenarruzza Oct 28, 2020
216e6e5
add tests for relation computed fields
diegosenarruzza Oct 28, 2020
cb9668b
expose method to append a computed attribute
diegosenarruzza Oct 28, 2020
19e757c
replace name field to attribute in query side (not in nql sentences)
diegosenarruzza Oct 28, 2020
55d0681
add single computed attribute
diegosenarruzza Oct 28, 2020
aed01e3
refactor variable names in computed attributes
diegosenarruzza Oct 28, 2020
e36e67e
fix attributes arguments in relation computed attributes to be optional
diegosenarruzza Oct 28, 2020
63dd8b4
fix relation computed attribute primary key must be optional and id b…
diegosenarruzza Oct 28, 2020
94f17f1
add tests for computed fields attribute in sentence
diegosenarruzza Oct 29, 2020
606c949
add tests for computed attributes related and simple
diegosenarruzza Oct 29, 2020
129ba42
refactor rename field in nql to attribute, according with the rest of…
diegosenarruzza Oct 30, 2020
63bcb2b
replace module computed attributes to class computed attribute
diegosenarruzza Nov 2, 2020
dd4e2c8
apply new computed attribute class on collection
diegosenarruzza Nov 2, 2020
b7ed34a
nql syntaxnode receive collection class in filter condition, only use…
diegosenarruzza Nov 2, 2020
145094b
fix nql method to apply computed attribute syntax
diegosenarruzza Nov 2, 2020
7369f4a
fix filter condition tests
diegosenarruzza Nov 2, 2020
21ae070
fix concat computed attributes on nql nodes
diegosenarruzza Nov 3, 2020
94efd25
add method to append computed attribute on query
diegosenarruzza Nov 3, 2020
ed0abe3
fix syntax arg of computed attribute
diegosenarruzza Nov 3, 2020
2535b06
fix computed attribute tes
diegosenarruzza Nov 3, 2020
208e5f3
remove computed attriubte node from nql and put into attribute node
diegosenarruzza Nov 5, 2020
e2a930e
fix nodes when call computed_attributes and pass collection class as …
diegosenarruzza Nov 5, 2020
8bdd5b8
fix tests about computed attributes according with changes in it
diegosenarruzza Nov 5, 2020
0d6ae2d
Update attribute.rb
gabynaiman Nov 9, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion lib/rasti/db/collection.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def collection_name
end

def collection_attributes
@collection_attributes ||= model.attributes - relations.keys
@collection_attributes ||= model.attributes - relations.keys - computed_attributes.keys
end

def primary_key
Expand Down Expand Up @@ -47,6 +47,10 @@ def queries
@queries ||= Hash::Indifferent.new
end

def computed_attributes
@computed_attributes ||= Hash::Indifferent.new
end

private

def set_collection_name(collection_name)
Expand Down Expand Up @@ -91,6 +95,11 @@ def query(name, lambda=nil, &block)
end
end

def computed_attribute(name, &block)
raise "Computed Attribute #{name} already exists" if computed_attributes.key? name
computed_attributes[name] = block.call
end

end

def initialize(environment)
Expand Down
22 changes: 22 additions & 0 deletions lib/rasti/db/computed_attribute.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
module Rasti
module DB
class ComputedAttribute

attr_reader :identifier

def initialize(identifier, &join)
@identifier = identifier
@join = join
end

def apply_join(dataset)
join ? join.call(dataset) : dataset
end

private

attr_reader :join

end
end
end
37 changes: 37 additions & 0 deletions lib/rasti/db/nql/nodes/attribute.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
module Rasti
module DB
module NQL
module Nodes
class Attribute < Treetop::Runtime::SyntaxNode

def identifier(collection_class)
if computed? collection_class
collection_class.computed_attributes[column].identifier
else
tables.empty? ? Sequel[column] : Sequel[tables.join('__').to_sym][column]
end
end

def tables
_tables.elements.map{ |e| e.table.text_value }
end

def column
_column.text_value.to_sym
end

def computed_attributes(collection_class)
computed?(collection_class) ? [column] : []
end

private

def computed?(collection_class)
collection_class.computed_attributes.key? column
end

end
end
end
end
end
4 changes: 4 additions & 0 deletions lib/rasti/db/nql/nodes/binary_node.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ def dependency_tables
values.flat_map(&:dependency_tables)
end

def computed_attributes(collection_class)
left.computed_attributes(collection_class) | right.computed_attributes(collection_class)
end

def values
@values ||= values_for(left) + values_for(right)
end
Expand Down
6 changes: 5 additions & 1 deletion lib/rasti/db/nql/nodes/comparisons/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@ module Comparisons
class Base < Treetop::Runtime::SyntaxNode

def dependency_tables
field.tables.empty? ? [] : [field.tables.join('.')]
attribute.tables.empty? ? [] : [attribute.tables.join('.')]
end

def computed_attributes(collection_class)
attribute.computed_attributes(collection_class)
end

end
Expand Down
4 changes: 2 additions & 2 deletions lib/rasti/db/nql/nodes/comparisons/equal.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ module Nodes
module Comparisons
class Equal < Base

def filter_condition
{ field.identifier => argument.value }
def filter_condition(collection_class)
{ attribute.identifier(collection_class) => argument.value }
end

end
Expand Down
4 changes: 2 additions & 2 deletions lib/rasti/db/nql/nodes/comparisons/greater_than.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ module Nodes
module Comparisons
class GreaterThan < Base

def filter_condition
field.identifier > argument.value
def filter_condition(collection_class)
attribute.identifier(collection_class) > argument.value
end

end
Expand Down
4 changes: 2 additions & 2 deletions lib/rasti/db/nql/nodes/comparisons/greater_than_or_equal.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ module Nodes
module Comparisons
class GreaterThanOrEqual < Base

def filter_condition
field.identifier >= argument.value
def filter_condition(collection_class)
attribute.identifier(collection_class) >= argument.value
end

end
Expand Down
4 changes: 2 additions & 2 deletions lib/rasti/db/nql/nodes/comparisons/include.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ module Nodes
module Comparisons
class Include < Base

def filter_condition
Sequel.ilike(field.identifier, "%#{argument.value}%")
def filter_condition(collection_class)
Sequel.ilike(attribute.identifier(collection_class), "%#{argument.value}%")
end

end
Expand Down
4 changes: 2 additions & 2 deletions lib/rasti/db/nql/nodes/comparisons/less_than.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ module Nodes
module Comparisons
class LessThan < Base

def filter_condition
field.identifier < argument.value
def filter_condition(collection_class)
attribute.identifier(collection_class) < argument.value
end

end
Expand Down
4 changes: 2 additions & 2 deletions lib/rasti/db/nql/nodes/comparisons/less_than_or_equal.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ module Nodes
module Comparisons
class LessThanOrEqual < Base

def filter_condition
field.identifier <= argument.value
def filter_condition(collection_class)
attribute.identifier(collection_class) <= argument.value
end

end
Expand Down
4 changes: 2 additions & 2 deletions lib/rasti/db/nql/nodes/comparisons/like.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ module Nodes
module Comparisons
class Like < Base

def filter_condition
Sequel.ilike(field.identifier, argument.value)
def filter_condition(collection_class)
Sequel.ilike(attribute.identifier(collection_class), argument.value)
end

end
Expand Down
4 changes: 2 additions & 2 deletions lib/rasti/db/nql/nodes/comparisons/not_equal.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ module Nodes
module Comparisons
class NotEqual < Base

def filter_condition
Sequel.negate(field.identifier => argument.value)
def filter_condition(collection_class)
Sequel.negate(attribute.identifier(collection_class) => argument.value)
end

end
Expand Down
4 changes: 2 additions & 2 deletions lib/rasti/db/nql/nodes/comparisons/not_include.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ module Nodes
module Comparisons
class NotInclude < Base

def filter_condition
~ Sequel.ilike(field.identifier, "%#{argument.value}%")
def filter_condition(collection_class)
~ Sequel.ilike(attribute.identifier(collection_class), "%#{argument.value}%")
end

end
Expand Down
4 changes: 2 additions & 2 deletions lib/rasti/db/nql/nodes/conjunction.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ module NQL
module Nodes
class Conjunction < BinaryNode

def filter_condition
Sequel.&(*values.map(&:filter_condition))
def filter_condition(collection_class)
Sequel.&(*values.map { |value| value.filter_condition(collection_class) } )
end

end
Expand Down
4 changes: 2 additions & 2 deletions lib/rasti/db/nql/nodes/disjunction.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ module NQL
module Nodes
class Disjunction < BinaryNode

def filter_condition
Sequel.|(*values.map(&:filter_condition))
def filter_condition(collection_class)
Sequel.|(*values.map { |value| value.filter_condition(collection_class) } )
end

end
Expand Down
23 changes: 0 additions & 23 deletions lib/rasti/db/nql/nodes/field.rb

This file was deleted.

8 changes: 6 additions & 2 deletions lib/rasti/db/nql/nodes/parenthesis_sentence.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@ def dependency_tables
sentence.dependency_tables
end

def filter_condition
sentence.filter_condition
def computed_attributes(collection_class)
sentence.computed_attributes(collection_class)
end

def filter_condition(collection_class)
sentence.filter_condition collection_class
end

end
Expand Down
8 changes: 6 additions & 2 deletions lib/rasti/db/nql/nodes/sentence.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@ def dependency_tables
proposition.dependency_tables
end

def filter_condition
proposition.filter_condition
def computed_attributes(collection_class)
proposition.computed_attributes collection_class
end

def filter_condition(collection_class)
proposition.filter_condition collection_class
end

end
Expand Down
Loading