Class: KBResultSet

Inherits:
Object show all
Includes:
Enumerable
Defined in:
lib/kirbybase.rb

Overview


KBResultSet

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(table, filter, filter_types, *values) ⇒ KBResultSet


initialize



3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
# File 'lib/kirbybase.rb', line 3645

def initialize(table, filter, filter_types, *values)
    @table = table
    @filter = filter
    @filter_types = filter_types
    @values = values

    @filter.each do |f|
        get_meth_str = <<-END_OF_STRING
        def #{f}()
            if defined?(@#{f}) then
                return @#{f}
            else
                @#{f} = self.collect { |x| x.#{f} }
                return @#{f}
            end
        end
        END_OF_STRING
        self.class.class_eval(get_meth_str)
    end
end

Class Method Details

.reverse(sort_field) ⇒ Object


KBResultSet.reverse



3638
3639
3640
# File 'lib/kirbybase.rb', line 3638

def KBResultSet.reverse(sort_field)
    return [sort_field, :desc]
end

Instance Method Details

#<<(value) ⇒ Object



3673
3674
3675
3676
# File 'lib/kirbybase.rb', line 3673

def <<(value)
  @values << value
  self
end

#[](key) ⇒ Object



3689
3690
3691
# File 'lib/kirbybase.rb', line 3689

def [](key)
  @values[key]
end

#each(&block) ⇒ Object



3680
3681
3682
# File 'lib/kirbybase.rb', line 3680

def each(&block)
  @values.each(&block)
end

#set(*updates, &update_cond) ⇒ Object


set

++ Update record(s) in table, return number of records updated.



3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
# File 'lib/kirbybase.rb', line 3699

def set(*updates, &update_cond)
    raise 'Cannot specify both a hash and a proc for method #set!' \
     unless updates.empty? or update_cond.nil?

    raise 'Must specify update proc or hash for method #set!' if \
     updates.empty? and update_cond.nil?

    if updates.empty?
        @table.set(self, update_cond)
    else
        @table.set(self, updates)
    end
end

#size ⇒ Object Also known as: length



3684
3685
3686
# File 'lib/kirbybase.rb', line 3684

def size
  @values.size
end

#sort(*sort_fields) ⇒ Object


sort



3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
# File 'lib/kirbybase.rb', line 3716

def sort(*sort_fields)
    sort_fields_arrs = []
    sort_fields.each do |f|
        if f.to_s[0..0] == '-'
            sort_fields_arrs << [f.to_s[1..-1].to_sym, :desc]
        elsif f.to_s[0..0] == '+'
            sort_fields_arrs << [f.to_s[1..-1].to_sym, :asc]
        else
            sort_fields_arrs << [f, :asc]
        end
    end

    sort_fields_arrs.each do |f|
        raise "Invalid sort field" unless @filter.include?(f[0])
    end

    sorted = @values.sort{|a,b|
        x = []
        y = []
        sort_fields_arrs.each do |s|
            if [:Integer, :Float].include?(
             @filter_types[@filter.index(s[0])])
                a_value = a.send(s[0]) || 0
                b_value = b.send(s[0]) || 0
            else
                a_value = a.send(s[0])
                b_value = b.send(s[0])
            end
            if s[1] == :desc
                x << b_value
                y << a_value
            else
                x << a_value
                y << b_value
            end
        end

        x <=> y
    }

    return self.class.new(@table, @filter, @filter_types, *sorted)
end

#to_ary ⇒ Object


to_ary



3669
3670
3671
# File 'lib/kirbybase.rb', line 3669

def to_ary
    @values.dup
end

#to_report(recs_per_page = 0, print_rec_sep = false) ⇒ Object


to_report



3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
# File 'lib/kirbybase.rb', line 3762

def to_report(recs_per_page=0, print_rec_sep=false)
    result = collect { |r| @filter.collect {|f| r.send(f)} }

    # How many records before a formfeed.
    delim = ' | '

    # columns of physical rows
    columns = [@filter].concat(result).transpose

    max_widths = columns.collect { |c|
        c.max { |a,b| a.to_s.size <=> b.to_s.size }.to_s.size
    }

    row_dashes = '-' * (max_widths.inject {|sum, n| sum + n} +
     delim.size * (max_widths.size - 1))

    justify_hash = { :String => :ljust, :Integer => :rjust,
     :Float => :rjust, :Boolean => :ljust, :Date => :ljust,
     :Time => :ljust, :DateTime => :ljust }

    header_line = @filter.zip(max_widths, @filter.collect { |f|
        @filter_types[@filter.index(f)] }).collect { |x,y,z|
             x.to_s.send(justify_hash[z], y) }.join(delim)

    output = ''
    recs_on_page_cnt = 0

    result.each do |row|
        if recs_on_page_cnt == 0
            output << header_line + "\n" << row_dashes + "\n"
        end

        output << row.zip(max_widths, @filter.collect { |f|
            @filter_types[@filter.index(f)] }).collect { |x,y,z|
                x.to_s.send(justify_hash[z], y) }.join(delim) + "\n"

        output << row_dashes + '\n' if print_rec_sep
        recs_on_page_cnt += 1

        if recs_per_page > 0 and (recs_on_page_cnt ==
         num_recs_per_page)
            output << '\f'
            recs_on_page_count = 0
        end
    end
    return output
end