Внутреннее разрешение ссылок (resolveReferences) в Vega и Vega-Lite представляет собой слой нормализации, который приводит разнородные описания данных, сигналов и вычисляемых выражений к единой системе адресации. Этот механизм играет критическую роль в момент компиляции спецификации, когда декларативное описание графика преобразуется в исполняемый план.
В основе лежит идея того, что любое имя поля, сигнала или вычисляемого выражения может существовать в нескольких контекстах: внутри трансформаций данных, внутри композиционных операторов (layer, facet, concat, repeat), а также в области сигналов (signals). resolveReferences отвечает за устранение неоднозначности и построение корректных связей между этими областями.
Каждая ссылка в Vega/Vega-Lite существует в одном из контекстов:
datum.x, datum["x"])signalName)calculate, aggregate,
lookup)resolveReferences выполняет унификацию этих контекстов, приводя их к внутреннему графу зависимостей.
Процесс resolveReferences можно рассматривать как последовательность фаз компиляции.
На первом этапе выполняется приведение всех ссылок к каноническому виду:
datum["field"] преобразуются в единый
формат доступаНа этом уровне устраняется синтаксическая неоднозначность.
Vega/Vega-Lite использует строго разделенные области:
resolveReferences строит таблицы символов для каждой области,
предотвращая коллизии имен. Например, поле данных color и
сигнал color не конфликтуют, но требуют явного контекстного
разрешения при использовании в выражениях.
После нормализации формируется направленный ациклический граф зависимостей:
Пример зависимости:
data -> transform -> scale -> mark encoding -> rendering
signal -> transform -> encoding
resolveReferences фиксирует порядок вычисления, гарантируя, что все зависимости вычисляются до их использования.
Особенно важную роль механизм играет внутри цепочек трансформаций.
При использовании lookup происходит связывание двух наборов данных:
resolveReferences выполняет:
Результатом становится расширенная структура datum, где внешние поля доступны как локальные.
В агрегирующих трансформациях возникают новые поля, которые могут ссылаться на ранее вычисленные значения.
resolveReferences обеспечивает:
Оконные функции создают зависимости между соседними строками данных. resolveReferences фиксирует:
В Vega-Lite композиционные операторы создают дополнительный уровень сложности.
В слоистых визуализациях каждый слой имеет собственное пространство данных и энкодингов. resolveReferences выполняет:
Особенно важно поведение при перекрытии имен шкал и полей.
Facet генерирует множество подграфиков на основе одного поля. resolveReferences:
Каждый facet становится независимым контекстом, но сохраняет связь с родительским dataset.
При повторении визуализаций resolveReferences выполняет параметрическую подстановку:
Сигналы представляют динамическое состояние спецификации. resolveReferences обеспечивает их корректную интеграцию в граф вычислений.
Любое выражение может содержать сигналы:
resolveReferences заменяет символические имена сигналов на ссылки в runtime store.
Сигналы могут зависеть друг от друга, образуя граф:
b = a + 1c = b * 2resolveReferences гарантирует топологическую сортировку сигналов.
В сложных спецификациях неизбежно возникают конфликты имен.
Если поле данных и сигнал имеют одинаковое имя:
resolveReferences явно маркирует происхождение каждой ссылки.
В layer и facet возникает вопрос:
resolveReferences применяет стратегию из блока
resolve:
shared — объединение ссылок на одну шкалуindependent — генерация отдельных экземпляровПосле завершения обработки спецификация превращается в нормализованный граф:
Этот граф является входом для runtime Vega, где выполняется фактический рендеринг.
resolveReferences также выполняет ряд оптимизаций:
Эти операции уменьшают глубину графа и ускоряют последующее вычисление.
Вся система трансформаций Vega/Vega-Lite опирается на единый принцип: данные, сигналы и визуальные компоненты существуют как узлы одного графа. resolveReferences является механизмом, который превращает декларативные ссылки в этот граф, обеспечивая:
Без этого слоя невозможна предсказуемая работа сложных вложенных визуализаций, включающих динамические сигналы, агрегированные данные и композиционные структуры.