/** * Create and return an OpenLayers filter object using the available * dimensions filters configuration within the data source. * @param {import("ngeo/datasource/OGC.js").default} dataSource Data source from which to create the * filter. * @return {?import("ol/format/filter/Filter.js").default} Filter * @private */ createDimensionsFilterFromDataSource_(dataSource) { const config = dataSource.dimensionsFiltersConfig || {}; const dimensions = dataSource.dimensions; if (!dimensions) { throw new Error('Missing dimensions'); } const conditions = []; for (const key in config) { let value = config[key].value; if (value === null) { const dimensionValue = dimensions[key]; if (dimensionValue !== undefined && dimensionValue !== null) { value = dimensionValue; } } if (value !== null) { conditions.push(olFormatFilter.equalTo(config[key].field, value, true)); } } if (conditions.length === 1) { return conditions[0]; } else if (conditions.length >= 2) { return olFormatFilter.and.apply(null, conditions); } return null; }
/** * Create a `ol.format.filter.Filter` object for a given data source. * See the `CreateFilterOptions` to learn more. * * @param {CreateFilterOptions} options Options. * @return {?import("ol/format/filter/Filter.js").default} Filter. */ createFilter(options) { const dataSource = options.dataSource; let mainFilter = null; if (options.filter) { mainFilter = options.filter; } else { const rules = options.filterRules || dataSource.filterRules; const conditions = []; if (rules && rules.length) { for (const rule of rules) { const filter = this.createFilterFromRule_( rule, dataSource, options.srsName ); if (filter) { conditions.push(filter); } } } const condition = dataSource.filterCondition; if (conditions.length === 1) { mainFilter = conditions[0]; } else if (conditions.length >= 2) { if (condition === ngeoFilterCondition.AND) { mainFilter = olFormatFilter.and.apply(null, conditions); } else if (condition === ngeoFilterCondition.OR || condition === ngeoFilterCondition.NOT ) { mainFilter = olFormatFilter.or.apply(null, conditions); } } if (mainFilter && condition === ngeoFilterCondition.NOT) { mainFilter = olFormatFilter.not(mainFilter); } } if (options.incTime) { const timeFilter = this.createTimeFilterFromDataSource_(dataSource); if (timeFilter) { if (mainFilter) { mainFilter = olFormatFilter.and.apply( null, [ mainFilter, timeFilter ] ); } else { mainFilter = timeFilter; } } } if (options.incDimensions) { const dimensionsFilter = this.createDimensionsFilterFromDataSource_(dataSource); if (dimensionsFilter) { if (mainFilter) { mainFilter = olFormatFilter.and.apply(null, [mainFilter, dimensionsFilter]); } else { mainFilter = dimensionsFilter; } } } return mainFilter; }