Skip to content
Snippets Groups Projects
user avatar
dpsutton authored
* 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
a4f01b69
History

Metabase

Metabase is the easy, open-source way for everyone in your company to ask questions and learn from data.

Metabase Product Screenshot

Latest Release Circle CI codecov Docker Pulls

Features

Take a tour of Metabase.

Supported databases

Installation

Metabase can be run just about anywhere. Check out our Installation Guides.

Contributing

To get started with a development installation of the Metabase, check out our Developers Guide.

Internationalization

We want Metabase to be available in as many languages as possible. See which translations are available and help contribute to internationalization using our project over at POEditor. You can also check out our policies on translations.

Extending Metabase

Hit our Query API from Javascript to integrate analytics. Metabase enables your application to:

  • Build moderation interfaces.
  • Export subsets of your users to third party marketing automation software.
  • Provide a custom customer lookup application for the people in your company.

Check out our guide, Working with the Metabase API.

Security Disclosure

See SECURITY.md for details.

License

This repository contains the source code for both the Open Source edition of Metabase, released under the AGPL, as well as the commercial editions of Metabase, which are released under the Metabase Commercial Software License.

See LICENSE.txt for details.

Unless otherwise noted, all files © 2023 Metabase, Inc.

Metabase Experts

If you’d like more technical resources to set up your data stack with Metabase, connect with a Metabase Expert.