Skip to content
Snippets Groups Projects
Unverified Commit 0870fbd5 authored by Tom Robinson's avatar Tom Robinson Committed by GitHub
Browse files

Fix filtering on joined fields (#12244)


* Repro for #12221

* yarn so pretty

* Fix isValidField for joined-field, which fixes filtering on joined fields. Resolves #12221

* s/fit/it/

* Fix column filtering on date fields

* fix lint

Co-authored-by: default avatarDamon P. Cortesi <d.lifehacker@gmail.com>
parent 1a1265c0
No related branches found
No related tags found
No related merge requests found
......@@ -62,7 +62,7 @@ export function isValidField(field) {
(isAggregateField(field) && typeof field[1] === "number") ||
(isJoinedField(field) &&
typeof field[1] === "string" &&
isValidField(field[0])) ||
isValidField(field[2])) ||
isFieldLiteral(field)
);
}
......
......@@ -70,7 +70,7 @@ export function canAddFilter(filter: ?FilterClause): boolean {
export function isStandard(filter: FilterClause): boolean {
return (
Array.isArray(filter) &&
STANDARD_FILTERS.has(filter[0]) &&
(STANDARD_FILTERS.has(filter[0]) || filter[0] === null) &&
(filter[1] === undefined || isValidField(filter[1]))
);
}
......
import Filter from "metabase-lib/lib/queries/structured/Filter";
import { ORDERS } from "__support__/sample_dataset_fixture";
import { ORDERS, PEOPLE } from "__support__/sample_dataset_fixture";
const query = ORDERS.query();
......@@ -72,5 +72,38 @@ describe("Filter", () => {
filter(["segment", 1]).setDimension(["field-id", ORDERS.TOTAL.id]),
).toEqual([null, ["field-id", ORDERS.TOTAL.id]]);
});
it("should set joined-field for new filter clause", () => {
const q = ORDERS.query().join({
alias: "foo",
"source-table": PEOPLE.id,
});
const f = new Filter([], 0, q);
expect(
f.setDimension(["joined-field", "foo", ["field-id", PEOPLE.EMAIL.id]], {
useDefaultOperator: true,
}),
).toEqual([
"=",
["joined-field", "foo", ["field-id", PEOPLE.EMAIL.id]],
undefined,
]);
});
});
const CASES = [
["isStandard", ["=", ["field-id", 1]]],
["isStandard", [null, ["field-id", 1]]], // assume null operator is standard
["isSegment", ["segment", 1]],
["isCustom", ["or", ["=", ["field-id", 1], 42]]],
];
for (const method of ["isStandard", "isSegment", "isCustom"]) {
describe(method, () => {
for (const [method_, mbql] of CASES) {
const expected = method_ === method;
it(`should return ${expected} for ${JSON.stringify(mbql)}`, () => {
expect(filter(mbql)[method]()).toEqual(expected);
});
}
});
}
});
import { isValidField } from "metabase/lib/query/field_ref";
describe("field_ref", () => {
describe("isValidField", () => {
it("should be valid for field id", () => {
expect(isValidField(["field-id", 1])).toBe(true);
});
it("should be valid for fk", () => {
expect(isValidField(["fk->", ["field-id", 1], ["field-id", 2]])).toBe(
true,
);
});
it("should be valid for joined-field", () => {
expect(isValidField(["joined-field", "foo", ["field-id", 1]])).toBe(true);
});
// TODO: remaininng field types
});
});
import { restore, signInAsNormalUser } from "__support__/cypress";
describe("support > join filter (metabase#12221)", () => {
before(restore);
before(signInAsNormalUser);
it.skip("can filter by a joined table", () => {
cy.visit("/question/new");
cy.contains("Custom question").click();
cy.contains("Sample Dataset").click();
cy.contains("Orders").click();
cy.get(".Icon-join_left_outer ").click();
cy.contains("People").click();
cy.contains("Orders + People");
cy.contains("Visualize").click();
cy.contains("Showing first 2,000");
cy.contains("Filter").click();
cy.contains("Email").click();
cy.contains("People – Email");
cy.get('[placeholder="Search by Email"]').type("wolf.");
cy.contains("wolf.dina@yahoo.com").click();
cy.contains("Add filter").click();
cy.contains("Showing 1 row");
});
});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment