Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions lib/data_tables/modules/search.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,19 @@ def build_search(model, in_hash, join_hash = nil)

def search_by_type(model, column, query, &block)
arel_column = model.arel_table[column]
result = case model.columns_hash[column.to_s]&.type
column_type = model.columns_hash[column.to_s]&.type

result = case column_type
when :string
query = Array.wrap(query)
# I'm pretty sure this is safe from SQL Injection
arel_column.matches("%#{query}%")
arel_column.matches_any(query.map { |q| "%#{q}%" })
when :integer
value = query&.to_i and arel_column.eq(value)
query = Array.wrap(query)
arel_column.eq_any(query.map(&:to_i))
when :float
query = Array.wrap(query)
arel_column.eq_any(query.map(&:to_f))
when :datetime
datetime = Time.parse(query)
range = (datetime-1.second)..(datetime+1.second)
Expand Down
76 changes: 71 additions & 5 deletions spec/data_tables/search_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@
"searchable": true,
"orderable": true,
"search": { "value": "", "regex": false }
},
{
"data": "engagement_rate",
"name": "",
"searchable": true,
"orderable": true,
"search": { "value": "", "regex": false }
}
],
"draw": 3,
Expand All @@ -43,8 +50,9 @@
before(:each) do
User.create(email: 'foo@bar.com')
User.create(email: 'foo2@bar.com')
Post.create(title: 'foo', views: 4)
Post.create(title: 'bar', views: 3)
Post.create(title: 'foo', views: 4, engagement_rate: 0.5)
Post.create(title: 'bar', views: 3, engagement_rate: 1.0)
Post.create(title: 'baz', views: 2, engagement_rate: 2.0)
end

it 'integers' do
Expand All @@ -58,12 +66,57 @@

posts = dt_module.search

# expect{dt_module.search}.to_not raise_error()
expect(posts.count).to eq(1)
expect(posts[0].views).to eq(4)

end

it 'integers for any of many values' do

complex_params[:columns][2][:search] = {
"value": ["4", "3", "1"],
"regex": false
}

dt_module = DataTables::Modules::Search.new(Post, Post.all, complex_params)

posts = dt_module.search

expect(posts.count).to eq(2)

end

it 'floats' do

complex_params[:columns][3][:search] = {
"value": ".5",
"regex": false
}

dt_module = DataTables::Modules::Search.new(Post, Post.all, complex_params)

posts = dt_module.search

expect(posts.count).to eq(1)
expect(posts[0].views).to eq(4)

end

it 'floats for any of many values' do

complex_params[:columns][3][:search] = {
"value": ["1", ".5", "1.5"],
"regex": false
}

dt_module = DataTables::Modules::Search.new(Post, Post.all, complex_params)

posts = dt_module.search

expect(posts.count).to eq(2)

end

it 'strings' do

complex_params[:columns][1][:search] = {
Expand All @@ -75,12 +128,26 @@

posts = dt_module.search

# expect{dt_module.search}.to_not raise_error()
expect(posts.count).to eq(1)
expect(posts[0].title).to eq('foo')

end

it 'strings for any of many values' do

complex_params[:columns][1][:search] = {
"value": ["foo", "bar"],
"regex": false
}

dt_module = DataTables::Modules::Search.new(Post, Post.all, complex_params)

posts = dt_module.search

expect(posts.count).to eq(2)

end

it 'uuids' do

complex_params[:columns][0][:search] = {
Expand All @@ -92,7 +159,6 @@

users = dt_module.search

# expect{dt_module.search}.to_not raise_error()
expect(users.count).to eq(1)
expect(users[0].email).to eq('foo@bar.com')

Expand Down
3 changes: 2 additions & 1 deletion spec/support/rails/db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
create_table :posts, :force => true do |t|
t.uuid :user_id
t.string :title
t.integer :views # for testing integers
t.integer :views
t.float :engagement_rate
t.timestamps
end

Expand Down