loadAllReferents method
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');
}
}