Skip to content
Snippets Groups Projects
Unverified Commit 4b41e837 authored by Tom Robinson's avatar Tom Robinson
Browse files

Add mutation methods to metabase-lib and gui query editor

parent e78a91f8
Branches
Tags
No related merge requests found
......@@ -8,6 +8,7 @@ import Dimension from "./Dimension";
import Action, { ActionClick } from "./Action";
import _ from "underscore";
import { updateIn } from "icepick";
import Q_deprecated from "metabase/lib/query";
import * as Q from "metabase/lib/query/query";
......@@ -18,6 +19,7 @@ import type {
Aggregation,
Breakout,
Filter,
LimitClause,
OrderBy
} from "metabase/meta/types/Query";
import type {
......@@ -98,6 +100,19 @@ export default class Query {
return Q.isBareRows(this.query());
}
addAggregation(aggregation: Aggregation) {
return this._updateQuery(Q.addAggregation, arguments);
}
updateAggregation(index: number, aggregation: Aggregation) {
return this._updateQuery(Q.updateAggregation, arguments);
}
removeAggregation(index: number) {
return this._updateQuery(Q.removeAggregation, arguments);
}
clearAggregations() {
return this._updateQuery(Q.clearAggregations, arguments);
}
// BREAKOUTS
breakouts(): Breakout[] {
......@@ -127,6 +142,19 @@ export default class Query {
return false;
}
addBreakout(breakout: Breakout) {
return this._updateQuery(Q.addBreakout, arguments);
}
updateBreakout(index: number, breakout: Breakout) {
return this._updateQuery(Q.updateBreakout, arguments);
}
removeBreakout(index: number) {
return this._updateQuery(Q.removeBreakout, arguments);
}
clearBreakouts() {
return this._updateQuery(Q.clearBreakouts, arguments);
}
// FILTERS
filters(): Filter[] {
......@@ -139,8 +167,23 @@ export default class Query {
return Q.canAddFilter(this.query());
}
addFilter(filter: Filter) {
return this._updateQuery(Q.addFilter, arguments);
}
updateFilter(index: number, filter: Filter) {
return this._updateQuery(Q.updateFilter, arguments);
}
removeFilter(index: number) {
return this._updateQuery(Q.removeFilter, arguments);
}
clearFilters() {
return this._updateQuery(Q.clearFilters, arguments);
}
// SORTS
// TODO: standardize SORT vs ORDER_BY terminology
sorts(): OrderBy[] {
return [];
}
......@@ -151,13 +194,33 @@ export default class Query {
return false;
}
expressions(): { [key: string]: any } {
return Q.getExpressions(this.query());
addOrderBy(order_by: OrderBy) {
return this._updateQuery(Q.addOrderBy, arguments);
}
updateOrderBy(index: number, order_by: OrderBy) {
return this._updateQuery(Q.updateOrderBy, arguments);
}
removeOrderBy(index: number) {
return this._updateQuery(Q.removeOrderBy, arguments);
}
clearOrderBy() {
return this._updateQuery(Q.clearOrderBy, arguments);
}
// LIMIT
setLimit(limit: number): void {}
updateLimit(limit: LimitClause) {
return this._updateQuery(Q.updateLimit, arguments);
}
clearLimit() {
return this._updateQuery(Q.clearLimit, arguments);
}
// EXPRESSIONS
expressions(): { [key: string]: any } {
return Q.getExpressions(this.query());
}
// NATIVE QUERY
......@@ -190,8 +253,23 @@ export default class Query {
return false;
}
/**
* Run the query
*/
run() {}
update(fn: (datasetQuery: DatasetQuery) => void) {
return fn(this.datasetQuery());
}
// INTERNAL
_updateQuery(
updateFunction: (
query: StructuredQuery,
...args: any[]
) => StructuredQuery,
args: any[]
) {
return new Query(
this._question,
updateIn(this._datasetQuery, ["query"], query =>
updateFunction(query, ...args))
);
}
}
......@@ -19,7 +19,7 @@ import _ from "underscore";
import type { TableId } from "metabase/meta/types/Table";
import type { DatabaseId } from "metabase/meta/types/Database";
import type { StructuredDatasetQuery } from "metabase/meta/types/Card";
import type { DatasetQuery } from "metabase/meta/types/Card";
import type { TableMetadata, DatabaseMetadata } from "metabase/meta/types/Metadata";
import type { Children } from 'react';
......@@ -44,17 +44,7 @@ type Props = {
setDatabaseFn: (id: DatabaseId) => void,
setSourceTableFn: (id: TableId) => void,
setDatasetQuery: (datasetQuery: StructuredDatasetQuery) => void,
addQueryFilter: () => void,
removeQueryFilter: () => void,
updateQueryFilter: () => void,
addQueryAggregation: () => void,
removeQueryAggregation: () => void,
updateQueryAggregation: () => void,
addQueryBreakout: () => void,
removeQueryBreakout: () => void,
updateQueryBreakout: () => void,
setDatasetQuery: (datasetQuery: DatasetQuery) => void,
isShowingTutorial: boolean,
isShowingDataReference: boolean,
......@@ -118,7 +108,7 @@ export default class GuiQueryEditor extends Component {
}
renderFilters() {
const { query, features } = this.props;
const { query, features, setDatasetQuery } = this.props;
if (!features.filter) return;
......@@ -135,8 +125,8 @@ export default class GuiQueryEditor extends Component {
<FilterList
filters={filters}
tableMetadata={query.tableMetadata()}
removeFilter={this.props.removeQueryFilter}
updateFilter={this.props.updateQueryFilter}
removeFilter={(index) => query.removeFilter(index).update(setDatasetQuery)}
updateFilter={(index, filter) => query.updateFilter(index, filter).update(setDatasetQuery)}
/>
);
}
......@@ -167,7 +157,7 @@ export default class GuiQueryEditor extends Component {
isNew={true}
tableMetadata={query.tableMetadata() || {}}
customFields={query.expressions()}
onCommitFilter={this.props.addQueryFilter}
onCommitFilter={(filter) => query.addFilter(filter).update(setDatasetQuery)}
onClose={() => this.refs.filterPopover.close()}
/>
</PopoverWithTrigger>
......@@ -177,7 +167,7 @@ export default class GuiQueryEditor extends Component {
}
renderAggregation() {
const { query, features } = this.props;
const { query, features, setDatasetQuery } = this.props;
if (!features.aggregation) {
return;
......@@ -208,8 +198,8 @@ export default class GuiQueryEditor extends Component {
aggregation={aggregation}
tableMetadata={query.tableMetadata()}
customFields={query.expressions()}
updateAggregation={(aggregation) => this.props.updateQueryAggregation(index, aggregation)}
removeAggregation={canRemoveAggregation ? this.props.removeQueryAggregation.bind(null, index) : null}
updateAggregation={(aggregation) => query.updateAggregation(index, aggregation).update(setDatasetQuery)}
removeAggregation={canRemoveAggregation ? (() => query.removeAggregation(index).update(setDatasetQuery)) : null}
addButton={this.renderAdd(null)}
/>
);
......@@ -231,7 +221,7 @@ export default class GuiQueryEditor extends Component {
}
renderBreakouts() {
const { query, features } = this.props;
const { query, setDatasetQuery, features } = this.props;
if (!features.breakout) {
return;
......@@ -266,7 +256,7 @@ export default class GuiQueryEditor extends Component {
customFieldOptions={query.expressions()}
tableMetadata={tableMetadata}
field={breakout}
setField={(field) => this.props.updateQueryBreakout(i, field)}
setField={(field) => query.updateBreakout(i, field).update(setDatasetQuery)}
addButton={this.renderAdd(i === 0 ? "Add a grouping" : null)}
/>
);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment