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
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
### 2.14.0
* Making flat_query an includable module for implementing filter classes
* Adds a new method for filter classes with `FlatQueryTools` included. `can_use_flat_query?` which uses smart defaults and can be overridden
* branched the standard `get_query` method to go to `get_flat_query` or the sub-select `get_complex_query` based on whether module is included and `can_use_flat_query?` is set to true
### 2.13.8
* Each flat-query condition now loops to more deeply support nested attributes. For each nest a new join param will be added to the query
* simplified some of the variable usage and params being passed around to remove things unnecessary.
Expand Down
4 changes: 2 additions & 2 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
PATH
remote: .
specs:
refine-rails (2.13.8)
refine-rails (2.14.0)
rails (>= 6.0)

GEM
Expand Down Expand Up @@ -105,7 +105,7 @@ GEM
mocha (2.7.1)
ruby2_keywords (>= 0.0.5)
mysql2 (0.5.6)
net-imap (0.5.6)
net-imap (0.5.8)
date
net-protocol
net-pop (0.1.2)
Expand Down
16 changes: 12 additions & 4 deletions app/models/refine/filter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ class Filter
include Stabilize
include Internationalized
include Inspector
include FlatQueryTools
# This validation structure sents `initial_query` as the method to validate against
define_model_callbacks :initialize, only: [:after]
after_initialize :valid?
Expand Down Expand Up @@ -92,10 +91,10 @@ def valid_query?

def get_query
raise "Initial query must exist" if initial_query.nil?
if blueprint.present?
@relation.where(group(make_sub_query(blueprint)))
if self.class.included_modules.include?(Refine::FlatQueryTools) && can_use_flat_query?
get_flat_query
else
@relation
get_complex_query
end
end

Expand All @@ -105,6 +104,14 @@ def get_query!
result
end

def get_complex_query
if blueprint.present?
@relation.where(group(make_sub_query(blueprint)))
else
@relation
end
end

def add_nodes_to_query(subquery:, nodes:, query_method:)
# Apply existing nodes to existing subquery
if subquery.present? && nodes.present?
Expand Down Expand Up @@ -213,6 +220,7 @@ def group(nodes)

def apply_condition(criterion)
begin
condition = get_condition_for_criterion(criterion)
get_condition_for_criterion(criterion)&.apply(criterion[:input], table, initial_query, false, nil)
rescue Refine::Conditions::Errors::ConditionClauseError => e
e.errors.each do |error|
Expand Down
17 changes: 15 additions & 2 deletions app/models/refine/flat_query_tools.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,16 @@ def construct_flat_query
else
unless condition_already_applied?(criteria_or_conjunction)
node = apply_flat_condition(criteria_or_conjunction)
@relation = @relation.where(Arel.sql(node.to_sql))
if node.is_a?(Arel::Nodes::Grouping)
@relation = @relation.where(node)
elsif node.is_a?(Array)
error = node.filter{ |n| n.is_a?(ActiveModel::Error) }.first
if error
filter.errors.add(:base, error.full_message)
end
else
@relation = @relation.where(Arel::Nodes::Grouping.new(node))
end
track_condition_applied(criteria_or_conjunction)
end
end
Expand Down Expand Up @@ -84,7 +93,6 @@ def apply_pending_joins
end
join_count += 1
end

end
end

Expand All @@ -100,5 +108,10 @@ def condition_already_applied?(criterion)
applied_conditions[criterion[:condition_id]] &&
applied_conditions[criterion[:condition_id]].include?(criterion[:input])
end

