Inheritance: UserAssetBase
Beispiel #1
0
        protected override void ProcessRecord()
        {
            JavaScriptSerializer jss = new JavaScriptSerializer();
            Dictionary<string, string> updatedAssetIds = new Dictionary<string, string>();
            string rawJson = "";
            UserAsset[] assetsInWorkspace = new UserAsset[] { };

            Experiment exp = Sdk.GetExperimentById(GetWorkspaceSetting(), ExperimentId, out rawJson);
            dynamic graph = jss.Deserialize<object>(rawJson);

            Dictionary<UserAssetType, string> assetNodeNames = new Dictionary<UserAssetType, string>();
            assetNodeNames.Add(UserAssetType.TrainedModel, "TrainedModelId");
            assetNodeNames.Add(UserAssetType.Transform, "TransformModuleId");
            assetNodeNames.Add(UserAssetType.Dataset, "DataSourceId");

            Dictionary<UserAssetType, string> assetTypeNames = new Dictionary<UserAssetType, string>();
            assetTypeNames.Add(UserAssetType.TrainedModel, "ILearnerDotNet");
            assetTypeNames.Add(UserAssetType.Transform, "ITransformDotNet");
            assetTypeNames.Add(UserAssetType.Dataset, "Dataset");
            List<UserAssetType> foundTypes = new List<UserAssetType>();

            foreach (dynamic node in graph["Graph"]["ModuleNodes"])
                foreach (dynamic inputPort in node["InputPortsInternal"])
                    foreach (UserAssetType assetType in assetNodeNames.Keys)
                    {
                        string assetId = inputPort[assetNodeNames[assetType]];
                        if (!string.IsNullOrEmpty(assetId) && !foundTypes.Contains(assetType))
                            foundTypes.Add(assetType);
                    }

            if (foundTypes.Count > 0)
            {
                if (All.IsPresent || (foundTypes.Contains(UserAssetType.Dataset) && AssetType == UserAssetType.Dataset))
                    assetsInWorkspace = assetsInWorkspace.Union(Sdk.GetDataset(GetWorkspaceSetting())).ToArray();
                if (All.IsPresent || (foundTypes.Contains(UserAssetType.TrainedModel) && AssetType == UserAssetType.TrainedModel))
                    assetsInWorkspace = assetsInWorkspace.Union(Sdk.GetTrainedModels(GetWorkspaceSetting())).ToArray();
                if (All.IsPresent || (foundTypes.Contains(UserAssetType.Transform) && AssetType == UserAssetType.Transform))
                    assetsInWorkspace = assetsInWorkspace.Union(Sdk.GetTransforms(GetWorkspaceSetting())).ToArray();

                UserAsset foundAsset = null;
                if (!string.IsNullOrEmpty(AssetName))
                {
                    foundAsset = assetsInWorkspace.SingleOrDefault(a => a.Name.ToLower() == AssetName.ToLower() && a.DataTypeId == assetTypeNames[AssetType]);
                    if (foundAsset == null)
                        throw new Exception(string.Format("{0} \"{1}\" is not found in the current workspace.", assetTypeNames[AssetType], AssetName));
                }

                //Dictionary<string, string> updatedAssets = new Dictionary<string, string>();
                bool foundAssetWithAssetNameInExperiment = false;
                foreach (dynamic node in graph["Graph"]["ModuleNodes"])
                    foreach (dynamic inputPort in node["InputPortsInternal"])
                        foreach (UserAssetType assetType in assetNodeNames.Keys)
                        {
                            string experimentAssetId = inputPort[assetNodeNames[assetType]];
                            if (!string.IsNullOrEmpty(experimentAssetId))
                            {
                                string familyId = experimentAssetId.Split('.')[1];
                                if (All.IsPresent || foundAsset.FamilyId == familyId)
                                {
                                    foundAssetWithAssetNameInExperiment = true;
                                    string assetName = assetsInWorkspace.SingleOrDefault(a => a.FamilyId == familyId).Name;
                                    UserAsset workspaceAsset = assetsInWorkspace.SingleOrDefault(a => a.FamilyId == familyId);
                                    if (workspaceAsset == null)
                                        throw new Exception(string.Format("Can't find {0} of family id \"{1}\" in the workspace.", familyId));
                                    if (workspaceAsset.Id != experimentAssetId)
                                    {
                                        if (!updatedAssetIds.ContainsKey(experimentAssetId))
                                        {
                                            inputPort[assetNodeNames[AssetType]] = workspaceAsset.Id;
                                            WriteObject(string.Format("{0} \"{1}\" has been updated from \"{2}\" to \"{3}\"", AssetType, assetName, experimentAssetId, workspaceAsset.Id));
                                            updatedAssetIds.Add(experimentAssetId, workspaceAsset.Id);
                                        }
                                    }
                                }
                            }
                        }
                if (!foundAssetWithAssetNameInExperiment)
                    throw new Exception(string.Format("Can't find {0} named \"{1}\" in the experiment.", AssetType, AssetName));

                if (updatedAssetIds.Count == 0)
                    WriteObject(string.Format("{0} already up-to-date.", All.IsPresent ? "All assets are" : AssetType + " \"" + AssetName + "\" is"));
                else
                {
                    string clientData = graph["Graph"]["SerializedClientData"];
                    foreach (var assetId in updatedAssetIds.Keys)
                        graph["Graph"]["SerializedClientData"] = clientData.Replace(assetId, updatedAssetIds[assetId]);
                    rawJson = jss.Serialize(graph);
                    Sdk.SaveExperiment(GetWorkspaceSetting(), exp, rawJson);
                }
            }
            else
                WriteObject("No updatable asset is found.");
        }