From d336e778f7d458c72ac5c59b5da09b7a4f665963 Mon Sep 17 00:00:00 2001 From: Felix Van der Jeugt Date: Fri, 11 Sep 2015 11:55:26 +0200 Subject: [PATCH 1/3] improve (and fix) parsing --- app/controllers/concerns/data_table.rb | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app/controllers/concerns/data_table.rb b/app/controllers/concerns/data_table.rb index 722ce68..825f96d 100644 --- a/app/controllers/concerns/data_table.rb +++ b/app/controllers/concerns/data_table.rb @@ -60,7 +60,8 @@ class DataTable columns: Hash.new } params.require(:columns).each do |i, column| - type, value = column.require(:search)[:value].split(':') + type, *values = column.require(:search)[:value].split(':') + value = values.join(':') unless values.empty? h = clean[:columns][column.require(:data).to_sym] = { name: column[:name], searchable: column[:searchable] == 'true', @@ -68,9 +69,13 @@ class DataTable type: type } if type == 'number-range' - h[:lower], h[:upper] = value.split('~').map &:to_i + h[:lower], h[:upper] = value.split('~').map do |euros| + (euros.to_f * 100).to_i rescue nil + end elsif type == 'date-range' - h[:lower], h[:upper] = value.split('~').map &:to_datetime + h[:lower], h[:upper] = value.split('~').map do |string| + string.to_datetime rescue nil + end else h[:value] = value end From bf9a845780d864eb90de1c90e4d1a0dcab5793a0 Mon Sep 17 00:00:00 2001 From: Ilion Beyst Date: Fri, 11 Sep 2015 12:00:49 +0200 Subject: [PATCH 2/3] implement pagination --- app/controllers/concerns/data_table.rb | 52 ++++++++++--------- .../concerns/transactions_query.rb | 1 - 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/app/controllers/concerns/data_table.rb b/app/controllers/concerns/data_table.rb index 825f96d..6498fc1 100644 --- a/app/controllers/concerns/data_table.rb +++ b/app/controllers/concerns/data_table.rb @@ -8,22 +8,38 @@ class DataTable end def json - response_json(@params[:draw], data) + { + draw: @params[:draw], + recordsTotal: @user.transactions.count, + recordsFiltered: count, + data: data + } end + private + def data - ActiveRecord::Base.connection.execute(self.query.to_sql) + run_query(paginated_query.project(Arel.star)) + end + + def count + run_query(query.project(Arel.star.count)).first[0] + end + + def paginated_query + query.skip(@params[:start]).take(@params[:length]) end def query - pred = predicates - q = @transactions.query - q = q.where(pred) if pred - q + return @query if @query # Do not build query twice + @query = @transactions.query + @query.where(predicate) if predicate + @query end - def predicates - [ *range_predicates(:amount), + def predicate + @predicate ||= [ + *range_predicates(:amount), *range_predicates(:time), eq_predicate(:peer), eq_predicate(:issuer), @@ -49,7 +65,9 @@ class DataTable @table[name].matches("%#{value}%") if value end - private + def run_query query + ActiveRecord::Base.connection.execute(query.to_sql) + end def sanitize_params(params) # Parsing according to https://datatables.net/manual/server-side @@ -82,21 +100,5 @@ class DataTable end return clean end - - def response_json(draw, selection) - { - draw: draw, - recordsTotal: @user.transactions.count, - recordsFiltered: selection.count, - #data: selection.offset(params[:start]).take(params[:length]).map { |transaction| { - #time: transaction.created_at, - #amount: transaction.signed_amount_for(user), - #peer: transaction.peer_of(user).try(:name), - #issuer: transaction.issuer.name, - #message: transaction.message, - #}} - data: selection - } - end end diff --git a/app/controllers/concerns/transactions_query.rb b/app/controllers/concerns/transactions_query.rb index bfd62d4..3276d57 100644 --- a/app/controllers/concerns/transactions_query.rb +++ b/app/controllers/concerns/transactions_query.rb @@ -12,7 +12,6 @@ class TransactionsQuery def query Arel::SelectManager.new(ActiveRecord::Base) .from(arel) - .project(Arel.star) end def arel From 4fad3416c0f19cb0115f68fdbcbaffa1b6a992f3 Mon Sep 17 00:00:00 2001 From: Ilion Beyst Date: Fri, 11 Sep 2015 12:07:39 +0200 Subject: [PATCH 3/3] fix general retartedness on my side --- app/controllers/concerns/data_table.rb | 7 +++---- app/controllers/concerns/transactions_query.rb | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/controllers/concerns/data_table.rb b/app/controllers/concerns/data_table.rb index 6498fc1..5a3a74e 100644 --- a/app/controllers/concerns/data_table.rb +++ b/app/controllers/concerns/data_table.rb @@ -31,10 +31,9 @@ class DataTable end def query - return @query if @query # Do not build query twice - @query = @transactions.query - @query.where(predicate) if predicate - @query + q = @transactions.query + q.where(predicate) if predicate + q end def predicate diff --git a/app/controllers/concerns/transactions_query.rb b/app/controllers/concerns/transactions_query.rb index 3276d57..bd87edc 100644 --- a/app/controllers/concerns/transactions_query.rb +++ b/app/controllers/concerns/transactions_query.rb @@ -60,10 +60,10 @@ class TransactionsQuery def incoming @user.incoming_transactions.arel @transactions - .where(@transactions[:debtor_id].eq(@user.id)) + .where(@transactions[:creditor_id].eq(@user.id)) .project( @transactions[:amount], - @transactions[:creditor_id].as('peer_id'), + @transactions[:debtor_id].as('peer_id'), @transactions[:created_at].as('time'), @transactions[:issuer_id], @transactions[:issuer_type],