Skip to content

Commit 1adadcd

Browse files
committed
[Maps] gather field formatters in data request so they can be used sync in vector_style
1 parent 2b6ef5c commit 1adadcd

5 files changed

Lines changed: 138 additions & 5 deletions

File tree

x-pack/legacy/plugins/maps/common/constants.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ export const FIELD_ORIGIN = {
5959
export const SOURCE_DATA_ID_ORIGIN = 'source';
6060
export const META_ID_ORIGIN_SUFFIX = 'meta';
6161
export const SOURCE_META_ID_ORIGIN = `${SOURCE_DATA_ID_ORIGIN}_${META_ID_ORIGIN_SUFFIX}`;
62+
export const FORMATTERS_ID_ORIGIN_SUFFIX = 'formatters';
63+
export const SOURCE_FORMATTERS_ID_ORIGIN = `${SOURCE_DATA_ID_ORIGIN}_${FORMATTERS_ID_ORIGIN_SUFFIX}`;
6264

6365
export const GEOJSON_FILE = 'GEOJSON_FILE';
6466

x-pack/legacy/plugins/maps/public/layers/joins/inner_join.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import { ESTermSource } from '../sources/es_term_source';
88
import { getComputedFieldNamePrefix } from '../styles/vector/style_util';
9-
import { META_ID_ORIGIN_SUFFIX } from '../../../common/constants';
9+
import { META_ID_ORIGIN_SUFFIX, FORMATTERS_ID_ORIGIN_SUFFIX } from '../../../common/constants';
1010

1111
export class InnerJoin {
1212
constructor(joinDescriptor, leftSource) {
@@ -45,6 +45,10 @@ export class InnerJoin {
4545
return `${this.getSourceDataRequestId()}_${META_ID_ORIGIN_SUFFIX}`;
4646
}
4747

48+
getSourceFormattersDataRequestId() {
49+
return `${this.getSourceDataRequestId()}_${FORMATTERS_ID_ORIGIN_SUFFIX}`;
50+
}
51+
4852
getLeftField() {
4953
return this._leftField;
5054
}

x-pack/legacy/plugins/maps/public/layers/styles/vector/vector_style.js

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
FIELD_ORIGIN,
2020
STYLE_TYPE,
2121
SOURCE_META_ID_ORIGIN,
22+
SOURCE_FORMATTERS_ID_ORIGIN,
2223
LAYER_STYLE_TYPE,
2324
} from '../../../../common/constants';
2425
import { VectorIcon } from './components/legend/vector_icon';
@@ -334,6 +335,42 @@ export class VectorStyle extends AbstractStyle {
334335
return fieldMeta ? fieldMeta : fieldMetaFromLocalFeatures;
335336
};
336337

338+
_getFieldFormatter = fieldName => {
339+
const dynamicProps = this.getDynamicPropertiesArray();
340+
const dynamicProp = dynamicProps.find(dynamicProp => {
341+
return fieldName === dynamicProp.getField().getName();
342+
});
343+
344+
if (!dynamicProp) {
345+
return null;
346+
}
347+
348+
let dataRequestId;
349+
if (dynamicProp.getFieldOrigin() === FIELD_ORIGIN.SOURCE) {
350+
dataRequestId = SOURCE_FORMATTERS_ID_ORIGIN;
351+
} else {
352+
const join = this._layer.getValidJoins().find(join => {
353+
const matchingField = join.getRightJoinSource().getMetricFieldForName(fieldName);
354+
return !!matchingField;
355+
});
356+
if (join) {
357+
dataRequestId = join.getSourceFormattersDataRequestId();
358+
}
359+
}
360+
361+
if (!dataRequestId) {
362+
return null;
363+
}
364+
365+
const formattersDataRequest = this._layer._findDataRequestForSource(dataRequestId);
366+
if (!formattersDataRequest || !formattersDataRequest.hasData()) {
367+
return null;
368+
}
369+
370+
const formatters = formattersDataRequest.getData();
371+
return formatters[fieldName];
372+
};
373+
337374
_getStyleMeta = () => {
338375
return _.get(this._descriptor, '__styleMeta', {});
339376
};
@@ -382,7 +419,7 @@ export class VectorStyle extends AbstractStyle {
382419
const promises = styles.map(async style => {
383420
return {
384421
label: await style.getField().getLabel(),
385-
fieldFormatter: await this._source.getFieldFormatter(style.getField().getName()),
422+
fieldFormatter: this._getFieldFormatter(style.getField().getName()),
386423
meta: this._getFieldMeta(style.getField().getName()),
387424
style,
388425
};

x-pack/legacy/plugins/maps/public/layers/util/can_skip_fetch.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,3 +158,15 @@ export function canSkipStyleMetaUpdate({ prevDataRequest, nextMeta }) {
158158
!updateDueToFields && !updateDueToSourceQuery && !updateDueToIsTimeAware && !updateDueToTime
159159
);
160160
}
161+
162+
export function canSkipFormattersUpdate({ prevDataRequest, nextMeta }) {
163+
if (!prevDataRequest) {
164+
return false;
165+
}
166+
const prevMeta = prevDataRequest.getMeta();
167+
if (!prevMeta) {
168+
return false;
169+
}
170+
171+
return !_.isEqual(prevMeta.fieldNames, nextMeta.fieldNames);
172+
}

x-pack/legacy/plugins/maps/public/layers/vector_layer.js

Lines changed: 81 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
FEATURE_ID_PROPERTY_NAME,
1414
SOURCE_DATA_ID_ORIGIN,
1515
SOURCE_META_ID_ORIGIN,
16+
SOURCE_FORMATTERS_ID_ORIGIN,
1617
FEATURE_VISIBLE_PROPERTY_NAME,
1718
EMPTY_FEATURE_COLLECTION,
1819
LAYER_TYPE,
@@ -24,7 +25,11 @@ import { JoinTooltipProperty } from './tooltips/join_tooltip_property';
2425
import { EuiIcon } from '@elastic/eui';
2526
import { i18n } from '@kbn/i18n';
2627
import { DataRequestAbortError } from './util/data_request';
27-
import { canSkipSourceUpdate, canSkipStyleMetaUpdate } from './util/can_skip_fetch';
28+
import {
29+
canSkipSourceUpdate,
30+
canSkipStyleMetaUpdate,
31+
canSkipFormattersUpdate,
32+
} from './util/can_skip_fetch';
2833
import { assignFeatureIds } from './util/assign_feature_ids';
2934
import {
3035
getFillFilterExpression,
@@ -286,6 +291,7 @@ export class VectorLayer extends AbstractLayer {
286291
async _syncJoins(syncContext) {
287292
const joinSyncs = this.getValidJoins().map(async join => {
288293
await this._syncJoinStyleMeta(syncContext, join);
294+
await this._syncJoinFormatters(syncContext, join);
289295
return this._syncJoin({ join, ...syncContext });
290296
});
291297

@@ -355,7 +361,7 @@ export class VectorLayer extends AbstractLayer {
355361
registerCancelCallback,
356362
dataFilters,
357363
}) {
358-
const requestToken = Symbol(`layer-source-data:${this.getId()}`);
364+
const requestToken = Symbol(`layer-${this.getId()}-${SOURCE_DATA_ID_ORIGIN}`);
359365
const searchFilters = this._getSearchFilters(dataFilters);
360366
const prevDataRequest = this.getSourceDataRequest();
361367

@@ -465,7 +471,7 @@ export class VectorLayer extends AbstractLayer {
465471
return;
466472
}
467473

468-
const requestToken = Symbol(`layer-${this.getId()}-style-meta`);
474+
const requestToken = Symbol(`layer-${this.getId()}-${dataRequestId}`);
469475
try {
470476
startLoading(dataRequestId, requestToken, nextMeta);
471477
const layerName = await this.getDisplayName();
@@ -484,12 +490,84 @@ export class VectorLayer extends AbstractLayer {
484490
}
485491
}
486492

493+
async _syncSourceFormatters(syncContext) {
494+
if (this._style.constructor.type !== LAYER_STYLE_TYPE.VECTOR) {
495+
return;
496+
}
497+
498+
return this._syncFormatters({
499+
source: this._source,
500+
dataRequestId: SOURCE_FORMATTERS_ID_ORIGIN,
501+
dynamicStyleProps: this._style.getDynamicPropertiesArray().filter(dynamicStyleProp => {
502+
return dynamicStyleProp.getFieldOrigin() === FIELD_ORIGIN.SOURCE;
503+
}),
504+
...syncContext,
505+
});
506+
}
507+
508+
async _syncJoinFormatters(syncContext, join) {
509+
const joinSource = join.getRightJoinSource();
510+
return this._syncFormatters({
511+
source: joinSource,
512+
dataRequestId: join.getSourceFormattersDataRequestId(),
513+
dynamicStyleProps: this._style.getDynamicPropertiesArray().filter(dynamicStyleProp => {
514+
const matchingField = joinSource.getMetricFieldForName(
515+
dynamicStyleProp.getField().getName()
516+
);
517+
return dynamicStyleProp.getFieldOrigin() === FIELD_ORIGIN.JOIN && !!matchingField;
518+
}),
519+
...syncContext,
520+
});
521+
}
522+
523+
async _syncFormatters({
524+
source,
525+
dataRequestId,
526+
dynamicStyleProps,
527+
startLoading,
528+
stopLoading,
529+
onLoadError,
530+
}) {
531+
if (dynamicStyleProps.length === 0) {
532+
return;
533+
}
534+
535+
const fieldNames = dynamicStyleProps.map(dynamicStyleProp => {
536+
return dynamicStyleProp.getField().getName();
537+
});
538+
const nextMeta = {
539+
fieldNames: _.uniq(fieldNames).sort(),
540+
};
541+
const prevDataRequest = this._findDataRequestForSource(dataRequestId);
542+
const canSkipUpdate = canSkipFormattersUpdate({ prevDataRequest, nextMeta });
543+
if (canSkipUpdate) {
544+
return;
545+
}
546+
547+
const requestToken = Symbol(`layer-${this.getId()}-${dataRequestId}`);
548+
try {
549+
startLoading(dataRequestId, requestToken, nextMeta);
550+
551+
const formatters = {};
552+
const promises = dynamicStyleProps.map(async dynamicStyleProp => {
553+
const fieldName = dynamicStyleProp.getField().getName();
554+
formatters[fieldName] = await source.getFieldFormatter(fieldName);
555+
});
556+
await Promise.all(promises);
557+
558+
stopLoading(dataRequestId, requestToken, formatters, nextMeta);
559+
} catch (error) {
560+
onLoadError(dataRequestId, requestToken, error.message);
561+
}
562+
}
563+
487564
async syncData(syncContext) {
488565
if (!this.isVisible() || !this.showAtZoomLevel(syncContext.dataFilters.zoom)) {
489566
return;
490567
}
491568

492569
await this._syncSourceStyleMeta(syncContext);
570+
await this._syncSourceFormatters(syncContext);
493571
const sourceResult = await this._syncSource(syncContext);
494572
if (
495573
!sourceResult.featureCollection ||

0 commit comments

Comments
 (0)