From c501a854e31e1043921405daed9b688471e76f94 Mon Sep 17 00:00:00 2001 From: Spencer Markowski Date: Sun, 10 Mar 2024 00:24:09 -0500 Subject: [PATCH 1/2] Fixes #39 Sort should override default_sort_key --- .../transformers/keyword_transformer.rb | 1 + lib/stretchy/relations/finder_methods.rb | 22 +++++++++++++++++-- lib/stretchy/relations/query_builder.rb | 2 +- spec/models/resource.rb | 6 ++--- spec/stretchy/querying_spec.rb | 15 ++++++++++++- spec/stretchy/relations/query_builder_spec.rb | 6 +++-- 6 files changed, 43 insertions(+), 9 deletions(-) diff --git a/lib/stretchy/attributes/transformers/keyword_transformer.rb b/lib/stretchy/attributes/transformers/keyword_transformer.rb index 195dfa2..655b0e5 100644 --- a/lib/stretchy/attributes/transformers/keyword_transformer.rb +++ b/lib/stretchy/attributes/transformers/keyword_transformer.rb @@ -31,6 +31,7 @@ def keyword?(arg) end def protected?(arg) + return false if arg.nil? Stretchy::Relations::AggregationMethods::AGGREGATION_METHODS.include?(arg.to_sym) end diff --git a/lib/stretchy/relations/finder_methods.rb b/lib/stretchy/relations/finder_methods.rb index 8050749..fc4c5c0 100644 --- a/lib/stretchy/relations/finder_methods.rb +++ b/lib/stretchy/relations/finder_methods.rb @@ -9,7 +9,16 @@ def first end def first! - spawn.sort(Hash[default_sort_key, :asc]).spawn.size(1) + spawned = spawn + if spawned.order_values.length.zero? + spawn.sort(Hash[default_sort_key, :asc]).spawn.size(1) + elsif spawned.order_values.length == 1 + new_direction = Hash[spawned.order_values.first.keys.first, :asc] + spawned.order_values = [] + spawned.order(**new_direction).size(1) + elsif + spawn.size(1) + end self end @@ -19,7 +28,16 @@ def last end def last! - spawn.sort(Hash[default_sort_key, :desc]).spawn.size(1) + spawned = spawn + if spawned.order_values.length.zero? + spawn.sort(Hash[default_sort_key, :desc]).spawn.size(1) + elsif spawned.order_values.length == 1 + new_direction = Hash[spawned.order_values.first.keys.first, :desc] + spawned.order_values.clear + spawned.order(new_direction).size(1) + else + spawn.size(1) + end self end diff --git a/lib/stretchy/relations/query_builder.rb b/lib/stretchy/relations/query_builder.rb index c5c71cf..1716d8b 100644 --- a/lib/stretchy/relations/query_builder.rb +++ b/lib/stretchy/relations/query_builder.rb @@ -150,7 +150,7 @@ def build_source end def build_sort - structure.sort sort.flatten #.inject(Hash.new) { |h,v| h.merge(v) } + structure.sort sort.map { |arg| keyword_transformer.transform(arg) }.flatten end def build_highlights diff --git a/spec/models/resource.rb b/spec/models/resource.rb index 64a21c0..3e83760 100644 --- a/spec/models/resource.rb +++ b/spec/models/resource.rb @@ -1,11 +1,11 @@ class Resource < Stretchy::Record index_name "resource_test" - attribute :name, :string - attribute :email, :string + attribute :name, :keyword + attribute :email, :keyword attribute :phone, :string attribute :position, :hash - attribute :gender, :string + attribute :gender, :keyword attribute :age, :integer attribute :income, :integer attribute :income_after_raise, :integer diff --git a/spec/stretchy/querying_spec.rb b/spec/stretchy/querying_spec.rb index b8ce114..6eef9b3 100644 --- a/spec/stretchy/querying_spec.rb +++ b/spec/stretchy/querying_spec.rb @@ -163,7 +163,7 @@ it 'accepts fields as keyword arguments' do result = described_class.order(age: :desc, name: :asc, created_at: {order: :desc, mode: :avg}) - expected = {:sort=>[{:age=>:desc}, {:name=>:asc}, {:created_at=>{:order=>:desc, :mode=>:avg}}]} + expected = {:sort=>[{:age=>:desc}, {'name.keyword'=>:asc}, {:created_at=>{:order=>:desc, :mode=>:avg}}]} expect(result.to_elastic).to eq(expected.with_indifferent_access) end @@ -172,6 +172,19 @@ expected = {:sort=>[{:age=>:desc}]} expect(result.to_elastic).to eq(expected.with_indifferent_access) end + + it 'overrides default sort with last' do + subject = described_class.sort(name: :asc) + query = subject.last!.to_elastic + expect(query).to eq({sort: [{'name.keyword': :desc}]}.with_indifferent_access) + end + + it 'overrides default sort with first' do + subject = described_class.sort(name: :asc) + query = subject.first!.to_elastic + expect(query).to eq({sort: [{'name.keyword': :asc}]}.with_indifferent_access) + end + end context 'fields' do diff --git a/spec/stretchy/relations/query_builder_spec.rb b/spec/stretchy/relations/query_builder_spec.rb index 87b901f..f4a9b0d 100644 --- a/spec/stretchy/relations/query_builder_spec.rb +++ b/spec/stretchy/relations/query_builder_spec.rb @@ -84,17 +84,19 @@ context 'sorting' do it 'accepts array of hashes' do sorts = [{created_at: :desc}, {title: :asc}] - subject = described_class.new(order: sorts) + subject = described_class.new({order: sorts}, attribute_types) query = subject.to_elastic expect(query).to eq({sort: sorts}.with_indifferent_access) end it 'accepts options' do sorts = [{price: { order: :desc, mode: :avg}}] - subject = described_class.new(order: sorts) + subject = described_class.new({order: sorts}, attribute_types) query = subject.to_elastic expect(query).to eq({sort: sorts}.with_indifferent_access) end + + end context 'search options' do From 60360cae34e35c5d9468e859f530b195b43b96f4 Mon Sep 17 00:00:00 2001 From: Spencer Markowski Date: Sun, 10 Mar 2024 00:39:52 -0500 Subject: [PATCH 2/2] Change direction of first sort key if not default_sort_key --- lib/stretchy/relations/finder_methods.rb | 22 ++++++++++------------ spec/stretchy/querying_spec.rb | 12 ++++++++++++ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/lib/stretchy/relations/finder_methods.rb b/lib/stretchy/relations/finder_methods.rb index fc4c5c0..a11fa1f 100644 --- a/lib/stretchy/relations/finder_methods.rb +++ b/lib/stretchy/relations/finder_methods.rb @@ -12,12 +12,11 @@ def first! spawned = spawn if spawned.order_values.length.zero? spawn.sort(Hash[default_sort_key, :asc]).spawn.size(1) - elsif spawned.order_values.length == 1 - new_direction = Hash[spawned.order_values.first.keys.first, :asc] - spawned.order_values = [] - spawned.order(**new_direction).size(1) - elsif - spawn.size(1) + elsif spawned.order_values.length >= 1 + first_order_value = spawned.order_values.shift + new_direction = Hash[first_order_value.keys.first, :asc] + spawned.order_values.unshift(new_direction) + spawned.size(1) end self end @@ -31,12 +30,11 @@ def last! spawned = spawn if spawned.order_values.length.zero? spawn.sort(Hash[default_sort_key, :desc]).spawn.size(1) - elsif spawned.order_values.length == 1 - new_direction = Hash[spawned.order_values.first.keys.first, :desc] - spawned.order_values.clear - spawned.order(new_direction).size(1) - else - spawn.size(1) + elsif spawned.order_values.length >= 1 + first_order_value = spawned.order_values.shift + new_direction = Hash[first_order_value.keys.first, :desc] + spawned.order_values.unshift(new_direction) + spawned.size(1) end self end diff --git a/spec/stretchy/querying_spec.rb b/spec/stretchy/querying_spec.rb index 6eef9b3..89c3b07 100644 --- a/spec/stretchy/querying_spec.rb +++ b/spec/stretchy/querying_spec.rb @@ -184,6 +184,18 @@ query = subject.first!.to_elastic expect(query).to eq({sort: [{'name.keyword': :asc}]}.with_indifferent_access) end + + it 'changes first sort key to desc' do + subject = described_class.sort(name: :asc, age: :desc) + query = subject.last!.to_elastic + expect(query[:sort]).to eq([{'name.keyword' => :desc}, {'age' => :desc}]) + end + + it 'changes first sort key to asc' do + subject = described_class.sort(name: :desc, age: :desc) + query = subject.first!.to_elastic + expect(query[:sort]).to eq([{'name.keyword' => :asc}, {'age' => :desc}]) + end end