public XmlRowReader ( |
||
data | ||
dataStructureId | long | |
observationIndex | int | |
return |
/// <summary> /// CAUTION !!!!!!!!!!!!!!!!! /// upload bezieht sich derzeit nur auf daten mit einem block (einer tabelle) /// umsetzung von mehreren blöckes noch nicht geklärt. /// (für einen wert gibt es eine weitere tabelle) /// </summary> /// <param name="dataSetID"></param> /// <param name="DataBase"></param> public void uploadData(string dataSetID, string DataBase) { DatasetManager datasetManager = new DatasetManager(); DataStructureManager dataStructureManager = new DataStructureManager(); XmlDataReader xmlDataReader = new XmlDataReader(); User user = new User(); string variableNames = ""; // query metadataAuthor and variable names from explorer.datasets queryAuthorAndVariables(ref user, ref variableNames, dataSetID, DataBase); List<string> varNames = variableNames.Split(',').ToList(); // get all dataStructures with equal variables count List<StructuredDataStructure> dataStructures = dataStructureManager.StructuredDataStructureRepo.Get(s => varNames.Count().Equals(s.Variables.Count)).ToList(); // get all Ids of dataStructures with equal variables List<long> dataStructureIds = new List<long>(); foreach (StructuredDataStructure dataStructure in dataStructures) { bool isSimilarStructure = true; foreach (Variable variable in dataStructure.Variables) { if (!varNames.Contains(variable.Label)) { isSimilarStructure &= false; break; } } if (isSimilarStructure) dataStructureIds.Add(dataStructure.Id); } // get the wanted dataset by comparing the old B1 datasetId out of the datasets with similar dataStructure Dataset dataset = null; List<Dataset> datasets = datasetManager.DatasetRepo.Get(d => dataStructureIds.Contains(d.DataStructure.Id)).ToList(); foreach (Dataset ds in datasets) { string oldDatasetId = ""; try { XmlNode extraID = ds.Versions.FirstOrDefault().Metadata.SelectSingleNode("Metadata/general/general/id/id"); oldDatasetId = extraID.InnerText; } catch { } if (oldDatasetId == dataSetID) { dataset = ds; break; } } if (dataset != null) { // get distinct and ascending ordered insertdates from DB List<DB2TimeStamp> distInsertDates = queryDistInsertDates(dataSetID, DataBase); bool checkObsIds = false; foreach (DB2TimeStamp insertDate in distInsertDates) { List<DataTuple> createdDataTuples = new List<DataTuple>(); List<DataTuple> editedDataTuples = new List<DataTuple>(); List<DataTuple> deletedDataTuples = new List<DataTuple>(); DatasetVersion workingCopy = datasetManager.GetDatasetLatestVersion(dataset.Id); // get dataset // get obsid, data, deleted and newest for each observation from DB List<Observation> observations = queryObservation(dataSetID, DataBase, insertDate.ToString()); Dictionary<long, long> obsIdMapsToTupleId = new Dictionary<long, long>(); if (checkObsIds) { // get all EffectiveTupleIds List<long> datasetTupleIds = datasetManager.GetDatasetVersionEffectiveTupleIds(workingCopy).ToList(); // id-mapping-list key=obsId, value=TupleId foreach EffectiveTupleId and obsId from Tuple.Extra obsIdMapsToTupleId = idMapping(datasetTupleIds, ref datasetManager); } // observation counter int observationIndex = 0; bool isNewest = true; foreach (Observation observation in observations) //////////////parallel { isNewest = (isNewest && observation.newest != 'Y') ? false : isNewest; // create dataTuple with xmlDataReader // split xml to string list and use DataReader.ReadRow DataTuple dataRow = xmlDataReader.XmlRowReader(observation.data, dataset.DataStructure.Id, observationIndex); // check if observation.obsid is in id-mapping-list long TupleId; if (checkObsIds && obsIdMapsToTupleId.TryGetValue(observation.obsid, out TupleId)) { DataTuple dataTuple = datasetManager.DataTupleRepo.Get(TupleId); if (observation.deleted != 'Y') { dataTuple.VariableValues = dataRow.VariableValues; // edit tuple if observation exists as tuple in EffectiveTuple and observation is not deleted editedDataTuples.Add(dataTuple); } else { // delete tuple if observation exists as tuple in EffectiveTuple and observ. is deleted deletedDataTuples.Add(dataTuple); } } else { // write the obsId and oldBExISdatasetId in Extra: <extra><obsid>[obsid]</obsid><oldBExISdatasetId>[dataSetID]</oldBExISdatasetId></extra> dataRow.Extra = oldIdsIntoExtra(observation.obsid, dataSetID, dataRow.Extra); // create tuple if observation exists not in EffectiveTuple createdDataTuples.Add(dataRow); } observationIndex++; // observation counter } checkObsIds = (!checkObsIds && !isNewest) ? true : checkObsIds; // checkOut if (datasetManager.IsDatasetCheckedOutFor(dataset.Id, user.Name) || datasetManager.CheckOutDataset(dataset.Id, user.Name)) { workingCopy = datasetManager.GetDatasetWorkingCopy(dataset.Id); // get dataset datasetManager.EditDatasetVersion(workingCopy, createdDataTuples, editedDataTuples, deletedDataTuples); // edit dataset datasetManager.CheckInDataset(dataset.Id, "Primary data row was submited.", user.Name); // checkIn } } } }