Uploaded image for project: 'Realm Dart SDK'
  1. Realm Dart SDK
  2. RDART-719

Sorting based on linked properties

      Problem

      I would like to sort a list based on linked properties. Would that be possible?

      I have seen a possibly related issue for Realm Java #672, and which appeared to be resolved in PR #3834 in 2017. However, I don't see information in the documentation on how sorting on linked properties would workout.

      In my case, I would like to sort a list of{{Item}}s, in which each item has a one-to-many relationship with FieldValue. The sorting, however, should be performed on a property in a single FieldValue.

      In pure Dart I would do it like this:

      Unable to find source-code formatter for language: dart. Available languages are: actionscript, ada, applescript, bash, c, c#, c++, cpp, css, erlang, go, groovy, haskell, html, java, javascript, js, json, lua, none, nyan, objc, perl, php, python, r, rainbow, ruby, scala, sh, sql, swift, visualbasic, xml, yaml
      import 'package:collection/collection.dart';
      
      part 'main.g.dart';
      
      @RealmModel()
      class _Item {
        @MapTo('_id')
        @PrimaryKey()
        late ObjectId id;
        late List<_FieldValue> fieldValues = const [];
      }
      
      @RealmModel()
      class _FieldValue {
        late _FieldProperty? fieldProperty;
        late String? textValue;
      }
      
      @RealmModel()
      class _FieldProperty {
        @MapTo('_id')
        @PrimaryKey()
        late ObjectId id;
      
        String name = "";
      }
      
      void main(List<String> arguments) {
        final realm = Realm(Configuration.local([
          FieldValue.schema,
          FieldProperty.schema,
          Item.schema,
        ]));
      
        final field = FieldProperty(ObjectId(), name: "text");
        final unsortedItems = [
          Item(ObjectId(), fieldValues: [FieldValue(ObjectId(), textValue: "a", fieldProperty: field)]),
          Item(ObjectId(), fieldValues: [FieldValue(ObjectId(), textValue: "d", fieldProperty: field)]),
          Item(ObjectId(), fieldValues: [FieldValue(ObjectId(), textValue: "c", fieldProperty: field)]),
          Item(ObjectId(), fieldValues: [FieldValue(ObjectId(),                 fieldProperty: field)]),
          Item(ObjectId(), fieldValues: [FieldValue(ObjectId(), textValue: "b", fieldProperty: field)])
        ];
        realm.write(() {
          realm.add(field);
          realm.addAll(unsortedItems);
        });
      
        var unsortedTextValues = unsortedItems
            .map((item) => (item.fieldValues
                    .firstWhereOrNull((element) => element.fieldProperty == field)
                    ?.textValue ??
                ""))
            .join(", ");
      
        print(unsortedTextValues); // a, d, c, , b
      
        // Sort items
        var sortedItems = unsortedItems.sorted((a, b) => (a.fieldValues
                    .firstWhereOrNull((element) => element.fieldProperty == field)
                    ?.textValue ??
                "")
            .compareTo((b.fieldValues.firstWhereOrNull(
                    (element) => element.fieldProperty == field))?.textValue ??
                ""));
      
        var sortedTextValues = sortedItems
            .map((item) => (item.fieldValues
                    .firstWhereOrNull((element) => element.fieldProperty == field)
                    ?.textValue ??
                ""))
            .join(", ");
      
        print(sortedTextValues); //  , a, b, c, d
      
        Realm.shutdown();
      }
      

      Is this also possible with Realm Query Language?

      Solution

      No response

      Alternatives

      No response

      How important is this improvement for you?

      Would be a major improvement

      Feature would mainly be used with

      Local Database only

            Assignee:
            Unassigned Unassigned
            Reporter:
            unitosyncbot Unito Sync Bot
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated: