static void DoMerge(string[] URIs, string output) { DataSetUri dstUri = DataSetUri.Create(output); if (dstUri.ProviderName.StartsWith("memory")) { throw new NotSupportedException("Copying to memory is not supported by the utility."); } DataSet[] dss = new DataSet[URIs.Length]; int i = 0; try { for (i = 0; i < dss.Length; i++) { dss[i] = DataSet.Open(URIs[i]); } } catch { for (; --i >= 0;) { dss[i].Dispose(); } throw; } using (DataSet mds = DataSet.Open("msds:memory")) { mds.IsAutocommitEnabled = false; IMetadataConflictResolver conflictResolver = new WarningConflictResolver(); foreach (var ds in dss) { // Global metadata foreach (var attr in ds.Metadata) { object val; if (mds.Metadata.ContainsKey(attr.Key, SchemaVersion.Recent)) { val = conflictResolver.Resolve(attr.Key, mds.Metadata[attr.Key, SchemaVersion.Recent], attr.Value); } else { val = attr.Value; } mds.Metadata[attr.Key] = val; } // Variables foreach (var var in ds.Variables) { mds.AddVariableByReference(var); } } try { mds.Commit(); } catch (DistributedCommitFailedException dex) { if (dex.InnerException is ConstraintsFailedException) { string error = String.Format("Input DataSets are incompatible: {0}", ((ConstraintsFailedException)(dex.InnerException)).Message); WriteError(error); return; } throw; } catch (ConstraintsFailedException cex) { string error = String.Format("Input DataSets are incompatible: {0}", cex.Message); WriteError(error); return; } Microsoft.Research.Science.Data.Utilities.DataSetCloning.Clone(mds, dstUri, Microsoft.Research.Science.Data.Utilities.DataSetCloning.DefaultUpdater).Dispose(); } }
static void DoSlice(string uri, Dictionary <string, Range> ranges, string outputUri) { DataSetUri dstUri = DataSetUri.Create(outputUri); if (dstUri.ProviderName.StartsWith("memory")) { throw new NotSupportedException("Copying to memory is not supported by the utility."); } using (DataSet src = DataSet.Open(uri)) { using (DataSet mds = DataSet.Open("msds:memory")) using (DataSet mds2 = DataSet.Open("msds:memory")) { mds.IsAutocommitEnabled = false; mds2.IsAutocommitEnabled = false; foreach (var var in src.Variables) { bool doSlice = false; foreach (var dim in var.Dimensions) { if (var.Dimensions.Contains(dim.Name)) { doSlice = true; break; } } if (doSlice) { var refVar = mds.AddVariableByReference(var); int rank = refVar.Rank; int[] origin = new int[rank]; int[] stride = new int[rank]; int[] count = new int[rank]; for (int i = 0; i < rank; i++) { Range r; if (ranges.TryGetValue(var.Dimensions[i].Name, out r)) { if (r.IsReduced) { origin[i] = r.Origin; stride[i] = 0; count[i] = 1; } else { throw new NotSupportedException("sds slice supports only dimension fixing"); } } else { origin[i] = 0; stride[i] = 1; count[i] = 0; } } Variable strVar = StrideVariable(refVar, origin, stride, count); mds2.AddVariableByReference(strVar); } else { mds2.AddVariableByReference(var); } } // mds2 is ready to be committed try { mds2.Commit(); } catch (DistributedCommitFailedException dex) { if (dex.InnerException is ConstraintsFailedException) { string error = String.Format("Input DataSets are incompatible: {0}", ((ConstraintsFailedException)(dex.InnerException)).Message); WriteError(error); return; } throw; } catch (ConstraintsFailedException cex) { string error = String.Format("Input DataSets are incompatible: {0}", cex.Message); WriteError(error); return; } // mds2 is ready to be cloned Microsoft.Research.Science.Data.Utilities.DataSetCloning.Clone(mds2, dstUri, Microsoft.Research.Science.Data.Utilities.DataSetCloning.DefaultUpdater).Dispose(); } } }