# Meant to be overridden by Filter classes to add or replace with custom logic
def can_use_flat_query?
!uses_or? && !uses_negative_clause? && !has_duplicate_conditions?
end
end
end
2 changes: 1 addition & 1 deletion lib/refine/rails/version.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module Refine
module Rails
VERSION = "2.13.8"
VERSION = "2.14.0"
end
end
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@clickfunnels/refine-stimulus",
"version": "2.13.8",
"version": "2.14.0",
"description": "Refine is a flexible query builder for your apps. It lets your users filter down to exactly what they're looking for. Completely configured on the backend.",
"browserslist": [
"defaults",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@
def create_filter(blueprint=nil)
tag_options = [{id: "1", display: "tag1"}, {id: "2", display: "tag2"}, {id: "3", display: "tag3"}, {id: "4", display: "tag4"}]
event_source_options = [{id: "1", display: "source1"}, {id: "2", display: "source2"}, {id: "5", display: "source5"}]
BlankTestFilter.new(blueprint,
FlatQueryTestFilter.new(blueprint,
Contact.all,
[
Refine::Conditions::TextCondition.new("text_field_value"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
SELECT DISTINCT `contacts`.* FROM `contacts`
INNER JOIN `forms_submissions` ON `forms_submissions`.`id` = `contacts`.`custom_attributes_id`
INNER JOIN `forms_submissions_answers` ON `forms_submissions_answers`.`submission_id` = `forms_submissions`.`id`
WHERE ((`forms_submissions_answers`.`entry` = 'test'))
WHERE (`forms_submissions_answers`.`entry` = 'test')
SQL
assert_equal expected_sql, filter.get_flat_query.to_sql
end
Expand All @@ -41,7 +41,7 @@
SELECT DISTINCT `contacts`.* FROM `contacts`
INNER JOIN `forms_submissions` ON `forms_submissions`.`id` = `contacts`.`custom_attributes_id`
INNER JOIN `forms_submissions_answers` ON `forms_submissions_answers`.`submission_id` = `forms_submissions`.`id`
WHERE ((`forms_submissions_answers`.`fields_option_id` IN (2, 3)))
WHERE (`forms_submissions_answers`.`fields_option_id` IN (2, 3))
SQL
assert_equal expected_sql, filter.get_flat_query.to_sql
end
Expand All @@ -55,7 +55,7 @@
INNER JOIN `forms_submissions` ON `forms_submissions`.`id` = `contacts`.`custom_attributes_id`
INNER JOIN `forms_submissions_answers` ON `forms_submissions_answers`.`submission_id` = `forms_submissions`.`id`
INNER JOIN `forms_submissions_answers_selected_options` ON `forms_submissions_answers_selected_options`.`answer_id` = `forms_submissions_answers`.`id`
WHERE ((`forms_submissions_answers_selected_options`.`fields_option_id` IN (1, 2)))
WHERE (`forms_submissions_answers_selected_options`.`fields_option_id` IN (1, 2))
SQL
assert_equal expected_sql, filter.get_flat_query.to_sql
end
Expand All @@ -69,7 +69,7 @@
INNER JOIN `forms_submissions` ON `forms_submissions`.`id` = `contacts`.`custom_attributes_id`
INNER JOIN `forms_submissions_answers` ON `forms_submissions_answers`.`submission_id` = `forms_submissions`.`id`
INNER JOIN `contacts_applied_tags` ON `contacts_applied_tags`.`contact_id` = `contacts`.`id`
WHERE ((`forms_submissions_answers`.`fields_option_id` IN (2, 3))) AND ((`contacts_applied_tags`.`tag_id` IN (1, 2)))
WHERE (`forms_submissions_answers`.`fields_option_id` IN (2, 3)) AND (`contacts_applied_tags`.`tag_id` IN (1, 2))
SQL
assert_equal expected_sql, filter.get_flat_query.to_sql
end
Expand All @@ -78,7 +78,7 @@
def create_filter(blueprint=nil)
field_options = [{id: "1", display: "field1"}, {id: "2", display: "field2"}, {id: "3", display: "field3"}, {id: "4", display: "field4"}]
selected_options = [{id: "1", display: "selected1"}, {id: "2", display: "selected2"}, {id: "3", display: "selected3"}, {id: "4", display: "selected4"}]
BlankTestFilter.new(blueprint,
FlatQueryTestFilter.new(blueprint,
Contact.all,
[
Refine::Conditions::TextCondition.new("custom_attributes.answers.entry"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
expected_sql = <<-SQL.squish
SELECT DISTINCT `contacts`.* FROM `contacts`
INNER JOIN `contacts_last_activities` ON `contacts_last_activities`.`contact_id` = `contacts`.`id`
WHERE ((`contacts_last_activities`.`last_activity_at` BETWEEN '2020-01-01 00:00:00' AND '2020-01-01 23:59:59'))
WHERE (`contacts_last_activities`.`last_activity_at` BETWEEN '2020-01-01 00:00:00' AND '2020-01-01 23:59:59')
SQL
assert_equal expected_sql, filter.get_flat_query.to_sql
end
Expand All @@ -36,15 +36,15 @@
SELECT DISTINCT `contacts`.* FROM `contacts`
INNER JOIN `contacts_last_activities` ON `contacts_last_activities`.`contact_id` = `contacts`.`id`
INNER JOIN `contacts_applied_tags` ON `contacts_applied_tags`.`contact_id` = `contacts`.`id`
WHERE ((`contacts_last_activities`.`last_activity_at` BETWEEN '2020-01-01 00:00:00' AND '2020-01-01 23:59:59')) AND ((`contacts_applied_tags`.`tag_id` = 4))
WHERE (`contacts_last_activities`.`last_activity_at` BETWEEN '2020-01-01 00:00:00' AND '2020-01-01 23:59:59') AND (`contacts_applied_tags`.`tag_id` = 4)
SQL
assert_equal expected_sql, filter.get_flat_query.to_sql
end
end

def create_filter(blueprint=nil)
tag_options = [{id: "1", display: "tag1"}, {id: "2", display: "tag2"}, {id: "3", display: "tag3"}, {id: "4", display: "tag4"}]
BlankTestFilter.new(blueprint,
FlatQueryTestFilter.new(blueprint,
Contact.all,
[
Refine::Conditions::TextCondition.new("text_field_value"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
expected_sql = <<-SQL.squish
SELECT DISTINCT `contacts`.* FROM `contacts`
INNER JOIN `contacts_applied_tags` ON `contacts_applied_tags`.`contact_id` = `contacts`.`id`
WHERE ((`contacts_applied_tags`.`tag_id` IN (1, 2))) AND ((`contacts_applied_tags`.`tag_id` = 4))
WHERE (`contacts_applied_tags`.`tag_id` IN (1, 2)) AND (`contacts_applied_tags`.`tag_id` = 4)
SQL
assert_equal expected_sql, filter.get_flat_query.to_sql
end
Expand All @@ -35,7 +35,7 @@

def create_filter(blueprint=nil)
tag_options = [{id: "1", display: "tag1"}, {id: "2", display: "tag2"}, {id: "3", display: "tag3"}, {id: "4", display: "tag4"}]
BlankTestFilter.new(blueprint,
FlatQueryTestFilter.new(blueprint,
Contact.all,
[
Refine::Conditions::TextCondition.new("text_field_value"),
Expand Down
Loading