dynamic_query 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -17,9 +17,7 @@ rails g dynamic_query:helper
17
17
 
18
18
  ``` ruby
19
19
  ## controller of Rails 3
20
- dq = dynamic_query(:list, :entry) # list models you wish to be queried. e.g. List => :list, AbcDef => :abc_def
21
- # Since version 0.4.0, you can use model's names directly.
22
- dq = dynamic_query(List, Entry)
20
+ dq = dynamic_query(List, Entry) # put models you wish to be queried here.
23
21
 
24
22
  @panel = dq.panel(params[:query])
25
23
  @lists = List.includes(:entries).where(dq.statement(params[:query])).all
@@ -36,20 +34,30 @@ dq = dynamic_query(List, Entry)
36
34
  ``` ruby
37
35
  # columns with name 'id' or name ended with '_id' are hided by default
38
36
  # :reveal_keys => true reveals those columns in the query panel
39
- dq = dynamic_query(:list, :entry, :reveal_keys => true)
40
- # Works for version >= 0.4.0
41
37
  dq = dynamic_query(List, Entry, :reveal_keys => true)
42
38
 
43
39
  # a white list or a black list can be defined by following options
44
- dq = dynamic_query(:list, :entry, :accept => { :list => [:name], :entry => [:title, :priority] }, :reject => { :entry => [:title] })
45
- # only lists.name and entries.priority can be seen on the query panel because the white list gets higher precedence than the black list
46
- # Works for version >= 0.4.0
47
40
  dq = dynamic_query(List, Entry, :accept => { List => [:name], Entry => [:title, :priority] }, :reject => { Entry => [:title] })
41
+ # only lists.name and entries.priority can be seen on the query panel because the white list gets higher precedence than the black list
48
42
 
49
43
  # column display names can be defined by following options
50
- dq = dynamic_query(:list, :entry, :alias => { 'lists.name' => 'Full Name' })
44
+ dq = dynamic_query(List, Entry, :alias => { 'lists.name' => 'Full Name' })
51
45
  # those names are used in the html select tag
52
46
 
47
+ ## join tables with arbitrary columns and query
48
+ dq = dynamic_query(Model1, Mode2)
49
+ @panel = dq.panel(params[:query])
50
+ @records = Model1.
51
+ select(all_columns_in(Model1, Model2)).
52
+ # all_columns_in is a method to help user select all columns within models
53
+ # you must select columns of tables you joined, otherwise columns won't show in the result
54
+ joins(tables_joined_by(Model1, [Model2, [:col1, :col1], [:my_col, :your_col], :col3, :col4])).
55
+ # tables_joined_by is a method to help user build inner join SQL statement between tables
56
+ # this demonstrates how to join two tables by following correspondence columns
57
+ # :col1 -> :col1, :my_col -> :your_col, :col3 -> :col3, :col4 -> :col4
58
+ # if columns have the same name in 2 tables, you can simply only enter there common name
59
+ where(dq.statement(params[:query])).all
60
+
53
61
  ## query panel is simply a rails form_tag which means it can accept the same hash options
54
62
  <%= dynamic_query @panel, :remote => true %>
