Fix Elasticsearch sorting incorrectly from DB
What does this MR do?
Closes #229982 (closed)
Before this our search results were getting mixed up within a page. The
Records#records
method is meant to sort again the query results based on the original
Elasticsearch ordering after loading from the DB, but this was not
working correctly in our code due to us monkey patching the
elasticsearch-model Gem and changing the value of
_id
for Elasticsearch records.
As such we needed to dig ourselves further into the monkey patch hole.
This MR replaces a single line inside Records#records
method, which,
unfortunately, required us to replace the entire lengthy method.
The diff for this monkey patch is simply:
if !self.order_values.present?
+ # BEGIN_MONKEY_PATCH
+ #
+ # Monkey patch sorting because we monkey patch ids and the
+ # previous code uses `hit['_id']` which does not match our
+ # record.id. We instead need `hit['_source']['id']`.
- @records.sort_by { |record| hits.index { |hit| hit['_id'].to_s == record.id.to_s } }
+ @records.sort_by { |record| hits.index { |hit| hit['_source']['id'].to_s == record.id.to_s } }
+ # END_MONKEY_PATCH
else
@records
end
Screenshots
Does this MR meet the acceptance criteria?
Conformity
-
Changelog entry - [-] Documentation (if required)
-
Code review guidelines -
Merge request performance guidelines -
Style guides -
Database guides -
Separation of EE specific content
Availability and Testing
-
Review and add/update tests for this feature/bug. Consider all test levels. See the Test Planning Process. -
Tested in all supported browsers -
Informed Infrastructure department of a default or new setting change, if applicable per definition of done
Security
If this MR contains changes to processing or storing of credentials or tokens, authorization and authentication methods and other items described in the security review guidelines:
-
Label as security and @ mention @gitlab-com/gl-security/appsec
-
The MR includes necessary changes to maintain consistency between UI, API, email, or other methods -
Security reports checked/validated by a reviewer from the AppSec team