Example #1
0
        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();
            }
        }
Example #2
0
        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();
                    }
            }
        }