Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature delete and insert #62

Open
wants to merge 4 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,15 @@ public virtual void UpdateObjects(ref DataObject[] objects, DataObjectCache Data

var AllQueriedObjects = new ArrayList();

// Массив имен (или storage) мастера.
var InsertDeleteValue = new StringCollection();

// Массив имен (или storage) объектов в котором меняяется мастер.
var UpdateClassesValue = new StringCollection();

var auditOperationInfoList = new List<AuditAdditionalInfo>();
var extraProcessingList = new List<DataObject>();
GenerateQueriesForUpdateObjects(DeleteQueries, DeleteTables, UpdateQueries, UpdateFirstQueries, UpdateLastQueries, UpdateTables, InsertQueries, InsertTables, TableOperations, QueryOrder, true, AllQueriedObjects, DataObjectCache, extraProcessingList, objects);
GenerateQueriesForUpdateObjects(DeleteQueries, DeleteTables, UpdateQueries, UpdateFirstQueries, UpdateLastQueries, UpdateTables, InsertQueries, InsertTables, TableOperations, QueryOrder, true, AllQueriedObjects, DataObjectCache, InsertDeleteValue, UpdateClassesValue, extraProcessingList, objects);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Предлагаю избавиться от этого бесконечного кол-ва параметров, заменить на объект GenerateQueriesContext, в который и запрятать всё необходимое.


GenerateAuditForAggregators(AllQueriedObjects, DataObjectCache, ref extraProcessingList);

Expand Down Expand Up @@ -186,9 +192,10 @@ public virtual void UpdateObjects(ref DataObject[] objects, DataObjectCache Data
go = false;
}
}
while (go);

while (go);
#endregion

