Skip to content

Commit

Permalink
Remove useMemorySelectionStore property and improve QueryController.js
Browse files Browse the repository at this point in the history
  • Loading branch information
matthiasstein committed Sep 17, 2021
1 parent 895a202 commit e38db92
Show file tree
Hide file tree
Showing 10 changed files with 553 additions and 76 deletions.
496 changes: 496 additions & 0 deletions src/main/js/bundles/dn_querybuilder/CachingStore.js

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import declare from "dojo/_base/declare";
import ComplexMemoryStore from "ct/store/ComplexMemory";
import { AsyncWritableInMemoryStore } from "store-api/InMemoryStore";
import "store-api/SpatialQuery";

export default declare([ComplexMemoryStore], {
masterStore: null,

getMetadata: function () {
export class MemoryStore extends AsyncWritableInMemoryStore {
constructor(opts) {
super(opts);
this.masterStore = opts.masterStore;
this.idList = opts.idList;
}
async getMetadata() {
return this.masterStore.getMetadata();
}
});
}
103 changes: 45 additions & 58 deletions src/main/js/bundles/dn_querybuilder/QueryController.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ import apprt_when from "apprt-core/when";
import async from "apprt-core/async";
import ct_lang from "ct/_lang";
import Filter from "ct/store/Filter";
import MemorySelectionStore from "./MemorySelectionStore";
import {MemoryStore} from "./MemoryStore";
import CachingStore from "./CachingStore";

const DELAY = 500;

Expand All @@ -41,12 +42,7 @@ export default class QueryController {

query(store, complexQuery, options, tool, queryBuilderWidgetModel) {
this.searchReplacer(complexQuery);
const queryBuilderProperties = this._queryBuilderProperties;
if (queryBuilderProperties.useMemorySelectionStore) {
this.memorySelectionQuery(store, complexQuery, options, tool, queryBuilderWidgetModel);
} else {
this.defaultQuery(store, complexQuery, options, tool, queryBuilderWidgetModel);
}
this.queryStore(store, complexQuery, options, tool, queryBuilderWidgetModel);
this._eventService.postEvent("dn_querybuilder/QUERY", {complexQuery: complexQuery});
}

Expand All @@ -58,66 +54,39 @@ export default class QueryController {
this._dataModel.setDatasource();
}

memorySelectionQuery(store, complexQuery, options, tool, queryBuilderWidgetModel) {
this._setProcessing(tool, true, queryBuilderWidgetModel);
options.fields = {geometry: 1};
const query = this.#query = store.query(complexQuery, options);
return apprt_when(query, (result) => {
if (result.total) {
const mapWidgetModel = this._mapWidgetModel;
const spatialReference = mapWidgetModel.get("spatialReference");
const wkid = spatialReference.latestWkid || spatialReference.wkid;
const geometries = result.map((item) => item.geometry);

if (geometries[0]) {
apprt_when(this._coordinateTransformer.transform(geometries, wkid), (transformedGeometries) => {
transformedGeometries.forEach((tg, index) => {
result[index].geometry = tg;
});
}, this);
}

const memorySelectionStore = new MemorySelectionStore({
id: "querybuilder_" + store.id,
idProperty: store.idProperty,
masterStore: store,
data: result
});

this._dataModel.setDatasource(memorySelectionStore);
this._setProcessing(tool, false, queryBuilderWidgetModel);
this._registerTempStore(memorySelectionStore, queryBuilderWidgetModel);

} else {
this._logService.warn({
id: 0,
message: this.#i18n.errors.noResultsError
});
this._setProcessing(tool, false, queryBuilderWidgetModel);
}
}, (e) => {
this._logService.error({
id: e.name,
message: e.message
});
this._setProcessing(tool, false, queryBuilderWidgetModel);
});
}

defaultQuery(store, complexQuery, options, tool, queryBuilderWidgetModel) {
queryStore(store, complexQuery, options, tool, queryBuilderWidgetModel) {
this._setProcessing(tool, true, queryBuilderWidgetModel);
const filter = new Filter(store, complexQuery, options);
const countFilter = new Filter(store, complexQuery, {});
const query = this.#query = countFilter.query({}, {count: 0});
const idProperty = store.idProperty;
let opts = null;
if (idProperty) {
opts = Object.assign({}, options);;
const fields = opts.fields = {};
fields[idProperty] = true;
}
let query = this.#query = countFilter.query({}, {count: 0});
return apprt_when(query.total, (total) => {
if (total) {
if (this._smartfinderComplexQueryHandler && store.coreName) {
this._smartfinderComplexQueryHandler.setComplexQuery(complexQuery);
this._setProcessing(tool, false, queryBuilderWidgetModel);
} else {
this._registerTempStore(filter, queryBuilderWidgetModel);
this._dataModel.setDatasource(filter);
query = this.#query = store.query(complexQuery, opts || options);
return apprt_when(query, (result) => {
this._setProcessing(tool, false, queryBuilderWidgetModel);
let resultStore;
const idList = result ? result.map(item => item[idProperty]) : [];
if (store.get) { // Check if store has a get-method, i.e. it can retrieve single features by ID
resultStore = this._createResultReferenceStore(idList, store, 1000);
} else {
resultStore = this._createFullItemResultStore(idList, result, store);
}

this._registerTempStore(filter, queryBuilderWidgetModel);
this._dataModel.setDatasource(resultStore);
});
}
this._setProcessing(tool, false, queryBuilderWidgetModel);
} else {
this._logService.warn({
message: this.#i18n.errors.noResultsError
Expand All @@ -133,6 +102,24 @@ export default class QueryController {
});
}

_createFullItemResultStore(idList, result, masterStore) {
return new MemoryStore({
masterStore: masterStore,
data: result,
idProperty: masterStore.idProperty,
// TODO: remove id list
idList: idList
});
}

_createResultReferenceStore(idList, masterStore, maxServerFeaturesLimit) {
return new CachingStore({
masterStore: masterStore,
idList: idList,
maxFeaturesLimit: maxServerFeaturesLimit
});
}

searchReplacer(o) {
const that = this;
ct_lang.forEachOwnProp(o, function (value, name) {
Expand Down
2 changes: 0 additions & 2 deletions src/main/js/bundles/dn_querybuilder/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,6 @@ No further configuration required, default values will be used.
"enableInitialDistinctValues": true,
"defaultLinkOperator": "$or",
"defaultSpatialRelation": "everywhere",
"useMemorySelectionStore": false,
"useUserExtent": false,
"allowNegation": true,
"showQuerySettingsInEditableMode": true,
Expand Down Expand Up @@ -160,7 +159,6 @@ No further configuration required, default values will be used.
| enableInitialDistinctValues | Boolean | ```true``` | ```false``` | ```true``` | Distinct values are queried after a new field was selected. |
| defaultLinkOperator | String | ```or``` | ```and``` | ```or``` | Defines the default link operator. |
| defaultSpatialRelation | String | ```everywhere``` | ```current_extent``` | ```everywhere``` | Defines the default spatial relation. |
| useMemorySelectionStore | Boolean | ```true``` | ```false``` | ```false``` | Use MemorySelectionStore to save the results. |
| useUserExtent | Boolean | ```true``` | ```false``` | ```false``` | Use the current user extent to filter predefined queries. |
| allowNegation | Boolean | ```true``` | ```false``` | ```true``` | Allows the user to negate the different parts of the queries. |
| showQuerySettingsInEditableMode | Boolean | ```true``` | ```false``` | ```true``` | Show or hide the query settings for editable queries. |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,6 @@
"w": 150
}
},
{
"type": "checkbox",
"label": "${propertiesWidget.useMemorySelectionStore}",
"field": "useMemorySelectionStore"
},
{
"type": "checkbox",
"label": "${propertiesWidget.useUserExtent}",
Expand Down
1 change: 0 additions & 1 deletion src/main/js/bundles/dn_querybuilder/config/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@
"enableDistinctValues": true,
"defaultLinkOperator": "$or",
"defaultSpatialRelation": "everywhere",
"useMemorySelectionStore": false,
"useUserExtent": false,
"allowNegation": false,
"showQuerySettingsInEditableMode": true,
Expand Down
1 change: 0 additions & 1 deletion src/main/js/bundles/dn_querybuilder/config/nls/bundle.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ module.exports = {
enableDistinctValues: "Use distinct values",
defaultLinkOperator: "Default relational operator",
defaultSpatialRelation: "Default spatial relation",
useMemorySelectionStore: "Use Memory Selection Store",
useUserExtent: "Use user's current map extent instead of a preset one",
allowNegation: "Allow user to negate fields",
showQuerySettingsInEditableMode: "Show query settings in editable mode",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ module.exports = {
enableDistinctValues: "Distinct Values vorschlagen",
defaultLinkOperator: "Standard-Vergleichsoperator",
defaultSpatialRelation: "Standard-R\u00E4umlicher-Vergleichsoperator",
useMemorySelectionStore: "Memory Selection Store verwenden",
useUserExtent: "Aktuelle Kartenausdehnung des Anwenders verwenden anstelle einer voreingestellten Ausdehnung",
allowNegation: "Negation eines Feldes erlauben",
showQuerySettingsInEditableMode: "Sucheinstellungen im Editiermodus anzeigen",
Expand Down
1 change: 0 additions & 1 deletion src/main/js/bundles/dn_querybuilder/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,6 @@
"enableInitialDistinctValues": true,
"defaultLinkOperator": "$or",
"defaultSpatialRelation": "everywhere",
"useMemorySelectionStore": false,
"useUserExtent": false,
"allowNegation": false,
"showQuerySettingsInEditableMode": true,
Expand Down
2 changes: 2 additions & 0 deletions src/test/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -68,3 +68,5 @@ jsregistry.directoryscanner.npmfolder=${basedir}/node_modules
jsregistry.directoryscanner.npmincludes=mocha,chai,@conterra,@conterra/mapapps-mocha-runner

geometry.service.url=https://utility.arcgisonline.com/arcgis/rest/services/Geometry/GeometryServer

client.config.requestMaxUrlLength=2048

0 comments on commit e38db92

Please sign in to comment.