conterra / mapapps-query-builder

The Query Builder Bundle allows you to create your own Query Tools, that perform custom queries to a store.
https://demos.conterra.de/mapapps/resources/apps/downloads_query_builder/index.html
Apache License 2.0
7 stars 6 forks source link

Domains from types are not displayed #39

Closed kknoppe closed 3 years ago

kknoppe commented 3 years ago

If a feature class has domains from types, the query builder currently only shows the codes, not the values.

The reason for this is that the domains are not stored in the field metadata, but in the type metadata at layer level.

I created a patch for MetadataAnalyzer.getFields:

return new Promise((resolve) => {
        try {
            const queryBuilderProperties = this._queryBuilderProperties;
            const metadata = store.getMetadata();
            apprt_when(metadata, (metadata) => {
                const types = metadata.types;
                const domainsFromTypes = {};
                types && types.forEach(type =>{
                    if(type.domains){
                        for (const [key, value] of Object.entries(type.domains)){
                            if(domainsFromTypes[key]){
                                domainsFromTypes[key].concat(value.codedValues);
                            }else{
                                domainsFromTypes[key] = value.codedValues;
                            }
                        }
                    }
                })

                const fields = metadata.fields;
                const storeData = [];
                fields.forEach((field) => {
                    let codedValues = (field.domain && field.domain.codedValues) || domainsFromTypes[field.name] || [];
                    let codedValueString = codedValues.length>0 ? "[CV]" : "";
                    if (field.type !== "geometry") {
                        let title = field.title;
                        if (!title || title === "") {
                            title = field.name;
                        }
                        let text = title;
                        if (queryBuilderProperties.showFieldType) {
                            text = title + " (" + field.type + ") " + codedValueString;
                        }
                        storeData.push({
                            id: field.name,
                            text: text,
                            type: field.type,
                            codedValues: codedValues,
                            distinctValues: [],
                            loading: false
                        });
                    }
                });
                resolve(storeData);
            }, this);
        } catch (e) {
            this._logService.error({
                id: 0,
                message: e
            });
        }
    });