kanbanworkflowstimelinescrumrubyroadmapproject-planningproject-managementopenprojectangularissue-trackerifcgantt-chartganttbug-trackerboardsbcf
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.1 KiB
95 lines
2.1 KiB
require_dependency "entry"
|
|
require 'forwardable'
|
|
|
|
class CostQuery < ActiveRecord::Base
|
|
extend Forwardable
|
|
include Enumerable
|
|
#belongs_to :user
|
|
#belongs_to :project
|
|
#attr_protected :user_id, :project_id, :created_at, :updated_at
|
|
|
|
def self.accepted_properties
|
|
@accepted_properties ||= []
|
|
end
|
|
|
|
def available_filters
|
|
CostQuery::Filter.all
|
|
end
|
|
|
|
def transformer
|
|
@transformer ||= CostQuery::Transformer.new self
|
|
end
|
|
|
|
def walker
|
|
@walker ||= CostQuery::Walker.new self
|
|
end
|
|
|
|
def add_chain(type, name, options)
|
|
chain type.const_get(name.to_s.camelcase), options
|
|
@transformer, @table = nil, nil
|
|
self
|
|
end
|
|
|
|
def chain(klass = nil, options = {})
|
|
@chain ||= Filter::NoFilter.new
|
|
@chain = klass.new @chain, options if klass
|
|
@chain = @chain.parent until @chain.top?
|
|
@chain
|
|
end
|
|
|
|
def filter(name, options = {})
|
|
add_chain Filter, name, options
|
|
end
|
|
|
|
def group_by(name, options = {})
|
|
add_chain GroupBy, name, options.reverse_merge(:type => :column)
|
|
end
|
|
|
|
def column(name, options = {})
|
|
group_by name, options.merge(:type => :column)
|
|
end
|
|
|
|
def row(name, options = {})
|
|
group_by name, options.merge(:type => :row)
|
|
end
|
|
|
|
def table
|
|
@table = Table.new(self)
|
|
end
|
|
|
|
def group_bys
|
|
return [] if chain.nil?
|
|
|
|
[chain].tap do |ary|
|
|
while !(ary.last.bottom? || ary.last.child.filter?)
|
|
ary << ary.last.child
|
|
end
|
|
end
|
|
end
|
|
|
|
def filters
|
|
last_group_by = group_bys.last
|
|
return [] if last_group_by.nil? || last_group_by.bottom?
|
|
|
|
[last_group_by.child].tap do |ary|
|
|
while !ary.last.bottom?
|
|
ary << ary.last.child
|
|
end
|
|
end
|
|
end
|
|
|
|
def_delegators :transformer, :column_first, :row_first
|
|
def_delegators :chain, :top, :bottom, :chain_collect, :sql_statement, :all_group_fields, :child, :clear, :result
|
|
def_delegators :result, :each_direct_result, :recursive_each, :recursive_each_with_level, :each, :each_row, :count,
|
|
:units, :real_costs, :size, :depth_of, :final_number
|
|
def_delegators :table, :row_index, :colum_index
|
|
|
|
def to_a
|
|
chain.to_a
|
|
end
|
|
|
|
def to_s
|
|
chain.to_s
|
|
end
|
|
|
|
end
|
|
|