private DatasetVersion editDatasetVersion(DatasetVersion workingCopyDatasetVersion, List<DataTuple> createdTuples, ICollection<DataTuple> editedTuples, ICollection<long> deletedTuples, ICollection<DataTuple> unchangedTuples)
{
Contract.Requires(workingCopyDatasetVersion.Dataset != null && workingCopyDatasetVersion.Dataset.Id >= 0);
Contract.Requires(workingCopyDatasetVersion.Dataset.Status == DatasetStatus.CheckedOut);
Contract.Ensures(Contract.Result<DatasetVersion>() != null && Contract.Result<DatasetVersion>().Id >= 0);
// be sure you are working on the latest version (working copy). applyTupleChanges takes the working copy from the DB
List<DataTupleVersion> tobeAdded = new List<DataTupleVersion>();
List<DataTuple> tobeDeleted = new List<DataTuple>();
List<DataTuple> tobeEdited = new List<DataTuple>();
DatasetVersion editedVersion = applyTupleChanges(workingCopyDatasetVersion, ref tobeAdded, ref tobeDeleted, ref tobeEdited, createdTuples, editedTuples, deletedTuples, unchangedTuples);
#region main code
//using (IUnitOfWork uow = this.GetUnitOfWork())
//{
// IRepository<DatasetVersion> repo = uow.GetRepository<DatasetVersion>();
// IRepository<DataTupleVersion> tupleVersionRepo = uow.GetRepository<DataTupleVersion>();
// IRepository<DataTuple> tupleRepo = uow.GetRepository<DataTuple>();
// // depends on how applyTupleChanges adds the tuples to its PriliminaryTuples!
// if (createdTuples != null)
// {
// foreach (DataTuple tuple in createdTuples)
// {
// tupleRepo.Put(tuple);
// }
// }
// if (tobeAdded != null)
// {
// foreach (DataTupleVersion dtv in tobeAdded)
// {
// tupleVersionRepo.Put(dtv);
// }
// }
// //foreach (var editedTuple in tobeEdited)
// //{
// // editedTuple.VariableValues.ToList().ForEach(p => System.Diagnostics.Debug.Print(p.Value.ToString()));
// // System.Diagnostics.Debug.Print(editedTuple.XmlVariableValues.AsString());
// //}
// if (tobeDeleted != null)
// {
// foreach (DataTuple tuple in tobeDeleted)
// {
// tupleRepo.Delete(tuple);
// }
// }
// // check whether the changes to the latest version, which is changed in the applyTupleChanges , are committed too!
// repo.Put(editedVersion);
// uow.Commit();
//}
#endregion
#region <<------ experimental code ------>>
// Check the same scenario using stateless session/ BulkUnitOfWork
using (IUnitOfWork uow = this.GetBulkUnitOfWork())
{
IRepository<DataTupleVersion> tupleVersionRepo = uow.GetRepository<DataTupleVersion>();
IRepository<DataTuple> tupleRepo = uow.GetRepository<DataTuple>();
// depends on how applyTupleChanges adds the tuples to its PriliminaryTuples!
if (createdTuples != null && createdTuples.Count >0)
{
int batchSize = uow.PersistenceManager.PreferredPushSize;
List<DataTuple> processedTuples = null;
long iterations = createdTuples.Count / batchSize;
if (iterations * batchSize < createdTuples.Count)
iterations++;
for (int round = 0; round < iterations; round++)
{
processedTuples = createdTuples.Skip(round * batchSize).Take(batchSize).ToList();
processedTuples.ForEach(tuple => tuple.Dematerialize());
tupleRepo.Put(processedTuples);
uow.ClearCache(true); //flushes one batch of the tuples to the DB
processedTuples.Clear();
GC.Collect();
}
}
if (tobeAdded != null && tobeAdded.Count > 0)
{
int batchSize = uow.PersistenceManager.PreferredPushSize;
List<DataTupleVersion> processedTuples = null;
long iterations = tobeAdded.Count / batchSize;
if (iterations * batchSize < tobeAdded.Count)
iterations++;
for(int round = 0; round < iterations; round++)
{
processedTuples = tobeAdded.Skip(round * batchSize).Take(batchSize).ToList();
tupleVersionRepo.Put(processedTuples);
uow.ClearCache(true); //flushes one batch of tuples
processedTuples.Clear();
GC.Collect();
}
}
//foreach (var editedTuple in tobeEdited)
//{
// editedTuple.VariableValues.ToList().ForEach(p => System.Diagnostics.Debug.Print(p.Value.ToString()));
// System.Diagnostics.Debug.Print(editedTuple.XmlVariableValues.AsString());
//}
if (tobeDeleted != null && tobeDeleted.Count > 0)
{
int batchSize = uow.PersistenceManager.PreferredPushSize;
List<DataTupleVersion> processedTuples = null;
long iterations = tobeAdded.Count / batchSize;
if (iterations * batchSize < tobeAdded.Count)
iterations++;
for (int round = 0; round < iterations; round++)
{
processedTuples = tobeAdded.Skip(round * batchSize).Take(batchSize).ToList();
tupleVersionRepo.Delete(processedTuples);
uow.ClearCache(true); //flushes one batch of tuples
processedTuples.Clear();
GC.Collect();
}
}
// check whether the changes to the latest version, which is changed in the applyTupleChanges , are committed too!
uow.Commit();
}
#endregion
using (IUnitOfWork uow = this.GetUnitOfWork())
{
IRepository<DatasetVersion> repo = uow.GetRepository<DatasetVersion>();
repo.Put(editedVersion); // must be updated in a tracked session
uow.Commit();
}
return (editedVersion);
}