English

FAQ: Is it possible to modify query and search results to display coded value domain descriptions?

Question

Is it possible to modify query and search results to display coded value domain descriptions?

Answer

Coded value domains are a set of valid values for an attribute, which often contains 'String' type information and can be retrieved using JavaScript. However, map service query operations, such as the Search widget and QueryTask method return raw data from the database, in the form of a numeric value that does not contain any valuable information instead of the coded values.

It is possible to modify query and search results to display the coded value domain information by creating a custom function to retrieve the information from the coded value and return the containing value.

The following code snippet demonstrates a sample of the custom function to retrieve information from a coded value in a QueryTask request:

function getCodedValue(layer, fieldName, fieldValue) {
var returnValue = fieldValue;
dojo.forEach(layer.fields,function(fld){
if (fld.name == fieldName) {
cDomain = fld.domain;
if (cDomain)
dojo.forEach(cDomain.codedValues,function(cVal){
if (cVal.code == fieldValue)
returnValue = cVal.name;
});
}
});
return returnValue;
}

The same logic can also be used for the Search widget. The following code demonstrates a full code sample:

require([
        "esri/map", "esri/dijit/Search", "esri/layers/FeatureLayer", "esri/InfoTemplate", "esri/graphic",
        "esri/symbols/SimpleMarkerSymbol", "dojo/_base/Color", "dojo/domReady!"
    ], function(Map, Search, FeatureLayer, InfoTemplate, Graphic, SimpleMarkerSymbol, Color) {
        var map = new Map("map", {
            basemap: "streets",
            center: [-97, 38], // lon, lat
            zoom: 5
        });

        var search = new Search({
            enableLabel: false,
            enableInfoWindow: true,
            showInfoWindowOnSelect: false,
            map: map
        }, "search");

        var sources = [];

        //Push the sources used to search. The ArcGIS Online World geocoder is included by default.  
        var featureLayer = new FeatureLayer("https://sampleserver6.arcgisonline.com/arcgis/rest/services/SF311/FeatureServer/0");
        sources.push({
            featureLayer: featureLayer,
            searchFields: ["objectid"],
            displayField: "objectid",
            exactMatch: false,
            outFields: ["*"],
            name: "Incidents",
            placeholder: "2739248",
            maxResults: 6,
            maxSuggestions: 6,
            enableSuggestions: true,
            minCharacters: 0
        });

        //Set the sources above to the search widget
        search.set("sources", sources);

        search.startup();

        search.on("select-result", showLocation);

        function showLocation(e) {
            map.graphics.clear();
            var point = e.result.feature.geometry;
            var symbol = new SimpleMarkerSymbol().setStyle(
                SimpleMarkerSymbol.STYLE_SQUARE).setColor(
                new Color([255, 0, 0, 0.5])
            );
            var graphic = new Graphic(point, symbol);
            map.graphics.add(graphic);

            var resultItems = "";
            var featureAttributes = e.result.feature.attributes;
            for (var field in featureAttributes) {
                if (field == "status") {
                    var value = getCodedValue(featureLayer, field, featureAttributes[field]);
                    resultItems += "<b>" + field + ": </b>" + value + "</br>";
                } else if (field == "objectid") {
                    resultItems += "<b>" + field + ": </b>" + featureAttributes[field] + "</br>";
                }
            }
            map.infoWindow.setTitle("Search Result");
            map.infoWindow.setContent(resultItems);
            map.infoWindow.show(e.result.feature.geometry);
        }

        //custom method that checks if the field has a coded value and if yes, it will return the description
        function getCodedValue(layer, fieldName, fieldValue) {
            var returnValue = fieldValue;
            dojo.forEach(layer.fields, function(fld) {
                if (fld.name == fieldName) {
                    cDomain = fld.domain;
                    if (cDomain)
                        dojo.forEach(cDomain.codedValues, function(cVal) {
                            if (cVal.code == fieldValue)
                                returnValue = cVal.name;
                        });
                }
            });
            return returnValue;
        }
    });

Related Information