55
63
  ```
data/Rakefile CHANGED
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/env rake
2
2
  begin
3
3
  require 'bundler/setup'
4
- require 'bundler/gem_tasks'
5
4
  rescue LoadError
6
5
  puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
7
6
  end
@@ -1,5 +1,5 @@
1
1
  <center>
2
- <table id="dynamic_result_table">
2
+ <table id="dynamic_result_table" style="text-align: center">
3
3
  <% if result.first %>
4
4
  <tr>
5
5
  <%= result.first.attributes.map { |k, _| "<th>#{k}</th>" }.join.html_safe %>
@@ -15,6 +15,53 @@
15
15
  <button id="table2csv">Download CSV</button>
16
16
 
17
17
  <script>
18
+ $( function() {
19
+ if ( sessionStorage.getItem( 'toggle_columns' ) == null ) {
20
+ sessionStorage.setItem( 'toggle_columns', '[]' )
21
+ }
22
+ console.log( sessionStorage.getItem( 'toggle_columns' ) );
23
+ var hide_ary = jQuery.parseJSON( sessionStorage.getItem( 'toggle_columns' ) );
24
+
25
+ $.each( hide_ary, function(index, value) {
26
+ var header = $("#dynamic_result_table tr > th:eq(" + value + ")");
27
+ header.attr( 'title', header.text() );
28
+ header.text( '●' );
29
+ $('#dynamic_result_table tr').find( "td:eq(" + value +")" ).each( function() {
30
+ $( this ).attr( 'title', $( this ).text() );
31
+ $( this ).text( '' );
32
+ });
33
+ });
34
+
35
+ $( '#dynamic_result_table th' ).each( function(index) {
36
+ $( this ).on( 'click', function() {
37
+ var header = $("#dynamic_result_table tr > th:eq(" + index + ")");
38
+ if ( header.text() == '●' ) {
39
+ var hide_ary = jQuery.parseJSON( sessionStorage.getItem( 'toggle_columns' ) );
40
+ hide_ary.splice( hide_ary.indexOf(index), 1 );
41
+ sessionStorage.setItem( 'toggle_columns', JSON.stringify( hide_ary ) )
42
+
43
+ header.text( header.attr( 'title' ) );
44
+ header.attr( 'title', '' );
45
+ $('#dynamic_result_table tr').find( "td:eq(" + index +")" ).each( function() {
46
+ $( this ).text( $( this ).attr( 'title' ) );
47
+ $( this ).attr( 'title', '' );
48
+ });
49
+ } else {
50
+ var hide_ary = jQuery.parseJSON( sessionStorage.getItem( 'toggle_columns' ) );
51
+ hide_ary.push( index );
52
+ sessionStorage.setItem( 'toggle_columns', JSON.stringify( hide_ary ) )
53
+
54
+ header.attr( 'title', header.text() );
55
+ header.text( '●' );
56
+ $('#dynamic_result_table tr').find( "td:eq(" + index +")" ).each( function() {
57
+ $( this ).attr( 'title', $( this ).text() );
58
+ $( this ).text( '' );
59
+ });
60
+ }
61
+ });
62
+ });
63
+ });
64
+
18
65
  var regulateCSVCell = function( cell ) {
19
66
  if ( cell.indexOf( ',' ) == -1 ) {
20
67
  return cell;
data/lib/dynamic_query.rb CHANGED
@@ -1,7 +1,8 @@
1
1
  require 'dynamic_query/railtie' if defined?(Rails)
2
2
  require 'generators/helper_generator' if defined?(Rails)
3
- require 'dynamic_query/combine_query'
3
+ require 'dynamic_query/combined_query'
4
4
  require 'dynamic_query/validator'
5
+ require 'arel'
5
6
 
6
7
  module DynamicQuery
7
8
  OPERATOR = ['=', '>', '>=', '<', '<=', '!=',
@@ -11,9 +12,48 @@ module DynamicQuery
11
12
  def dynamic_query(*models, opt)
12
13
  DynamicQueryInstance.new(*models, opt)
13
14
  end
14
-
15
+
16
+ def tables_joined_by(from, *to_tables)
17
+ sql = ''
18
+ from_table = from.table_name
19
+ to_tables_count = Hash.new(0)
20
+ to_tables.each do |to|
21
+ to_table = to.first.table_name
22
+ if to_tables_count[to_table] == 0
23
+ sql << "INNER JOIN `#{to_table}` ON "
24
+ mappings = []
25
+ to.drop(1).each do |mapping|
26
+ if mapping.kind_of? Array
27
+ mappings << "`#{from_table}`.`#{mapping.first}` = `#{to_table}`.`#{mapping.last}`"
28
+ else
29
+ mappings << "`#{from_table}`.`#{mapping}` = `#{to_table}`.`#{mapping}`"
30
+ end
31
+ end
32
+ sql << "(#{mappings.join(' AND ')})"
33
+ to_tables_count[to_table] += 1
34
+ else
35
+ sql << "INNER JOIN `#{to_table}` `#{to_table}_#{to_tables_count[to_table]}` ON "
36
+ mappings = []
37
+ to.drop(1).each do |mapping|
38
+ if mapping.kind_of? Array
39
+ mappings << "`#{from_table}`.`#{mapping.first}` = `#{to_table}_#{to_tables_count[to_table]}`.`#{mapping.last}`"
40
+ else
41
+ mappings << "`#{from_table}`.`#{mapping}` = `#{to_table}_#{to_tables_count[to_table]}`.`#{mapping}`"
42
+ end
43
+ end
44
+ sql << "(#{mappings.join(' AND ')})"
45
+ to_tables_count[to_table] += 1
46
+ end
47
+ end
48
+ sql
49
+ end
50
+
51
+ def all_columns_in(*models)
52
+ models.map { |m| m.columns.map { |col| "#{m.table_name}.#{col.name}" } }.flatten.join ', '
53
+ end
54
+
15
55
  class DynamicQueryInstance
