@@ -1680,4 +1680,149 @@ TEST_F(SearchFamilyTest, AggregateResultFields) {
1680
1680
IsMap (), IsMap ()));
1681
1681
}
1682
1682
1683
+ TEST_F (SearchFamilyTest, AggregateSortByJson) {
1684
+ Run ({" JSON.SET" , " j1" , " $" , R"( {"name": "first", "number": 1200, "group": "first"})" });
1685
+ Run ({" JSON.SET" , " j2" , " $" , R"( {"name": "second", "number": 800, "group": "first"})" });
1686
+ Run ({" JSON.SET" , " j3" , " $" , R"( {"name": "third", "number": 300, "group": "first"})" });
1687
+ Run ({" JSON.SET" , " j4" , " $" , R"( {"name": "fourth", "number": 400, "group": "second"})" });
1688
+ Run ({" JSON.SET" , " j5" , " $" , R"( {"name": "fifth", "number": 900, "group": "second"})" });
1689
+ Run ({" JSON.SET" , " j6" , " $" , R"( {"name": "sixth", "number": 300, "group": "first"})" });
1690
+ Run ({" JSON.SET" , " j7" , " $" , R"( {"name": "seventh", "number": 400, "group": "second"})" });
1691
+ Run ({" JSON.SET" , " j8" , " $" , R"( {"name": "eighth", "group": "first"})" });
1692
+ Run ({" JSON.SET" , " j9" , " $" , R"( {"name": "ninth", "group": "second"})" });
1693
+
1694
+ Run ({" FT.CREATE" , " index" , " ON" , " JSON" , " SCHEMA" , " $.name" , " AS" , " name" , " TEXT" , " $.number" ,
1695
+ " AS" , " number" , " NUMERIC" , " $.group" , " AS" , " group" , " TAG" });
1696
+
1697
+ // Test sorting by name (DESC) and number (ASC)
1698
+ auto resp = Run ({" FT.AGGREGATE" , " index" , " *" , " SORTBY" , " 4" , " @name" , " DESC" , " @number" , " ASC" });
1699
+ EXPECT_THAT (resp, IsUnordArrayWithSize (
1700
+ IsMap (" name" , " \" third\" " , " number" , " 300" ),
1701
+ IsMap (" name" , " \" sixth\" " , " number" , " 300" ),
1702
+ IsMap (" name" , " \" seventh\" " , " number" , " 400" ),
1703
+ IsMap (" name" , " \" second\" " , " number" , " 800" ), IsMap (" name" , " \" ninth\" " ),
1704
+ IsMap (" name" , " \" fourth\" " , " number" , " 400" ),
1705
+ IsMap (" name" , " \" first\" " , " number" , " 1200" ),
1706
+ IsMap (" name" , " \" fifth\" " , " number" , " 900" ), IsMap (" name" , " \" eighth\" " )));
1707
+
1708
+ // Test sorting by name (ASC) and number (DESC)
1709
+ resp = Run ({" FT.AGGREGATE" , " index" , " *" , " SORTBY" , " 4" , " @name" , " ASC" , " @number" , " DESC" });
1710
+ EXPECT_THAT (resp, IsUnordArrayWithSize (
1711
+ IsMap (" name" , " \" eighth\" " ), IsMap (" name" , " \" fifth\" " , " number" , " 900" ),
1712
+ IsMap (" name" , " \" first\" " , " number" , " 1200" ),
1713
+ IsMap (" name" , " \" fourth\" " , " number" , " 400" ), IsMap (" name" , " \" ninth\" " ),
1714
+ IsMap (" name" , " \" second\" " , " number" , " 800" ),
1715
+ IsMap (" name" , " \" seventh\" " , " number" , " 400" ),
1716
+ IsMap (" name" , " \" sixth\" " , " number" , " 300" ),
1717
+ IsMap (" name" , " \" third\" " , " number" , " 300" )));
1718
+
1719
+ // Test sorting by group (ASC), number (DESC), and name
1720
+ resp = Run (
1721
+ {" FT.AGGREGATE" , " index" , " *" , " SORTBY" , " 5" , " @group" , " ASC" , " @number" , " DESC" , " @name" });
1722
+ EXPECT_THAT (resp, IsUnordArrayWithSize (
1723
+ IsMap (" group" , " \" first\" " , " number" , " 1200" , " name" , " \" first\" " ),
1724
+ IsMap (" group" , " \" first\" " , " number" , " 800" , " name" , " \" second\" " ),
1725
+ IsMap (" group" , " \" first\" " , " number" , " 300" , " name" , " \" sixth\" " ),
1726
+ IsMap (" group" , " \" first\" " , " number" , " 300" , " name" , " \" third\" " ),
1727
+ IsMap (" group" , " \" first\" " , " name" , " \" eighth\" " ),
1728
+ IsMap (" group" , " \" second\" " , " number" , " 900" , " name" , " \" fifth\" " ),
1729
+ IsMap (" group" , " \" second\" " , " number" , " 400" , " name" , " \" fourth\" " ),
1730
+ IsMap (" group" , " \" second\" " , " number" , " 400" , " name" , " \" seventh\" " ),
1731
+ IsMap (" group" , " \" second\" " , " name" , " \" ninth\" " )));
1732
+
1733
+ // Test sorting by number (ASC), group (DESC), and name
1734
+ resp = Run (
1735
+ {" FT.AGGREGATE" , " index" , " *" , " SORTBY" , " 5" , " @number" , " ASC" , " @group" , " DESC" , " @name" });
1736
+ EXPECT_THAT (resp, IsUnordArrayWithSize (
1737
+ IsMap (" number" , " 300" , " group" , " \" first\" " , " name" , " \" sixth\" " ),
1738
+ IsMap (" number" , " 300" , " group" , " \" first\" " , " name" , " \" third\" " ),
1739
+ IsMap (" number" , " 400" , " group" , " \" second\" " , " name" , " \" fourth\" " ),
1740
+ IsMap (" number" , " 400" , " group" , " \" second\" " , " name" , " \" seventh\" " ),
1741
+ IsMap (" number" , " 800" , " group" , " \" first\" " , " name" , " \" second\" " ),
1742
+ IsMap (" number" , " 900" , " group" , " \" second\" " , " name" , " \" fifth\" " ),
1743
+ IsMap (" number" , " 1200" , " group" , " \" first\" " , " name" , " \" first\" " ),
1744
+ IsMap (" group" , " \" second\" " , " name" , " \" ninth\" " ),
1745
+ IsMap (" group" , " \" first\" " , " name" , " \" eighth\" " )));
1746
+
1747
+ // Test sorting with MAX 3
1748
+ resp = Run ({" FT.AGGREGATE" , " index" , " *" , " SORTBY" , " 1" , " @number" , " MAX" , " 3" });
1749
+ EXPECT_THAT (resp, IsUnordArrayWithSize (IsMap (" number" , " 300" ), IsMap (" number" , " 300" ),
1750
+ IsMap (" number" , " 400" )));
1751
+
1752
+ // Test sorting with MAX 3
1753
+ resp = Run ({" FT.AGGREGATE" , " index" , " *" , " SORTBY" , " 2" , " @number" , " DESC" , " MAX" , " 3" });
1754
+ EXPECT_THAT (resp, IsUnordArrayWithSize (IsMap (" number" , " 1200" ), IsMap (" number" , " 900" ),
1755
+ IsMap (" number" , " 800" )));
1756
+
1757
+ // Test sorting by number (ASC) with MAX 999
1758
+ resp = Run ({" FT.AGGREGATE" , " index" , " *" , " SORTBY" , " 1" , " @number" , " MAX" , " 999" });
1759
+ EXPECT_THAT (resp, IsUnordArrayWithSize (IsMap (" number" , " 300" ), IsMap (" number" , " 300" ),
1760
+ IsMap (" number" , " 400" ), IsMap (" number" , " 400" ),
1761
+ IsMap (" number" , " 800" ), IsMap (" number" , " 900" ),
1762
+ IsMap (" number" , " 1200" ), IsMap (), IsMap ()));
1763
+
1764
+ // Test sorting by name and number (DESC)
1765
+ resp = Run ({" FT.AGGREGATE" , " index" , " *" , " SORTBY" , " 3" , " @name" , " @number" , " DESC" });
1766
+ EXPECT_THAT (resp, IsUnordArrayWithSize (
1767
+ IsMap (" name" , " \" eighth\" " ), IsMap (" name" , " \" fifth\" " , " number" , " 900" ),
1768
+ IsMap (" name" , " \" first\" " , " number" , " 1200" ),
1769
+ IsMap (" name" , " \" fourth\" " , " number" , " 400" ), IsMap (" name" , " \" ninth\" " ),
1770
+ IsMap (" name" , " \" second\" " , " number" , " 800" ),
1771
+ IsMap (" name" , " \" seventh\" " , " number" , " 400" ),
1772
+ IsMap (" name" , " \" sixth\" " , " number" , " 300" ),
1773
+ IsMap (" name" , " \" third\" " , " number" , " 300" )));
1774
+
1775
+ // Test SORTBY with MAX, GROUPBY, and REDUCE COUNT
1776
+ resp = Run ({" FT.AGGREGATE" , " index" , " *" , " SORTBY" , " 1" , " @name" , " MAX" , " 3" , " GROUPBY" , " 1" ,
1777
+ " @number" , " REDUCE" , " COUNT" , " 0" , " AS" , " count" });
1778
+ EXPECT_THAT (resp, IsUnordArrayWithSize (IsMap (" number" , " 900" , " count" , " 1" ),
1779
+ IsMap (" number" , ArgType (RespExpr::NIL), " count" , " 1" ),
1780
+ IsMap (" number" , " 1200" , " count" , " 1" )));
1781
+
1782
+ // Test SORTBY with MAX, GROUPBY (0 fields), and REDUCE COUNT
1783
+ resp = Run ({" FT.AGGREGATE" , " index" , " *" , " SORTBY" , " 1" , " @name" , " MAX" , " 3" , " GROUPBY" , " 0" ,
1784
+ " REDUCE" , " COUNT" , " 0" , " AS" , " count" });
1785
+ EXPECT_THAT (resp, IsUnordArrayWithSize (IsMap (" count" , " 3" )));
1786
+ }
1787
+
1788
+ TEST_F (SearchFamilyTest, AggregateSortByParsingErrors) {
1789
+ Run ({" JSON.SET" , " j1" , " $" , R"( {"name": "first", "number": 1200, "group": "first"})" });
1790
+ Run ({" JSON.SET" , " j2" , " $" , R"( {"name": "second", "number": 800, "group": "first"})" });
1791
+ Run ({" JSON.SET" , " j3" , " $" , R"( {"name": "third", "number": 300, "group": "first"})" });
1792
+ Run ({" JSON.SET" , " j4" , " $" , R"( {"name": "fourth", "number": 400, "group": "second"})" });
1793
+ Run ({" JSON.SET" , " j5" , " $" , R"( {"name": "fifth", "number": 900, "group": "second"})" });
1794
+ Run ({" JSON.SET" , " j6" , " $" , R"( {"name": "sixth", "number": 300, "group": "first"})" });
1795
+ Run ({" JSON.SET" , " j7" , " $" , R"( {"name": "seventh", "number": 400, "group": "second"})" });
1796
+ Run ({" JSON.SET" , " j8" , " $" , R"( {"name": "eighth", "group": "first"})" });
1797
+ Run ({" JSON.SET" , " j9" , " $" , R"( {"name": "ninth", "group": "second"})" });
1798
+
1799
+ Run ({" FT.CREATE" , " index" , " ON" , " JSON" , " SCHEMA" , " $.name" , " AS" , " name" , " TEXT" , " $.number" ,
1800
+ " AS" , " number" , " NUMERIC" , " $.group" , " AS" , " group" , " TAG" });
1801
+
1802
+ // Test SORTBY with invalid argument count
1803
+ auto resp = Run ({" FT.AGGREGATE" , " index" , " *" , " SORTBY" , " 999" , " @name" , " @number" , " DESC" });
1804
+ EXPECT_THAT (resp, ErrArg (" bad arguments for SORTBY: specified invalid number of strings" ));
1805
+
1806
+ // Test SORTBY with negative argument count
1807
+ resp = Run ({" FT.AGGREGATE" , " index" , " *" , " SORTBY" , " -3" , " @name" , " @number" , " DESC" });
1808
+ EXPECT_THAT (resp, ErrArg (" value is not an integer or out of range" ));
1809
+
1810
+ // Test MAX with invalid value
1811
+ resp = Run ({" FT.AGGREGATE" , " index" , " *" , " SORTBY" , " 1" , " @name" , " MAX" , " -10" });
1812
+ EXPECT_THAT (resp, ErrArg (" value is not an integer or out of range" ));
1813
+
1814
+ // Test MAX without a value
1815
+ resp = Run ({" FT.AGGREGATE" , " index" , " *" , " SORTBY" , " 1" , " @name" , " MAX" });
1816
+ EXPECT_THAT (resp, ErrArg (" syntax error" ));
1817
+
1818
+ // Test SORTBY with a non-existing field
1819
+ /* Temporary unsupported
1820
+ resp = Run({"FT.AGGREGATE", "index", "*", "SORTBY", "1", "@nonexistingfield"});
1821
+ EXPECT_THAT(resp, ErrArg("Property `nonexistingfield` not loaded nor in schema")); */
1822
+
1823
+ // Test SORTBY with an invalid value
1824
+ resp = Run ({" FT.AGGREGATE" , " index" , " *" , " SORTBY" , " notvalue" , " @name" });
1825
+ EXPECT_THAT (resp, ErrArg (" value is not an integer or out of range" ));
1826
+ }
1827
+
1683
1828
} // namespace dfly
0 commit comments