module E2Model::DatasetMethods

Public Instance Methods

apply_after_load_processors(model, entries) click to toggle source
# File lib/engine2/core.rb, line 366
def apply_after_load_processors model, entries
    model.after_load_processors.each do |name, proc|
        type_info = model.find_type_info(name)
        name_sym = name.to_sym
        entries.each do |entry|
            proc.(entry, name_sym, type_info) if entry.key?(name_sym)
        end
    end
end
ensure_primary_key() click to toggle source
# File lib/engine2/core.rb, line 376
def ensure_primary_key
    pk = model.primary_keys
    raise Engine2::E2Error.new("No primary key defined for model #{model}") unless pk && pk.all?

    if opts_select = @opts[:select]
        sel_pk = []
        opts_select.each do |sel|
            name = case sel
                when Symbol
                    sel
                when Sequel::SQL::QualifiedIdentifier
                    sel.column
                when Sequel::SQL::AliasedExpression
                    sel
                    # nil #sel.aliaz # ?
                    # sel.expression
                end
            sel_pk << name if name && pk.include?(name)
        end

        if pk.length == sel_pk.length
            self
        else
            sels = (pk - sel_pk).map{|k| model.table_name.q(k)}
            select_more(*sels)
        end
    else
        select(*pk.map{|k| model.table_name.q(k)})
    end
end
extract_select(sel, al = nil) { |nil, sel, nil| ... } click to toggle source
# File lib/engine2/core.rb, line 407
def extract_select sel, al = nil, &blk
    case sel
    when Symbol
        yield nil, sel, nil
    when Sequel::SQL::QualifiedIdentifier
        yield sel.table, sel.column, al
    when Sequel::SQL::AliasedExpression, Sequel::SQL::Function
        sel
        # extract_select sel.expression, sel.aliaz, &blk
        # expr = sel.expression
        # yield  expr.table, expr.column
    else
        raise Engine2::E2Error.new("Unknown selection #{sel}")
    end
end
get_opts() click to toggle source
# File lib/engine2/core.rb, line 478
def get_opts
    @opts
end
load(*args) click to toggle source
# File lib/engine2/core.rb, line 349
def load *args
    if entry = self[*args]
        model.after_load_processors.each do |name, proc|
            type_info = model.find_type_info(name)
            name_sym = name.to_sym
            proc.(entry, name_sym, type_info) if entry.key?(name_sym)
        end if model.after_load_processors
        entry
    end
end
load_all() click to toggle source
# File lib/engine2/core.rb, line 360
def load_all
    entries = self.all
    apply_after_load_processors(model, entries) if model.after_load_processors
    entries
end
setup_query(fields) click to toggle source
# File lib/engine2/core.rb, line 423
def setup_query fields
    joins = {}
    model_table_name = model.table_name

    select = @opts[:select].map do |sel|
        extract_select sel do |table, name, aliaz|
            mdl = if table
                if table == model_table_name
                    model
                else
                    assoc = model.many_to_one_associations[table] || model.many_to_many_associations[table]
                    raise Engine2::E2Error.new("Association #{table} not found for model #{model}") unless assoc
                    assoc.associated_class
                end
            else
                model
            end

            mdl_table_name = mdl.table_name
            table ||= mdl_table_name
            if mdl_table_name == model_table_name
                fields << name
            else
                fields << table.q(name)
                joins[mdl_table_name] ||= model.many_to_one_associations[table] || model.many_to_many_associations[table]
            end

            f_info = mdl.type_info[name]
            raise Engine2::E2Error.new("Column #{name} not found for table #{table}") unless f_info
            if f_info[:dummy]
                nil
            else
                qname = mdl_table_name.q(name)
                if table == model_table_name
                    qname
                else
                    Sequel.alias_columns_in_joins ? qname.as(:"#{table}__#{name}") : qname
                end
            end
        end
    end.compact

    joins.reduce(clone(select: select)) do |joined, (table, assoc)|
        m = assoc.associated_class
        case assoc[:type]
        when :many_to_one
            keys = assoc[:qualified_key]
            joined.left_join(table, m.primary_keys.zip(keys.is_a?(Array) ? keys : [keys]))
        when :many_to_many
            joined.left_join(assoc[:join_table], assoc[:left_keys].zip(model.primary_keys)).left_join(m.table_name, m.primary_keys.zip(assoc[:right_keys]))
        else unsupported_association
        end
    end
end
with_proc(&blk) click to toggle source
# File lib/engine2/core.rb, line 482
def with_proc &blk
    ds = clone
    ds.row_proc = blk
    ds
end