@@ -195,12 +195,75 @@ InternalValue Default::Filter(const InternalValue& baseVal, RenderContext& conte
195
195
196
196
DictSort::DictSort (FilterParams params)
197
197
{
198
-
198
+ ParseParams ({{ " case_sensitive " , false }, { " by " , false , std::string ( " key " )}, { " reverse " , false }}, params);
199
199
}
200
200
201
201
InternalValue DictSort::Filter (const InternalValue& baseVal, RenderContext& context)
202
202
{
203
- return InternalValue ();
203
+ const MapAdapter* map = boost::get<MapAdapter>(&baseVal);
204
+ if (map == nullptr )
205
+ return InternalValue ();
206
+
207
+ InternalValue isReverseVal = GetArgumentValue (" reverse" , context, InternalValue (false ));
208
+ InternalValue isCsVal = GetArgumentValue (" case_sensitive" , context, InternalValue (false ));
209
+ InternalValue byVal = GetArgumentValue (" by" , context, InternalValue (std::string (" key" )));
210
+
211
+ bool (*comparator)(const KeyValuePair& left, const KeyValuePair& right);
212
+
213
+ if (AsString (byVal) == " key" ) // Sort by key
214
+ {
215
+ if (ConvertToBool (isCsVal))
216
+ {
217
+ comparator = [](const KeyValuePair& left, const KeyValuePair& right)
218
+ {
219
+ return left.key < right.key ;
220
+ };
221
+ }
222
+ else
223
+ {
224
+ comparator = [](const KeyValuePair& left, const KeyValuePair& right)
225
+ {
226
+ return boost::lexicographical_compare (left.key , right.key , boost::algorithm::is_iless ());
227
+ };
228
+ }
229
+ }
230
+ else if (AsString (byVal) == " value" )
231
+ {
232
+ if (ConvertToBool (isCsVal))
233
+ {
234
+ comparator = [](const KeyValuePair& left, const KeyValuePair& right)
235
+ {
236
+ return ConvertToBool (Apply2<visitors::BinaryMathOperation>(left.value , right.value , BinaryExpression::LogicalLt, BinaryExpression::CaseSensitive));
237
+ };
238
+ }
239
+ else
240
+ {
241
+ comparator = [](const KeyValuePair& left, const KeyValuePair& right)
242
+ {
243
+ return ConvertToBool (Apply2<visitors::BinaryMathOperation>(left.value , right.value , BinaryExpression::LogicalLt, BinaryExpression::CaseInsensitive));
244
+ };
245
+ }
246
+ }
247
+ else
248
+ return InternalValue ();
249
+
250
+ std::vector<KeyValuePair> tempVector;
251
+ tempVector.reserve (map->GetSize ());
252
+ for (int64_t idx = 0 ; idx < map->GetSize (); ++ idx)
253
+ {
254
+ auto val = map->GetValueByIndex (idx);
255
+ auto & kvVal = boost::get<KeyValuePair>(val);
256
+ tempVector.push_back (std::move (kvVal));
257
+ }
258
+
259
+ if (ConvertToBool (isReverseVal))
260
+ std::sort (tempVector.begin (), tempVector.end (), [comparator](auto & l, auto & r) {return comparator (r, l);});
261
+ else
262
+ std::sort (tempVector.begin (), tempVector.end (), [comparator](auto & l, auto & r) {return comparator (l, r);});
263
+
264
+ InternalValueList resultList (tempVector.begin (), tempVector.end ());
265
+
266
+ return InternalValue (ListAdapter::CreateAdapter (std::move (resultList)));
204
267
}
205
268
206
269
GroupBy::GroupBy (FilterParams params)
@@ -311,7 +374,7 @@ struct PrettyPrinter : visitors::BaseVisitor<InternalValue>
311
374
std::ostringstream os;
312
375
313
376
os << " '" << kwPair.key << " ': " ;
314
- os << AsString (Apply<PrettyPrinter>(kwPair, m_context));
377
+ os << AsString (Apply<PrettyPrinter>(kwPair. value , m_context));
315
378
316
379
return InternalValue (os.str ());
317
380
}
0 commit comments