@@ -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';
2425import { EuiIcon } from '@elastic/eui' ;
2526import { i18n } from '@kbn/i18n' ;
2627import { 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' ;
2833import { assignFeatureIds } from './util/assign_feature_ids' ;
2934import {
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