dynamic_query 0.7.1 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,71 +2,116 @@
2
2
 
3
3
  <center id="combined_result">
4
4
 
5
- <table id="combined_result_table" style="text-align: center">
6
- <% if completed_row %>
7
- <tr>
8
- <%= completed_row.map { |record|
9
- "<th colspan='#{record.attributes.size}'>#{record.table_name}</th>" }.join.html_safe %>
10
- </tr>
11
- <tr>
12
- <%= completed_row.map{ |rec|
13
- rec.attributes.map { |k, _| k } }.flatten.map { |col| "<th>#{col}</th>" }.join.html_safe %>
14
- </tr>
15
- <% end %>
16
- <% result.each do |row| %>
17
- <tr>
18
- <% row.map { |rec| rec.attributes.map { |k ,v| v } }.flatten.each do |col| %>
19
- <td><%= col %></td>
20
- <% end %>
21
- </tr>
5
+ <table id="combined_result_table" style="text-align: center">
6
+ <% if completed_row %>
7
+ <tr>
8
+ <%= completed_row.map { |rec|
9
+ rec.attributes.map { |k, _| "<th>#{k}</th>" }
10
+ }.flatten.join.html_safe %>
11
+ </tr>
22
12
  <% end %>
23
- </table>
24
-
25
- <button id="table2csv">Download CSV</button>
26
-
27
- <script>
28
- var regulateCSVCell = function( cell ) {
29
- if ( cell.indexOf( ',' ) == -1 ) {
30
- return cell;
31
- }
32
- return '"' + cell + '"';
33
- };
34
-
35
- var ary2CSV = function( ary ) {
36
- csv = '';
37
- for ( var row in ary ) {
38
- for ( var col in ary[row] ) {
39
- if ( col == 0 ) {
40
- csv += regulateCSVCell( ary[row][col] )
41
- } else {
42
- csv += ',' + regulateCSVCell( ary[row][col] )
13
+ <% result.each do |row| %>
14
+ <tr>
15
+ <% row.map { |rec| rec.attributes.map { |k ,v| v } }.flatten.each do |col| %>
16
+ <td><%= col %></td>
17
+ <% end %>
18
+ </tr>
19
+ <% end %>
20
+ </table>
21
+
22
+ <button id="table2csv">Download CSV</button>
23
+
24
+ <script>
25
+ $( function() {
26
+ if ( sessionStorage.getItem( 'toggle_columns' ) == null ) {
27
+ sessionStorage.setItem( 'toggle_columns', '[]' )
28
+ }
29
+ console.log( sessionStorage.getItem( 'toggle_columns' ) );
30
+ var hide_ary = jQuery.parseJSON( sessionStorage.getItem( 'toggle_columns' ) );
31
+
32
+ $.each( hide_ary, function( index, value ) {
33
+ var header = $("#combined_result_table tr > th:eq(" + value + ")");
34
+ header.attr( 'title', header.text() );
35
+ header.text( '●' );
36
+ $('#combined_result_table tr').find( "td:eq(" + value +")" ).each( function() {
37
+ $( this ).attr( 'title', $( this ).text() );
38
+ $( this ).text( '' );
39
+ });
40
+ });
41
+
42
+ $( '#combined_result_table th' ).each( function( index ) {
43
+ $( this ).on( 'click', function() {
44
+ var header = $("#combined_result_table tr > th:eq(" + index + ")");
45
+ if ( header.text() == '●' ) {
46
+ var hide_ary = jQuery.parseJSON( sessionStorage.getItem( 'toggle_columns' ) );
47
+ hide_ary.splice( hide_ary.indexOf(index), 1 );
48
+ sessionStorage.setItem( 'toggle_columns', JSON.stringify( hide_ary ) )
49
+
50
+ header.text( header.attr( 'title' ) );
51
+ header.attr( 'title', '' );
52
+ $('#combined_result_table tr').find( "td:eq(" + index +")" ).each( function() {
53
+ $( this ).text( $( this ).attr( 'title' ) );
54
+ $( this ).attr( 'title', '' );
55
+ });
56
+ } else {
57
+ var hide_ary = jQuery.parseJSON( sessionStorage.getItem( 'toggle_columns' ) );
58
+ hide_ary.push( index );
59
+ sessionStorage.setItem( 'toggle_columns', JSON.stringify( hide_ary ) )
60
+
61
+ header.attr( 'title', header.text() );
62
+ header.text( '●' );
63
+ $('#combined_result_table tr').find( "td:eq(" + index +")" ).each( function() {
64
+ $( this ).attr( 'title', $( this ).text() );
65
+ $( this ).text( '' );
66
+ });
67
+ }
68
+ });
69
+ });
70
+ });
71
+
72
+ var regulateCSVCell = function( cell ) {
73
+ if ( cell.indexOf( ',' ) == -1 ) {
74
+ return cell;
75
+ }
76
+ return '"' + cell + '"';
77
+ };
78
+
79
+ var ary2CSV = function( ary ) {
80
+ csv = '';
81
+ for ( var row in ary ) {
82
+ for ( var col in ary[row] ) {
83
+ if ( col == 0 ) {
84
+ csv += regulateCSVCell( ary[row][col] )
85
+ } else {
86
+ csv += ',' + regulateCSVCell( ary[row][col] )
87
+ }
43
88
  }
89
+ csv += "\n"
44
90
  }
45
- csv += "\n"
46
- }
47
- return csv;
48
- };
91
+ return csv;
92
+ };
93
+
94
+ var saveCSV = function( csv ) {
95
+ var href = 'data:application/csv;charset=utf-8,'
96
+ href += encodeURIComponent( csv );
97
+ window.open( href );
98
+ };
49
99
 
50
- var saveCSV = function( csv ) {
51
- var href = 'data:application/csv;charset=utf-8,'
52
- href += encodeURIComponent( csv );
53
- window.open( href );
54
- };
55
-
56
- $( '#table2csv' ).on( 'click', function() {
57
- var table = [];
58
- $( '#combined_result_table tr' ).each( function( index ) {
59
- if ( index > 0 ) {
100
+ $( '#table2csv' ).on( 'click', function() {
101
+ var hide_ary = jQuery.parseJSON( sessionStorage.getItem( 'toggle_columns' ) );
102
+ var table = [];
103
+ $( '#combined_result_table tr' ).each( function( index ) {
60
104
  var row = [];
61
- $( this ).children().each( function() {
62
- row.push( $( this ).text() );
105
+ $( this ).children().each( function( index ) {
106
+ if ( $.inArray( index, hide_ary ) == -1 ) {
107
+ row.push( $( this ).text() );
108
+ }
63
109
  });
64
110
  table.push( row );
65
- }
111
+ });
112
+
113
+ saveCSV( ary2CSV( table ) );
66
114
  });
67
-
68
- saveCSV( ary2CSV( table ) );
69
- });
70
- </script>
115
+ </script>
71
116
 
72
117
  </center>
@@ -1,4 +1,5 @@
1
- <center>
1
+ <center id="dynamic_result">
2
+
2
3
  <table id="dynamic_result_table" style="text-align: center">
3
4
  <% if result.first %>
4
5
  <tr>
@@ -22,7 +23,7 @@
22
23
  console.log( sessionStorage.getItem( 'toggle_columns' ) );
23
24
  var hide_ary = jQuery.parseJSON( sessionStorage.getItem( 'toggle_columns' ) );
24
25
 
25
- $.each( hide_ary, function(index, value) {
26
+ $.each( hide_ary, function( index, value ) {
26
27
  var header = $("#dynamic_result_table tr > th:eq(" + value + ")");
27
28
  header.attr( 'title', header.text() );
28
29
  header.text( '●' );
@@ -32,7 +33,7 @@
32
33
  });
33
34
  });
34
35
 
35
- $( '#dynamic_result_table th' ).each( function(index) {
36
+ $( '#dynamic_result_table th' ).each( function( index ) {
36
37
  $( this ).on( 'click', function() {
37
38
  var header = $("#dynamic_result_table tr > th:eq(" + index + ")");
38
39
  if ( header.text() == '●' ) {
@@ -106,4 +107,5 @@
106
107
  saveCSV( ary2CSV( table ) );
107
108
  });
108
109
  </script>
110
+
109
111
  </center>
data/lib/dynamic_query.rb CHANGED
@@ -10,6 +10,7 @@ module DynamicQuery
10
10
  'BETWEEN', 'NOT BETWEEN', 'IS NULL', 'IS NOT NULL']
11
11
 
12
12
  def dynamic_query(*models, opt)
13
+ models.flatten!
13
14
  DynamicQueryInstance.new(*models, opt)
14
15
  end
15
16
 
@@ -51,6 +52,66 @@ module DynamicQuery
51
52
  def all_columns_in(*models)
52
53
  models.map { |m| m.columns.map { |col| "#{m.table_name}.#{col.name}" } }.flatten.join ', '
53
54
  end
55
+
56
+ def estimate_total(dq, query)
57
+ models = dq.models
58
+ et = models.map { |m| { :table => m.table_name, :total => m.count, :conditioned => conditioned_count(dq, query, m) } }
59
+ major = et.max_by { |i| i[:total] }
60
+ et.delete major
61
+ estimate = major[:conditioned] * et.map { |i| i[:conditioned].to_f / i[:total] }.reduce(:*)
62
+ estimate = estimate.to_i
63
+ end
64
+
65
+ def conditioned_count(dq, query, model)
66
+ conditions = dq.conditions query, model.table_name
67
+ statement = Querier.statement conditions
68
+ model.where(statement).count
69
+ end
70
+
71
+ class Querier
72
+ STMT_SUFFIX_DICT = {
73
+ nil => '= ?',
74
+ 'eq' => '= ?',
75
+ 'not_eq' => '!= ?',
76
+ 'gt' => '> ?',
77
+ 'ge' => '>= ?',
78
+ 'lt' => '< ?',
79
+ 'le' => '<= ?',
80
+ 'in' => 'IN (?)',
81
+ 'not_in' => 'NOT IN (?)',
82
+ 'like' => 'LIKE ?',
83
+ 'not_like' => 'NOT LIKE ?',
84
+ 'btw' => 'BETWEEN ? AND ?',
85
+ 'not_btw' => 'NOT BETWEEN ? AND ?',
86
+ 'between' => 'BETWEEN ? AND ?',
87
+ 'not_between' => 'NOT BETWEEN ? AND ?',
88
+ 'is' => 'IS ?',
89
+ 'is_not' => 'IS NOT ?'
90
+ }
91
+
92
+ def self.statement(conditions)
93
+ conditions ||= []
94
+ statement = []
95
+ values = []
96
+
97
+ conditions.each do |conds|
98
+ and_conds = []
99
+ conds.each do |key, val|
100
+ col, op = key.to_s.split(/\./)
101
+ op = STMT_SUFFIX_DICT[op]
102
+ and_conds << "#{col} #{op}"
103
+ if ['BETWEEN ? AND ?', 'NOT BETWEEN ? AND ?'].include? op
104
+ values << val[0] << val[1]
105
+ else
106
+ values << val
107
+ end
108
+ end
109
+ statement << and_conds.join(' AND ')
110
+ end
111
+
112
+ values.unshift statement.map { |s| "(#{s})" }.join(' OR ')
113
+ end
114
+ end
54
115
 
55
116
  class DynamicQueryInstance
56
117
  include CombinedQuery, Validator
@@ -71,6 +132,8 @@ module DynamicQuery
71
132
  opt = {}
72
133
  end
73
134
 
135
+ @origin_models = models.dup
136
+
74
137
  models.map! do |m|
75
138
  if [String, Symbol].include? m.class
76
139
  m.to_s.split(/_/).map { |word| word.capitalize }.join.constantize
@@ -149,6 +212,10 @@ module DynamicQuery
149
212
  @aliases = used_aliases
150
213
  end
151
214
 
215
+ def models
216
+ @origin_models
217
+ end
218
+
152
219
  def panel(query)
153
220
  query ||= { 'or_1' => { 'and_1' => { :column => '', :operator => '', :value1 => '', :value2 => '' } } }
154
221
  query = query.clone
@@ -27,7 +27,10 @@ module DynamicQuery
27
27
  c.keys.each { |k| c[k] = Hash[ c[k].each_slice(2).to_a ] }
28
28
  cond << c
29
29
  end
30
- cond.map! { |c| c[table.to_s] } if table
30
+ if table
31
+ cond.map! { |c| c[table.to_s] }
32
+ cond.delete nil
33
+ end
31
34
  cond
32
35
  end
33
36
 
@@ -1,7 +1,7 @@
1
1
  module DynamicQuery
2
2
  MAJOR = 0
3
3
  MINOR = 7
4
- PATCH = 1
4
+ PATCH = 2
5
5
 
6
6
  VERSION = [MAJOR, MINOR, PATCH].compact.join('.')
7
7
  end
@@ -8,7 +8,7 @@ module DynamicQuery
8
8
  copy_file 'app/helpers/dynamic_query_helper.rb', 'app/helpers/dynamic_query_helper.rb'
9
9
  copy_file 'app/helpers/_dynamic_query.html.erb', 'app/helpers/_dynamic_query.html.erb'
10
10
  copy_file 'app/helpers/_dynamic_result.html.erb', 'app/helpers/_dynamic_result.html.erb'
11
- copy_file 'app/helpers/_combined_result.html.erb', 'app/helpers/_combined_result.html.erb'
11
+ #copy_file 'app/helpers/_combined_result.html.erb', 'app/helpers/_combined_result.html.erb'
12
12
  end
13
13
  end
14
14
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynamic_query
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.7.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-08 00:00:00.000000000 Z
12
+ date: 2013-03-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -191,7 +191,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
191
191
  version: '0'
192
192
  segments:
193
193
  - 0
194
- hash: -1676575374639160798
194
+ hash: -309352636508812369
195
195
  required_rubygems_version: !ruby/object:Gem::Requirement
196
196
  none: false
197
197
  requirements:
@@ -200,11 +200,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
200
200
  version: '0'
201
201
  segments:
202
202
  - 0
203
- hash: -1676575374639160798
203
+ hash: -309352636508812369
204
204
  requirements: []
205
205
  rubyforge_project:
206
206
  rubygems_version: 1.8.25
207
207
  signing_key:
208
208
  specification_version: 3
209
- summary: dynamic_query-0.7.1
209
+ summary: dynamic_query-0.7.2
210
210
  test_files: []