Skip to content

Commit

Permalink
Merge pull request #50 from theablefew/esmarkowski/Sort-should-overri…
Browse files Browse the repository at this point in the history
…de-default_sort_key

Fix issue with sort overriding default_sort_key
  • Loading branch information
esmarkowski authored Mar 10, 2024
2 parents 16c415f + 60360ca commit 3794428
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
20 changes: 18 additions & 2 deletions lib/stretchy/relations/finder_methods.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,15 @@ 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
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

Expand All @@ -19,7 +27,15 @@ 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
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

Expand Down
2 changes: 1 addition & 1 deletion lib/stretchy/relations/query_builder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions spec/models/resource.rb
Original file line number Diff line number Diff line change
@@ -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
Expand Down
27 changes: 26 additions & 1 deletion spec/stretchy/querying_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -172,6 +172,31 @@
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

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

context 'fields' do
Expand Down
6 changes: 4 additions & 2 deletions spec/stretchy/relations/query_builder_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 3794428

Please sign in to comment.