16
- include CombineQuery, Validator
56
+ include CombinedQuery, Validator
17
57
 
18
58
  def initialize(*models, opt)
19
59
  @reveal_keys = false
@@ -2,7 +2,7 @@ require 'dynamic_query/validator'
2
2
  require 'dynamic_query/joiner'
3
3
 
4
4
  module DynamicQuery
5
- module CombineQuery
5
+ module CombinedQuery
6
6
  include Validator, Joiner
7
7
 
8
8
  def conditions(query, table = nil)
@@ -1,6 +1,6 @@
1
- class DynamicQuery
1
+ module DynamicQuery
2
2
  MAJOR = 0
3
- MINOR = 6
3
+ MINOR = 7
4
4
  PATCH = 0
5
5
 
6
6
  VERSION = [MAJOR, MINOR, PATCH].compact.join('.')
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.6.0
4
+ version: 0.7.0
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-05 00:00:00.000000000 Z
12
+ date: 2013-03-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -43,6 +43,22 @@ dependencies:
43
43
  - - ~>
44
44
  - !ruby/object:Gem::Version
45
45
  version: 2.2.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: will_paginate
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
46
62
  - !ruby/object:Gem::Dependency
47
63
  name: sqlite3
48
64
  requirement: !ruby/object:Gem::Requirement
@@ -59,6 +75,22 @@ dependencies:
59
75
  - - ~>
60
76
  - !ruby/object:Gem::Version
61
77
  version: 1.3.7
78
+ - !ruby/object:Gem::Dependency
79
+ name: mysql2
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 0.3.11
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 0.3.11
62
94
  - !ruby/object:Gem::Dependency
63
95
  name: shoulda
64
96
  requirement: !ruby/object:Gem::Requirement
@@ -129,7 +161,7 @@ executables: []
129
161
  extensions: []
130
162
  extra_rdoc_files: []
131
163
  files:
132
- - lib/dynamic_query/combine_query.rb
164
+ - lib/dynamic_query/combined_query.rb
133
165
  - lib/dynamic_query/helper.rb
134
166
  - lib/dynamic_query/joiner.rb
135
167
  - lib/dynamic_query/railtie.rb
@@ -159,7 +191,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
159
191
  version: '0'
160
192
  segments:
161
193
  - 0
162
- hash: -1017995843201086013
194
+ hash: 310380793727581897
163
195
  required_rubygems_version: !ruby/object:Gem::Requirement
164
196
  none: false
165
197
  requirements:
@@ -168,11 +200,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
168
200
  version: '0'
169
201
  segments:
170
202
  - 0
171
- hash: -1017995843201086013
203
+ hash: 310380793727581897
172
204
  requirements: []
173
205
  rubyforge_project:
174
206
  rubygems_version: 1.8.25
175
207
  signing_key:
176
208
  specification_version: 3
177
- summary: dynamic_query-0.6.0
209
+ summary: dynamic_query-0.7.0
178
210
  test_files: []