UNPKG

virool-pivot

Version:

A web-based exploratory visualization UI for Druid.io

155 lines (154 loc) 9.54 kB
"use strict"; var index_1 = require('../../../common/models/index'); function attributeToYAML(attribute) { var lines = [ (" - name: " + attribute.name), (" type: " + attribute.type) ]; if (attribute.special) { lines.push(" special: " + attribute.special); } lines.push(''); return lines; } exports.attributeToYAML = attributeToYAML; function dimensionToYAML(dimension) { var lines = [ (" - name: " + dimension.name), (" title: " + dimension.title) ]; if (dimension.kind !== 'string') { lines.push(" kind: " + dimension.kind); } lines.push(" expression: " + dimension.expression.toString()); lines.push(''); return lines; } exports.dimensionToYAML = dimensionToYAML; function measureToYAML(measure) { var lines = [ (" - name: " + measure.name), (" title: " + measure.title) ]; var ex = measure.expression; var lastAction = ex.lastAction(); var comment = ''; // Make a comment if this is a .sum(min_blah) or similar if (lastAction.action === 'sum' && /\bmin\b|\bmax\b|\bunique\b|\buniques\b/i.test((lastAction.expression.name || '').replace(/_/g, ' ')) // \b matches "_" :-( ) { comment = ' # double check please'; } lines.push(" expression: " + ex.toString() + comment); var format = measure.format; if (format !== index_1.Measure.DEFAULT_FORMAT) { lines.push(" format: " + format); } lines.push(''); return lines; } exports.measureToYAML = measureToYAML; function dataSourceToYAML(dataSource, withComments) { var lines = [ (" - name: " + dataSource.name), (" title: " + dataSource.title), (" engine: " + dataSource.engine), (" source: " + dataSource.source), "" ]; var timeAttribute = dataSource.timeAttribute; if (timeAttribute && !(dataSource.engine === 'druid' && timeAttribute.name === '__time')) { if (withComments) { lines.push(" # The primary time attribute of the data refers to the attribute that must always be filtered on"); lines.push(" # This is particularly useful for Druid data sources as they must always have a time filter."); } lines.push(" timeAttribute: " + timeAttribute.name, ''); } var refreshRule = dataSource.refreshRule; if (withComments) { lines.push(" # The refresh rule describes how often the data source looks for new data. Default: 'query'/PT1M (every minute)"); } lines.push(" refreshRule:"); lines.push(" rule: " + refreshRule.rule); if (refreshRule.time) { lines.push(" time: " + refreshRule.time.toISOString()); } if (refreshRule.refresh) { lines.push(" refresh: " + refreshRule.refresh.toString()); } lines.push(''); var defaultTimezone = dataSource.defaultTimezone; if (withComments) { lines.push(" # The default timezone for this dataset to operate in defaults to UTC"); } if (defaultTimezone.equals(index_1.DataSource.DEFAULT_TIMEZONE)) { if (withComments) { lines.push(" #defaultTimezone: " + index_1.DataSource.DEFAULT_TIMEZONE.toString(), ''); } } else { lines.push(" defaultTimezone: " + defaultTimezone.toString() + "}", ''); } var defaultDuration = dataSource.defaultDuration; if (withComments) { lines.push(" # The default duration for the time filter (if not set " + index_1.DataSource.DEFAULT_DURATION.toString() + " is used)"); } if (defaultDuration.equals(index_1.DataSource.DEFAULT_DURATION)) { if (withComments) { lines.push(" #defaultDuration: " + index_1.DataSource.DEFAULT_DURATION.toString(), ''); } } else { lines.push(" defaultDuration: " + defaultDuration.toString(), ''); } var defaultSortMeasure = dataSource.defaultSortMeasure; if (withComments) { lines.push(" # The default sort measure name (if not set the first measure name is used)"); } lines.push(" defaultSortMeasure: " + defaultSortMeasure, ''); var defaultPinnedDimensions = dataSource.defaultPinnedDimensions.toArray(); if (withComments) { lines.push(" # The names of dimensions that are pinned by default (in order that they will appear in the pin bar)"); } lines.push(" defaultPinnedDimensions: " + JSON.stringify(defaultPinnedDimensions), ''); var introspection = dataSource.introspection; if (withComments) { lines.push(" # How the dataset should be introspected", " # possible options are:", " # * none - Do not do any introspection, take what is written in the config as the rule of law.", " # * no-autofill - Introspect the datasource but do not automatically generate dimensions or measures", " # * autofill-dimensions-only - Introspect the datasource, automatically generate dimensions only", " # * autofill-measures-only - Introspect the datasource, automatically generate measures only", " # * autofill-all - (default) Introspect the datasource, automatically generate dimensions and measures"); } lines.push(" introspection: " + introspection, ''); var attributeOverrides = dataSource.attributeOverrides; if (withComments) { lines.push(" # The list of attribute overrides in case introspection get something wrong"); } lines.push(' attributeOverrides:'); if (withComments) { lines.push(" # A general attribute override looks like so:", " #", " # name: user_unique", " # ^ the name of the attribute (the column in the database)", " #", " # type: STRING", " # ^ (optional) plywood type of the attribute", " #", " # special: unique", " # ^ (optional) any kind of special significance associated with this attribute", ""); } lines = lines.concat.apply(lines, attributeOverrides.map(attributeToYAML)); var dimensions = dataSource.dimensions.toArray(); if (withComments) { lines.push(" # The list of dimensions defined in the UI. The order here will be reflected in the UI"); } lines.push(' dimensions:'); if (withComments) { lines.push(" # A general dimension looks like so:", " #", " # name: channel", " # ^ the name of the dimension as used in the URL (you should try not to change these)", " #", " # title: The Channel", " # ^ (optional) the human readable title. If not set a title is generated from the 'name'", " #", " # kind: string", " # ^ (optional) the kind of the dimension. Can be 'string', 'time', 'number', or 'boolean'. Defaults to 'string'", " #", " # expression: $channel", " # ^ (optional) the Plywood bucketing expression for this dimension. Defaults to '$name'", " # if, say, channel was called 'cnl' in the data you would put '$cnl' here", " # See also the expressions API reference: https://plywood.imply.io/expressions", " #", " # url: string", " # ^ (optional) a url (including protocol) associated with the dimension, with optional token '%s'", " # that is replaced by the dimension value to generate links specific to each value.", ""); } lines = lines.concat.apply(lines, dimensions.map(dimensionToYAML)); if (withComments) { lines.push(" # This is the place where you might want to add derived dimensions.", " #", " # Here are some examples of possible derived dimensions:", " #", " # - name: is_usa", " # title: Is USA?", " # expression: $country == 'United States'", " #", " # - name: file_version", " # expression: $filename.extract('(\\d+\\.\\d+\\.\\d+)')", ""); } var measures = dataSource.measures.toArray(); if (withComments) { lines.push(" # The list of measures defined in the UI. The order here will be reflected in the UI"); } lines.push(" measures:"); if (withComments) { lines.push(" # A general measure looks like so:", " #", " # name: avg_revenue", " # ^ the name of the dimension as used in the URL (you should try not to change these)", " #", " # title: Average Revenue", " # ^ (optional) the human readable title. If not set a title is generated from the 'name'", " #", " # expression: $main.sum($revenue) / $main.sum($volume) * 10", " # ^ (optional) the Plywood bucketing expression for this dimension.", " # Usually defaults to '$main.sum($name)' but if the name contains 'min' or 'max' will use that as the aggregate instead of sum.", " # this is the place to define your fancy formulas", ""); } lines = lines.concat.apply(lines, measures.map(measureToYAML)); if (withComments) { lines.push(" # This is the place where you might want to add derived measures (a.k.a Post Aggregators).", " #", " # Here are some examples of possible derived measures:", " #", " # - name: ecpm", " # title: eCPM", " # expression: $main.sum($revenue) / $main.sum($impressions) * 1000", " #", " # - name: usa_revenue", " # title: USA Revenue", " # expression: $main.filter($country == 'United States').sum($revenue)", ""); } lines.push(''); return lines; } exports.dataSourceToYAML = dataSourceToYAML;