table.fields.forEach(function(field) { score(field.description); score(field.special_type); if (isFK(field.special_type)) { score(field.target); } });
results.fields = filterFn(fields).filter((f) => !usedFields[f.id] && (!isFK(f.special_type) || !includeJoins));
results.fks = fields.filter((f) => isFK(f.special_type) && f.target).map((joinField) => {
isFK() { return isFK(this.special_type); }
isID() { return isPK(this.special_type) || isFK(this.special_type); }
return async (dispatch, getState) => { const { qb: { card, queryResult } } = getState(); if (!queryResult) return false; // lookup the coldef and cell value of the cell we are taking action on var coldef = queryResult.data.cols[columnIndex], value = queryResult.data.rows[rowIndex][columnIndex], sourceTableID = card.dataset_query.query.source_table, isForeignColumn = coldef.table_id && coldef.table_id !== sourceTableID && coldef.fk_field_id, fieldRefForm = isForeignColumn ? ['fk->', coldef.fk_field_id, coldef.id] : ['field-id', coldef.id]; if (isPK(coldef.special_type)) { // action is on a PK column let newCard = startNewCard("query", card.dataset_query.database); newCard.dataset_query.query.source_table = coldef.table_id; newCard.dataset_query.query.aggregation = ["rows"]; newCard.dataset_query.query.filter = ["AND", ["=", coldef.id, value]]; // run it dispatch(setCardAndRun(newCard)); MetabaseAnalytics.trackEvent("QueryBuilder", "Table Cell Click", "PK"); } else if (isFK(coldef.special_type)) { // action is on an FK column let newCard = startNewCard("query", card.dataset_query.database); newCard.dataset_query.query.source_table = coldef.target.table_id; newCard.dataset_query.query.aggregation = ["rows"]; newCard.dataset_query.query.filter = ["AND", ["=", coldef.target.id, value]]; // run it dispatch(setCardAndRun(newCard)); MetabaseAnalytics.trackEvent("QueryBuilder", "Table Cell Click", "FK"); } else { // this is applying a filter by clicking on a cell value let dataset_query = Utils.copy(card.dataset_query); if (coldef.unit && coldef.unit != "default" && filter === "=") { // this is someone using quick filters on a datetime value let start = moment(value).format("YYYY-MM-DD"); let end = start; switch(coldef.unit) { case "week": end = moment(value).add(1, "weeks").subtract(1, "days").format("YYYY-MM-DD"); break; case "month": end = moment(value).add(1, "months").subtract(1, "days").format("YYYY-MM-DD"); break; case "quarter": end = moment(value).add(1, "quarters").subtract(1, "days").format("YYYY-MM-DD"); break; case "year": start = moment(value, "YYYY").format("YYYY-MM-DD"); end = moment(value, "YYYY").add(1, "years").subtract(1, "days").format("YYYY-MM-DD"); break; } Query.addFilter(dataset_query.query, ["BETWEEN", fieldRefForm, start, end]); } else { // quick filtering on a normal value (string/number) Query.addFilter(dataset_query.query, [filter, fieldRefForm, value]); } // update and run the query dispatch(setQuery(dataset_query, true)); MetabaseAnalytics.trackEvent("QueryBuilder", "Table Cell Click", "Quick Filter"); } };
.filter(f => isFK(f.special_type) && f.target)
f => !usedFields[f.id] && (!isFK(f.special_type) || !includeJoins),