Shopify / liquid

Liquid markup language. Safe, customer facing template language for flexible web apps.
https://shopify.github.io/liquid/
MIT License
11.13k stars 1.39k forks source link

Cannot Sort Metaobject by Numerical Metafield - "cannot sort values of incompatible types" Error #1742

Open gazjones00 opened 1 year ago

gazjones00 commented 1 year ago

Summary:

When trying to sort a Metaobject that contains several metafields, including order_index of type number_integer, the Liquid engine throws an error that says cannot sort values of incompatible types. The sorting works perfectly well when sorting by single_line_text_field or string, but not with a numerical value.

Details:

We have a Metaobject defined for a size guide, containing a metafield order_index of type number_integer. We are trying to sort this Metaobject by order_index but are encountering an error.

Code sample:

liquidCopy code
{% liquid
  assign sizes = shop.metaobjects.standard_size.values | sort: 'order_index'
  ...
%}

The error seems to be originating from this line: https://github.com/Shopify/liquid/blob/0b9318222bcc09681e52fd5b8e70262274e673bf/lib/liquid/standardfilters.rb#L923

Inside the sort function here: https://github.com/Shopify/liquid/blob/0b9318222bcc09681e52fd5b8e70262274e673bf/lib/liquid/standardfilters.rb#L355

Steps to Reproduce:

  1. Define a Metaobject with a metafield order_index of type number_integer.
  2. As shown in the code sample, Try to sort the Metaobject using Liquid syntax.
  3. Observe the error cannot sort values of incompatible types.

Expected Behavior:

The Metaobject should be sorted based on the order_index field without errors.

Actual Behavior:

Throws error cannot sort values of incompatible types.

Additional Information:

Thank you for taking the time to look into this issue. I would love to hear any insights or solutions.

lucasaraujo45 commented 1 year ago

@gazjones00

I encountered the same issue when attempting to sort by date/number. I wasn't able to sort by number and the date isn't sourced from a metaobject JSON.

As a temporary workaround, I defined the date as a string within the metaobject. I then used regex validation to ensure user input adheres to the 'yyyy-mm-dd' format. By doing this, I was able to sort the dates alphabetically, and this approach successfully resolved the issue for me.

I hope this helps someone else facing a similar problem, but it'd be great if the core issue with sorting numerical types could be addressed. Thanks for this issue!

NeuroticCoder91 commented 6 months ago

Seems entirely silly that we cannot sort by date type in a metaobject