chore(chart-data): add annotations and url params to chart data schema (#11393)

* chore(chart-data): add annotations to chart data schema

* bump superset-ui packages

* xit flaky cypress tests
This commit is contained in:
Ville Brofeldt 2020-10-28 23:41:39 +02:00 committed by GitHub
parent e5e35634de
commit e230865216
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 695 additions and 251 deletions

View File

@ -54,7 +54,7 @@ describe('AdhocMetrics', () => {
});
});
it('Switch from simple to custom sql', () => {
xit('Switch from simple to custom sql', () => {
cy.get('[data-test=metrics]')
.find('[data-test="metric-option"]')
.should('have.length', 1);
@ -95,7 +95,7 @@ describe('AdhocMetrics', () => {
});
});
it('Switch from custom sql tabs to simple', () => {
xit('Switch from custom sql tabs to simple', () => {
cy.get('[data-test=metrics]').within(() => {
cy.get('.Select__dropdown-indicator').click();
cy.get('input[type=text]').type('sum_girls{enter}');

File diff suppressed because it is too large Load Diff

View File

@ -64,33 +64,33 @@
"@data-ui/sparkline": "^0.0.84",
"@emotion/core": "^10.0.28",
"@superset-ui/chart-controls": "^0.15.5",
"@superset-ui/core": "^0.15.2",
"@superset-ui/legacy-plugin-chart-calendar": "^0.15.5",
"@superset-ui/legacy-plugin-chart-chord": "^0.15.5",
"@superset-ui/legacy-plugin-chart-country-map": "^0.15.5",
"@superset-ui/legacy-plugin-chart-event-flow": "^0.15.5",
"@superset-ui/legacy-plugin-chart-force-directed": "^0.15.5",
"@superset-ui/legacy-plugin-chart-heatmap": "^0.15.5",
"@superset-ui/legacy-plugin-chart-histogram": "^0.15.5",
"@superset-ui/legacy-plugin-chart-horizon": "^0.15.5",
"@superset-ui/legacy-plugin-chart-map-box": "^0.15.5",
"@superset-ui/legacy-plugin-chart-paired-t-test": "^0.15.5",
"@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.15.5",
"@superset-ui/legacy-plugin-chart-partition": "^0.15.5",
"@superset-ui/legacy-plugin-chart-pivot-table": "^0.15.5",
"@superset-ui/legacy-plugin-chart-rose": "^0.15.5",
"@superset-ui/legacy-plugin-chart-sankey": "^0.15.5",
"@superset-ui/legacy-plugin-chart-sankey-loop": "^0.15.5",
"@superset-ui/legacy-plugin-chart-sunburst": "^0.15.5",
"@superset-ui/legacy-plugin-chart-treemap": "^0.15.5",
"@superset-ui/legacy-plugin-chart-world-map": "^0.15.5",
"@superset-ui/legacy-preset-chart-big-number": "^0.15.5",
"@superset-ui/core": "^0.15.10",
"@superset-ui/legacy-plugin-chart-calendar": "^0.15.10",
"@superset-ui/legacy-plugin-chart-chord": "^0.15.10",
"@superset-ui/legacy-plugin-chart-country-map": "^0.15.10",
"@superset-ui/legacy-plugin-chart-event-flow": "^0.15.10",
"@superset-ui/legacy-plugin-chart-force-directed": "^0.15.10",
"@superset-ui/legacy-plugin-chart-heatmap": "^0.15.10",
"@superset-ui/legacy-plugin-chart-histogram": "^0.15.10",
"@superset-ui/legacy-plugin-chart-horizon": "^0.15.10",
"@superset-ui/legacy-plugin-chart-map-box": "^0.15.10",
"@superset-ui/legacy-plugin-chart-paired-t-test": "^0.15.10",
"@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.15.10",
"@superset-ui/legacy-plugin-chart-partition": "^0.15.10",
"@superset-ui/legacy-plugin-chart-pivot-table": "^0.15.10",
"@superset-ui/legacy-plugin-chart-rose": "^0.15.10",
"@superset-ui/legacy-plugin-chart-sankey": "^0.15.10",
"@superset-ui/legacy-plugin-chart-sankey-loop": "^0.15.10",
"@superset-ui/legacy-plugin-chart-sunburst": "^0.15.10",
"@superset-ui/legacy-plugin-chart-treemap": "^0.15.10",
"@superset-ui/legacy-plugin-chart-world-map": "^0.15.10",
"@superset-ui/legacy-preset-chart-big-number": "^0.15.10",
"@superset-ui/legacy-preset-chart-deckgl": "^0.3.1",
"@superset-ui/legacy-preset-chart-nvd3": "^0.15.8",
"@superset-ui/plugin-chart-echarts": "^0.15.7",
"@superset-ui/plugin-chart-table": "^0.15.5",
"@superset-ui/plugin-chart-word-cloud": "^0.15.5",
"@superset-ui/preset-chart-xy": "^0.15.5",
"@superset-ui/legacy-preset-chart-nvd3": "^0.15.10",
"@superset-ui/plugin-chart-echarts": "^0.15.11",
"@superset-ui/plugin-chart-table": "^0.15.10",
"@superset-ui/plugin-chart-word-cloud": "^0.15.10",
"@superset-ui/preset-chart-xy": "^0.15.10",
"@vx/responsive": "^0.0.195",
"abortcontroller-polyfill": "^1.1.9",
"antd": "^4.5.2",

View File

@ -705,7 +705,94 @@ class ChartDataExtrasSchema(Schema):
)
class AnnotationLayerSchema(Schema):
annotationType = fields.String(
description="Type of annotation layer",
validate=validate.OneOf(
choices=("EVENT", "FORMULA", "INTERVAL", "TIME_SERIES",)
),
)
color = fields.String(description="Layer color", allow_none=True,)
descriptionColumns = fields.List(
fields.String(),
description="Columns to use as the description. If none are provided, "
"all will be shown.",
)
hideLine = fields.Boolean(
description="Should line be hidden. Only applies to line annotations",
allow_none=True,
)
intervalEndColumn = fields.String(
description=(
"Column containing end of interval. Only applies to interval layers"
),
allow_none=True,
)
name = fields.String(description="Name of layer", required=True)
opacity = fields.String(
description="Opacity of layer",
validate=validate.OneOf(
choices=("", "opacityLow", "opacityMedium", "opacityHigh"),
),
allow_none=True,
required=False,
)
overrides = fields.Dict(
keys=fields.String(
desciption="Name of property to be overridden",
validate=validate.OneOf(
choices=("granularity", "time_grain_sqla", "time_range", "time_shift"),
),
),
values=fields.Raw(allow_none=True),
description="which properties should be overridable",
allow_none=True,
)
show = fields.Boolean(description="Should the layer be shown", required=True)
showMarkers = fields.Boolean(
description="Should markers be shown. Only applies to line annotations.",
required=True,
)
sourceType = fields.String(
description="Type of source for annotation data",
validate=validate.OneOf(choices=("", "line", "NATIVE", "table",)),
)
style = fields.String(
description="Line style. Only applies to time-series annotations",
validate=validate.OneOf(choices=("dashed", "dotted", "solid", "longDashed",)),
)
timeColumn = fields.String(
description="Column with event date or interval start date", allow_none=True,
)
titleColumn = fields.String(description="Column with title", allow_none=True,)
width = fields.Float(
description="Width of annotation line",
validate=[
Range(
min=0,
min_inclusive=True,
error=_("`width` must be greater or equal to 0"),
)
],
)
value = fields.Raw(
description="For formula annotations, this contains the formula. "
"For other types, this is the primary key of the source object.",
required=True,
)
class ChartDataQueryObjectSchema(Schema):
annotation_layers = fields.List(
fields.Nested(AnnotationLayerSchema),
description="Annotation layers to apply to chart",
allow_none=True,
)
applied_time_extras = fields.Dict(
description="A mapping of temporal extras that have been applied to the query",
required=False,
example={"__time_range": "1 year ago : now"},
)
filters = fields.List(fields.Nested(ChartDataFilterSchema), required=False)
granularity = fields.String(
description="Name of temporal column used for time filtering. For legacy Druid "
@ -817,6 +904,19 @@ class ChartDataQueryObjectSchema(Schema):
"as `having_druid`.",
deprecated=True,
)
druid_time_origin = fields.String(
description="Starting point for time grain counting on legacy Druid "
"datasources. Used to change e.g. Monday/Sunday first-day-of-week. "
"This field is deprecated and should be passed to `extras` "
"as `druid_time_origin`.",
allow_none=True,
)
url_params = fields.Dict(
description="Optional query parameters passed to a dashboard or Explore view",
keys=fields.String(description="The query parameter"),
values=fields.String(description="The value of the query parameter"),
allow_none=True,
)
class ChartDataDatasourceSchema(Schema):
@ -853,7 +953,28 @@ class ChartDataQueryContextSchema(Schema):
# pylint: enable=no-self-use,unused-argument
class AnnotationDataSchema(Schema):
columns = fields.List(
fields.String(),
description="columns available in the annotation result",
required=True,
)
records = fields.List(
fields.Dict(keys=fields.String(),),
description="records mapping the column name to it's value",
required=True,
)
class ChartDataResponseResult(Schema):
annotation_data = fields.List(
fields.Dict(
keys=fields.String(description="Annotation layer name"),
values=fields.String(),
),
description="All requested annotation data",
allow_none=True,
)
cache_key = fields.String(
description="Unique cache key for query object", required=True, allow_none=True,
)

View File

@ -155,6 +155,8 @@ class QueryContext:
query_obj.row_offset = 0
query_obj.columns = [o.column_name for o in self.datasource.columns]
payload = self.get_df_payload(query_obj)
# TODO: implement
payload["annotation_data"] = []
df = payload["df"]
status = payload["status"]
if status != utils.QueryStatus.FAILED:

View File

@ -59,6 +59,7 @@ class QueryObject:
and druid. The query objects are constructed on the client.
"""
annotation_layers: List[Dict[str, Any]]
granularity: Optional[str]
from_dttm: Optional[datetime]
to_dttm: Optional[datetime]
@ -79,6 +80,7 @@ class QueryObject:
def __init__(
self,
annotation_layers: Optional[List[Dict[str, Any]]] = None,
granularity: Optional[str] = None,
metrics: Optional[List[Union[Dict[str, Any], str]]] = None,
groupby: Optional[List[str]] = None,
@ -97,9 +99,11 @@ class QueryObject:
post_processing: Optional[List[Optional[Dict[str, Any]]]] = None,
**kwargs: Any,
):
annotation_layers = annotation_layers or []
metrics = metrics or []
extras = extras or {}
is_sip_38 = is_feature_enabled("SIP_38_VIZ_REARCHITECTURE")
self.annotation_layers = annotation_layers
self.granularity = granularity
self.from_dttm, self.to_dttm = utils.get_since_until(
relative_start=extras.get(