loadAllReferents method

Future loadAllReferents(
  1. List<NsgDataItem> items,
  2. List<String>? loadReference, {
  3. String tag = '',
  4. bool readTableParts = true,
})

Implementation

Future loadAllReferents(List<NsgDataItem> items, List<String>? loadReference, {String tag = '', bool readTableParts = true}) async {
  if (items.isEmpty || loadReference == null || loadReference.isEmpty) {
    return;
  }
  try {
    for (var fieldName in loadReference) {
      var splitedName = fieldName.split('.');
      var field = NsgDataClient.client.getReferentFieldByFullPath(items[0].runtimeType, splitedName[0]);
      if (field is! NsgDataBaseReferenceField) continue;
      var refList = <String>[];
      var refItems = <NsgDataItem>[];
      var checkItems = <NsgDataItem>[];

      if (field is NsgDataReferenceField && field is! NsgDataUntypedReferenceField) {
        for (var item in items) {
          var checkedItem = field.getReferent(item, allowNull: true);
          if (checkedItem == null) {
            var fieldValue = item.getFieldValue(splitedName[0]).toString();
            if (!fieldValue.contains(Guid.Empty) && (!refList.contains(fieldValue))) {
              refList.add(fieldValue);
            }
          } else {
            checkItems.add(checkedItem);
          }
        }

        if (refList.isNotEmpty) {
          var request = NsgDataRequest(dataItemType: field.referentElementType);
          var cmp = NsgCompare();
          cmp.add(
              name: NsgDataClient.client.getNewObject(field.referentElementType).primaryKeyField,
              value: refList,
              comparisonOperator: NsgComparisonOperator.inList);
          var filter = NsgDataRequestParams(compare: cmp);
          //print('field.referentElementType ${field.referentElementType}');
          if (storageType == NsgDataStorageType.server) {
            refItems = await request.requestItems(filter: filter, loadReference: []);
          } else {
            refItems = await NsgLocalDb.instance.requestItems(NsgDataClient.client.getNewObject(field.referentElementType), filter);
          }
          checkItems.addAll(refItems);
        }
      } else if (field is NsgDataUntypedReferenceField) {
        var sortedFields = <String, List<String>>{};
        for (var item in items) {
          var checkedItem = field.getReferent(item, allowNull: true);
          if (checkedItem == null) {
            var splittedFieldValue = item.getFieldValue(splitedName[0]).toString().split('.');

            if (splittedFieldValue.length == 2 && !splittedFieldValue[0].contains(Guid.Empty)) {
              if (!sortedFields.containsKey(splittedFieldValue[1])) {
                sortedFields[splittedFieldValue[1]] = <String>[];
              }
              var refList = sortedFields[splittedFieldValue[1]];
              if (!refList!.contains(splittedFieldValue[0])) {
                refList.add(splittedFieldValue[0]);
              }
            }
          } else {
            checkItems.add(checkedItem);
          }
        }

        if (sortedFields.isNotEmpty) {
          for (var typeName in sortedFields.keys) {
            var refList = sortedFields[typeName];
            var refType = NsgDataClient.client.getTypeByServerName(typeName);
            var request = NsgDataRequest(dataItemType: refType);
            var cmp = NsgCompare();
            cmp.add(name: NsgDataClient.client.getNewObject(refType).primaryKeyField, value: refList, comparisonOperator: NsgComparisonOperator.inList);
            var filter = NsgDataRequestParams(compare: cmp);
            if (storageType == NsgDataStorageType.server) {
              refItems = await request.requestItems(filter: filter, loadReference: []);
            } else {
              refItems = await NsgLocalDb.instance.requestItems(NsgDataClient.client.getNewObject(refType), filter);
            }
            checkItems.addAll(refItems);
          }
        }
      } else if (field is NsgDataReferenceListField) {
        for (var item in items) {
          var fieldValue = item.getFieldValue(splitedName[0]) as List<NsgDataItem>;
          if (readTableParts && storageType == NsgDataStorageType.local) {
            if (fieldValue.isNotEmpty) {
              var cmp = NsgCompare();
              var ids = <String>[];
              for (var e in fieldValue) {
                ids.add(e.id);
              }
              cmp.add(name: fieldValue[0].primaryKeyField, value: ids, comparisonOperator: NsgComparisonOperator.inList);
              var request = NsgDataRequest(dataItemType: fieldValue[0].runtimeType, storageType: NsgDataStorageType.local);
              var rows = await request.requestItems(filter: NsgDataRequestParams(compare: cmp));
              for (var row in rows) {
                var tr = fieldValue.firstWhereOrNull((e) => e.id == row.id);
                if (tr != null) {
                  tr.copyFieldValues(row);
                }
              }
            }
          }
          refItems.addAll(fieldValue);
          checkItems.addAll(fieldValue);
        }
      }

      if (splitedName.length > 1 && checkItems.isNotEmpty) {
        splitedName.removeAt(0);
        //Данные для проверки на дочитывание необходимо рассортировать по типам данных на случай если они получены по нетипизированной ссылке
        var mapData = <Type, List<NsgDataItem>>{};
        for (var item in checkItems) {
          List<NsgDataItem>? list = mapData[item.runtimeType];
          if (list == null) {
            list = <NsgDataItem>[];
            mapData[item.runtimeType] = list;
          }
          list.add(item);
        }
        for (var key in mapData.keys) {
          await loadAllReferents(mapData[key]!, [splitedName.join('.')], tag: tag);
        }
      }
    }
  } catch (ex) {
    debugPrint('ERROR LAR-375: $ex');
  }
}