Skip to content
Snippets Groups Projects
Unverified Commit a4f01b69 authored by dpsutton's avatar dpsutton Committed by GitHub
Browse files

Separate date from datetime binning options (#29423)

* Separate date from datetime binning options

The BE sends over binning indexes for each field and a top level map for
how to interpret these keys.

```javascript
❯ http get http://localhost:3000/api/table/10658/query_metadata Cookie:$SESSION -pb
{
    "active": true,
    "caveats": null,
    "created_at": "2023-03-21T22:20:42.363169Z",
    "db": {
        "engine": "postgres",
        "features": [ "full-join", ... ],
        "id": 499,
        ...
    },
    "db_id": 499,
    "dimension_options": {
        "0": { "mbql": [ "field", null, { "temporal-unit": "day" } ],
               "name": "Day",
               "type": "type/Date"},
        "1": { "mbql": [ "field", null, { "temporal-unit": "week" } ],
               "name": "Week",
               "type": "type/Date" },
        "10": { "mbql": ["field", null, { "temporal-unit": "quarter-of-year"}],
                "name": "Quarter of Year",
                "type": "type/Date" },
        "11": { "mbql": [ "field", null, { "temporal-unit": "minute" } ],
                "name": "Minute",
                "type": "type/DateTime"},
        "12": { "mbql": [ "field", null, { "temporal-unit": "hour"}],
                "name": "Hour",
                "type": "type/DateTime"},
        ... // more options. They have a type, an id, and an mbql clause
    },
    "display_name": "Different Times",
    "entity_type": null,
    "fields": [{"name": "id",},
               {"name": "dt",
                "dimension_options": [
                    "11", "12", "13", "14", "15", "16", "17",
                    "18", "19", "20", "21", "22", "23", "24", "25"]
                "database_type": "timestamp",
                "effective_type": "type/DateTime",
               },
               {"name": "t",
                "dimension_options": [ "26", "27", "28" ],
                "effective_type": "type/Time",
                "database_type": "time"
               },
               {"name": "d",
                "database_type": "date",
                "dimension_options": [ "0", "1", "2", "3", "4", "5",
                                       "6", "7", "8", "9", "10" ],
                "effective_type": "type/Date",
        }
    ],
    "name": "different_times",
    ...
}
```

This PR adds some new types just for dates so that you don't get offered
by group a date by hour or minute.

This adds new indexes to this list, which makes us wary that these
indexes have leaked out and cannot be changed. But that is not the
case. This is essentially compression on the response. When the FE saves
a query, it does not include the index but uses the mbql query to insert
the proper temporal-unit:

```clojure
;; a "date" field choosing the quarter option
{:type :query,
 :query {:source-table 5,
         :breakout [[:field 49 {:temporal-unit :quarter}]],
         :aggregation [[:count]]},
 :database 1}

;; the same query but binning by week
{:database 1,
 :query {:source-table 5,
         :breakout [[:field 49 {:temporal-unit :week}]],
         :aggregation [[:count]]},
 :type :query}
```

So the index is relative to just the editing session of the query, and
the indexes do not have to be stable when we add new ones.

* athena and mongo (others?) don't have a date type

the test expects a date field to have date binning options. previous, we
made no distinction for binning options for date vs datetime fields. Now
we do and have to manage expectations in the tests.

* mongo returns type/Instant
parent bcb7d3e3
Branches
Tags
No related merge requests found
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment