class RailsServersideDatatables::DataTable

Public Class Methods

new( query, parameters ) click to toggle source
# File lib/rails_serverside_datatables/data_table.rb, line 6
def initialize( query, parameters )
  @columns    = []
  @parameters = parameters

  @query         = query
  @total_records = query.size
end

Public Instance Methods

add_column( definition, structured = {}, &block ) click to toggle source
# File lib/rails_serverside_datatables/data_table.rb, line 14
def add_column( definition, structured = {}, &block )
  if definition.is_a? Column
    @columns.push definition
  else
    if block.nil?
      @columns.push Column.new( "cc_#{@columns.size}".to_sym, definition[:expression], structured )
    else
      @columns.push( Column.new( "cc_#{@columns.size}".to_sym, definition[:expression], structured ) do |value, structured|
        block.call(value, structured)
      end)
    end

    @columns.last.display_name = definition.fetch( :display_name, "#{@columns.size}" )
  end
end
as_json() click to toggle source
# File lib/rails_serverside_datatables/data_table.rb, line 30
def as_json
  return configuration if config_request?

  apply_select
  apply_column_filters
  apply_global_filter

  @records_filtered = @query.size

  apply_order
  apply_offset
  apply_limit

  {
      draw: @parameters[ :draw ] || 1,
      recordsTotal: @total_records,
      recordsFiltered: @records_filtered,
      data: @query.map { |record| @columns.map { |col| col.value( record ) } }
  }
end
config_request?() click to toggle source
# File lib/rails_serverside_datatables/data_table.rb, line 51
def config_request?
  @parameters[ 'dt_config' ] == 'true'
end

Protected Instance Methods

apply_column_filters() click to toggle source
# File lib/rails_serverside_datatables/data_table.rb, line 74
def apply_column_filters
  conditions = ExprTreeNode.new( 'AND', Type::OPERATOR, true )
  column_filters.each { |filter| conditions.add_argument filter }

  @query = @query.where( conditions.to_s ) if conditions.arguments?
end
apply_global_filter() click to toggle source
# File lib/rails_serverside_datatables/data_table.rb, line 81
def apply_global_filter
  unless global_filter?
    return
  end

  filter = ExprTreeNode.new( 'OR', Type::OPERATOR, false )
  global_filter.each { |f| filter.add_argument f }

  if filter.arguments?
    @query = @query.where( filter.to_s )
  end
end
apply_limit() click to toggle source
# File lib/rails_serverside_datatables/data_table.rb, line 66
def apply_limit
  @query = @query.limit( limit )
end
apply_offset() click to toggle source
# File lib/rails_serverside_datatables/data_table.rb, line 62
def apply_offset
  @query = @query.offset( offset )
end
apply_order() click to toggle source
# File lib/rails_serverside_datatables/data_table.rb, line 94
def apply_order
  criteria = order

  if criteria.expression.arguments?
    @query = @query.order( order.to_s )
  end
end
apply_select() click to toggle source
# File lib/rails_serverside_datatables/data_table.rb, line 70
def apply_select
  @query = @query.select( ExpressionList.new( @columns.map { |c| c.select }.flatten ).to_s )
end
column_filters() click to toggle source
# File lib/rails_serverside_datatables/data_table.rb, line 111
def column_filters
  ( @parameters[:columns] || {} ).to_a.map do |column|
    filter = ( column.last[ :search ] || { value: nil } )[ :value ]

    if filter.present?
      @columns[ column.last[:data].to_i ].filter( filter )
    else
      nil
    end
  end.reject { |v| v.nil? }
end
configuration() click to toggle source
# File lib/rails_serverside_datatables/data_table.rb, line 56
def configuration
  {
      columns: @columns.map { |c| c.configuration }
  }
end
global_filter() click to toggle source
# File lib/rails_serverside_datatables/data_table.rb, line 131
def global_filter
  @columns.map { |c| c.filter( global_filter_text ) }
end
global_filter?() click to toggle source
# File lib/rails_serverside_datatables/data_table.rb, line 127
def global_filter?
  global_filter_text.present?
end
global_filter_text() click to toggle source
# File lib/rails_serverside_datatables/data_table.rb, line 123
def global_filter_text
  (@parameters[ :search ] || { value: nil } )[ :value ]
end
limit() click to toggle source
# File lib/rails_serverside_datatables/data_table.rb, line 107
def limit
  @parameters[:length] || 100
end
offset() click to toggle source
# File lib/rails_serverside_datatables/data_table.rb, line 103
def offset
  @parameters[:start] || 0
end
order() click to toggle source
# File lib/rails_serverside_datatables/data_table.rb, line 135
def order
  ExpressionList.new(
      ( @parameters[ :order ] || {} ).values.map { |column|
        @columns[ column[:column].to_i ].order( column[:dir] )
      }
  )
end