11 Replies Latest reply on Aug 25, 2016 8:18 AM by tcoufal RSS
    tcoufal Communicator

    How to safely remove the whole ModelTagVocabulary, all it's terms and references

    Hi Guys,

    I have rather unusual problem.

     

    We do have a production instance version of 6.6.2.

    There must have been a bug in that build, because back then it allowed me to create a ModelTagVocabulary named:

    developers even though that there was already vocabulary named Developers (with different case).

     

    Now I need to upgrade our TW version, and when I am doing export->import (via source control entities as well as with ThingWorx storage) I have an error:

    Vocabulary developers already exists, but with different case. So I choose not to import that Vocabulary, but now every entity that contains that tag is not working.

    Is there a safe way how to delete whole Vocabulary, all it's terms and references to those terms?

     

    I need to clear my system before I do the export.

    Thanks a lot

     

    Tomas

      • Re: How to safely remove the whole ModelTagVocabulary, all it's terms and references
        pchung Collaborator

        In the version upgrades as you have noticed, now Thingworx treats developers and Developers as the same.

         

        What I would recommend is to go back to the original and write a script that first finds all the entities tagged and then it removes them and adds the proper non-interfering tag.

        You can use a variety of the search functions to search for tagged items.

          • Re: How to safely remove the whole ModelTagVocabulary, all it's terms and references
            tcoufal Communicator

            I have never worked with search functions. Would you mind to give me a hand?

            Thanks a lot for that info though.

              • Re: How to safely remove the whole ModelTagVocabulary, all it's terms and references
                pchung Collaborator

                Easiest one to use would be SearchModelTags

                This will return a list of Entities then step through each do RemoteTags and then AddTags or you can use SetTags which overwrites the original Tag(s)

                  • Re: How to safely remove the whole ModelTagVocabulary, all it's terms and references
                    tcoufal Communicator

                    Hi Pai,

                    one question though.

                    I have my Thing and its service made like this:

                     

                    var params = {

                      maxItems: undefined /* NUMBER */,

                      types: undefined /* JSON */,

                      aspects: undefined /* JSON */,

                      excludedAspects: undefined /* JSON */,

                        tags: "developers:coufalt" /* TAGS */

                    };

                     

                     

                    // result: INFOTABLE dataShape: "EntityDescriptor"

                    var myEntities = Resources["SearchFunctions"].SearchModelTags(params);

                     

                    var tableLength = myEntities.rows.length;

                    var count = 0;

                    for (var x = 0; x < tableLength; x++) {

                      var row = myEntities.rows[x];

                        var myEntity = row.name;

                       

                        try {

                            var params = {

                                tags: "developers:coufalt" /* Application:Tag1  */

                            };

                            Things[myEntity].RemoveTags(params);

                            count++;

                        } catch(err) {

                            logger.warn(err);

                        }  

                    }

                    logger.warn("cleaned " + count + " tags");

                     

                    Problem with that is that it only cleans the Things. If I want to clean Mashups I can substitute the Things[myEntity] for let say Mashups[myEntity],

                    unfortunately enough I tagged things like MediaEntities (dont realy know why I did that....) and things like DataShapes, ThingShapes, Users and even Oganisations. Well almost everything.

                    How can I reference those things? I thought that I can do it like this:

                    var myEntityType = row.parentType

                    [myEntityType][myEntity].RemoveTags(params)

                     

                    but that does not work.

                    Any idea?

                     

                    Tomas

                      • Re: How to safely remove the whole ModelTagVocabulary, all it's terms and references
                        pchung Collaborator

                        Right that is very unfortunate as those do not support these services.

                        Unfortunately my best recommendation is to clean those manually. You can find them fairly easily by using the advanced filter in composer.

                          • Re: How to safely remove the whole ModelTagVocabulary, all it's terms and references
                            tcoufal Communicator

                            Turned out, they do

                            I have changed script to this and it worked:

                             

                            for (var x = 0; x < tableLength; x++) {

                              var row = myEntities.rows[x];

                                var myEntity = row.name;

                                var myEntityType = row.parentName;

                               

                                try {

                                    var params = {

                                        tags: "developers:coufalt" /* Application:Tag1  */

                                    };

                                    if (myEntityType == "MediaEntities") {MediaEntities[myEntity].RemoveTags(params);}

                                    else if (myEntityType == "DataShapes") {DataShapes[myEntity].RemoveTags(params);}

                                    else if (myEntityType == "ThingShapes") {ThingShapes[myEntity].RemoveTags(params);}

                                    else if (myEntityType == "Users") {Users[myEntity].RemoveTags(params);}

                                    else if (myEntityType == "ThingTemplates") {ThingTemplates[myEntity].RemoveTags(params);}

                                    else if (myEntityType == "StyleDefinitions") {StyleDefinitions[myEntity].RemoveTags(params);}

                                    else if (myEntityType == "Organizations") {Organizations[myEntity].RemoveTags(params);}

                                    else if (myEntityType == "Mashups") {Mashups[myEntity].RemoveTags(params);}

                                    else if (myEntityType == "Menus") {Menus[myEntity].RemoveTags(params);}

                                    else if (myEntityType == "Groups") {Groups[myEntity].RemoveTags(params);}

                                    else if (myEntityType == "StateDefinitions") {StateDefinitions[myEntity].RemoveTags(params);}

                                    else if (myEntityType == "ApplicationKeys") {ApplicationKeys[myEntity].RemoveTags(params);}       

                                    count++;

                                } catch(err) {

                                    logger.warn(err);

                                }

                            }

                              • Re: How to safely remove the whole ModelTagVocabulary, all it's terms and references
                                pchung Collaborator

                                Ah even better (I think I had a utility similar to this in the past)

                                  • Re: How to safely remove the whole ModelTagVocabulary, all it's terms and references
                                    tcoufal Communicator

                                    I call it, TagKiller

                                     

                                    One follow up question (perhaps I will make a new thread). I am having some troubles with migration.

                                    I have one server TW 6.6 and I want to move it to the new server running TW 7.2.

                                    I cannot do the migration on that target, so I have exported my things from the old one.

                                    I have used Export to SourceControlEntities -> this one is very nice, but it does not export Data..

                                    So for data I've used Export To File -> Data ->All

                                    I moved those files (SourceControl.zip) and Export Folder to the new system and imported.

                                    First was Import from sourceControlEntities (I had to unpack that zip file and move to SystemRepository first), it allowed me to check diffs in my imported entitis. And than I imported data (I had to move that folder to Export folder and imported via ThingWorxStorage).

                                    I ran into few error messages, but all and all, it works.

                                    What is the correct procedure for System-to-system migration.

                                    And what would you recommend as Best practice. To do it like this or make a new instance of the same TW version as it is on old machine, than export, import and than to use Upgrade Scripts and do the incremental Database updates??

                                     

                                    Thanks a lot.