if (QueryOrder.Count > 0)
{
#region сзади чистые Update
Expand All @@ -202,7 +209,7 @@ public virtual void UpdateObjects(ref DataObject[] objects, DataObjectCache Data
{
var ops = (OperationType)TableOperations[table];

if (ops == OperationType.Update && UpdateLastQueries.Count == 0)
if (ops == OperationType.Update && UpdateLastQueries.Count == 0 && !UpdateClassesValue.Contains(table))
{
if (
(ex = RunCommands(UpdateQueries, UpdateTables, table, command, id, AlwaysThrowException)) == null)
Expand Down Expand Up @@ -248,7 +255,7 @@ public virtual void UpdateObjects(ref DataObject[] objects, DataObjectCache Data
for (int i = QueryOrder.Count - 1; i >= 0; i--)
{
string table = QueryOrder[i];
if ((ex = RunCommands(DeleteQueries, DeleteTables, table, command, id, AlwaysThrowException)) != null)
if (!InsertDeleteValue.Contains(table) && (ex = RunCommands(DeleteQueries, DeleteTables, table, command, id, AlwaysThrowException)) != null)
{
throw ex;
}
Expand All @@ -268,6 +275,17 @@ public virtual void UpdateObjects(ref DataObject[] objects, DataObjectCache Data
}
}

if (InsertDeleteValue.Count > 0)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Аналогичные проверки нужно добавить и для других циклов.

{
foreach (string table in InsertDeleteValue)
{
if ((ex = RunCommands(DeleteQueries, DeleteTables, table, command, id, AlwaysThrowException)) != null)
{
throw ex;
}
}
}

foreach (string table in QueryOrder)
{
if ((ex = RunCommands(UpdateLastQueries, UpdateTables, table, command, id, AlwaysThrowException)) != null)
Expand Down
69 changes: 66 additions & 3 deletions ICSSoft.STORMNET.Business/SQLDataService/SQLDataService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4209,6 +4209,8 @@ private bool ContainsKeyINProcessing(Dictionary<TypeKeyPair, bool> processedDict
/// <param name="checkLoadedProps"> Проверять ли загруженность свойств </param>
/// <param name="processingObjects"> The processing Objects. </param>
/// <param name="dataObjectCache"> The Data Object Cache.</param>
/// <param name="insertDeleteValue"> Обработка случая когда создается новый мастер и старый удаляется, массив мастеров.</param>
/// <param name="updateClassesValue"> Обработка случая когда создается новый мастер и старый удаляется, массив агрегаторов.</param>
/// <param name="dobjects"> Для чего генерим запросы </param>
public virtual void GenerateQueriesForUpdateObjects(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут поменять сигнатуру.

StringCollection deleteQueries,
Expand All @@ -4224,6 +4226,8 @@ public virtual void GenerateQueriesForUpdateObjects(
bool checkLoadedProps,
System.Collections.ArrayList processingObjects,
DataObjectCache dataObjectCache,
StringCollection insertDeleteValue,
StringCollection updateClassesValue,
params ICSSoft.STORMNET.DataObject[] dobjects)
{
GenerateQueriesForUpdateObjects(
Expand All @@ -4240,6 +4244,8 @@ public virtual void GenerateQueriesForUpdateObjects(
checkLoadedProps,
processingObjects,
dataObjectCache,
insertDeleteValue,
updateClassesValue,
null,
dobjects);
}
Expand Down Expand Up @@ -4875,6 +4881,8 @@ private bool FixCyclic(
/// <param name="processingObjects">Текущие обрабатываемые объекты (то есть объекты, которые данный сервис данных планирует подтвердить в БД
/// в текущей транзакции). Выходной параметр.</param>
/// <param name="dataObjectCache">Кэш объектов данных.</param>
/// <param name="insertDeleteValue">Список типов соответствующих случаю когда создается новый мастер и старый удаляется, массив мастеров.</param>
/// <param name="updateClassesValue"> Обработка случая когда создается новый мастер и старый удаляется, массив агрегаторов.</param>
/// <param name="auditObjects">Список объектов, которые необходимо записать в аудит (выходной параметр). Заполняется в том случае, когда
/// передан не null и текущий сервис аудита включен.</param>
/// <param name="dobjects">Объекты, для которых генерируются запросы.</param>
Expand All @@ -4892,6 +4900,8 @@ public virtual void GenerateQueriesForUpdateObjects(
bool checkLoadedProps,
ArrayList processingObjects,
DataObjectCache dataObjectCache,
StringCollection insertDeleteValue,
StringCollection updateClassesValue,
List<DataObject> auditObjects,
params DataObject[] dobjects)
{
Expand Down Expand Up @@ -5168,7 +5178,51 @@ public virtual void GenerateQueriesForUpdateObjects(
{
// Включем текущий объект в граф зависимостей.
GetDependencies(processingObject, processingObject.GetType(), dependencies, extraUpdateList);
}
}

var processingObjectsIsList = processingObjects.Cast<DataObject>().ToList();
var processingObjectsListOnDelete = processingObjectsIsList.Where(t => t.GetStatus() == ObjectStatus.Deleted);
var processingObjectsListOnInsert = processingObjectsIsList.Where(t => t.GetStatus() == ObjectStatus.Created);
var processingObjectsListOnAltered = processingObjectsIsList.Where(t => t.GetStatus() == ObjectStatus.Altered);

foreach (DataObject processingObject in processingObjectsListOnAltered)
{
Type processingObjectType = processingObject.GetType();
string[] props = Information.GetAllPropertyNames(processingObjectType);

foreach (var value in props)
{
Type[] propertyTypes = TypeUsage.GetUsageTypes(processingObjectType, value);
foreach (var type in propertyTypes)
{
var objectOnInsert = processingObjectsListOnInsert.FirstOrDefault(t => t.GetType() == type);
var objectOnDelete = processingObjectsListOnDelete.FirstOrDefault(t => t.GetType() == type);

if (objectOnInsert != null && objectOnDelete != null)
{
string processingObjectStorageName = Information.GetClassStorageName(processingObjectType);
string processingObjectValue = processingObjectStorageName == string.Empty ? value : processingObjectStorageName;

string storageNameClass = Information.GetClassStorageName(objectOnInsert.GetType());
string classValue = storageNameClass == string.Empty ? value : storageNameClass;

// Случай когда создается новый мастер и старый удаляется.

// Массив имен (или storage) мастера.
if (!insertDeleteValue.Contains(classValue))
{
insertDeleteValue.Add(classValue);
}

// Массив имен (или storage) объектов в котором меняяется мастер.
if (!updateClassesValue.Contains(processingObjectValue))
{
updateClassesValue.Add(processingObjectValue);
}
}
}
}
}

// Поиск и разрешение циклов в зависимостях.
List<Type> grafDependencies = new List<Type>();
Expand Down Expand Up @@ -5646,11 +5700,20 @@ public virtual void UpdateObjectsByExtConn(
var tableOperations = new SortedList();
var queryOrder = new StringCollection();

var allQueriedObjects = new System.Collections.ArrayList();
var allQueriedObjects = new System.Collections.ArrayList();

// Случай когда создается новый мастер и старый удаляется.
//var InsertDeleteValue = new Dictionary<string, string>();

// Массив имен (или storage) мастера.
var InsertDeleteValue = new StringCollection();

// Массив имен (или storage) объектов в котором меняяется мастер.
var UpdateClassesValue = new StringCollection();

var auditOperationInfoList = new List<AuditAdditionalInfo>();
var extraProcessingList = new List<DataObject>();
GenerateQueriesForUpdateObjects(deleteQueries, deleteTables, updateQueries, updateFirstQueries, updateLastQueries, updateTables, insertQueries, insertTables, tableOperations, queryOrder, true, allQueriedObjects, dataObjectCache, extraProcessingList, objects);
GenerateQueriesForUpdateObjects(deleteQueries, deleteTables, updateQueries, updateFirstQueries, updateLastQueries, updateTables, insertQueries, insertTables, tableOperations, queryOrder, true, allQueriedObjects, dataObjectCache, InsertDeleteValue, UpdateClassesValue, extraProcessingList, objects);

GenerateAuditForAggregators(allQueriedObjects, dataObjectCache, ref extraProcessingList, transaction);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -585,6 +585,78 @@ public void AggregatorWithLinkToDetailTest1()
Assert.Null(detailDeleted);
Assert.Null(masterDeleted);
}
}

/// <summary>
/// Тестовый метод для проверки удаления мастера со сменой ссылок на него у связанных с ним ассоциацией объектов.
/// </summary>
[Fact]
public void DeleteUpdateAssociatedMasterTest()
{
foreach (var ds in DataServices)
{
var собачийТипПороды = new ТипПороды() { Название = "Порода собак", ДатаРегистрации = DateTime.Now };
var лисьяПорода = new Порода() { Название = "Лисы", ТипПороды = собачийТипПороды };
var updateArray = new DataObject[] { лисьяПорода, собачийТипПороды };

ds.UpdateObjects(ref updateArray);

var кошачийТипПороды = new ТипПороды() { Название = "Порода кошек", ДатаРегистрации = DateTime.Now };
собачийТипПороды.SetStatus(ObjectStatus.Deleted);
лисьяПорода.ТипПороды = кошачийТипПороды;
updateArray = new DataObject[] { лисьяПорода, собачийТипПороды, кошачийТипПороды };

ds.UpdateObjects(ref updateArray);
}
}

/// <summary>
/// Тестовый метод для проверки удаления мастера со сменой ссылок на него у связанных с ним ассоциацией Storage объектов.
/// </summary>
[Fact]
public void DeleteUpdateAssociatedMasterStorageClassTest()
{
foreach (var ds in DataServices)
{
var informationTestClass = new InformationTestClass() { StringPropertyForInformationTestClass = "Test3" };
var inheritedMasterClass = new InheritedMasterClass() { StringMasterProperty = "Test", InformationTestClass = informationTestClass };

var updateArray = new DataObject[] { inheritedMasterClass, informationTestClass };

ds.UpdateObjects(ref updateArray);

var newInformationTestClass = new InformationTestClass() { StringPropertyForInformationTestClass = "Test33" };
informationTestClass.SetStatus(ObjectStatus.Deleted);
inheritedMasterClass.InformationTestClass = newInformationTestClass;
updateArray = new DataObject[] { inheritedMasterClass, informationTestClass, newInformationTestClass };

ds.UpdateObjects(ref updateArray);
}
}

/// <summary>
/// Тестовый метод для проверки удаления Storage мастера со сменой ссылок на него у связанных с ним ассоциацией объектов.
/// </summary>
[Fact]
public void DeleteUpdateAssociatedStorageMasterTest()
{
foreach (var ds in DataServices)
{
var источникФинансирования = new ИсточникФинансирования() { НомерИсточникаФинансирования = 100 };
var иФХозДоговора = new ИФХозДоговора() { НомерИФХозДоговора = 200, ИсточникФинансирования = источникФинансирования };
var xозДоговор = new ХозДоговор() { НомерХозДоговора = 300 };
xозДоговор.ИФХозДоговора.Add(иФХозДоговора);
var updateArray = new DataObject[] { xозДоговор, иФХозДоговора, источникФинансирования };

ds.UpdateObjects(ref updateArray);

var источникФинансирования2 = new ИсточникФинансирования() { НомерИсточникаФинансирования = 400 };
источникФинансирования.SetStatus(ObjectStatus.Deleted);
иФХозДоговора.ИсточникФинансирования = источникФинансирования2;
updateArray = new DataObject[] { иФХозДоговора, источникФинансирования, источникФинансирования2 };

ds.UpdateObjects(ref updateArray);
}
}

/// <summary>
Expand Down
2 changes: 1 addition & 1 deletion NewPlatform.Flexberry.ORM.nuspec
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>NewPlatform.Flexberry.ORM</id>
<version>5.1.0-beta06</version>
<version>5.1.0-beta07</version>
<title>Flexberry ORM</title>
<authors>New Platform Ltd</authors>
<owners>New Platform Ltd</owners>
Expand Down