vega-parser
Version:
Parse Vega specifications to runtime dataflows.
96 lines (72 loc) • 2.01 kB
JavaScript
import {isObject} from 'vega-util';
export function Entry(type, value, params, parent) {
this.id = -1;
this.type = type;
this.value = value;
this.params = params;
if (parent) this.parent = parent;
}
export function entry(type, value, params, parent) {
return new Entry(type, value, params, parent);
}
export function operator(value, params) {
return entry('operator', value, params);
}
// -----
export function ref(op) {
const ref = {$ref: op.id};
// if operator not yet registered, cache ref to resolve later
if (op.id < 0) (op.refs = op.refs || []).push(ref);
return ref;
}
export const tupleidRef = {
$tupleid: 1,
toString: function() { return ':_tupleid_:'; }
};
export function fieldRef(field, name) {
return name ? {$field: field, $name: name} : {$field: field};
}
export const keyFieldRef = fieldRef('key');
export function compareRef(fields, orders) {
return {$compare: fields, $order: orders};
}
export function keyRef(fields, flat) {
const ref = {$key: fields};
if (flat) ref.$flat = true;
return ref;
}
// -----
export const Ascending = 'ascending';
export const Descending = 'descending';
export function sortKey(sort) {
return !isObject(sort) ? ''
: (sort.order === Descending ? '-' : '+')
+ aggrField(sort.op, sort.field);
}
export function aggrField(op, field) {
return (op && op.signal ? '$' + op.signal : op || '')
+ (op && field ? '_' : '')
+ (field && field.signal ? '$' + field.signal : field || '');
}
// -----
export const Scope = 'scope';
export const View = 'view';
export function isSignal(_) {
return _ && _.signal;
}
export function isExpr(_) {
return _ && _.expr;
}
export function hasSignal(_) {
if (isSignal(_)) return true;
if (isObject(_)) for (const key in _) {
if (hasSignal(_[key])) return true;
}
return false;
}
export function value(specValue, defaultValue) {
return specValue != null ? specValue : defaultValue;
}
export function deref(v) {
return v && v.signal || v;
}