From 74b82f2e0da4b2de38995c592f2bff03f6e5c9de Mon Sep 17 00:00:00 2001 From: phoet Date: Wed, 26 Sep 2018 12:22:30 +0200 Subject: [PATCH] push a joins attribute to the facet --- lib/forty_facets/filter/sql_facet_filter_definition.rb | 6 ++++-- test/smoke_test.rb | 8 ++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/forty_facets/filter/sql_facet_filter_definition.rb b/lib/forty_facets/filter/sql_facet_filter_definition.rb index d243535..0cd437b 100644 --- a/lib/forty_facets/filter/sql_facet_filter_definition.rb +++ b/lib/forty_facets/filter/sql_facet_filter_definition.rb @@ -6,6 +6,7 @@ def initialize(search, queries, opts) @search = search @queries = queries @path = Array(opts[:path]) if opts[:path].present? + @joins = Array(opts[:joins]) if opts[:joins].present? @path ||= @queries.keys @options = opts end @@ -29,7 +30,7 @@ def build_scope Proc.new do |base| # intersection of values and definition queries base.where(selected_queries.values.map do |query| - "(#{query})" + "(#{query})" end.join(" OR ")) end end @@ -55,13 +56,14 @@ def add(value) def facet query = definition.queries.map do |key, sql_query| - "(#{sql_query}) as #{key}" + "(#{sql_query}) as #{key}" end.join(", ") query += ", count(*) as occurrences" counts = without.result.reorder("") .select(query) .group(definition.queries.keys) + counts = counts.joins(definition.joins) if definition.joins counts.includes_values = [] result = {} diff --git a/test/smoke_test.rb b/test/smoke_test.rb index 6b100ba..cb1b56d 100644 --- a/test/smoke_test.rb +++ b/test/smoke_test.rb @@ -23,6 +23,8 @@ class MovieSearch < FortyFacets::FacetSearch facet [:studio, :country], name: 'Country' facet [:studio, :status], name: 'Studio status' facet [:studio, :producers], name: 'Producers' + sql_facet({ uschis: "studios.name = 'Uschi'", non_uschis: "studios.name != 'USCHI'" }, + { name: "Uschis", path: [:studio, :uschis], joins: [:studio] }) sql_facet({ classic: "year <= 1980", non_classic: "year > 1980" }, { name: "Classic", path: :classic }) sql_facet({ classic: "year <= 1980", non_classic: "year > 1980" }, @@ -34,6 +36,12 @@ class MovieSearch < FortyFacets::FacetSearch class SmokeTest < Minitest::Test + def test_sql_facet_with_belongs_to + search = MovieSearch.new({'studio-uschis' => {}}) + assert_equal Movie.count, search.result.size + assert_equal search.filter([:studio, :uschis]).facet, [FortyFacets::FacetValue.new(:uschis, 0, false), FortyFacets::FacetValue.new(:non_uschis, 40, false)] + end + def test_it_finds_all_movies search = MovieSearch.new({}) assert_equal Movie.all.size, search.result.size