combine two codes in a reference qualifier

lmao
Tera Contributor

hello, i have an advanced reference qualifier with following code:

 

 

javascript: ['incident', 'problem'].indexOf(current.sys_class_name + '') == -1? '' : 'operational_statusNOT IN' + new OpsStatusFilter('cmdb_ci').by('CreateTask').join()

 

 

and i would like to add following conditions to it:

 

sys_class_name    IS ONE OF:

cmdb_ci_server

cmdb_ci_business_app

cmdb_ci_aix_server

cmdb_ci_datapower_server
cmdb_ci_esx_server
cmdb_ci_hyper_v_server
cmdb_ci_ibm_frame
cmdb_ci_ibm_zos_server
cmdb_ci_lb_bigip
cmdb_ci_linux_server
cmdb_ci_net_app_server
cmdb_ci_unix_server
cmdb_ci_vcenter_server_obj
cmdb_ci_win_server

 

can you advice me how?

12 REPLIES 12

Uttkarsh S
Tera Contributor

Hi,

 

I would suggest to create a script include and merge those two queries and then call that script include in the reference qualifier field. See example below:

 

a) If you have to apply AND condition between the existing and new query:

 

var RestrictCIClass = Class.create();
RestrictCIClass.prototype = {
    initialize: function() {},

    restrictClasses: function(current) {
        var oldQuery = ['incident', 'problem'].indexOf(current.sys_class_name + '') == -1 ? '' : 'operational_statusNOT IN' + new OpsStatusFilter('cmdb_ci').by('CreateTask').join();
        var newQuery = oldQuery + '^sys_class_name!=cmdb_ci_server^sys_class_name!=cmdb_ci_business_app^sys_class_name!=cmdb_ci_aix_server^sys_class_name!=cmdb_ci_esx_server^sys_class_name!=cmdb_ci_hyper_v_server^sys_class_name!=cmdb_ci_ibm_frame^sys_class_name!=cmdb_ci_ibm_zos_server^sys_class_name!=cmdb_ci_linux_server^sys_class_name!=cmdb_ci_netapp_svm^sys_class_name!=cmdb_ci_unix_server^sys_class_name!=cmdb_ci_vcenter_server_obj^sys_class_name!=cmdb_ci_win_server^EQ';
		return newQuery();
    },
    type: 'RestrictCIClass'
};

 

 

b) If you have to apply OR condition between the existing and new query

 

var RestrictCIClass = Class.create();
RestrictCIClass.prototype = {
    initialize: function() {},

    restrictClasses: function(current) {
        var oldQuery = ['incident', 'problem'].indexOf(current.sys_class_name + '') == -1 ? '' : 'operational_statusNOT IN' + new OpsStatusFilter('cmdb_ci').by('CreateTask').join();
        var newQuery = oldQuery + '^ORsys_class_name!=cmdb_ci_server^sys_class_name!=cmdb_ci_business_app^sys_class_name!=cmdb_ci_aix_server^sys_class_name!=cmdb_ci_esx_server^sys_class_name!=cmdb_ci_hyper_v_server^sys_class_name!=cmdb_ci_ibm_frame^sys_class_name!=cmdb_ci_ibm_zos_server^sys_class_name!=cmdb_ci_linux_server^sys_class_name!=cmdb_ci_netapp_svm^sys_class_name!=cmdb_ci_unix_server^sys_class_name!=cmdb_ci_vcenter_server_obj^sys_class_name!=cmdb_ci_win_server^EQ';
		return newQuery();
    },
    type: 'RestrictCIClass'
};

 

 

 

After that, invoke that script include from the reference qualifier field:

 

javascript:new global.RestrictCIClass().restrictClasses(current);

 

Please keep in mind one more suggestion. Since you are applying this on 'cmdb_ci' reference qualifier, if you have to apply this on few particular table(s) only, I would suggest to use dictionary override and override the reference qualifier.

 

 

Please mark the answer "Correct" or "Helpful", if it helps your case.

Cheers,

Uttkarsh

lmao
Tera Contributor

hello and thank you a lot! i am now creating the script include. but i saw a mistake in my original post. I meant 

instead of "IS NOT ONE OF" i meant "IS ONE OF"

 

sys_class_name    IS ONE OF:

cmdb_ci_server

cmdb_ci_business_app

cmdb_ci_aix_server

cmdb_ci_datapower_server
cmdb_ci_esx_server
cmdb_ci_hyper_v_server
cmdb_ci_ibm_frame
cmdb_ci_ibm_zos_server
cmdb_ci_lb_bigip
cmdb_ci_linux_server
cmdb_ci_net_app_server
cmdb_ci_unix_server
cmdb_ci_vcenter_server_obj
cmdb_ci_win_server

 

so when i use this script, can it work? i have tried to create the script include with that script below but it still lets me choose all CIs

 

var RestrictCIClass = Class.create();
RestrictCIClass.prototype = {
    initialize: function() {},

    restrictClasses: function(current) {
        var oldQuery = ['incident', 'problem'].indexOf(current.sys_class_name + '') == -1 ? '' : 'operational_statusNOT IN' + new OpsStatusFilter('cmdb_ci').by('CreateTask').join();
        var newQuery = oldQuery + '^sys_class_name=cmdb_ci_server^sys_class_name=cmdb_ci_business_app^sys_class_name=cmdb_ci_aix_server^sys_class_name=cmdb_ci_esx_server^sys_class_name=cmdb_ci_hyper_v_server^sys_class_name=cmdb_ci_ibm_frame^sys_class_name=cmdb_ci_ibm_zos_server^sys_class_name=cmdb_ci_linux_server^sys_class_name=cmdb_ci_netapp_svm^sys_class_name=cmdb_ci_unix_server^sys_class_name=cmdb_ci_vcenter_server_obj^sys_class_name=cmdb_ci_win_server^EQ';
		return newQuery();
    },
    type: 'RestrictCIClass'
};

 

Uttkarsh S
Tera Contributor

Hi,

 

If you have to use 'IS ONE OF' then you have to use OR condition. If you see closely, '^' indicates AND operation whereas you have to use '^OR' to construct the query. Something like this below:

 

 

 

 

var newQuery = oldQuery + '^sys_class_name=cmdb_ci_server^ORsys_class_name=cmdb_ci_business_app^ORsys_class_name=cmdb_ci_aix_server^ORsys_class_name=cmdb_ci_datapower_server^ORsys_class_name=cmdb_ci_esx_server^ORsys_class_name=cmdb_ci_hyper_v_server^ORsys_class_name=cmdb_ci_ibm_frame^ORsys_class_name=cmdb_ci_ibm_zos_server^ORsys_class_name=cmdb_ci_lb_bigip^ORsys_class_name=cmdb_ci_linux_server^ORsys_class_name=cmdb_ci_net_app_server^ORsys_class_name=cmdb_ci_unix_server^ORsys_class_name=cmdb_ci_vcenter_server_obj^ORsys_class_name=cmdb_ci_win_server^EQ';

 

 

 

 

Please mark the answer "Correct" or "Helpful", if it helps your case.

Cheers,

Uttkarsh

Maddysunil
Kilo Sage

@lmao 

you can create a script include and can call it from reference qualifier

Script include:

 

    // List of excluded sys_class_name values
    var excludedClasses = [
        'cmdb_ci_server',
        'cmdb_ci_business_app',
        'cmdb_ci_aix_server',
        'cmdb_ci_datapower_server',
        'cmdb_ci_esx_server',
        'cmdb_ci_hyper_v_server',
        'cmdb_ci_ibm_frame',
        'cmdb_ci_ibm_zos_server',
        'cmdb_ci_lb_bigip',
        'cmdb_ci_linux_server',
        'cmdb_ci_net_app_server',
        'cmdb_ci_unix_server',
        'cmdb_ci_vcenter_server_obj',
        'cmdb_ci_win_server'
    ];

    // Check if current.sys_class_name is not in the excludedClasses list
    if (excludedClasses.indexOf(current.sys_class_name + '') == -1) {
        // If not excluded, return the original reference qualifier
        return 'operational_statusNOT IN' + new OpsStatusFilter('cmdb_ci').by('CreateTask').join();
    } else {
        // If excluded, return an empty string to filter out all options
        return '';
    }

 

Please Mark Correct if this solves your query and also mark 👍Helpful if you find my response worthy based on the impact.

 

Thanks