From 251d202095a24790e0d2db4c1701407c3985ee42 Mon Sep 17 00:00:00 2001
From: Tom Robinson <tlrobinson@gmail.com>
Date: Thu, 9 Jan 2020 12:58:03 -0800
Subject: [PATCH] Consolidate Select component (#11522)

Consolidate our two Select components, implement with AccordionList.
---
 .../datamodel/components/FieldRemapping.jsx   |   5 +-
 .../components/database/ColumnItem.jsx        | 107 ++-
 .../components/database/MetadataTable.jsx     |   2 +
 .../admin/datamodel/containers/FieldApp.jsx   |  10 +-
 .../src/metabase/components/AccordionList.jsx | 212 +++---
 .../metabase/components/SchedulePicker.jsx    |  63 +-
 .../src/metabase/components/Select.info.js    |  75 ++-
 frontend/src/metabase/components/Select.jsx   | 516 +++++----------
 .../src/metabase/components/SelectButton.jsx  |  16 +-
 frontend/src/metabase/css/components/list.css |  26 +-
 .../src/metabase/css/components/select.css    |   5 +
 frontend/src/metabase/hoc/Uncontrollable.jsx  |  49 ++
 frontend/src/metabase/hoc/utils.js            |   3 +
 frontend/src/metabase/lib/core.js             |   5 -
 .../new_query/containers/NewQueryOptions.jsx  |  25 +-
 .../components/widgets/YearPicker.jsx         |   2 +-
 .../metabase/reference/components/Field.jsx   |  27 +-
 .../reference/components/FieldTypeDetail.jsx  |  28 +-
 .../components/GuideDetailEditor.jsx          |  55 +-
 .../MetricImportantFieldsDetail.jsx           |  33 +-
 frontend/test/__support__/cypress.js          |  13 +
 frontend/test/__support__/metadata.js         |  12 +
 .../databases/DatabaseEditApp.e2e.spec.js     | 377 -----------
 .../databases/DatabaseListApp.e2e.spec.js     | 473 -------------
 .../admin/datamodel/FieldApp.e2e.spec.js      | 519 ---------------
 .../admin/datamodel/datamodel.e2e.spec.js     | 226 -------
 .../metabase/admin/people/people.cy.spec.js   |   4 +-
 .../admin/settings/settings.cy.spec.js        |   8 +-
 .../components.unit.spec.js.snap              | 205 +++++-
 .../test/metabase/public/public.e2e.spec.js   | 620 ------------------
 .../metabase/reference/databases.cy.spec.js   |  10 +-
 .../test/metabase/reference/guide.cy.spec.js  |   2 +-
 .../scenarios/admin/databases/add.cy.spec.js  | 120 ++++
 .../scenarios/admin/databases/edit.cy.spec.js | 178 +++++
 .../scenarios/admin/databases/list.cy.spec.js |  57 ++
 .../admin/datamodel/field.cy.spec.js          | 155 +++++
 .../admin/datamodel/table.cy.spec.js          | 160 +++++
 .../scenarios/custom_question.cy.spec.js      |   3 +-
 .../test/metabase/scenarios/public.cy.spec.js | 282 ++++++++
 .../scenarios/query_builder.e2e.spec.js       | 110 ----
 .../test/snapshot-creators/default.cy.snap.js |  19 +-
 frontend/test/snapshots/blank.sql             | 544 +++++++--------
 frontend/test/snapshots/default.sql           | 610 ++++++++---------
 package.json                                  |   2 +-
 yarn.lock                                     |   8 +-
 45 files changed, 2350 insertions(+), 3631 deletions(-)
 create mode 100644 frontend/src/metabase/hoc/Uncontrollable.jsx
 create mode 100644 frontend/src/metabase/hoc/utils.js
 create mode 100644 frontend/test/__support__/metadata.js
 delete mode 100644 frontend/test/metabase/admin/databases/DatabaseEditApp.e2e.spec.js
 delete mode 100644 frontend/test/metabase/admin/databases/DatabaseListApp.e2e.spec.js
 delete mode 100644 frontend/test/metabase/admin/datamodel/FieldApp.e2e.spec.js
 delete mode 100644 frontend/test/metabase/admin/datamodel/datamodel.e2e.spec.js
 delete mode 100644 frontend/test/metabase/public/public.e2e.spec.js
 create mode 100644 frontend/test/metabase/scenarios/admin/databases/add.cy.spec.js
 create mode 100644 frontend/test/metabase/scenarios/admin/databases/edit.cy.spec.js
 create mode 100644 frontend/test/metabase/scenarios/admin/databases/list.cy.spec.js
 create mode 100644 frontend/test/metabase/scenarios/admin/datamodel/field.cy.spec.js
 create mode 100644 frontend/test/metabase/scenarios/admin/datamodel/table.cy.spec.js
 create mode 100644 frontend/test/metabase/scenarios/public.cy.spec.js
 delete mode 100644 frontend/test/metabase/scenarios/query_builder.e2e.spec.js

diff --git a/frontend/src/metabase/admin/datamodel/components/FieldRemapping.jsx b/frontend/src/metabase/admin/datamodel/components/FieldRemapping.jsx
index 030607878f5..ffa10af15e4 100644
--- a/frontend/src/metabase/admin/datamodel/components/FieldRemapping.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/FieldRemapping.jsx
@@ -98,7 +98,7 @@ export default class FieldRemapping extends React.Component {
     });
   };
 
-  onSetMappingType = async mappingType => {
+  handleChangeMappingType = async ({ target: { value: mappingType } }) => {
     const {
       table,
       field,
@@ -256,8 +256,9 @@ export default class FieldRemapping extends React.Component {
       <div>
         <Select
           value={mappingType}
-          onChange={this.onSetMappingType}
+          onChange={this.handleChangeMappingType}
           options={this.getAvailableMappingTypes()}
+          optionValueFn={o => o}
         />
         {mappingType === MAP_OPTIONS.foreign && [
           <SelectSeparator key="foreignKeySeparator" />,
diff --git a/frontend/src/metabase/admin/datamodel/components/database/ColumnItem.jsx b/frontend/src/metabase/admin/datamodel/components/database/ColumnItem.jsx
index 2c3438adf54..20b4f0b6295 100644
--- a/frontend/src/metabase/admin/datamodel/components/database/ColumnItem.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/database/ColumnItem.jsx
@@ -26,26 +26,25 @@ export default class Column extends Component {
     updateField: PropTypes.func.isRequired,
   };
 
-  updateField = properties =>
+  updateField = properties => {
     this.props.updateField({
       ...this.props.field.getPlainObject(),
       ...properties,
     });
+  };
 
-  onNameChange = event => {
-    if (!_.isEmpty(event.target.value)) {
-      this.updateField({ display_name: event.target.value });
+  handleChangeName = ({ target: { value: display_name } }) => {
+    if (!_.isEmpty(display_name)) {
+      this.updateField({ display_name });
     } else {
       // if the user set this to empty then simply reset it because that's not allowed!
-      event.target.value = this.props.field.display_name;
+      this.updateField({ display_name: this.props.field.display_name });
     }
   };
 
-  onDescriptionChange = event =>
-    this.updateField({ description: event.target.value });
-
-  onVisibilityChange = ({ id: visibility_type }) =>
-    this.updateField({ visibility_type });
+  handleChangeDescription = ({ target: { value: description } }) => {
+    this.updateField({ description });
+  };
 
   render() {
     const { field, idfields } = this.props;
@@ -59,7 +58,7 @@ export default class Column extends Component {
               className="AdminInput TableEditor-field-name float-left bordered inline-block rounded text-bold"
               type="text"
               value={this.props.field.display_name || ""}
-              onBlurChange={this.onNameChange}
+              onBlurChange={this.handleChangeName}
             />
             <div className="clearfix">
               <div className="flex flex-auto">
@@ -86,7 +85,7 @@ export default class Column extends Component {
               className="AdminInput TableEditor-field-description"
               type="text"
               value={this.props.field.description || ""}
-              onBlurChange={this.onDescriptionChange}
+              onBlurChange={this.handleChangeDescription}
               placeholder={t`No column description yet`}
             />
           </div>
@@ -111,8 +110,9 @@ export class FieldVisibilityPicker extends Component {
     className?: string,
   };
 
-  onVisibilityChange = ({ id: visibility_type }) =>
+  handleChangeVisibility = ({ target: { value: visibility_type } }) => {
     this.props.updateField({ visibility_type });
+  };
 
   render() {
     const { field, className } = this.props;
@@ -120,13 +120,11 @@ export class FieldVisibilityPicker extends Component {
     return (
       <Select
         className={cx("TableEditor-field-visibility", className)}
-        placeholder={t`Select a field visibility`}
-        value={MetabaseCore.field_visibility_types.find(
-          type => type.id === field.visibility_type,
-        )}
+        value={field.visibility_type}
+        onChange={this.handleChangeVisibility}
         options={MetabaseCore.field_visibility_types}
-        onChange={this.onVisibilityChange}
-        triggerClasses={this.props.triggerClasses}
+        optionValueFn={o => o.id}
+        placeholder={t`Select a field visibility`}
       />
     );
   }
@@ -140,15 +138,14 @@ export class SpecialTypeAndTargetPicker extends Component {
     selectSeparator?: React$Element<any>,
   };
 
-  onSpecialTypeChange = async ({ id: special_type }) => {
+  handleChangeSpecialType = async ({ target: { value: special_type } }) => {
     const { field, updateField } = this.props;
 
     // If we are changing the field from a FK to something else, we should delete any FKs present
     if (field.target && field.target.id != null && isFK(field.special_type)) {
       await updateField({
         special_type,
-        target: null,
-        k_target_field_id: null,
+        fk_target_field_id: null,
       });
     } else {
       await updateField({ special_type });
@@ -161,16 +158,14 @@ export class SpecialTypeAndTargetPicker extends Component {
     );
   };
 
-  onCurrencyTypeChange = async currency => {
+  handleChangeCurrency = async ({ target: { value: currency } }) => {
     const { field, updateField } = this.props;
-
-    // FIXME: mutation
-    field.settings = {
-      ...(field.settings || {}),
-      currency,
-    };
-
-    await updateField(field);
+    await updateField({
+      settings: {
+        ...(field.settings || {}),
+        currency,
+      },
+    });
     MetabaseAnalytics.trackEvent(
       "Data Model",
       "Update Currency Type",
@@ -178,21 +173,22 @@ export class SpecialTypeAndTargetPicker extends Component {
     );
   };
 
-  onTargetChange = async ({ id: fk_target_field_id }) => {
+  handleChangeTarget = async ({ target: { value: fk_target_field_id } }) => {
     await this.props.updateField({ fk_target_field_id });
-
     MetabaseAnalytics.trackEvent("Data Model", "Update Field Target");
   };
 
   render() {
     const { field, className, selectSeparator } = this.props;
 
-    let specialTypes = MetabaseCore.field_special_types.slice(0);
-    specialTypes.push({
-      id: null,
-      name: t`No special type`,
-      section: t`Other`,
-    });
+    let specialTypes = [
+      ...MetabaseCore.field_special_types,
+      {
+        id: null,
+        name: t`No special type`,
+        section: t`Other`,
+      },
+    ];
     // if we don't have a numeric base-type then prevent the options for unix timestamp conversion (#823)
     if (!isNumericBaseType(field)) {
       specialTypes = specialTypes.filter(f => !isa(f.id, TYPE.UNIXTimestamp));
@@ -216,14 +212,13 @@ export class SpecialTypeAndTargetPicker extends Component {
     return (
       <div>
         <Select
-          className={cx("TableEditor-field-special-type", "mt0", className)}
-          placeholder={t`Select a special type`}
-          value={MetabaseCore.field_special_types.find(
-            type => type.id === field.special_type,
-          )}
+          className={cx("TableEditor-field-special-type mt0", className)}
+          value={field.special_type}
+          onChange={this.handleChangeSpecialType}
           options={specialTypes}
-          onChange={this.onSpecialTypeChange}
-          triggerClasses={this.props.triggerClasses}
+          optionValueFn={o => o.id}
+          optionSectionFn={o => o.section}
+          placeholder={t`Select a special type`}
         />
         {showCurrencyTypeSelect && selectSeparator}
         {// TODO - now that we have multiple "nested" options like choosing a
@@ -231,18 +226,13 @@ export class SpecialTypeAndTargetPicker extends Component {
         // handle a "secondary" input more elegantly
         showCurrencyTypeSelect && (
           <Select
-            className={cx(
-              "TableEditor-field-target",
-              "inline-block",
-              className,
-            )}
-            triggerClasses={this.props.triggerClasses}
+            className={cx("TableEditor-field-target inline-block", className)}
             value={
               (field.settings && field.settings.currency) ||
               getGlobalSettingsForColumn(field).currency ||
               "USD"
             }
-            onChange={({ target }) => this.onCurrencyTypeChange(target.value)}
+            onChange={this.handleChangeCurrency}
             placeholder={t`Select a currency type`}
             searchProp="name"
             searchCaseSensitive={false}
@@ -260,17 +250,16 @@ export class SpecialTypeAndTargetPicker extends Component {
         {showFKTargetSelect && selectSeparator}
         {showFKTargetSelect && (
           <Select
-            className={cx("TableEditor-field-target", "text-wrap", className)}
-            triggerClasses={this.props.triggerClasses}
+            className={cx("TableEditor-field-target text-wrap", className)}
             placeholder={t`Select a target`}
-            value={idfields.find(
-              idField => idField.id === field.fk_target_field_id,
-            )}
+            value={field.fk_target_field_id}
+            onChange={this.handleChangeTarget}
             options={idfields}
+            optionValueFn={field => field.id}
             optionNameFn={field =>
               field.displayName({ includeTable: true, includeSchema })
             }
-            onChange={this.onTargetChange}
+            optionIconFn={field => null}
           />
         )}
       </div>
diff --git a/frontend/src/metabase/admin/datamodel/components/database/MetadataTable.jsx b/frontend/src/metabase/admin/datamodel/components/database/MetadataTable.jsx
index 727f90e5e95..b725305d550 100644
--- a/frontend/src/metabase/admin/datamodel/components/database/MetadataTable.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/database/MetadataTable.jsx
@@ -126,12 +126,14 @@ export default class MetadataTable extends Component {
         <div className="MetadataTable-title flex flex-column bordered rounded">
           <InputBlurChange
             className="AdminInput TableEditor-table-name text-bold border-bottom rounded-top"
+            name="display_name"
             type="text"
             value={table.display_name || ""}
             onBlurChange={this.onNameChange}
           />
           <InputBlurChange
             className="AdminInput TableEditor-table-description rounded-bottom"
+            name="description"
             type="text"
             value={table.description || ""}
             onBlurChange={this.onDescriptionChange}
diff --git a/frontend/src/metabase/admin/datamodel/containers/FieldApp.jsx b/frontend/src/metabase/admin/datamodel/containers/FieldApp.jsx
index 93d1bbed529..d65766a95e0 100644
--- a/frontend/src/metabase/admin/datamodel/containers/FieldApp.jsx
+++ b/frontend/src/metabase/admin/datamodel/containers/FieldApp.jsx
@@ -312,12 +312,10 @@ const FieldGeneralPane = ({
         description={t`When this field is used in a filter, what should people use to enter the value they want to filter on?`}
       />
       <Select
-        value={_.findWhere(has_field_values_options, {
-          value: field.has_field_values,
-        })}
-        onChange={option =>
+        value={field.has_field_values}
+        onChange={({ target: { value } }) =>
           onUpdateFieldProperties({
-            has_field_values: option.value,
+            has_field_values: value,
           })
         }
         options={has_field_values_options}
@@ -425,12 +423,14 @@ export class FieldHeader extends React.Component {
     return (
       <div>
         <InputBlurChange
+          name="display_name"
           className="h2 AdminInput bordered rounded border-dark block mb1"
           value={this.props.field.display_name}
           onChange={this.onNameChange}
           placeholder={this.props.field.name}
         />
         <InputBlurChange
+          name="description"
           className="text AdminInput bordered input text-measure block full"
           value={this.props.field.description}
           onChange={this.onDescriptionChange}
diff --git a/frontend/src/metabase/components/AccordionList.jsx b/frontend/src/metabase/components/AccordionList.jsx
index 8ae5d80aae9..da5445b23a2 100644
--- a/frontend/src/metabase/components/AccordionList.jsx
+++ b/frontend/src/metabase/components/AccordionList.jsx
@@ -1,3 +1,5 @@
+/* eslint "react/prop-types": "warn" */
+
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
@@ -9,12 +11,6 @@ import Icon from "metabase/components/Icon";
 import ListSearchField from "metabase/components/ListSearchField";
 import { List, CellMeasurer, CellMeasurerCache } from "react-virtualized";
 
-export type RenderItemWrapper = (
-  item: any,
-  itemIndex: number,
-  children?: any,
-) => React$Element;
-
 export default class AccordionList extends Component {
   constructor(props, context) {
     super(props, context);
@@ -53,22 +49,38 @@ export default class AccordionList extends Component {
     style: PropTypes.object,
     className: PropTypes.string,
     id: PropTypes.string,
+
+    width: PropTypes.number,
+    maxHeight: PropTypes.number,
+
     sections: PropTypes.array.isRequired,
-    searchable: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),
+
     initiallyOpenSection: PropTypes.number,
     openSection: PropTypes.number,
     onChange: PropTypes.func,
     onChangeSection: PropTypes.func,
+
+    // section getters/render props
+    renderSectionIcon: PropTypes.func,
+
+    // item getters/render props
     itemIsSelected: PropTypes.func,
     itemIsClickable: PropTypes.func,
-    renderItem: PropTypes.func,
-    renderSectionIcon: PropTypes.func,
-    renderItemWrapper: PropTypes.func,
+    renderItemName: PropTypes.func,
+    renderItemDescription: PropTypes.func,
+    renderItemIcon: PropTypes.func,
+    renderItemExtra: PropTypes.func,
     getItemClassName: PropTypes.func,
+
     alwaysTogglable: PropTypes.bool,
     alwaysExpanded: PropTypes.bool,
     hideSingleSectionTitle: PropTypes.bool,
     showItemArrows: PropTypes.bool,
+
+    searchable: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),
+    searchProp: PropTypes.string,
+    searchCaseInsensitive: PropTypes.bool,
+    searchFuzzy: PropTypes.bool,
     searchPlaceholder: PropTypes.string,
   };
 
@@ -76,9 +88,25 @@ export default class AccordionList extends Component {
     style: {},
     width: 300,
     searchable: section => section.items && section.items.length > 10,
+    searchProp: "name",
+    searchCaseInsensitive: true,
+    searchFuzzy: true,
     alwaysTogglable: false,
     alwaysExpanded: false,
     hideSingleSectionTitle: false,
+
+    // section getters/render props
+    renderSectionIcon: section =>
+      section.icon && <Icon name={section.icon} size={18} />,
+
+    // item getters/render props
+    itemIsClickable: item => true,
+    itemIsSelected: item => false,
+    renderItemName: item => item.name,
+    renderItemDescription: item => item.description,
+    renderItemExtra: item => null,
+    renderItemIcon: item => item.icon && <Icon name={item.icon} size={18} />,
+    getItemClassName: item => item.className,
   };
 
   componentDidMount() {
@@ -89,7 +117,12 @@ export default class AccordionList extends Component {
     // Use list.scrollToRow instead of the scrollToIndex prop since the
     // causes the list's scrolling to be pinned to the selected row
     setTimeout(() => {
-      if (this._initialSelectedRowIndex != null && this._list) {
+      const index = this._initialSelectedRowIndex;
+      if (
+        this._list &&
+        index != null &&
+        !(index >= this._startIndex && index <= this._stopIndex)
+      ) {
         this._list.scrollToRow(this._initialSelectedRowIndex);
       }
     }, 0);
@@ -171,7 +204,7 @@ export default class AccordionList extends Component {
     const { sections } = this.props;
     let selectedSection = null;
     for (let i = 0; i < sections.length; i++) {
-      if (_.some(sections[i].items, item => this.itemIsSelected(item))) {
+      if (_.some(sections[i].items, item => this.props.itemIsSelected(item))) {
         selectedSection = i;
         break;
       }
@@ -179,22 +212,6 @@ export default class AccordionList extends Component {
     return selectedSection === sectionIndex;
   }
 
-  itemIsClickable = item => {
-    if (this.props.itemIsClickable) {
-      return this.props.itemIsClickable(item);
-    } else {
-      return true;
-    }
-  };
-
-  itemIsSelected = item => {
-    if (this.props.itemIsSelected) {
-      return this.props.itemIsSelected(item);
-    } else {
-      return false;
-    }
-  };
-
   handleChange = item => {
     if (this.props.onChange) {
       this.props.onChange(item);
@@ -205,70 +222,20 @@ export default class AccordionList extends Component {
     this.setState({ searchText });
   };
 
-  renderItemExtra = (item, itemIndex, isSelected) => {
-    if (this.props.renderItemExtra) {
-      return this.props.renderItemExtra(item, itemIndex, isSelected);
-    } else {
-      return null;
-    }
-  };
-
-  renderItemIcon = (item, itemIndex) => {
-    if (this.props.renderItemIcon) {
-      return this.props.renderItemIcon(item, itemIndex);
-    } else if (item.icon) {
-      return <Icon className="Icon text-default" name={item.icon} size={18} />;
-    } else {
-      return null;
-    }
-  };
-
-  renderSectionIcon = (section, sectionIndex) => {
-    if (this.props.renderSectionIcon) {
-      return (
-        <span className="List-section-icon mr1 flex align-center">
-          {this.props.renderSectionIcon(section, sectionIndex)}
-        </span>
-      );
-    } else if (section.icon) {
-      return (
-        <span className="List-section-icon mr1 flex align-center">
-          <Icon name={section.icon} size={18} />
-        </span>
-      );
-    } else {
-      return null;
-    }
-  };
-
-  renderItemWrapper = (item, itemIndex, children) => {
-    if (this.props.renderItemWrapper) {
-      return this.props.renderItemWrapper(item, itemIndex, children);
-    } else {
-      return children;
-    }
-  };
-
-  getItemClassName = (item, itemIndex) => {
-    if (this.props.getItemClassName) {
-      return this.props.getItemClassName(item, itemIndex);
-    } else {
-      return item.className;
-    }
-  };
-
   render() {
     const {
       id,
       style,
       className,
       searchable,
+      searchProp,
+      searchCaseInsensitive,
+      searchFuzzy,
       sections,
       alwaysTogglable,
       alwaysExpanded,
       hideSingleSectionTitle,
     } = this.props;
-    const { searchText } = this.state;
 
     const openSection = this.getOpenSection();
     const sectionIsExpanded = sectionIndex =>
@@ -279,6 +246,23 @@ export default class AccordionList extends Component {
     const sectionIsTogglable = sectionIndex =>
       alwaysTogglable || sections.length > 1;
 
+    let { searchText } = this.state;
+    let searchFilter = () => true;
+    if (searchText) {
+      searchFilter = item => {
+        let itemText = String(item[searchProp] || "");
+        if (searchCaseInsensitive) {
+          itemText = itemText.toLowerCase();
+          searchText = searchText.toLowerCase();
+        }
+        if (searchFuzzy) {
+          return itemText.indexOf(searchText) >= 0;
+        } else {
+          return itemText.startsWith(searchText);
+        }
+      };
+    }
+
     // if any section is searchable just enable a global search
     let globalSearch = false;
 
@@ -316,12 +300,9 @@ export default class AccordionList extends Component {
         section.items.length > 0
       ) {
         for (const [itemIndex, item] of section.items.entries()) {
-          if (
-            !searchText ||
-            item.name.toLowerCase().includes(searchText.toLowerCase())
-          ) {
+          if (searchFilter(item)) {
             const isLastItem = itemIndex === section.items.length - 1;
-            if (this.itemIsSelected(item)) {
+            if (this.props.itemIsSelected(item)) {
               this._initialSelectedRowIndex = rows.length;
             }
             rows.push({
@@ -364,16 +345,9 @@ export default class AccordionList extends Component {
               onChange={this.handleChange}
               searchText={this.state.searchText}
               onChangeSearchText={this.handleChangeSearchText}
-              itemIsSelected={this.itemIsSelected}
-              itemIsClickable={this.itemIsClickable}
               sectionIsExpanded={sectionIsExpanded}
               sectionIsTogglable={sectionIsTogglable}
               toggleSection={this.toggleSection}
-              renderSectionIcon={this.renderSectionIcon}
-              renderItemWrapper={this.renderItemWrapper}
-              renderItemIcon={this.renderItemIcon}
-              renderItemExtra={this.renderItemExtra}
-              getItemClassName={this.getItemClassName}
             />
           ))}
         </div>
@@ -434,26 +408,25 @@ export default class AccordionList extends Component {
                   onChange={this.handleChange}
                   searchText={this.state.searchText}
                   onChangeSearchText={this.handleChangeSearchText}
-                  itemIsSelected={this.itemIsSelected}
-                  itemIsClickable={this.itemIsClickable}
                   sectionIsExpanded={sectionIsExpanded}
                   sectionIsTogglable={sectionIsTogglable}
                   toggleSection={this.toggleSection}
-                  renderSectionIcon={this.renderSectionIcon}
-                  renderItemWrapper={this.renderItemWrapper}
-                  renderItemIcon={this.renderItemIcon}
-                  renderItemExtra={this.renderItemExtra}
-                  getItemClassName={this.getItemClassName}
                 />
               )}
             </CellMeasurer>
           );
         }}
+        onRowsRendered={({ startIndex, stopIndex }) => {
+          this._startIndex = startIndex;
+          this._stopIndex = stopIndex;
+        }}
       />
     );
   }
 }
 
+/* eslint-disable react/prop-types */
+
 const AccordionListCell = ({
   style,
   sections,
@@ -466,7 +439,8 @@ const AccordionListCell = ({
   alwaysExpanded,
   toggleSection,
   renderSectionIcon,
-  renderItemWrapper,
+  renderItemName,
+  renderItemDescription,
   renderItemIcon,
   renderItemExtra,
   searchText,
@@ -488,6 +462,8 @@ const AccordionListCell = ({
         </div>
       );
     } else {
+      const icon = renderSectionIcon(section, sectionIndex);
+      const name = section.name;
       content = (
         <div
           className={cx(
@@ -502,8 +478,12 @@ const AccordionListCell = ({
             (() => toggleSection(sectionIndex))
           }
         >
-          {renderSectionIcon(section, sectionIndex)}
-          <h3 className="List-section-title text-wrap">{section.name}</h3>
+          {icon && (
+            <span className="List-section-icon mr1 flex align-center">
+              {icon}
+            </span>
+          )}
+          {name && <h3 className="List-section-title text-wrap">{name}</h3>}
           {sections.length > 1 && section.items && section.items.length > 0 && (
             <span className="flex-align-right hover-child">
               <Icon
@@ -532,9 +512,10 @@ const AccordionListCell = ({
   } else if (type === "item") {
     const isSelected = itemIsSelected(item, itemIndex);
     const isClickable = itemIsClickable(item, itemIndex);
-    content = renderItemWrapper(
-      item,
-      itemIndex,
+    const icon = renderItemIcon(item, itemIndex, isSelected);
+    const name = renderItemName(item, itemIndex, isSelected);
+    const description = renderItemDescription(item, itemIndex, isSelected);
+    content = (
       <div
         className={cx(
           "List-item flex mx1",
@@ -553,10 +534,19 @@ const AccordionListCell = ({
           )}
           onClick={isClickable ? () => onChange(item) : null}
         >
-          <span className="flex align-center">
-            {renderItemIcon(item, itemIndex, isSelected)}
-          </span>
-          <h4 className="List-item-title ml1 text-wrap">{item.name}</h4>
+          {icon && (
+            <span className="List-item-icon text-default flex align-center">
+              {icon}
+            </span>
+          )}
+          <div>
+            {name && <h4 className="List-item-title ml1 text-wrap">{name}</h4>}
+            {description && (
+              <p className="List-item-description ml1 text-wrap">
+                {description}
+              </p>
+            )}
+          </div>
         </a>
         {renderItemExtra(item, itemIndex, isSelected)}
         {showItemArrows && (
@@ -564,7 +554,7 @@ const AccordionListCell = ({
             <Icon name="chevronright" size={8} />
           </div>
         )}
-      </div>,
+      </div>
     );
   }
 
diff --git a/frontend/src/metabase/components/SchedulePicker.jsx b/frontend/src/metabase/components/SchedulePicker.jsx
index b6edf37d4ce..cb01089dee0 100644
--- a/frontend/src/metabase/components/SchedulePicker.jsx
+++ b/frontend/src/metabase/components/SchedulePicker.jsx
@@ -56,7 +56,7 @@ export default class SchedulePicker extends Component {
     onScheduleChange: PropTypes.func.isRequired,
   };
 
-  onPropertyChange(name, value) {
+  handleChangeProperty(name, value) {
     let newSchedule = {
       ...this.props.schedule,
       [name]: value,
@@ -128,28 +128,22 @@ export default class SchedulePicker extends Component {
       <span className="mt1">
         <span className="h4 text-bold mx1">on the</span>
         <Select
-          value={_.find(
-            MONTH_DAY_OPTIONS,
-            o => o.value === schedule.schedule_frame,
-          )}
-          options={MONTH_DAY_OPTIONS}
-          optionNameFn={o => o.name}
           className="h4 text-bold bg-white"
-          optionValueFn={o => o.value}
-          onChange={o => this.onPropertyChange("schedule_frame", o)}
+          value={schedule.schedule_frame}
+          onChange={({ target: { value } }) =>
+            this.handleChangeProperty("schedule_frame", value)
+          }
+          options={MONTH_DAY_OPTIONS}
         />
         {schedule.schedule_frame !== "mid" && (
           <span className="mt1 mx1">
             <Select
-              value={_.find(
-                DAY_OPTIONS,
-                o => o.value === schedule.schedule_day,
-              )}
-              options={DAY_OPTIONS}
-              optionNameFn={o => o.name}
-              optionValueFn={o => o.value}
               className="h4 text-bold bg-white"
-              onChange={o => this.onPropertyChange("schedule_day", o)}
+              value={schedule.schedule_day}
+              onChange={({ target: { value } }) =>
+                this.handleChangeProperty("schedule_day", value)
+              }
+              options={DAY_OPTIONS}
             />
           </span>
         )}
@@ -164,15 +158,12 @@ export default class SchedulePicker extends Component {
       <span className="mt1">
         <span className="h4 text-bold mx1">on</span>
         <Select
-          value={_.find(
-            DAY_OF_WEEK_OPTIONS,
-            o => o.value === schedule.schedule_day,
-          )}
-          options={DAY_OF_WEEK_OPTIONS}
-          optionNameFn={o => o.name}
-          optionValueFn={o => o.value}
           className="h4 text-bold bg-white"
-          onChange={o => this.onPropertyChange("schedule_day", o)}
+          value={schedule.schedule_day}
+          onChange={({ target: { value } }) =>
+            this.handleChangeProperty("schedule_day", value)
+          }
+          options={DAY_OF_WEEK_OPTIONS}
         />
       </span>
     );
@@ -192,19 +183,19 @@ export default class SchedulePicker extends Component {
         <span className="h4 text-bold mr1">at</span>
         <Select
           className="mr1 h4 text-bold bg-white"
-          value={_.find(HOUR_OPTIONS, o => o.value === hour)}
+          value={hour}
           options={HOUR_OPTIONS}
-          optionNameFn={o => o.name}
-          optionValueFn={o => o.value}
-          onChange={o => this.onPropertyChange("schedule_hour", o + amPm * 12)}
+          onChange={({ target: { value } }) =>
+            this.handleChangeProperty("schedule_hour", value + amPm * 12)
+          }
         />
         <Select
-          value={_.find(AM_PM_OPTIONS, o => o.value === amPm)}
-          options={AM_PM_OPTIONS}
-          optionNameFn={o => o.name}
-          optionValueFn={o => o.value}
-          onChange={o => this.onPropertyChange("schedule_hour", hour + o * 12)}
           className="h4 text-bold bg-white"
+          value={amPm}
+          onChange={({ target: { value } }) =>
+            this.handleChangeProperty("schedule_hour", hour + value * 12)
+          }
+          options={AM_PM_OPTIONS}
         />
         {textBeforeSendTime && (
           <div className="mt2 h4 text-bold text-medium border-top pt2">
@@ -227,10 +218,12 @@ export default class SchedulePicker extends Component {
         <Select
           className="h4 text-bold bg-white"
           value={scheduleType}
+          onChange={({ target: { value } }) =>
+            this.handleChangeProperty("schedule_type", value)
+          }
           options={scheduleOptions}
           optionNameFn={o => capitalize(o)}
           optionValueFn={o => o}
-          onChange={o => this.onPropertyChange("schedule_type", o)}
         />
         {scheduleType === "monthly" && this.renderMonthlyPicker()}
         {scheduleType === "weekly" && this.renderDayPicker()}
diff --git a/frontend/src/metabase/components/Select.info.js b/frontend/src/metabase/components/Select.info.js
index 2afa78575de..c4f3d6ebe1e 100644
--- a/frontend/src/metabase/components/Select.info.js
+++ b/frontend/src/metabase/components/Select.info.js
@@ -1,37 +1,68 @@
 import React from "react";
 import { t } from "ttag";
-import Select, { Option } from "metabase/components/Select";
+import Select from "metabase/components/Select";
 
 export const component = Select;
 
-const fixture = [
-  { name: t`Blue`, value: "blue" },
-  { name: t`Green`, value: "green" },
-  { name: t`Red`, value: "red" },
-  { name: t`Yellow`, value: "yellow" },
-];
-
 export const description = t`
     A component used to make a selection
 `;
 
+import _ from "underscore";
+import { field_special_types } from "metabase/lib/core";
+const EXAMPLE_SECTIONS = _.chain(field_special_types)
+  .first(10)
+  .groupBy("section")
+  .pairs()
+  .map(([section, items]) => ({
+    name: section,
+    items: items.map(item => ({
+      name: item.name,
+      value: item.id,
+      icon:
+        item.id === "type/FK"
+          ? "connections"
+          : item.id === "type/Name"
+          ? "string"
+          : item.id === "type/PK"
+          ? "unknown"
+          : null,
+      description: item.description,
+    })),
+  }))
+  .value();
+const EXAMPLE_OPTIONS = EXAMPLE_SECTIONS.map(section => section.items).flat();
+
 export const examples = {
-  Default: (
-    <Select value="yellow" onChange={() => alert(t`Selected`)}>
-      {fixture.map(f => (
-        <Option name={f.name}>{f.name}</Option>
-      ))}
-    </Select>
+  default: (
+    <Select defaultValue={EXAMPLE_OPTIONS[0].value} options={EXAMPLE_OPTIONS} />
+  ),
+  search: (
+    <Select
+      defaultValue={EXAMPLE_OPTIONS[0].value}
+      options={EXAMPLE_OPTIONS}
+      searchProp="name"
+    />
+  ),
+  sections: (
+    <Select
+      defaultValue={EXAMPLE_OPTIONS[0].value}
+      sections={EXAMPLE_SECTIONS}
+    />
+  ),
+  multiple: (
+    <Select
+      defaultValue={[EXAMPLE_OPTIONS[0].value, EXAMPLE_OPTIONS[3].value]}
+      options={EXAMPLE_OPTIONS}
+      multiple
+    />
   ),
-  "With search": (
+  kitchen_sink: (
     <Select
-      value="yellow"
+      defaultValue={[EXAMPLE_OPTIONS[0].value, EXAMPLE_OPTIONS[3].value]}
+      sections={EXAMPLE_SECTIONS}
+      multiple
       searchProp="name"
-      onChange={() => alert(t`Selected`)}
-    >
-      {fixture.map(f => (
-        <Option name={f.name}>{f.name}</Option>
-      ))}
-    </Select>
+    />
   ),
 };
diff --git a/frontend/src/metabase/components/Select.jsx b/frontend/src/metabase/components/Select.jsx
index 248f1acb155..9a2188672ac 100644
--- a/frontend/src/metabase/components/Select.jsx
+++ b/frontend/src/metabase/components/Select.jsx
@@ -2,401 +2,237 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import { List } from "react-virtualized";
-import "react-virtualized/styles.css";
-import { t } from "ttag";
-import ColumnarSelector from "metabase/components/ColumnarSelector";
 import Icon from "metabase/components/Icon";
 import PopoverWithTrigger from "metabase/components/PopoverWithTrigger";
 import SelectButton from "./SelectButton";
 
-import cx from "classnames";
 import _ from "underscore";
+import AccordionList from "./AccordionList";
+import { createSelector } from "reselect";
 
-export default class Select extends Component {
-  static propTypes = {
-    children: PropTypes.any,
-  };
+import { color } from "metabase/lib/colors";
 
-  render() {
-    if (this.props.children) {
-      return <BrowserSelect {...this.props} />;
-    } else {
-      return <LegacySelect {...this.props} />;
-    }
-  }
-}
+import Uncontrollable from "metabase/hoc/Uncontrollable";
 
-class BrowserSelect extends Component {
-  state = {
-    inputValue: "",
-  };
+const MIN_ICON_WIDTH = 20;
 
+@Uncontrollable()
+export default class Select extends Component {
   static propTypes = {
-    children: PropTypes.array.isRequired,
+    className: PropTypes.string,
+
+    // one of these is required
+    options: PropTypes.any,
+    sections: PropTypes.any,
+    children: PropTypes.any,
+
+    value: PropTypes.any.isRequired,
     onChange: PropTypes.func.isRequired,
-    value: PropTypes.any,
-    defaultValue: PropTypes.any,
+    multiple: PropTypes.bool,
+    placeholder: PropTypes.string,
 
+    // PopoverWithTrigger props
+    isInitiallyOpen: PropTypes.bool,
+
+    // AccordianList props
     searchProp: PropTypes.string,
     searchCaseInsensitive: PropTypes.bool,
     searchFuzzy: PropTypes.bool,
 
-    isInitiallyOpen: PropTypes.bool,
-    placeholder: PropTypes.string,
-    // NOTE - @kdoh
-    // seems too generic for us?
-    triggerElement: PropTypes.any,
-    height: PropTypes.number,
-    width: PropTypes.number,
-    rowHeight: PropTypes.number,
-    // TODO - @kdoh
-    // we should not allow this
-    className: PropTypes.string,
-    compact: PropTypes.bool,
-    multiple: PropTypes.bool,
+    optionNameFn: PropTypes.func,
+    optionValueFn: PropTypes.func,
+    optionDescriptionFn: PropTypes.func,
+    optionSectionFn: PropTypes.func,
+    optionDisabledFn: PropTypes.func,
+    optionIconFn: PropTypes.func,
   };
+
   static defaultProps = {
-    className: "",
-    width: 300,
-    height: 320,
-    rowHeight: 40,
-    multiple: false,
-    searchCaseInsensitive: true,
-    searchFuzzy: true,
+    optionNameFn: option => option.children || option.name,
+    optionValueFn: option => option.value,
+    optionDescriptionFn: option => option.description,
+    optionDisabledFn: option => option.disabled,
+    optionIconFn: option => option.icon,
+  };
+
+  constructor(props) {
+    super(props);
+
+    // reselect selectors
+    const _getValue = props => props.value;
+    const _getValues = createSelector(
+      [_getValue],
+      value => (Array.isArray(value) ? value : [value]),
+    );
+    const _getValuesSet = createSelector(
+      [_getValues],
+      values => new Set(values),
+    );
+    this._getValues = () => _getValues(this.props);
+    this._getValuesSet = () => _getValuesSet(this.props);
+  }
+
+  _getSections() {
+    // normalize `children`/`options` into same format as `sections`
+    const { children, sections, options } = this.props;
+    if (children) {
+      const optionToItem = option => option.props;
+      const first = Array.isArray(children) ? children[0] : children;
+      if (first && first.type === OptionSection) {
+        return React.Children.map(children, child => ({
+          ...child.props,
+          items: React.Children.map(child.props.children, optionToItem),
+        }));
+      } else if (first && first.type === Option) {
+        return [{ items: React.Children.map(children, optionToItem) }];
+      }
+    } else if (options) {
+      if (this.props.optionSectionFn) {
+        return _.chain(options)
+          .groupBy(this.props.optionSectionFn)
+          .pairs()
+          .map(([section, items]) => ({ name: section, items }))
+          .value();
+      } else {
+        return [{ items: options }];
+      }
+    } else if (sections) {
+      return sections;
+    }
+    return [];
+  }
+
+  itemIsSelected = option => {
+    const optionValue = this.props.optionValueFn(option);
+    return this._getValuesSet().has(optionValue);
   };
 
-  isSelected(otherValue) {
-    const { value, multiple, defaultValue } = this.props;
+  itemIsClickable = option => !this.props.optionDisabledFn(option);
+
+  handleChange = option => {
+    const { multiple, onChange } = this.props;
+    const optionValue = this.props.optionValueFn(option);
+    let value;
     if (multiple) {
-      return _.any(value, v => v === otherValue);
+      const values = this._getValues();
+      value = this.itemIsSelected(option)
+        ? values.filter(value => value !== optionValue)
+        : [...values, optionValue];
     } else {
+      value = optionValue;
+    }
+    onChange({ target: { value } });
+    if (!multiple) {
+      this._popover.close();
+    }
+  };
+
+  renderItemIcon = item => {
+    if (this.itemIsSelected(item)) {
       return (
-        value === otherValue ||
-        ((value == null || value === "") &&
-          (otherValue == null || otherValue === "")) ||
-        (value == null && otherValue === defaultValue)
+        <Icon
+          name="check"
+          size={14}
+          color={color("text-dark")}
+          style={{ minWidth: MIN_ICON_WIDTH }}
+        />
       );
     }
-  }
+    const icon = this.props.optionIconFn(item);
+    if (icon) {
+      return (
+        <Icon
+          name={icon}
+          size={item.iconSize || 18}
+          color={item.iconColor || color("text-dark")}
+          style={{ minWidth: MIN_ICON_WIDTH }}
+        />
+      );
+    }
+    return <span style={{ minWidth: MIN_ICON_WIDTH }} />;
+  };
 
   render() {
     const {
       className,
-      value,
-      onChange,
+      placeholder,
       searchProp,
       searchCaseInsensitive,
       searchFuzzy,
       isInitiallyOpen,
-      placeholder,
-      triggerElement,
-      width,
-      height,
-      rowHeight,
-      multiple,
     } = this.props;
 
-    let children = _.flatten(this.props.children);
-
-    let selectedNames = children
-      .filter(child => this.isSelected(child.props.value))
-      .map(child => child.props.children);
-    if (_.isEmpty(selectedNames) && placeholder) {
-      selectedNames = [placeholder];
-    }
-
-    let { inputValue } = this.state;
-    let filter = () => true;
-    if (searchProp && inputValue) {
-      filter = child => {
-        let childValue = String(child.props[searchProp] || "");
-        if (!inputValue) {
-          return false;
-        }
-        if (searchCaseInsensitive) {
-          childValue = childValue.toLowerCase();
-          inputValue = inputValue.toLowerCase();
-        }
-        if (searchFuzzy) {
-          return childValue.indexOf(inputValue) >= 0;
-        } else {
-          return childValue.startsWith(inputValue);
-        }
-      };
-    }
-
-    // make sure we filter by the search query
-    children = children.filter(filter);
-
-    let extraProps = {};
-    if (this.props.compact) {
-      extraProps = {
-        tetherOptions: {
-          attachment: `top left`,
-          targetAttachment: `bottom left`,
-          targetOffset: `0px 0px`,
-        },
-        hasArrow: false,
-      };
-    }
+    const sections = this._getSections();
+    const selectedNames = sections
+      .map(section =>
+        section.items.filter(this.itemIsSelected).map(this.props.optionNameFn),
+      )
+      .flat()
+      .filter(n => n);
 
     return (
       <PopoverWithTrigger
-        ref="popover"
-        className={className}
+        ref={ref => (this._popover = ref)}
         triggerElement={
-          triggerElement || (
-            <SelectButton hasValue={multiple ? value.length > 0 : !!value}>
-              {selectedNames.map((name, index) => (
-                <span key={index}>
-                  {name}
-                  {index < selectedNames.length - 1 ? ", " : ""}
-                </span>
-              ))}
-            </SelectButton>
-          )
-        }
-        pinInitialAttachment={
-          // keep the popover from jumping around one its been opened,
-          // this can happen when filtering items via search
-          true
+          <SelectButton hasValue={selectedNames.length > 0}>
+            {selectedNames.length > 0
+              ? selectedNames.map((name, index) => (
+                  <span key={index}>
+                    {name}
+                    {index < selectedNames.length - 1 ? ", " : ""}
+                  </span>
+                ))
+              : placeholder}
+          </SelectButton>
         }
         triggerClasses={className}
-        verticalAttachments={["top", "bottom"]}
         isInitiallyOpen={isInitiallyOpen}
-        {...extraProps}
+        verticalAttachments={["top", "bottom"]}
+        // keep the popover from jumping around one its been opened,
+        // this can happen when filtering items via search
+        pinInitialAttachment
       >
-        <div className="flex flex-column">
-          {searchProp && (
-            <input
-              className="AdminSelect m1 flex-full"
-              value={inputValue}
-              onChange={e => this.setState({ inputValue: e.target.value })}
-              autoFocus
-            />
-          )}
-          <List
-            width={width}
-            height={
-              // check to see if the height of the number of rows is less than the provided (or default)
-              // height. if so, set the height to the number of rows * the row height so that
-              // large blank spaces at the bottom are prevented
-              children.length * rowHeight < height
-                ? children.length * rowHeight
-                : height
-            }
-            rowHeight={rowHeight}
-            rowCount={children.length}
-            rowRenderer={({ index, key, style }) => {
-              const child = children[index];
-
-              /*
-               * for each child we need to add props based on
-               * the parent's onClick and the current selection
-               * status, so we use cloneElement here
-               * */
-              return (
-                <div key={key} style={style} onClick={e => e.stopPropagation()}>
-                  {React.cloneElement(children[index], {
-                    selected: this.isSelected(child.props.value),
-                    onClick: () => {
-                      if (!child.props.disabled) {
-                        if (multiple) {
-                          const value = this.isSelected(child.props.value)
-                            ? this.props.value.filter(
-                                v => v !== child.props.value,
-                              )
-                            : this.props.value.concat([child.props.value]);
-                          onChange({ target: { value } });
-                        } else {
-                          onChange({ target: { value: child.props.value } });
-                          this.refs.popover.close();
-                        }
-                      }
-                    },
-                  })}
-                </div>
-              );
-            }}
-          />
-        </div>
+        <AccordionList
+          sections={sections}
+          className="MB-Select text-brand"
+          alwaysExpanded
+          itemIsSelected={this.itemIsSelected}
+          itemIsClickable={this.itemIsClickable}
+          renderItemName={this.props.optionNameFn}
+          renderItemDescription={this.props.optionDescriptionFn}
+          renderItemIcon={this.renderItemIcon}
+          onChange={this.handleChange}
+          searchable={!!searchProp}
+          searchProp={searchProp}
+          searchCaseInsensitive={searchCaseInsensitive}
+          searchFuzzy={searchFuzzy}
+        />
       </PopoverWithTrigger>
     );
   }
 }
-
-export class Option extends Component {
+export class OptionSection extends Component {
   static propTypes = {
-    children: PropTypes.any,
-    selected: PropTypes.bool,
-    disabled: PropTypes.bool,
-    onClick: PropTypes.func,
-    icon: PropTypes.string,
-    iconColor: PropTypes.string,
-    iconSize: PropTypes.number,
+    name: PropTypes.any,
+    icon: PropTypes.any,
+    children: PropTypes.any.isRequired,
   };
-
   render() {
-    const {
-      children,
-      selected,
-      disabled,
-      icon,
-      iconColor,
-      iconSize,
-      onClick,
-    } = this.props;
-    return (
-      <div
-        onClick={onClick}
-        className={cx(
-          "ColumnarSelector-row flex align-center cursor-pointer no-decoration relative",
-          {
-            "ColumnarSelector-row--selected": selected,
-            disabled: disabled,
-          },
-        )}
-      >
-        <Icon name="check" size={14} style={{ position: "absolute" }} />
-        {icon && (
-          <Icon
-            name={icon}
-            size={iconSize}
-            style={{
-              position: "absolute",
-              color: iconColor,
-              visibility: !selected ? "visible" : "hidden",
-            }}
-          />
-        )}
-        <span className="ml4 no-decoration">{children}</span>
-      </div>
-    );
+    return null;
   }
 }
-
-class LegacySelect extends Component {
+export class Option extends Component {
   static propTypes = {
-    value: PropTypes.any,
-    values: PropTypes.array,
-    options: PropTypes.array.isRequired,
-    disabledOptionIds: PropTypes.array,
-    placeholder: PropTypes.string,
-    emptyPlaceholder: PropTypes.string,
-    onChange: PropTypes.func,
-    optionNameFn: PropTypes.func,
-    optionValueFn: PropTypes.func,
-    className: PropTypes.string,
-    isInitiallyOpen: PropTypes.bool,
-    disabled: PropTypes.bool,
-    //TODO: clean up hardcoded "AdminSelect" class on trigger to avoid this workaround
-    triggerClasses: PropTypes.string,
-  };
+    value: PropTypes.any.isRequired,
 
-  static defaultProps = {
-    placeholder: "",
-    emptyPlaceholder: t`Nothing to select`,
-    disabledOptionIds: [],
-    optionNameFn: option => option.name,
-    optionValueFn: option => option,
-    isInitiallyOpen: false,
-  };
-
-  toggle() {
-    this.refs.popover.toggle();
-  }
+    // one of these two is required
+    name: PropTypes.any,
+    children: PropTypes.any,
 
+    icon: PropTypes.any,
+    disabled: PropTypes.bool,
+  };
   render() {
-    const {
-      className,
-      value,
-      values,
-      onChange,
-      options,
-      disabledOptionIds,
-      optionNameFn,
-      optionValueFn,
-      placeholder,
-      emptyPlaceholder,
-      isInitiallyOpen,
-      disabled,
-    } = this.props;
-
-    const selectedName = value
-      ? optionNameFn(value)
-      : options && options.length > 0
-      ? placeholder
-      : emptyPlaceholder;
-
-    const triggerElement = (
-      <div
-        className={cx(
-          "flex align-center",
-          !value && (!values || values.length === 0) ? " text-medium" : "",
-        )}
-      >
-        {values && values.length !== 0 ? (
-          values
-            .map(value => optionNameFn(value))
-            .sort()
-            .map((name, index) => (
-              <span key={index} className="mr1">{`${name}${
-                index !== values.length - 1 ? ",   " : ""
-              }`}</span>
-            ))
-        ) : (
-          <span className="mr1">{selectedName}</span>
-        )}
-        <Icon className="flex-align-right" name="chevrondown" size={12} />
-      </div>
-    );
-
-    let sections = {};
-    options.forEach(function(option) {
-      const sectionName = option.section || "";
-      sections[sectionName] = sections[sectionName] || {
-        title: sectionName || undefined,
-        items: [],
-      };
-      sections[sectionName].items.push(option);
-    });
-    sections = Object.keys(sections).map(sectionName => sections[sectionName]);
-
-    const columns = [
-      {
-        selectedItem: value,
-        selectedItems: values,
-        sections: sections,
-        disabledOptionIds: disabledOptionIds,
-        itemTitleFn: optionNameFn,
-        itemDescriptionFn: item => item.description,
-        itemSelectFn: item => {
-          onChange(optionValueFn(item));
-          if (!values) {
-            this.toggle();
-          }
-        },
-      },
-    ];
-
-    const disablePopover = disabled || !options || options.length === 0;
-
-    return (
-      <PopoverWithTrigger
-        ref="popover"
-        className={className}
-        triggerElement={triggerElement}
-        triggerClasses={
-          this.props.triggerClasses || cx("AdminSelect", this.props.className)
-        }
-        isInitiallyOpen={isInitiallyOpen}
-        disabled={disablePopover}
-      >
-        <div onClick={e => e.stopPropagation()}>
-          <ColumnarSelector columns={columns} />
-        </div>
-      </PopoverWithTrigger>
-    );
+    return null;
   }
 }
diff --git a/frontend/src/metabase/components/SelectButton.jsx b/frontend/src/metabase/components/SelectButton.jsx
index 4cbe3439370..6b6466ffd02 100644
--- a/frontend/src/metabase/components/SelectButton.jsx
+++ b/frontend/src/metabase/components/SelectButton.jsx
@@ -9,16 +9,18 @@ import cx from "classnames";
 const SelectButton = ({ className, style, children, hasValue = true }) => (
   <div
     style={style}
-    className={cx(className, "AdminSelect flex align-center", {
+    className={cx(className, "AdminSelect", {
       "text-medium": !hasValue,
     })}
   >
-    <span className="AdminSelect-content mr1">{children}</span>
-    <Icon
-      className="AdminSelect-chevron flex-align-right"
-      name="chevrondown"
-      size={12}
-    />
+    <span className="flex align-center">
+      <span className="AdminSelect-content mr1">{children}</span>
+      <Icon
+        className="AdminSelect-chevron flex-align-right"
+        name="chevrondown"
+        size={12}
+      />
+    </span>
   </div>
 );
 
diff --git a/frontend/src/metabase/css/components/list.css b/frontend/src/metabase/css/components/list.css
index b4023b79ca6..a72c9298561 100644
--- a/frontend/src/metabase/css/components/list.css
+++ b/frontend/src/metabase/css/components/list.css
@@ -37,17 +37,13 @@
   word-wrap: break-word;
 }
 
+/* LIST ITEM */
 .List-item {
   display: flex;
   border-radius: 4px;
   margin-top: 2px;
   margin-bottom: 2px;
 }
-
-.List-item--disabled .List-item-title {
-  color: var(--color-text-medium);
-}
-
 .List-item:not(.List-item--disabled):hover,
 .List-item--selected {
   background-color: currentColor;
@@ -55,15 +51,33 @@
   /*color: white;*/
 }
 
+/* LIST ITEM TITLE */
 .List-item-title {
   color: var(--color-text-dark);
 }
-
+.List-item--disabled .List-item-title {
+  color: var(--color-text-medium);
+}
 .List-item:not(.List-item--disabled):hover .List-item-title,
 .List-item--selected .List-item-title {
   color: white;
 }
 
+/* LIST ITEM DESCRIPTION */
+.List-item-description {
+  margin-top: 0.25em;
+  margin-bottom: 0;
+  color: var(--color-text-medium);
+}
+.List-item--disabled .List-item-description {
+  color: var(--color-text-dark);
+}
+.List-item:not(.List-item--disabled):hover .List-item-description,
+.List-item--selected .List-item-description {
+  color: rgba(255, 255, 255, 0.5);
+}
+
+/* LIST ITEM ICON */
 .List-item:not(.List-item--disabled):hover .Icon,
 .List-item--selected .Icon {
   color: white !important;
diff --git a/frontend/src/metabase/css/components/select.css b/frontend/src/metabase/css/components/select.css
index 25a7abc35fc..6204181a8fa 100644
--- a/frontend/src/metabase/css/components/select.css
+++ b/frontend/src/metabase/css/components/select.css
@@ -98,3 +98,8 @@
 .Select select:focus {
   outline: none;
 }
+
+/* fix the outline that appears when interacting with metabase/components/Select */
+.MB-Select:focus {
+  outline: none;
+}
diff --git a/frontend/src/metabase/hoc/Uncontrollable.jsx b/frontend/src/metabase/hoc/Uncontrollable.jsx
new file mode 100644
index 00000000000..474687380ca
--- /dev/null
+++ b/frontend/src/metabase/hoc/Uncontrollable.jsx
@@ -0,0 +1,49 @@
+import React from "react";
+import PropTypes from "prop-types";
+
+import { getDisplayName } from "./utils";
+
+// wraps a component that takes `value` and `onChange` and allows it to be "uncontrolled"
+// i.e. https://reactjs.org/docs/uncontrolled-components.html
+
+const Uncontrollable = () => WrappedComponent =>
+  class extends React.Component {
+    static displayName = `Uncontrollable(${getDisplayName(WrappedComponent)})`;
+
+    constructor(props) {
+      super(props);
+      this.state = {
+        value: props.defaultValue,
+      };
+    }
+
+    static propTypes = {
+      ...WrappedComponent.propTypes,
+      // controlled
+      value: PropTypes.any,
+      onChange: PropTypes.func,
+      // uncontrolled
+      defaultValue: PropTypes.any,
+    };
+
+    handleChange = e => {
+      this.setState({ value: e.target.value });
+    };
+    render() {
+      if (this.props.value !== undefined) {
+        // controlled
+        return <WrappedComponent {...this.props} />;
+      } else {
+        // uncontrolled
+        return (
+          <WrappedComponent
+            {...this.props}
+            value={this.state.value}
+            onChange={this.handleChange}
+          />
+        );
+      }
+    }
+  };
+
+export default Uncontrollable;
diff --git a/frontend/src/metabase/hoc/utils.js b/frontend/src/metabase/hoc/utils.js
new file mode 100644
index 00000000000..936ad31f62e
--- /dev/null
+++ b/frontend/src/metabase/hoc/utils.js
@@ -0,0 +1,3 @@
+export function getDisplayName(WrappedComponent) {
+  return WrappedComponent.displayName || WrappedComponent.name || "Component";
+}
diff --git a/frontend/src/metabase/lib/core.js b/frontend/src/metabase/lib/core.js
index f4739401a58..8ef97fa3ec2 100644
--- a/frontend/src/metabase/lib/core.js
+++ b/frontend/src/metabase/lib/core.js
@@ -230,11 +230,6 @@ export const field_special_types = [
     name: t`Score`,
     section: t`Common`,
   },
-  {
-    id: TYPE.Description,
-    name: t`Description`,
-    section: t`Common`,
-  },
   {
     id: TYPE.Title,
     name: t`Title`,
diff --git a/frontend/src/metabase/new_query/containers/NewQueryOptions.jsx b/frontend/src/metabase/new_query/containers/NewQueryOptions.jsx
index f8e4beffb3f..2ec6ec91953 100644
--- a/frontend/src/metabase/new_query/containers/NewQueryOptions.jsx
+++ b/frontend/src/metabase/new_query/containers/NewQueryOptions.jsx
@@ -2,6 +2,7 @@ import React, { Component } from "react";
 
 import { compose } from "redux";
 import { connect } from "react-redux";
+import { push } from "react-router-redux";
 
 import { t } from "ttag";
 
@@ -27,12 +28,34 @@ const mapStateToProps = state => ({
   hasNativeWrite: getHasNativeWrite(state),
 });
 
+const mapDispatchToProps = {
+  push,
+};
+
 const PAGE_PADDING = [1, 4];
 
 @fitViewport
+@connect(
+  null,
+  { push },
+)
 export class NewQueryOptions extends Component {
   props: Props;
 
+  componentWillMount(props) {
+    const { location, push } = this.props;
+    if (Object.keys(location.query).length > 0) {
+      const { database, table, ...options } = location.query;
+      push(
+        Urls.newQuestion({
+          ...options,
+          databaseId: database ? parseInt(database) : undefined,
+          tableId: table ? parseInt(table) : undefined,
+        }),
+      );
+    }
+  }
+
   render() {
     const { hasDataAccess, hasNativeWrite } = this.props;
 
@@ -99,6 +122,6 @@ export default compose(
   Database.loadList({ query: { include_tables: true, include_cards: true } }),
   connect(
     mapStateToProps,
-    null,
+    mapDispatchToProps,
   ),
 )(NewQueryOptions);
diff --git a/frontend/src/metabase/parameters/components/widgets/YearPicker.jsx b/frontend/src/metabase/parameters/components/widgets/YearPicker.jsx
index 3b6ede05d5e..8703fb6379d 100644
--- a/frontend/src/metabase/parameters/components/widgets/YearPicker.jsx
+++ b/frontend/src/metabase/parameters/components/widgets/YearPicker.jsx
@@ -12,7 +12,7 @@ const YearPicker = ({ value, onChange }) => (
     options={YEARS}
     optionNameFn={option => option}
     optionValueFn={option => option}
-    onChange={onChange}
+    onChange={({ target: { value } }) => onChange(value)}
   />
 );
 
diff --git a/frontend/src/metabase/reference/components/Field.jsx b/frontend/src/metabase/reference/components/Field.jsx
index 8512a7789d2..48a7d34cb21 100644
--- a/frontend/src/metabase/reference/components/Field.jsx
+++ b/frontend/src/metabase/reference/components/Field.jsx
@@ -45,12 +45,10 @@ const Field = ({ field, foreignKeys, url, icon, isEditing, formField }) => (
         <div className={F.fieldType}>
           {isEditing ? (
             <Select
-              triggerClasses={F.fieldSelect}
               placeholder={t`Select a field type`}
-              value={
-                MetabaseCore.field_special_types_map[
-                  formField.special_type.value
-                ] || MetabaseCore.field_special_types_map[field.special_type]
+              value={formField.special_type.value || field.special_type}
+              onChange={({ target: { value } }) =>
+                formField.special_type.onChange(value)
               }
               options={MetabaseCore.field_special_types
                 .concat({
@@ -63,7 +61,8 @@ const Field = ({ field, foreignKeys, url, icon, isEditing, formField }) => (
                     isNumericBaseType(field) ||
                     !isa(type && type.id, TYPE.UNIXTimestamp),
                 )}
-              onChange={type => formField.special_type.onChange(type.id)}
+              optionValueFn={o => o.id}
+              optionSectionFn={o => o.section}
             />
           ) : (
             <div className="flex">
@@ -97,18 +96,16 @@ const Field = ({ field, foreignKeys, url, icon, isEditing, formField }) => (
                 (isFK(field.special_type) &&
                   formField.special_type.value === undefined)) && (
                 <Select
-                  triggerClasses={F.fieldSelect}
-                  placeholder={t`Select a field type`}
+                  placeholder={t`Select a target`}
                   value={
-                    foreignKeys[formField.fk_target_field_id.value] ||
-                    foreignKeys[field.fk_target_field_id] ||
-                    {}
+                    formField.fk_target_field_id.value ||
+                    field.fk_target_field_id
                   }
-                  options={Object.values(foreignKeys)}
-                  onChange={foreignKey =>
-                    formField.fk_target_field_id.onChange(foreignKey.id)
+                  onChange={({ target: { value } }) =>
+                    formField.fk_target_field_id.onChange(value)
                   }
-                  optionNameFn={foreignKey => foreignKey.name}
+                  options={Object.values(foreignKeys)}
+                  optionValueFn={o => o.id}
                 />
               )
             : isFK(field.special_type) && (
diff --git a/frontend/src/metabase/reference/components/FieldTypeDetail.jsx b/frontend/src/metabase/reference/components/FieldTypeDetail.jsx
index 266af6dee15..18e3630e24e 100644
--- a/frontend/src/metabase/reference/components/FieldTypeDetail.jsx
+++ b/frontend/src/metabase/reference/components/FieldTypeDetail.jsx
@@ -28,13 +28,8 @@ const FieldTypeDetail = ({
         <span>
           {isEditing ? (
             <Select
-              triggerClasses="rounded bordered p1 inline-block"
               placeholder={t`Select a field type`}
-              value={
-                MetabaseCore.field_special_types_map[
-                  fieldTypeFormField.value
-                ] || MetabaseCore.field_special_types_map[field.special_type]
-              }
+              value={fieldTypeFormField.value || field.special_type}
               options={MetabaseCore.field_special_types
                 .concat({
                   id: null,
@@ -46,7 +41,10 @@ const FieldTypeDetail = ({
                     ? !(type.id && type.id.startsWith("timestamp_"))
                     : true,
                 )}
-              onChange={type => fieldTypeFormField.onChange(type.id)}
+              optionValueFn={o => o.id}
+              onChange={({ target: { value } }) =>
+                fieldTypeFormField.onChange(value)
+              }
             />
           ) : (
             <span>
@@ -63,19 +61,13 @@ const FieldTypeDetail = ({
                 (isFK(field.special_type) &&
                   fieldTypeFormField.value === undefined)) && (
                 <Select
-                  triggerClasses="rounded bordered p1 inline-block"
-                  placeholder={t`Select a field type`}
-                  value={
-                    foreignKeys[foreignKeyFormField.value] ||
-                    foreignKeys[field.fk_target_field_id] || {
-                      name: t`Select a Foreign Key`,
-                    }
-                  }
+                  placeholder={t`Select a foreign key`}
+                  value={foreignKeyFormField.value || field.fk_target_field_id}
                   options={Object.values(foreignKeys)}
-                  onChange={foreignKey =>
-                    foreignKeyFormField.onChange(foreignKey.id)
+                  onChange={({ target: { value } }) =>
+                    foreignKeyFormField.onChange(value)
                   }
-                  optionNameFn={foreignKey => foreignKey.name}
+                  optionValueFn={o => o.id}
                 />
               )
             : isFK(field.special_type) && (
diff --git a/frontend/src/metabase/reference/components/GuideDetailEditor.jsx b/frontend/src/metabase/reference/components/GuideDetailEditor.jsx
index e917b34ac49..6ef9a106371 100644
--- a/frontend/src/metabase/reference/components/GuideDetailEditor.jsx
+++ b/frontend/src/metabase/reference/components/GuideDetailEditor.jsx
@@ -45,6 +45,7 @@ const GuideDetailEditor = ({
 
   const selectClasses = "input h3 px2 py1";
 
+  const selectedIdsSet = new Set(selectedIds);
   return (
     <div className={cx("mb2 border-bottom pb4 text-measure", className)}>
       <div className="relative mt2 flex align-center">
@@ -64,11 +65,10 @@ const GuideDetailEditor = ({
         <div className="py2">
           {entities ? (
             <Select
-              value={entities[formField.id.value]}
-              options={Object.values(entities)}
-              disabledOptionIds={selectedIds}
-              optionNameFn={option => option.display_name || option.name}
-              onChange={entity => {
+              placeholder={t`Select...`}
+              value={formField.id.value}
+              onChange={({ target: { value } }) => {
+                const entity = entities[value];
                 //TODO: refactor into function
                 formField.id.onChange(entity.id);
                 formField.points_of_interest.onChange(
@@ -84,7 +84,10 @@ const GuideDetailEditor = ({
                   );
                 }
               }}
-              placeholder={t`Select...`}
+              options={Object.values(entities)}
+              optionNameFn={option => option.display_name || option.name}
+              optionValueFn={option => option.id}
+              optionDisabledFn={o => selectedIdsSet.has(o.id)}
             />
           ) : (
             <SchemaTableAndSegmentDataSelector
@@ -182,36 +185,20 @@ const GuideDetailEditor = ({
               {t`Which 2-3 fields do you usually group this metric by?`}
             </EditLabel>
             <Select
-              options={fieldsByMetric}
-              optionNameFn={option => option.display_name || option.name}
               placeholder={t`Select...`}
-              values={formField.important_fields.value || []}
-              disabledOptionIds={
-                formField.important_fields.value &&
-                formField.important_fields.value.length === 3
-                  ? fieldsByMetric
-                      .filter(
-                        field =>
-                          !formField.important_fields.value.includes(field),
-                      )
-                      .map(field => field.id)
-                  : []
+              multiple
+              value={formField.important_fields.value || []}
+              onChange={({ target: { value } }) =>
+                formField.important_fields.onChange(value)
               }
-              onChange={field => {
-                const importantFields = formField.important_fields.value || [];
-                return importantFields.includes(field)
-                  ? formField.important_fields.onChange(
-                      importantFields.filter(
-                        importantField => importantField !== field,
-                      ),
-                    )
-                  : importantFields.length < 3 &&
-                      formField.important_fields.onChange(
-                        importantFields.concat(field),
-                      );
-              }}
-              disabled={
-                formField.id.value === null || formField.id.value === undefined
+              disabled={formField.id.value == null}
+              options={fieldsByMetric}
+              optionNameFn={metric => metric.display_name || metric.name}
+              optionValueFn={metric => metric.id}
+              optionDisabledFn={metric =>
+                formField.important_fields &&
+                formField.important_fields.length >= 3 &&
+                !formField.important_fields.includes(metric.id)
               }
             />
           </div>
diff --git a/frontend/src/metabase/reference/components/MetricImportantFieldsDetail.jsx b/frontend/src/metabase/reference/components/MetricImportantFieldsDetail.jsx
index f666d6d5038..a78a023f82a 100644
--- a/frontend/src/metabase/reference/components/MetricImportantFieldsDetail.jsx
+++ b/frontend/src/metabase/reference/components/MetricImportantFieldsDetail.jsx
@@ -28,31 +28,18 @@ const MetricImportantFieldsDetail = ({
         </div>
         <div className={cx(D.detailSubtitle, { mt1: true })}>
           <Select
-            key="metricFieldsSelect"
-            triggerClasses="input p1 block"
-            options={table.fields.map(fieldId => allFields[fieldId])}
-            optionNameFn={option => option.display_name || option.name}
             placeholder={t`Select...`}
-            values={formField.value || []}
-            disabledOptionIds={
-              formField.value && formField.value.length === 3
-                ? table.fields
-                    .map(fieldId => allFields[fieldId])
-                    .filter(field => !formField.value.includes(field))
-                    .map(field => field.id)
-                : []
+            multiple
+            value={formField.value || []}
+            onChange={formField.onChange}
+            options={table.fields.map(fieldId => allFields[fieldId])}
+            optionValueFn={field => field.id}
+            optionNameFn={field => field.display_name || field.name}
+            optionDisabledFn={field =>
+              formField.value &&
+              formField.value.length >= 3 &&
+              !formField.value.includes(field.id)
             }
-            onChange={field => {
-              const importantFields = formField.value || [];
-              return importantFields.includes(field)
-                ? formField.onChange(
-                    importantFields.filter(
-                      importantField => importantField !== field,
-                    ),
-                  )
-                : importantFields.length < 3 &&
-                    formField.onChange(importantFields.concat(field));
-            }}
           />
         </div>
       </div>
diff --git a/frontend/test/__support__/cypress.js b/frontend/test/__support__/cypress.js
index f2c0e9d88c0..85fa445dfb7 100644
--- a/frontend/test/__support__/cypress.js
+++ b/frontend/test/__support__/cypress.js
@@ -16,6 +16,10 @@ export function signInAsNormalUser() {
   cy.request("POST", "/api/session", NORMAL_USER_CREDS);
 }
 
+export function signOut() {
+  cy.clearCookie("metabase.SESSION");
+}
+
 export function snapshot(name) {
   cy.request("POST", `/api/testing/snapshot/${name}`);
 }
@@ -23,4 +27,13 @@ export function restore(name = "default") {
   cy.request("POST", `/api/testing/restore/${name}`);
 }
 
+export function popover(callback) {
+  const p = cy.get(".PopoverContainer");
+  return callback ? callback(p) : p;
+}
+export function modal(callback) {
+  const m = cy.get(".ModalContainer");
+  return callback ? callback(m) : m;
+}
+
 Cypress.on("uncaught:exception", (err, runnable) => false);
diff --git a/frontend/test/__support__/metadata.js b/frontend/test/__support__/metadata.js
new file mode 100644
index 00000000000..1f1589bb2bb
--- /dev/null
+++ b/frontend/test/__support__/metadata.js
@@ -0,0 +1,12 @@
+// TODO: consolidate with sample_dataset_fixture.js once we get get cypress to load metabase-lib
+// TODO: dump sample_dataset_fixture.json from same snapshot as used in Cypress tests
+
+export const SAMPLE_DATASET = {
+  id: 1,
+};
+
+export const PRODUCTS = {
+  CATEGORY: {
+    id: 6,
+  },
+};
diff --git a/frontend/test/metabase/admin/databases/DatabaseEditApp.e2e.spec.js b/frontend/test/metabase/admin/databases/DatabaseEditApp.e2e.spec.js
deleted file mode 100644
index 60f65fd16ba..00000000000
--- a/frontend/test/metabase/admin/databases/DatabaseEditApp.e2e.spec.js
+++ /dev/null
@@ -1,377 +0,0 @@
-import { useSharedAdminLogin, createTestStore } from "__support__/e2e";
-
-import React from "react";
-import { mount } from "enzyme";
-import {
-  INITIALIZE_DATABASE,
-  RESCAN_DATABASE_FIELDS,
-  SYNC_DATABASE_SCHEMA,
-  DISCARD_SAVED_FIELD_VALUES,
-  UPDATE_DATABASE,
-  MIGRATE_TO_NEW_SCHEDULING_SETTINGS,
-  DEFAULT_SCHEDULES,
-} from "metabase/admin/databases/database";
-import DatabaseEditApp from "metabase/admin/databases/containers/DatabaseEditApp";
-import DatabaseEditForms from "metabase/admin/databases/components/DatabaseEditForms";
-import DatabaseSchedulingForm, {
-  SyncOption,
-} from "metabase/admin/databases/components/DatabaseSchedulingForm";
-import FormField from "metabase/components/form/FormField";
-import Toggle from "metabase/components/Toggle";
-import { TestModal } from "metabase/components/Modal";
-import Select from "metabase/components/Select";
-import ColumnarSelector from "metabase/components/ColumnarSelector";
-import Radio from "metabase/components/Radio";
-import { click, clickButton } from "__support__/enzyme";
-import { MetabaseApi } from "metabase/services";
-import _ from "underscore";
-
-// NOTE ATTE KEINÄNEN 8/17/17:
-// This test suite has overlap (albeit intentional) with both DatabaseListApp.e2e.spec and signup.e2e.spec
-
-// Currently a lot of duplication with SegmentPane tests
-describe("DatabaseEditApp", () => {
-  beforeAll(async () => {
-    useSharedAdminLogin();
-  });
-
-  describe("Connection tab", () => {
-    it("shows the connection settings for sample dataset correctly", async () => {
-      const store = await createTestStore();
-      store.pushPath("/admin/databases/1");
-      const dbEditApp = mount(store.connectContainer(<DatabaseEditApp />));
-      await store.waitForActions([INITIALIZE_DATABASE]);
-
-      const editForm = dbEditApp.find(DatabaseEditForms);
-      expect(editForm.length).toBe(1);
-      expect(editForm.find("select").props().defaultValue).toBe("h2");
-      expect(editForm.find('input[name="name"]').props().value).toBe(
-        "Sample Dataset",
-      );
-      expect(editForm.find('input[name="db"]').props().value).toEqual(
-        expect.stringContaining("sample-dataset.db"),
-      );
-    });
-
-    it("lets you modify the connection settings", async () => {
-      const store = await createTestStore();
-      store.pushPath("/admin/databases/1");
-      const dbEditApp = mount(store.connectContainer(<DatabaseEditApp />));
-      await store.waitForActions([INITIALIZE_DATABASE]);
-
-      const editForm = dbEditApp.find(DatabaseEditForms);
-      const letUserControlSchedulingField = editForm
-        .find(FormField)
-        .filterWhere(
-          f => f.props().fieldName === "let-user-control-scheduling",
-        );
-      expect(letUserControlSchedulingField.find(Toggle).props().value).toBe(
-        false,
-      );
-      click(letUserControlSchedulingField.find(Toggle));
-
-      // Connection and Scheduling tabs shouldn't be visible yet
-      expect(dbEditApp.find(Radio).find("li").length).toBe(0);
-
-      clickButton(editForm.find('button[children="Save"]'));
-
-      await store.waitForActions([UPDATE_DATABASE]);
-
-      // Tabs should be now visible as user-controlled scheduling is enabled
-      expect(dbEditApp.find(Radio).find("li").length).toBe(2);
-    });
-
-    // NOTE Atte Keinänen 8/17/17: See migrateDatabaseToNewSchedulingSettings for more information about migration process
-    it("shows the analysis toggle correctly for non-migrated analysis settings when `is_full_sync` is true", async () => {
-      // Set is_full_sync to false here inline and remove the let-user-control-scheduling setting
-      const database = await MetabaseApi.db_get({ dbId: 1 });
-      await MetabaseApi.db_update({
-        ...database,
-        is_full_sync: true,
-        details: _.omit(database.details, "let-user-control-scheduling"),
-      });
-
-      const store = await createTestStore();
-      store.pushPath("/admin/databases/1");
-      const dbEditApp = mount(store.connectContainer(<DatabaseEditApp />));
-      await store.waitForActions([
-        INITIALIZE_DATABASE,
-        MIGRATE_TO_NEW_SCHEDULING_SETTINGS,
-      ]);
-
-      const editForm = dbEditApp.find(DatabaseEditForms);
-      expect(editForm.length).toBe(1);
-      expect(editForm.find("select").props().defaultValue).toBe("h2");
-      expect(editForm.find('input[name="name"]').props().value).toBe(
-        "Sample Dataset",
-      );
-      expect(editForm.find('input[name="db"]').props().value).toEqual(
-        expect.stringContaining("sample-dataset.db"),
-      );
-
-      const letUserControlSchedulingField = editForm
-        .find(FormField)
-        .filterWhere(
-          f => f.props().fieldName === "let-user-control-scheduling",
-        );
-      expect(letUserControlSchedulingField.length).toBe(1);
-      expect(letUserControlSchedulingField.find(Toggle).props().value).toBe(
-        false,
-      );
-      expect(dbEditApp.find(Radio).find("li").length).toBe(0);
-    });
-
-    it("shows the analysis toggle correctly for non-migrated analysis settings when `is_full_sync` is false", async () => {
-      // Set is_full_sync to true here inline and remove the let-user-control-scheduling setting
-      const database = await MetabaseApi.db_get({ dbId: 1 });
-      await MetabaseApi.db_update({
-        ...database,
-        is_full_sync: false,
-        details: _.omit(database.details, "let-user-control-scheduling"),
-      });
-
-      // Start the actual interaction test
-      const store = await createTestStore();
-      store.pushPath("/admin/databases/1");
-      const dbEditApp = mount(store.connectContainer(<DatabaseEditApp />));
-      await store.waitForActions([
-        INITIALIZE_DATABASE,
-        MIGRATE_TO_NEW_SCHEDULING_SETTINGS,
-      ]);
-
-      const editForm = dbEditApp.find(DatabaseEditForms);
-      const letUserControlSchedulingField = editForm
-        .find(FormField)
-        .filterWhere(
-          f => f.props().fieldName === "let-user-control-scheduling",
-        );
-      expect(letUserControlSchedulingField.length).toBe(1);
-      expect(letUserControlSchedulingField.find(Toggle).props().value).toBe(
-        true,
-      );
-      expect(dbEditApp.find(Radio).find("li").length).toBe(2);
-    });
-
-    afterAll(async () => {
-      // revert all changes that have been made
-      // use a direct API call for the sake of simplicity / reliability
-      const database = await MetabaseApi.db_get({ dbId: 1 });
-      await MetabaseApi.db_update({
-        ...database,
-        is_full_sync: true,
-        details: {
-          ...database.details,
-          "let-user-control-scheduling": false,
-        },
-      });
-    });
-  });
-
-  describe("Scheduling tab", () => {
-    beforeAll(async () => {
-      // Enable the user-controlled scheduling for these tests
-      const database = await MetabaseApi.db_get({ dbId: 1 });
-      await MetabaseApi.db_update({
-        ...database,
-        details: {
-          ...database.details,
-          "let-user-control-scheduling": true,
-        },
-      });
-    });
-
-    it("shows the initial scheduling settings correctly", async () => {
-      const store = await createTestStore();
-      store.pushPath("/admin/databases/1");
-      const dbEditApp = mount(store.connectContainer(<DatabaseEditApp />));
-      await store.waitForActions([INITIALIZE_DATABASE]);
-
-      const editForm = dbEditApp.find(DatabaseEditForms);
-      expect(editForm.length).toBe(1);
-      click(
-        dbEditApp
-          .find(Radio)
-          .find("li")
-          .last(),
-      );
-
-      const schedulingForm = dbEditApp.find(DatabaseSchedulingForm);
-      expect(schedulingForm.length).toBe(1);
-
-      expect(
-        schedulingForm
-          .find(Select)
-          .first()
-          .text(),
-      ).toEqual("Hourly");
-
-      const syncOptions = schedulingForm.find(SyncOption);
-      const syncOptionOften = syncOptions.first();
-
-      expect(syncOptionOften.props().name).toEqual("Regularly, on a schedule");
-      expect(syncOptionOften.props().selected).toEqual(true);
-    });
-
-    it("lets you change the db sync period", async () => {
-      const store = await createTestStore();
-
-      store.pushPath("/admin/databases/1");
-      const dbEditApp = mount(store.connectContainer(<DatabaseEditApp />));
-      await store.waitForActions([INITIALIZE_DATABASE]);
-
-      click(
-        dbEditApp
-          .find(Radio)
-          .find("li")
-          .last(),
-      );
-      const schedulingForm = dbEditApp.find(DatabaseSchedulingForm);
-      const dbSyncSelect = schedulingForm.find(Select).first();
-      click(dbSyncSelect);
-
-      const dailyOption = schedulingForm
-        .find(ColumnarSelector)
-        .find("li")
-        .at(1)
-        .children();
-      expect(dailyOption.text()).toEqual("Daily");
-      click(dailyOption);
-
-      expect(dbSyncSelect.text()).toEqual("Daily");
-
-      clickButton(schedulingForm.find('button[children="Save changes"]'));
-
-      await store.waitForActions([UPDATE_DATABASE]);
-    });
-
-    it("lets you change the table change frequency to Never", async () => {
-      const store = await createTestStore();
-      store.pushPath("/admin/databases/1");
-      const dbEditApp = mount(store.connectContainer(<DatabaseEditApp />));
-      await store.waitForActions([INITIALIZE_DATABASE]);
-
-      click(
-        dbEditApp
-          .find(Radio)
-          .find("li")
-          .last(),
-      );
-      const schedulingForm = dbEditApp.find(DatabaseSchedulingForm);
-      const dbSyncSelect = schedulingForm.find(Select).first();
-      click(dbSyncSelect);
-
-      const syncOptions = schedulingForm.find(SyncOption);
-      const syncOptionsNever = syncOptions.at(1);
-
-      expect(syncOptionsNever.props().selected).toEqual(false);
-      click(syncOptionsNever);
-      expect(syncOptionsNever.props().selected).toEqual(true);
-
-      clickButton(schedulingForm.find('button[children="Save changes"]'));
-      await store.waitForActions([UPDATE_DATABASE]);
-    });
-
-    it("shows the modified scheduling settings correctly", async () => {
-      const store = await createTestStore();
-      store.pushPath("/admin/databases/1");
-      const dbEditApp = mount(store.connectContainer(<DatabaseEditApp />));
-      await store.waitForActions([INITIALIZE_DATABASE]);
-
-      click(
-        dbEditApp
-          .find(Radio)
-          .find("li")
-          .last(),
-      );
-      const schedulingForm = dbEditApp.find(DatabaseSchedulingForm);
-      expect(schedulingForm.length).toBe(1);
-
-      expect(
-        schedulingForm
-          .find(Select)
-          .first()
-          .text(),
-      ).toEqual("Daily");
-
-      const syncOptions = schedulingForm.find(SyncOption);
-      const syncOptionOften = syncOptions.first();
-      const syncOptionNever = syncOptions.at(1);
-      expect(syncOptionOften.props().selected).toEqual(false);
-      expect(syncOptionNever.props().selected).toEqual(true);
-    });
-
-    afterAll(async () => {
-      // revert all changes that have been made
-      const database = await MetabaseApi.db_get({ dbId: 1 });
-      await MetabaseApi.db_update({
-        ...database,
-        is_full_sync: true,
-        schedules: DEFAULT_SCHEDULES,
-        details: {
-          ...database.details,
-          "let-user-control-scheduling": false,
-        },
-      });
-    });
-  });
-
-  describe("Actions sidebar", () => {
-    it("lets you trigger the manual database schema sync", async () => {
-      const store = await createTestStore();
-      store.pushPath("/admin/databases/1");
-      const dbEditApp = mount(store.connectContainer(<DatabaseEditApp />));
-      await store.waitForActions([INITIALIZE_DATABASE]);
-
-      clickButton(dbEditApp.find(".Button--syncDbSchema"));
-      await store.waitForActions([SYNC_DATABASE_SCHEMA]);
-      // TODO: do we have any way to see that the sync is actually in progress in the backend?
-    });
-
-    it("lets you trigger the manual rescan of field values", async () => {
-      const store = await createTestStore();
-      store.pushPath("/admin/databases/1");
-      const dbEditApp = mount(store.connectContainer(<DatabaseEditApp />));
-      await store.waitForActions([INITIALIZE_DATABASE]);
-
-      clickButton(dbEditApp.find(".Button--rescanFieldValues"));
-      await store.waitForActions([RESCAN_DATABASE_FIELDS]);
-      // TODO: do we have any way to see that the field rescanning is actually in progress in the backend?
-    });
-
-    // TODO Atte Keinänen 8/15/17: Does losing field values potentially cause test failures in other test suites?
-    it("lets you discard saved field values", async () => {
-      // To be safe, let's mock the API method
-      MetabaseApi.db_discard_values = jest.fn();
-      const store = await createTestStore();
-      store.pushPath("/admin/databases/1");
-      const dbEditApp = mount(store.connectContainer(<DatabaseEditApp />));
-      await store.waitForActions([INITIALIZE_DATABASE]);
-
-      click(dbEditApp.find(".Button--discardSavedFieldValues"));
-      clickButton(dbEditApp.find(TestModal).find(".Button--danger"));
-      await store.waitForActions([DISCARD_SAVED_FIELD_VALUES]);
-
-      expect(MetabaseApi.db_discard_values.mock.calls.length).toBe(1);
-    });
-
-    // Disabled because removal&recovery causes the db id to change
-    it("lets you remove the dataset", () => {
-      pending();
-
-      // const store = await createTestStore()
-      // store.pushPath("/admin/databases/1");
-      // const dbEditApp = mount(store.connectContainer(<DatabaseEditApp />));
-      // await store.waitForActions([INITIALIZE_DATABASE])
-      //
-      // try {
-      //     click(dbEditApp.find(".Button--deleteDatabase"))
-      //     console.log(dbEditApp.debug());
-      //     await store.waitForActions([DELETE_DATABASE])
-      //     await store.dispatch(addSampleDataset())
-      // } catch(e) {
-      //     throw e;
-      // } finally {
-      // }
-    });
-  });
-});
diff --git a/frontend/test/metabase/admin/databases/DatabaseListApp.e2e.spec.js b/frontend/test/metabase/admin/databases/DatabaseListApp.e2e.spec.js
deleted file mode 100644
index 6d42a381e48..00000000000
--- a/frontend/test/metabase/admin/databases/DatabaseListApp.e2e.spec.js
+++ /dev/null
@@ -1,473 +0,0 @@
-import {
-  useSharedAdminLogin,
-  createTestStore,
-  eventually,
-} from "__support__/e2e";
-import { click, clickButton, setInputValue } from "__support__/enzyme";
-
-import { mount } from "enzyme";
-import {
-  initializeDatabase,
-  INITIALIZE_DATABASE,
-  DELETE_DATABASE_FAILED,
-  CREATE_DATABASE_STARTED,
-  CREATE_DATABASE_FAILED,
-  UPDATE_DATABASE_STARTED,
-  UPDATE_DATABASE_FAILED,
-  UPDATE_DATABASE,
-  VALIDATE_DATABASE_STARTED,
-  SET_DATABASE_CREATION_STEP,
-  VALIDATE_DATABASE_FAILED,
-} from "metabase/admin/databases/database";
-
-import DatabaseListApp from "metabase/admin/databases/containers/DatabaseListApp";
-
-import { MetabaseApi } from "metabase/services";
-import DatabaseEditApp from "metabase/admin/databases/containers/DatabaseEditApp";
-import { delay } from "metabase/lib/promise";
-import { getEditingDatabase } from "metabase/admin/databases/selectors";
-import FormMessage, {
-  SERVER_ERROR_MESSAGE,
-} from "metabase/components/form/FormMessage";
-import CreatedDatabaseModal from "metabase/admin/databases/components/CreatedDatabaseModal";
-import FormField from "metabase/components/form/FormField";
-import Toggle from "metabase/components/Toggle";
-import DatabaseSchedulingForm, {
-  SyncOption,
-} from "metabase/admin/databases/components/DatabaseSchedulingForm";
-
-import Databases from "metabase/entities/databases";
-
-describe("dashboard list", () => {
-  beforeAll(async () => {
-    useSharedAdminLogin();
-  });
-
-  it("should render", async () => {
-    const store = await createTestStore();
-    store.pushPath("/admin/databases");
-
-    const app = mount(store.getAppContainer());
-
-    await store.waitForActions([Databases.actionTypes.FETCH_LIST]);
-
-    expect(app.find(DatabaseListApp).length).toEqual(1);
-  });
-
-  describe("adds", () => {
-    it("should work and shouldn't let you accidentally add db twice", async () => {
-      Databases.api.create = async db => {
-        await delay(10);
-        return { ...db, id: 10 };
-      };
-
-      const store = await createTestStore();
-      store.pushPath("/admin/databases");
-
-      const app = mount(store.getAppContainer());
-
-      await eventually(() => {
-        click(app.find(".Button.Button--primary").first());
-      });
-
-      const dbDetailsForm = app.find(DatabaseEditApp);
-      expect(dbDetailsForm.length).toBe(1);
-
-      await store.waitForActions([INITIALIZE_DATABASE]);
-
-      expect(
-        dbDetailsForm.find('button[children="Save"]').props().disabled,
-      ).toBe(true);
-
-      const updateInputValue = (name, value) =>
-        setInputValue(dbDetailsForm.find(`input[name="${name}"]`), value);
-
-      updateInputValue("name", "Test db name");
-      updateInputValue("dbname", "test_postgres_db");
-      updateInputValue("user", "uberadmin");
-
-      const saveButton = dbDetailsForm.find('button[children="Save"]');
-
-      expect(saveButton.props().disabled).toBe(false);
-      clickButton(saveButton);
-
-      // Now the submit button should be disabled so that you aren't able to trigger the db creation action twice
-      await store.waitForActions([CREATE_DATABASE_STARTED]);
-      expect(saveButton.text()).toBe("Saving...");
-      expect(saveButton.props().disabled).toBe(true);
-
-      await eventually(() =>
-        expect(store.getPath()).toEqual("/admin/databases?created=10"),
-      );
-      expect(app.find(CreatedDatabaseModal).length).toBe(1);
-    });
-
-    it("should show validation error if you enable scheduling toggle and enter invalid db connection info", async () => {
-      Databases.api.create = async db => {
-        await delay(10);
-        return { ...db, id: 10 };
-      };
-
-      const store = await createTestStore();
-      store.pushPath("/admin/databases");
-
-      const app = mount(store.getAppContainer());
-
-      await eventually(() => {
-        click(app.find(".Button.Button--primary").first());
-      });
-
-      const dbDetailsForm = app.find(DatabaseEditApp);
-      expect(dbDetailsForm.length).toBe(1);
-
-      await store.waitForActions([INITIALIZE_DATABASE]);
-
-      expect(
-        dbDetailsForm.find('button[children="Save"]').props().disabled,
-      ).toBe(true);
-
-      const updateInputValue = (name, value) =>
-        setInputValue(dbDetailsForm.find(`input[name="${name}"]`), value);
-
-      updateInputValue("name", "Test db name");
-      updateInputValue("dbname", "test_postgres_db");
-      updateInputValue("user", "uberadmin");
-
-      const letUserControlSchedulingField = dbDetailsForm
-        .find(FormField)
-        .filterWhere(
-          f => f.props().fieldName === "let-user-control-scheduling",
-        );
-      expect(letUserControlSchedulingField.length).toBe(1);
-      expect(letUserControlSchedulingField.find(Toggle).props().value).toBe(
-        false,
-      );
-      click(letUserControlSchedulingField.find(Toggle));
-
-      const nextStepButton = dbDetailsForm.find('button[children="Next"]');
-      expect(nextStepButton.props().disabled).toBe(false);
-      clickButton(nextStepButton);
-
-      await store.waitForActions([
-        VALIDATE_DATABASE_STARTED,
-        VALIDATE_DATABASE_FAILED,
-      ]);
-      expect(app.find(FormMessage).text()).toMatch(
-        /Couldn't connect to the database./,
-      );
-    });
-
-    it("should direct you to scheduling settings if you enable the toggle", async () => {
-      Databases.api.create = async db => {
-        await delay(10);
-        return { ...db, id: 10 };
-      };
-      // mock the validate API now because we need a positive response
-      // TODO Atte Keinänen 8/17/17: Could we at some point connect to some real H2 instance here?
-      // Maybe the test fixture would be a good fit as tests are anyway using a copy of it (no connection conflicts expected)
-      MetabaseApi.db_validate = async db => {
-        await delay(10);
-        return { valid: true };
-      };
-
-      const store = await createTestStore();
-      store.pushPath("/admin/databases");
-
-      const app = mount(store.getAppContainer());
-      await store.waitForActions([Databases.actionTypes.FETCH_LIST]);
-
-      await eventually(() => {
-        click(app.find(".Button.Button--primary").first());
-      });
-
-      const dbDetailsForm = app.find(DatabaseEditApp);
-      expect(dbDetailsForm.length).toBe(1);
-
-      await store.waitForActions([INITIALIZE_DATABASE]);
-
-      expect(
-        dbDetailsForm.find('button[children="Save"]').props().disabled,
-      ).toBe(true);
-
-      const updateInputValue = (name, value) =>
-        setInputValue(dbDetailsForm.find(`input[name="${name}"]`), value);
-
-      updateInputValue("name", "Test db name");
-      updateInputValue("dbname", "test_postgres_db");
-      updateInputValue("user", "uberadmin");
-
-      const letUserControlSchedulingField = dbDetailsForm
-        .find(FormField)
-        .filterWhere(
-          f => f.props().fieldName === "let-user-control-scheduling",
-        );
-      expect(letUserControlSchedulingField.length).toBe(1);
-      expect(letUserControlSchedulingField.find(Toggle).props().value).toBe(
-        false,
-      );
-      click(letUserControlSchedulingField.find(Toggle));
-
-      const nextStepButton = dbDetailsForm.find('button[children="Next"]');
-      expect(nextStepButton.props().disabled).toBe(false);
-      clickButton(nextStepButton);
-
-      await store.waitForActions([
-        VALIDATE_DATABASE_STARTED,
-        SET_DATABASE_CREATION_STEP,
-      ]);
-
-      // Change the sync period to never in scheduling settings
-      const schedulingForm = app.find(DatabaseSchedulingForm);
-      expect(schedulingForm.length).toBe(1);
-      const syncOptions = schedulingForm.find(SyncOption);
-      const syncOptionsNever = syncOptions.at(1);
-      expect(syncOptionsNever.props().selected).toEqual(false);
-      click(syncOptionsNever);
-      expect(syncOptionsNever.props().selected).toEqual(true);
-
-      const saveButton = dbDetailsForm.find('button[children="Save"]');
-      expect(saveButton.props().disabled).toBe(false);
-      clickButton(saveButton);
-
-      // Now the submit button should be disabled so that you aren't able to trigger the db creation action twice
-      await store.waitForActions([CREATE_DATABASE_STARTED]);
-      expect(saveButton.text()).toBe("Saving...");
-
-      await eventually(() =>
-        expect(store.getPath()).toEqual("/admin/databases?created=10"),
-      );
-
-      expect(app.find(CreatedDatabaseModal).length).toBe(1);
-    });
-
-    it("should show error correctly on failure", async () => {
-      Databases.api.create = async () => {
-        await delay(10);
-        return Promise.reject({
-          status: 400,
-          data: {},
-          isCancelled: false,
-        });
-      };
-
-      const store = await createTestStore();
-      store.pushPath("/admin/databases");
-
-      const app = mount(store.getAppContainer());
-
-      await eventually(() => {
-        const addDbButton = app.find(".Button.Button--primary").first();
-        expect(addDbButton).not.toBe(null);
-        click(addDbButton);
-      });
-
-      const dbDetailsForm = app.find(DatabaseEditApp);
-      expect(dbDetailsForm.length).toBe(1);
-
-      await store.waitForActions([INITIALIZE_DATABASE]);
-
-      const saveButton = dbDetailsForm.find('button[children="Save"]');
-      expect(saveButton.props().disabled).toBe(true);
-
-      // TODO: Apply change method here
-      const updateInputValue = (name, value) =>
-        setInputValue(dbDetailsForm.find(`input[name="${name}"]`), value);
-
-      updateInputValue("name", "Test db name");
-      updateInputValue("dbname", "test_postgres_db");
-      updateInputValue("user", "uberadmin");
-
-      // TODO: Apply button submit thing here
-      expect(saveButton.props().disabled).toBe(false);
-      clickButton(saveButton);
-
-      await store.waitForActions([CREATE_DATABASE_STARTED]);
-      expect(saveButton.text()).toBe("Saving...");
-
-      await store.waitForActions([CREATE_DATABASE_FAILED]);
-      expect(dbDetailsForm.find(FormMessage).text()).toEqual(
-        SERVER_ERROR_MESSAGE,
-      );
-      expect(saveButton.text()).toBe("Save");
-    });
-  });
-
-  describe("deletes", () => {
-    it("should not block deletes", async () => {
-      Databases.api.delete = async () => {
-        await delay(10);
-      };
-
-      const store = await createTestStore();
-      store.pushPath("/admin/databases");
-
-      const app = mount(store.getAppContainer());
-
-      let deleteButtons;
-      await eventually(() => {
-        deleteButtons = app.find(".Button.Button--danger");
-        expect(deleteButtons).not.toHaveLength(0);
-      });
-
-      // let dbCount = deleteButtons.length;
-      click(deleteButtons.first());
-
-      const deleteModal = app.find(".test-modal");
-      setInputValue(deleteModal.find(".Form-input"), "DELETE");
-      clickButton(deleteModal.find(".Button.Button--danger"));
-
-      // test that the modal is gone
-      expect(app.find(".test-modal").length).toEqual(0);
-
-      // we should now have a disabled db row during delete
-      expect(app.find("tr.disabled").length).toEqual(1);
-
-      await eventually(() => {
-        // there should be no disabled db rows now
-        expect(app.find("tr.disabled").length).toEqual(0);
-
-        // we should now have one database less in the list
-        // NOTE: unsure why the delete button is still present, it is not during manual testing
-        // expect(app.find(".Button.Button--danger").length).toEqual(dbCount - 1);
-      });
-    });
-
-    it("should show error correctly on failure", async () => {
-      Databases.api.delete = async () => {
-        await delay(10);
-        return Promise.reject({
-          status: 400,
-          data: {},
-          isCancelled: false,
-        });
-      };
-
-      const store = await createTestStore();
-      store.pushPath("/admin/databases");
-
-      const app = mount(store.getAppContainer());
-
-      let deleteButtons;
-      await eventually(() => {
-        deleteButtons = app.find(".Button.Button--danger");
-        expect(deleteButtons).not.toHaveLength(0);
-      });
-
-      const dbCount = deleteButtons.length;
-      click(deleteButtons.first());
-
-      const deleteModal = app.find(".test-modal");
-      setInputValue(deleteModal.find(".Form-input"), "DELETE");
-      clickButton(deleteModal.find(".Button.Button--danger"));
-
-      // test that the modal is gone
-      expect(app.find(".test-modal").length).toEqual(0);
-
-      // we should now have a disabled db row during delete
-      expect(app.find("tr.disabled").length).toEqual(1);
-
-      // db delete fails
-      await store.waitForActions([DELETE_DATABASE_FAILED]);
-
-      // there should be no disabled db rows now
-      expect(app.find("tr.disabled").length).toEqual(0);
-
-      // the db count should be same as before
-      expect(app.find(".Button.Button--danger")).toHaveLength(dbCount);
-
-      expect(app.find(FormMessage).text()).toBe(SERVER_ERROR_MESSAGE);
-    });
-  });
-
-  describe("editing", () => {
-    const newName = "Ex-Sample Data Set";
-
-    it("should be able to edit database name", async () => {
-      const store = await createTestStore();
-      store.pushPath("/admin/databases");
-
-      const app = mount(store.getAppContainer());
-      await store.waitForActions([Databases.actionTypes.FETCH_LIST]);
-
-      await eventually(() =>
-        click(app.find('a[children="Sample Dataset"]').first()),
-      );
-
-      expect(store.getPath()).toEqual("/admin/databases/1");
-      await store.waitForActions([INITIALIZE_DATABASE]);
-
-      const dbDetailsForm = app.find(DatabaseEditApp);
-      expect(dbDetailsForm.length).toBe(1);
-
-      const nameField = dbDetailsForm.find(`input[name="name"]`);
-      expect(nameField.props().value).toEqual("Sample Dataset");
-
-      setInputValue(nameField, newName);
-
-      const saveButton = dbDetailsForm.find('button[children="Save"]');
-      clickButton(saveButton);
-
-      await store.waitForActions([UPDATE_DATABASE_STARTED]);
-      expect(saveButton.text()).toBe("Saving...");
-      expect(saveButton.props().disabled).toBe(true);
-
-      await store.waitForActions([UPDATE_DATABASE]);
-      expect(saveButton.props().disabled).toBe(undefined);
-      expect(dbDetailsForm.find(FormMessage).text()).toEqual(
-        "Successfully saved!",
-      );
-    });
-
-    it("should show the updated database name", async () => {
-      const store = await createTestStore();
-      store.pushPath("/admin/databases/1");
-
-      const app = mount(store.getAppContainer());
-      await store.waitForActions([INITIALIZE_DATABASE]);
-
-      const dbDetailsForm = app.find(DatabaseEditApp);
-      expect(dbDetailsForm.length).toBe(1);
-
-      const nameField = dbDetailsForm.find(`input[name="name"]`);
-      expect(nameField.props().value).toEqual(newName);
-    });
-
-    it("should show an error if saving fails", async () => {
-      const store = await createTestStore();
-      store.pushPath("/admin/databases/1");
-
-      const app = mount(store.getAppContainer());
-      await store.waitForActions([INITIALIZE_DATABASE]);
-
-      const dbDetailsForm = app.find(DatabaseEditApp);
-      expect(dbDetailsForm.length).toBe(1);
-
-      const tooLongName = "too long name ".repeat(100);
-      const nameField = dbDetailsForm.find(`input[name="name"]`);
-      setInputValue(nameField, tooLongName);
-
-      const saveButton = dbDetailsForm.find('button[children="Save"]');
-      clickButton(saveButton);
-
-      await store.waitForActions([UPDATE_DATABASE_STARTED]);
-      expect(saveButton.text()).toBe("Saving...");
-      expect(saveButton.props().disabled).toBe(true);
-
-      await store.waitForActions([UPDATE_DATABASE_FAILED]);
-      expect(saveButton.props().disabled).toBe(undefined);
-      expect(dbDetailsForm.find(".Form-message.text-error").length).toBe(1);
-    });
-
-    afterAll(async () => {
-      const store = await createTestStore();
-      store.dispatch(initializeDatabase(1));
-      await store.waitForActions([INITIALIZE_DATABASE]);
-      const sampleDatasetDb = getEditingDatabase(store.getState());
-
-      await MetabaseApi.db_update({
-        ...sampleDatasetDb,
-        name: "Sample Dataset",
-      });
-    });
-  });
-});
diff --git a/frontend/test/metabase/admin/datamodel/FieldApp.e2e.spec.js b/frontend/test/metabase/admin/datamodel/FieldApp.e2e.spec.js
deleted file mode 100644
index 91658ace0d4..00000000000
--- a/frontend/test/metabase/admin/datamodel/FieldApp.e2e.spec.js
+++ /dev/null
@@ -1,519 +0,0 @@
-import {
-  useSharedAdminLogin,
-  createTestStore,
-  eventually,
-} from "__support__/e2e";
-
-import {
-  clickButton,
-  setInputValue,
-  click,
-  dispatchBrowserEvent,
-} from "__support__/enzyme";
-
-import { metadata as staticFixtureMetadata } from "__support__/sample_dataset_fixture";
-
-import React from "react";
-import { mount } from "enzyme";
-import { delay } from "metabase/lib/promise";
-import FieldApp, {
-  FieldHeader,
-} from "metabase/admin/datamodel/containers/FieldApp";
-import FieldRemapping, {
-  RemappingNamingTip,
-  ValueRemappings,
-  FieldValueMapping,
-} from "metabase/admin/datamodel/components/FieldRemapping";
-import InputBlurChange from "metabase/components/InputBlurChange";
-import {
-  FieldVisibilityPicker,
-  SpecialTypeAndTargetPicker,
-} from "metabase/admin/datamodel/components/database/ColumnItem";
-import Popover from "metabase/components/Popover";
-import Select from "metabase/components/Select";
-import SelectButton from "metabase/components/SelectButton";
-import ButtonWithStatus from "metabase/components/ButtonWithStatus";
-import { getMetadata } from "metabase/selectors/metadata";
-import Fields from "metabase/entities/fields";
-import Tables from "metabase/entities/tables";
-import Databases from "metabase/entities/databases";
-import { MetabaseApi } from "metabase/services";
-
-// TODO: Should we use the metabase/lib/urls methods for constructing urls also here?
-
-// TODO Atte Keinänen 7/10/17: Use fixtures after metabase-lib branch has been merged
-
-const CREATED_AT_ID = 1;
-const PRODUCT_ID_FK_ID = 3;
-const USER_ID_FK_ID = 7;
-// enumeration with values 1, 2, 3, 4 or 5
-const USER_SOURCE_TABLE_ID = 2;
-const USER_SOURCE_ID = 18;
-
-const PRODUCT_RATING_TABLE_ID = 4;
-const PRODUCT_RATING_ID = 33;
-
-const initFieldApp = async ({ tableId = 1, fieldId }) => {
-  const store = await createTestStore();
-  store.pushPath(`/admin/datamodel/database/1/table/${tableId}/${fieldId}`);
-  const fieldApp = mount(store.connectContainer(<FieldApp />));
-  await store.waitForActions([
-    Databases.actions.fetchDatabaseMetadata,
-    Tables.actions.fetchTableMetadata,
-    Fields.actions.fetchFieldValues,
-  ]);
-  return { store, fieldApp };
-};
-
-describe("FieldApp", () => {
-  beforeAll(async () => {
-    useSharedAdminLogin();
-  });
-
-  describe("name settings", () => {
-    const newTitle = "Brought Into Existence At";
-    const newDescription =
-      "The point in space-time when this order saw the light.";
-
-    it("lets you change field name and description", async () => {
-      const { store, fieldApp } = await initFieldApp({
-        fieldId: CREATED_AT_ID,
-      });
-
-      const header = fieldApp.find(FieldHeader);
-      expect(header.length).toBe(1);
-
-      const nameInput = header.find(InputBlurChange).at(0);
-      expect(nameInput.props().value).toBe(
-        staticFixtureMetadata.fields["1"].display_name,
-      );
-      const descriptionInput = header.find(InputBlurChange).at(1);
-      expect(descriptionInput.props().value).toBe(
-        staticFixtureMetadata.fields["1"].description,
-      );
-
-      setInputValue(nameInput, newTitle);
-      await store.waitForActions([Fields.actions.update]);
-
-      setInputValue(descriptionInput, newDescription);
-      await store.waitForActions([Fields.actions.update]);
-    });
-
-    it("should show the entered values after a page reload", async () => {
-      const { fieldApp } = await initFieldApp({ fieldId: CREATED_AT_ID });
-
-      const header = fieldApp.find(FieldHeader);
-      expect(header.length).toBe(1);
-      const nameInput = header.find(InputBlurChange).at(0);
-      const descriptionInput = header.find(InputBlurChange).at(1);
-
-      expect(nameInput.props().value).toBe(newTitle);
-      expect(descriptionInput.props().value).toBe(newDescription);
-    });
-
-    afterAll(async () => {
-      await MetabaseApi.field_update({
-        id: CREATED_AT_ID,
-        display_name: staticFixtureMetadata.fields[1].display_name,
-        description: staticFixtureMetadata.fields[1].description,
-      });
-    });
-  });
-
-  describe("visibility settings", () => {
-    it("shows correct default visibility", async () => {
-      const { fieldApp } = await initFieldApp({ fieldId: CREATED_AT_ID });
-      const visibilitySelect = fieldApp.find(FieldVisibilityPicker);
-      expect(visibilitySelect.text()).toMatch(/Everywhere/);
-    });
-
-    it("lets you change field visibility", async () => {
-      const { store, fieldApp } = await initFieldApp({
-        fieldId: CREATED_AT_ID,
-      });
-
-      const visibilitySelect = fieldApp.find(FieldVisibilityPicker);
-      click(visibilitySelect);
-      click(
-        visibilitySelect
-          .find(Popover)
-          .find("li")
-          .at(1)
-          .children()
-          .first(),
-      );
-
-      await store.waitForActions([Fields.actions.update]);
-    });
-
-    it("should show the updated visibility setting after a page reload", async () => {
-      const { fieldApp } = await initFieldApp({ fieldId: CREATED_AT_ID });
-
-      const picker = fieldApp.find(FieldVisibilityPicker);
-      expect(picker.text()).toMatch(/Only in detail views/);
-    });
-
-    afterAll(async () => {
-      await MetabaseApi.field_update({
-        id: CREATED_AT_ID,
-        visibility_type: "normal",
-      });
-    });
-  });
-
-  describe("special type and target settings", () => {
-    it("shows the correct default special type for a foreign key", async () => {
-      const { fieldApp } = await initFieldApp({ fieldId: PRODUCT_ID_FK_ID });
-      const picker = fieldApp.find(SpecialTypeAndTargetPicker).text();
-      expect(picker).toMatch(/Foreign KeyProducts → ID/);
-    });
-
-    it("lets you change the type to 'No special type'", async () => {
-      const { store, fieldApp } = await initFieldApp({
-        fieldId: CREATED_AT_ID,
-      });
-
-      const picker = fieldApp.find(SpecialTypeAndTargetPicker);
-      const typeSelect = picker.find(Select).at(0);
-      click(typeSelect);
-
-      const noSpecialTypeButton = typeSelect
-        .find(Popover)
-        .find("li")
-        .last()
-        .children()
-        .first();
-      click(noSpecialTypeButton);
-
-      await store.waitForActions([Fields.actions.update]);
-      expect(picker.text()).toMatch(/Select a special type/);
-    });
-
-    it("lets you change the type to 'Number'", async () => {
-      const { store, fieldApp } = await initFieldApp({
-        fieldId: CREATED_AT_ID,
-      });
-      const picker = fieldApp.find(SpecialTypeAndTargetPicker);
-      const typeSelect = picker.find(Select).at(0);
-      click(typeSelect);
-
-      const noSpecialTypeButton = typeSelect
-        .find(Popover)
-        .find("li")
-        .filterWhere(li => li.text() === "Number")
-        .first()
-        .children()
-        .first();
-
-      click(noSpecialTypeButton);
-
-      await store.waitForActions([Fields.actions.update]);
-      expect(picker.text()).toMatch(/Number/);
-    });
-
-    it("lets you change the type to 'Foreign key' and choose the target field", async () => {
-      const { store, fieldApp } = await initFieldApp({
-        fieldId: CREATED_AT_ID,
-      });
-      const picker = fieldApp.find(SpecialTypeAndTargetPicker);
-      const typeSelect = picker.find(Select).at(0);
-      click(typeSelect);
-
-      const foreignKeyButton = typeSelect
-        .find(Popover)
-        .find("li")
-        .at(2)
-        .children()
-        .first();
-      click(foreignKeyButton);
-      await store.waitForActions([Fields.actions.update]);
-
-      expect(picker.text()).toMatch(/Foreign KeySelect a target/);
-      const fkFieldSelect = picker.find(Select).at(1);
-      click(fkFieldSelect);
-
-      const productIdField = fkFieldSelect
-        .find(Popover)
-        .find("li")
-        .filterWhere(li => /The numerical product number./.test(li.text()))
-        .first()
-        .children()
-        .first();
-
-      click(productIdField);
-      await store.waitForActions([Fields.actions.update]);
-      expect(picker.text()).toMatch(/Foreign KeyProducts → ID/);
-    });
-
-    afterAll(async () => {
-      await MetabaseApi.field_update({
-        id: CREATED_AT_ID,
-        special_type: "type/CreationTimestamp",
-        fk_target_field_id: null,
-      });
-    });
-  });
-
-  describe("display value / remapping settings", () => {
-    it("shows only 'Use original value' for fields without fk and values", async () => {
-      const { fieldApp } = await initFieldApp({ fieldId: CREATED_AT_ID });
-      const section = fieldApp.find(FieldRemapping);
-      const mappingTypePicker = section.find(Select).first();
-      expect(mappingTypePicker.text()).toBe("Use original value");
-
-      click(mappingTypePicker);
-      const pickerOptions = mappingTypePicker.find(Popover).find("li");
-      expect(pickerOptions.map(o => o.text())).toEqual(["Use original value"]);
-    });
-
-    it("lets you change to 'Use foreign key' and change the target for field with fk", async () => {
-      const { store, fieldApp } = await initFieldApp({
-        fieldId: USER_ID_FK_ID,
-      });
-      const section = fieldApp.find(FieldRemapping);
-      const mappingTypePicker = section.find(Select);
-      expect(mappingTypePicker.text()).toBe("Use original value");
-
-      click(mappingTypePicker);
-      const pickerOptions = mappingTypePicker.find(Popover).find("li");
-      expect(pickerOptions.length).toBe(2);
-
-      const useFKButton = pickerOptions
-        .at(1)
-        .children()
-        .first();
-      click(useFKButton);
-      store.waitForActions([
-        Fields.actions.updateFieldDimension,
-        Tables.actions.fetchTableMetadata,
-      ]);
-
-      let fkFieldSelect;
-
-      await eventually(() => {
-        fkFieldSelect = section.find(SelectButton);
-        expect(fkFieldSelect.text()).toBe("Name");
-      });
-
-      click(fkFieldSelect);
-
-      const sourceField = fkFieldSelect
-        .parent()
-        .find(Popover)
-        .find(".List-item")
-        .filterWhere(li => /Source/.test(li.text()))
-        .first()
-        .children()
-        .first();
-
-      click(sourceField);
-      store.waitForActions([Tables.actions.fetchTableMetadata]);
-
-      await eventually(() => {
-        fkFieldSelect = section.find(SelectButton);
-        expect(fkFieldSelect.text()).toBe("Source");
-      });
-    });
-
-    it("doesn't show date fields in fk options", async () => {
-      const { fieldApp } = await initFieldApp({ fieldId: USER_ID_FK_ID });
-      const section = fieldApp.find(FieldRemapping);
-      const mappingTypePicker = section.find(Select);
-      expect(mappingTypePicker.text()).toBe("Use foreign key");
-
-      const fkFieldSelect = section.find(SelectButton);
-      click(fkFieldSelect);
-
-      const popover = fkFieldSelect.parent().find(Popover);
-      expect(popover.length).toBe(1);
-
-      const dateFieldIcons = popover.find("svg.Icon-calendar");
-      expect(dateFieldIcons.length).toBe(0);
-    });
-
-    it("lets you switch back to Use original value after changing to some other value", async () => {
-      const { store, fieldApp } = await initFieldApp({
-        fieldId: USER_ID_FK_ID,
-      });
-      const section = fieldApp.find(FieldRemapping);
-      const mappingTypePicker = section.find(Select);
-      expect(mappingTypePicker.text()).toBe("Use foreign key");
-
-      click(mappingTypePicker);
-      const pickerOptions = mappingTypePicker.find(Popover).find("li");
-      const useOriginalValue = pickerOptions
-        .first()
-        .children()
-        .first();
-      click(useOriginalValue);
-
-      store.waitForActions([
-        Fields.actions.deleteFieldDimension,
-        Tables.actions.fetchTableMetadata,
-      ]);
-    });
-
-    it("forces you to choose the FK field manually if there is no field with Field Name special type", async () => {
-      const { store, fieldApp } = await initFieldApp({
-        fieldId: USER_ID_FK_ID,
-      });
-
-      // Set FK id to `Reviews -> ID`  with a direct metadata update call
-      const field = getMetadata(store.getState()).fields[USER_ID_FK_ID];
-      await store.dispatch(
-        Fields.actions.update({
-          ...field.getPlainObject(),
-          fk_target_field_id: 31,
-        }),
-      );
-
-      const section = fieldApp.find(FieldRemapping);
-      const mappingTypePicker = section.find(Select);
-      expect(mappingTypePicker.text()).toBe("Use original value");
-      click(mappingTypePicker);
-      const pickerOptions = mappingTypePicker.find(Popover).find("li");
-      expect(pickerOptions.length).toBe(2);
-
-      const useFKButton = pickerOptions
-        .at(1)
-        .children()
-        .first();
-      click(useFKButton);
-      store.waitForActions([
-        Fields.actions.updateFieldDimension,
-        Tables.actions.fetchTableMetadata,
-      ]);
-      // TODO: Figure out a way to avoid using delay – the use of delays may lead to occasional CI failures
-      await delay(500);
-
-      expect(section.find(RemappingNamingTip).length).toBe(1);
-
-      dispatchBrowserEvent("mousedown", {
-        e: { target: document.documentElement },
-      });
-      await delay(300); // delay needed because of setState in FieldApp; app.update() does not work for whatever reason
-      expect(section.find(".text-error").length).toBe(1); // warning that you should choose a column
-    });
-
-    it("doesn't let you enter custom remappings for a field with string values", async () => {
-      const { fieldApp } = await initFieldApp({
-        tableId: USER_SOURCE_TABLE_ID,
-        fieldId: USER_SOURCE_ID,
-      });
-      const section = fieldApp.find(FieldRemapping);
-      const mappingTypePicker = section.find(Select);
-
-      expect(mappingTypePicker.text()).toBe("Use original value");
-      click(mappingTypePicker);
-      const pickerOptions = mappingTypePicker.find(Popover).find("li");
-      expect(pickerOptions.length).toBe(1);
-    });
-
-    // TODO: Make sure that product rating is a Category and that a sync has been run
-    it("lets you enter custom remappings for a field with numeral values", async () => {
-      const { store, fieldApp } = await initFieldApp({
-        tableId: PRODUCT_RATING_TABLE_ID,
-        fieldId: PRODUCT_RATING_ID,
-      });
-      const section = fieldApp.find(FieldRemapping);
-      const mappingTypePicker = section.find(Select);
-
-      expect(mappingTypePicker.text()).toBe("Use original value");
-      click(mappingTypePicker);
-      const pickerOptions = mappingTypePicker.find(Popover).find("li");
-      expect(pickerOptions.length).toBe(2);
-
-      const customMappingButton = pickerOptions
-        .at(1)
-        .children()
-        .first();
-      click(customMappingButton);
-
-      store.waitForActions([
-        Fields.actions.updateFieldDimension,
-        Tables.actions.fetchTableMetadata,
-      ]);
-      // TODO: Figure out a way to avoid using delay – using delays may lead to occasional CI failures
-      await delay(500);
-
-      const valueRemappingsSection = section.find(ValueRemappings);
-      expect(valueRemappingsSection.length).toBe(1);
-
-      const fieldValueMappings = valueRemappingsSection.find(FieldValueMapping);
-      expect(fieldValueMappings.length).toBe(5);
-
-      const firstMapping = fieldValueMappings.at(0);
-      expect(firstMapping.find("h3").text()).toBe("1");
-      expect(firstMapping.find(InputBlurChange).props().value).toBe("1");
-      setInputValue(firstMapping.find(InputBlurChange), "Terrible");
-
-      const lastMapping = fieldValueMappings.last();
-      expect(lastMapping.find("h3").text()).toBe("5");
-      expect(lastMapping.find(InputBlurChange).props().value).toBe("5");
-      setInputValue(
-        lastMapping.find(InputBlurChange),
-        "Extraordinarily awesome",
-      );
-
-      const saveButton = valueRemappingsSection.find(ButtonWithStatus);
-      clickButton(saveButton);
-
-      store.waitForActions([Fields.actions.updateFieldValues]);
-    });
-
-    it("shows the updated values after page reload", async () => {
-      const { fieldApp } = await initFieldApp({
-        tableId: PRODUCT_RATING_TABLE_ID,
-        fieldId: PRODUCT_RATING_ID,
-      });
-      const section = fieldApp.find(FieldRemapping);
-      const mappingTypePicker = section.find(Select);
-
-      expect(mappingTypePicker.text()).toBe("Custom mapping");
-      const fieldValueMappings = section.find(FieldValueMapping);
-      expect(
-        fieldValueMappings
-          .first()
-          .find(InputBlurChange)
-          .props().value,
-      ).toBe("Terrible");
-      expect(
-        fieldValueMappings
-          .last()
-          .find(InputBlurChange)
-          .props().value,
-      ).toBe("Extraordinarily awesome");
-    });
-
-    afterAll(async () => {
-      const store = await createTestStore();
-      await store.dispatch(Tables.actions.fetchTableMetadata({ id: 1 }));
-
-      const field = getMetadata(store.getState()).fields[USER_ID_FK_ID];
-      await store.dispatch(
-        Fields.actions.update({
-          ...field.getPlainObject(),
-          fk_target_field_id: 13, // People -> ID
-        }),
-      );
-
-      await store.dispatch(
-        Fields.actions.deleteFieldDimension({ id: USER_ID_FK_ID }),
-      );
-      await store.dispatch(
-        Fields.actions.deleteFieldDimension({ id: PRODUCT_RATING_ID }),
-      );
-
-      // TODO: This is a little hacky – could there be a way to simply reset the user-defined valued?
-      await store.dispatch(
-        Fields.actions.updateFieldValues({ id: PRODUCT_RATING_ID }, [
-          [1, "1"],
-          [2, "2"],
-          [3, "3"],
-          [4, "4"],
-          [5, "5"],
-        ]),
-      );
-    });
-  });
-});
diff --git a/frontend/test/metabase/admin/datamodel/datamodel.e2e.spec.js b/frontend/test/metabase/admin/datamodel/datamodel.e2e.spec.js
deleted file mode 100644
index 082f21cd260..00000000000
--- a/frontend/test/metabase/admin/datamodel/datamodel.e2e.spec.js
+++ /dev/null
@@ -1,226 +0,0 @@
-// Converted from an old Selenium E2E test
-import {
-  useSharedAdminLogin,
-  createTestStore,
-  deleteAllSegments,
-  deleteAllMetrics,
-} from "__support__/e2e";
-import { click, clickButton, setInputValue } from "__support__/enzyme";
-
-import { mount } from "enzyme";
-import { UPDATE_PREVIEW_SUMMARY } from "metabase/admin/datamodel/datamodel";
-import { FETCH_TABLE_METADATA } from "metabase/redux/metadata";
-
-import { Link } from "react-router";
-import ColumnsList from "metabase/admin/datamodel/components/database/ColumnsList";
-import ColumnarSelector from "metabase/components/ColumnarSelector";
-import SegmentsList from "metabase/admin/datamodel/components/database/SegmentsList";
-import OperatorSelector from "metabase/query_builder/components/filters/OperatorSelector";
-import FilterPopover from "metabase/query_builder/components/filters/FilterPopover";
-import SegmentItem from "metabase/admin/datamodel/components/database/SegmentItem";
-import MetricsList from "metabase/admin/datamodel/components/database/MetricsList";
-import MetricItem from "metabase/admin/datamodel/components/database/MetricItem";
-import { MetabaseApi } from "metabase/services";
-import {
-  metrics as Metrics,
-  segments as Segments,
-  databases as Databases,
-  tables as Tables,
-  fields as Fields,
-} from "metabase/entities";
-
-describe("admin/datamodel", () => {
-  beforeAll(async () => useSharedAdminLogin());
-
-  describe("data model editor", () => {
-    it("should allow admin to edit data model", async () => {
-      const store = await createTestStore();
-
-      store.pushPath("/admin/datamodel/database");
-      const app = mount(store.getAppContainer());
-      await store.waitForActions([Tables.actions.fetchList]);
-
-      // Open "Orders" table section
-      const adminListItems = await app.async.find(".AdminList-item");
-      click(adminListItems.at(0));
-      await store.waitForActions([Tables.actions.fetchMetadata]);
-
-      // Toggle its visibility to "Hidden"
-      const visibilityToggle = await app.async.find("#VisibilityTypes > span");
-      click(visibilityToggle.at(1));
-      await store.waitForActions([Tables.actions.update]);
-
-      // Toggle "Why hide" to "Irrelevant/Cruft"
-      click(app.find("#VisibilitySubTypes > span").at(2));
-      await store.waitForActions([Tables.actions.update]);
-
-      // Unhide
-      click(app.find("#VisibilityTypes > span").at(0));
-
-      // Open "People" table section
-      click(adminListItems.at(1));
-      await store.waitForActions([Tables.actions.fetchMetadata]);
-
-      // hide fields from people table
-      // Set Address field to "Only in Detail Views"
-      const columnsListItems = (await app.async.find(ColumnsList)).find("li");
-
-      click(columnsListItems.first().find(".TableEditor-field-visibility"));
-      const onlyInDetailViewsRow = app
-        .find(ColumnarSelector)
-        .find(".ColumnarSelector-row")
-        .at(1);
-      expect(onlyInDetailViewsRow.text()).toMatch(/Only in detail views/);
-      click(onlyInDetailViewsRow);
-      await store.waitForActions([Fields.actions.update]);
-
-      // Set Birth Date field to "Do Not Include"
-      click(columnsListItems.at(1).find(".TableEditor-field-visibility"));
-      // different ColumnarSelector than before so do a new lookup
-      const doNotIncludeRow = app
-        .find(ColumnarSelector)
-        .find(".ColumnarSelector-row")
-        .at(2);
-      expect(doNotIncludeRow.text()).toMatch(/Do not include/);
-      click(doNotIncludeRow);
-
-      await store.waitForActions([Fields.actions.update]);
-
-      // modify special type for address field
-      click(columnsListItems.first().find(".TableEditor-field-special-type"));
-      const entityNameTypeRow = app
-        .find(ColumnarSelector)
-        .find(".ColumnarSelector-row")
-        .at(1);
-      expect(entityNameTypeRow.text()).toMatch(/Entity Name/);
-      click(entityNameTypeRow);
-      await store.waitForActions([Fields.actions.update]);
-
-      // TODO Atte Keinänen 8/9/17: Currently this test doesn't validate that the updates actually are reflected in QB
-    });
-
-    it("should allow admin to create segments", async () => {
-      const store = await createTestStore();
-
-      // Open the People table admin page
-      store.pushPath("/admin/datamodel/database/1/table/2");
-      const app = mount(store.getAppContainer());
-
-      await store.waitForActions([
-        Databases.actions.fetchList,
-        Databases.actions.fetchIdfields,
-      ]);
-
-      // Click the new segment button and check that we get properly redirected
-      click(app.find(SegmentsList).find(Link));
-      expect(store.getPath()).toBe("/admin/datamodel/segment/create?table=2");
-      await store.waitForActions([
-        FETCH_TABLE_METADATA,
-        UPDATE_PREVIEW_SUMMARY,
-      ]);
-
-      // Add "Email Is Not gmail" filter
-      click(app.find(".GuiBuilder-filtered-by a").first());
-
-      const filterPopover = app.find(FilterPopover);
-      click(filterPopover.find('[children="Email"]'));
-
-      // click to expand options
-      const operatorSelector = filterPopover.find(OperatorSelector);
-      click(operatorSelector);
-      // click "Is Not"
-      clickButton(operatorSelector.find('[children="Is not"]'));
-
-      setInputValue(filterPopover.find("input"), "gmail");
-      await clickButton(filterPopover.find('[children="Add filter"]'));
-
-      await store.waitForActions([UPDATE_PREVIEW_SUMMARY]);
-
-      // Add name and description
-      setInputValue(app.find("input[name='name']"), "Gmail users");
-      setInputValue(app.find("textarea[name='description']"), "change");
-
-      // Save the segment
-      click(app.find('button[children="Save changes"]'));
-
-      await store.waitForActions([
-        Segments.actions.create,
-        Databases.actions.fetchList,
-      ]);
-      expect(store.getPath()).toBe("/admin/datamodel/database/1/table/2");
-
-      // Validate that the segment got actually added
-      expect(
-        app
-          .find(SegmentsList)
-          .find(SegmentItem)
-          .first()
-          .text(),
-      ).toEqual("Gmail usersFiltered by Email");
-    });
-
-    it("should allow admin to create metrics", async () => {
-      const store = await createTestStore();
-
-      // Open the People table admin page
-      store.pushPath("/admin/datamodel/database/1/table/2");
-      const app = mount(store.getAppContainer());
-
-      await store.waitForActions([
-        Databases.actions.fetchList,
-        Databases.actions.fetchIdfields,
-      ]);
-
-      // Click the new metric button and check that we get properly redirected
-      click(app.find(MetricsList).find(Link));
-      expect(store.getPath()).toBe("/admin/datamodel/metric/create?table=2");
-      await store.waitForActions([
-        FETCH_TABLE_METADATA,
-        UPDATE_PREVIEW_SUMMARY,
-      ]);
-
-      click(app.find("AggregationWidget"));
-      click(
-        app.find("AggregationPopover").find('h4[children="Count of rows"]'),
-      );
-
-      setInputValue(app.find("input[name='name']"), "User count");
-      setInputValue(
-        app.find("textarea[name='description']"),
-        "Total number of users",
-      );
-
-      // Save the metric
-      click(app.find('button[children="Save changes"]'));
-
-      await store.waitForActions([
-        Metrics.actions.create,
-        Databases.actions.fetchList,
-      ]);
-      expect(store.getPath()).toBe("/admin/datamodel/database/1/table/2");
-
-      // Validate that the segment got actually added
-      expect(
-        app
-          .find(MetricsList)
-          .find(MetricItem)
-          .first()
-          .text(),
-      ).toEqual("User countCount");
-    });
-
-    afterAll(() =>
-      Promise.all([
-        MetabaseApi.table_update({ id: 1, visibility_type: null }), // Sample Dataset
-        MetabaseApi.field_update({
-          id: 8,
-          visibility_type: "normal",
-          special_type: null,
-        }), // Address
-        MetabaseApi.field_update({ id: 9, visibility_type: "normal" }), // Address
-        deleteAllSegments(),
-        deleteAllMetrics(),
-      ]),
-    );
-  });
-});
diff --git a/frontend/test/metabase/admin/people/people.cy.spec.js b/frontend/test/metabase/admin/people/people.cy.spec.js
index 7ed0d9819b8..6ea543bc673 100644
--- a/frontend/test/metabase/admin/people/people.cy.spec.js
+++ b/frontend/test/metabase/admin/people/people.cy.spec.js
@@ -6,11 +6,11 @@ describe("admin/people", () => {
 
   describe("user management", () => {
     it("should render", () => {
-      cy.visit("admin/people");
+      cy.visit("/admin/people");
       cy.contains("People");
     });
     it("should allow admin to create new users", () => {
-      cy.visit("admin/people");
+      cy.visit("/admin/people");
       cy.contains("Add someone").click();
       cy.contains("First name")
         .next()
diff --git a/frontend/test/metabase/admin/settings/settings.cy.spec.js b/frontend/test/metabase/admin/settings/settings.cy.spec.js
index 78ad257abd3..a341369230a 100644
--- a/frontend/test/metabase/admin/settings/settings.cy.spec.js
+++ b/frontend/test/metabase/admin/settings/settings.cy.spec.js
@@ -8,7 +8,7 @@ describe("admin/settings", () => {
     cy.server();
     cy.route("PUT", "**/admin-email").as("saveSettings");
 
-    cy.visit("admin/settings/general");
+    cy.visit("/admin/settings/general");
 
     // aliases don't last past refreshes, so create a function to grab the input
     // rather than aliasing it with .as()
@@ -25,7 +25,7 @@ describe("admin/settings", () => {
       .blur();
     cy.wait("@saveSettings");
 
-    cy.visit("admin/settings/general");
+    cy.visit("/admin/settings/general");
     // after we refreshed, the field should still be "other.email"
     emailInput().should("have.value", "other.email@metabase.com");
 
@@ -42,7 +42,7 @@ describe("admin/settings", () => {
     cy.route("PUT", "**/custom-formatting").as("saveFormatting");
 
     // update the formatting
-    cy.visit("admin/settings/formatting");
+    cy.visit("/admin/settings/formatting");
     cy.contains("17:24 (24-hour clock)").click();
     cy.wait("@saveFormatting");
 
@@ -54,7 +54,7 @@ describe("admin/settings", () => {
     cy.contains(/^February 11, 2019, 21:40$/).debug();
 
     // reset the formatting
-    cy.visit("admin/settings/formatting");
+    cy.visit("/admin/settings/formatting");
     cy.contains("5:24 PM (12-hour clock)").click();
     cy.wait("@saveFormatting");
 
diff --git a/frontend/test/metabase/internal/__snapshots__/components.unit.spec.js.snap b/frontend/test/metabase/internal/__snapshots__/components.unit.spec.js.snap
index 275bdc473ae..d676ac03290 100644
--- a/frontend/test/metabase/internal/__snapshots__/components.unit.spec.js.snap
+++ b/frontend/test/metabase/internal/__snapshots__/components.unit.spec.js.snap
@@ -967,7 +967,7 @@ exports[`Radio should render "vertical" correctly 1`] = `
 </ul>
 `;
 
-exports[`Select should render "Default" correctly 1`] = `
+exports[`Select should render "default" correctly 1`] = `
 <a
   className="no-decoration"
   id={undefined}
@@ -975,23 +975,32 @@ exports[`Select should render "Default" correctly 1`] = `
   style={undefined}
 >
   <div
-    className="AdminSelect flex align-center"
+    className="AdminSelect"
     style={undefined}
   >
     <span
-      className="AdminSelect-content mr1"
-    />
-    <svg
-      className="Icon Icon-chevrondown AdminSelect-chevron flex-align-right Icon-cxuQhR kTAgZA"
-      fill="currentcolor"
-      height={12}
-      viewBox="0 0 32 32"
-      width={12}
+      className="flex align-center"
     >
-      <path
-        d="M1 12 L16 26 L31 12 L27 8 L16 18 L5 8 z "
-      />
-    </svg>
+      <span
+        className="AdminSelect-content mr1"
+      >
+        <span>
+          Entity Key
+          
+        </span>
+      </span>
+      <svg
+        className="Icon Icon-chevrondown AdminSelect-chevron flex-align-right Icon-cxuQhR kTAgZA"
+        fill="currentcolor"
+        height={12}
+        viewBox="0 0 32 32"
+        width={12}
+      >
+        <path
+          d="M1 12 L16 26 L31 12 L27 8 L16 18 L5 8 z "
+        />
+      </svg>
+    </span>
   </div>
   <span
     className="hide"
@@ -999,7 +1008,7 @@ exports[`Select should render "Default" correctly 1`] = `
 </a>
 `;
 
-exports[`Select should render "With search" correctly 1`] = `
+exports[`Select should render "kitchen_sink" correctly 1`] = `
 <a
   className="no-decoration"
   id={undefined}
@@ -1007,23 +1016,163 @@ exports[`Select should render "With search" correctly 1`] = `
   style={undefined}
 >
   <div
-    className="AdminSelect flex align-center"
+    className="AdminSelect"
     style={undefined}
   >
     <span
-      className="AdminSelect-content mr1"
-    />
-    <svg
-      className="Icon Icon-chevrondown AdminSelect-chevron flex-align-right Icon-cxuQhR kTAgZA"
-      fill="currentcolor"
-      height={12}
-      viewBox="0 0 32 32"
-      width={12}
+      className="flex align-center"
     >
-      <path
-        d="M1 12 L16 26 L31 12 L27 8 L16 18 L5 8 z "
-      />
-    </svg>
+      <span
+        className="AdminSelect-content mr1"
+      >
+        <span>
+          Entity Key
+          , 
+        </span>
+        <span>
+          Avatar Image URL
+          
+        </span>
+      </span>
+      <svg
+        className="Icon Icon-chevrondown AdminSelect-chevron flex-align-right Icon-cxuQhR kTAgZA"
+        fill="currentcolor"
+        height={12}
+        viewBox="0 0 32 32"
+        width={12}
+      >
+        <path
+          d="M1 12 L16 26 L31 12 L27 8 L16 18 L5 8 z "
+        />
+      </svg>
+    </span>
+  </div>
+  <span
+    className="hide"
+  />
+</a>
+`;
+
+exports[`Select should render "multiple" correctly 1`] = `
+<a
+  className="no-decoration"
+  id={undefined}
+  onClick={[Function]}
+  style={undefined}
+>
+  <div
+    className="AdminSelect"
+    style={undefined}
+  >
+    <span
+      className="flex align-center"
+    >
+      <span
+        className="AdminSelect-content mr1"
+      >
+        <span>
+          Entity Key
+          , 
+        </span>
+        <span>
+          Avatar Image URL
+          
+        </span>
+      </span>
+      <svg
+        className="Icon Icon-chevrondown AdminSelect-chevron flex-align-right Icon-cxuQhR kTAgZA"
+        fill="currentcolor"
+        height={12}
+        viewBox="0 0 32 32"
+        width={12}
+      >
+        <path
+          d="M1 12 L16 26 L31 12 L27 8 L16 18 L5 8 z "
+        />
+      </svg>
+    </span>
+  </div>
+  <span
+    className="hide"
+  />
+</a>
+`;
+
+exports[`Select should render "search" correctly 1`] = `
+<a
+  className="no-decoration"
+  id={undefined}
+  onClick={[Function]}
+  style={undefined}
+>
+  <div
+    className="AdminSelect"
+    style={undefined}
+  >
+    <span
+      className="flex align-center"
+    >
+      <span
+        className="AdminSelect-content mr1"
+      >
+        <span>
+          Entity Key
+          
+        </span>
+      </span>
+      <svg
+        className="Icon Icon-chevrondown AdminSelect-chevron flex-align-right Icon-cxuQhR kTAgZA"
+        fill="currentcolor"
+        height={12}
+        viewBox="0 0 32 32"
+        width={12}
+      >
+        <path
+          d="M1 12 L16 26 L31 12 L27 8 L16 18 L5 8 z "
+        />
+      </svg>
+    </span>
+  </div>
+  <span
+    className="hide"
+  />
+</a>
+`;
+
+exports[`Select should render "sections" correctly 1`] = `
+<a
+  className="no-decoration"
+  id={undefined}
+  onClick={[Function]}
+  style={undefined}
+>
+  <div
+    className="AdminSelect"
+    style={undefined}
+  >
+    <span
+      className="flex align-center"
+    >
+      <span
+        className="AdminSelect-content mr1"
+      >
+        <span>
+          Entity Key
+          
+        </span>
+      </span>
+      <svg
+        className="Icon Icon-chevrondown AdminSelect-chevron flex-align-right Icon-cxuQhR kTAgZA"
+        fill="currentcolor"
+        height={12}
+        viewBox="0 0 32 32"
+        width={12}
+      >
+        <path
+          d="M1 12 L16 26 L31 12 L27 8 L16 18 L5 8 z "
+        />
+      </svg>
+    </span>
   </div>
   <span
     className="hide"
diff --git a/frontend/test/metabase/public/public.e2e.spec.js b/frontend/test/metabase/public/public.e2e.spec.js
deleted file mode 100644
index 38962d82e82..00000000000
--- a/frontend/test/metabase/public/public.e2e.spec.js
+++ /dev/null
@@ -1,620 +0,0 @@
-jest.mock("metabase/components/ExplicitSize");
-
-// Converted from an old Selenium E2E test
-import {
-  useSharedAdminLogin,
-  logout,
-  createTestStore,
-  createDashboard,
-  restorePreviousLogin,
-  waitForRequestToComplete,
-  eventually,
-} from "__support__/e2e";
-
-import _ from "underscore";
-import jwt from "jsonwebtoken";
-
-import { click, clickButton, setInputValue } from "__support__/enzyme";
-
-import { mount } from "enzyme";
-
-import { LOAD_CURRENT_USER } from "metabase/redux/user";
-import {
-  INITIALIZE_SETTINGS,
-  UPDATE_SETTING,
-  updateSetting,
-} from "metabase/admin/settings/settings";
-import SettingToggle from "metabase/admin/settings/components/widgets/SettingToggle";
-import Toggle from "metabase/components/Toggle";
-import EmbeddingLegalese from "metabase/admin/settings/components/widgets/EmbeddingLegalese";
-import {
-  CREATE_PUBLIC_LINK,
-  INITIALIZE_QB,
-  API_CREATE_QUESTION,
-  QUERY_COMPLETED,
-  RUN_QUERY,
-  setDatasetQuery,
-  UPDATE_EMBEDDING_PARAMS,
-  UPDATE_ENABLE_EMBEDDING,
-  UPDATE_TEMPLATE_TAG,
-  SET_IS_SHOWING_TEMPLATE_TAGS_EDITOR,
-} from "metabase/query_builder/actions";
-import NativeQueryEditor from "metabase/query_builder/components/NativeQueryEditor";
-import { delay } from "metabase/lib/promise";
-import TagEditorSidebar from "metabase/query_builder/components/template_tags/TagEditorSidebar";
-import { getQuery } from "metabase/query_builder/selectors";
-import {
-  ADD_PARAM_VALUES,
-  FETCH_TABLE_METADATA,
-} from "metabase/redux/metadata";
-import {
-  FETCH_DASHBOARD_CARD_DATA,
-  FETCH_CARD_DATA,
-} from "metabase/dashboard/dashboard";
-
-import Select from "metabase/components/Select";
-import RunButton from "metabase/query_builder/components/RunButton";
-import Scalar from "metabase/visualizations/visualizations/Scalar";
-import ParameterFieldWidget from "metabase/parameters/components/widgets/ParameterFieldWidget";
-import TextWidget from "metabase/parameters/components/widgets/TextWidget";
-import SaveQuestionModal from "metabase/containers/SaveQuestionModal";
-import SharingPane from "metabase/public/components/widgets/SharingPane";
-import { EmbedTitle } from "metabase/public/components/widgets/EmbedModalContent";
-import PreviewPane from "metabase/public/components/widgets/PreviewPane";
-import CopyWidget from "metabase/components/CopyWidget";
-import ListSearchField from "metabase/components/ListSearchField";
-import * as Urls from "metabase/lib/urls";
-import { QuestionEmbedWidgetTrigger } from "metabase/query_builder/containers/QuestionEmbedWidget";
-
-import { CardApi, DashboardApi, SettingsApi } from "metabase/services";
-
-const PEOPLE_TABLE_ID = 2;
-const PEOPLE_PK_FIELD_ID = 13;
-
-async function setQueryText(store, queryText) {
-  // We don't have Ace editor so we have to trigger the Redux action manually
-  const newDatasetQuery = getQuery(store.getState())
-    .setQueryText(queryText)
-    .datasetQuery();
-
-  return store.dispatch(setDatasetQuery(newDatasetQuery));
-}
-
-const getRelativeUrlWithoutHash = url =>
-  url.replace(/#.*$/, "").replace(/http:\/\/.*?\//, "/");
-
-const COUNT_ALL = "200";
-const COUNT_DOOHICKEY = "42";
-const COUNT_GADGET = "53";
-
-describe("public/embedded", () => {
-  beforeAll(async () => useSharedAdminLogin());
-
-  describe("questions", () => {
-    let publicUrl = null;
-    let embedUrl = null;
-
-    it("should allow users to enable public sharing", async () => {
-      const store = await createTestStore();
-
-      // load public sharing settings
-      store.pushPath("/admin/settings/public_sharing");
-      const app = mount(store.getAppContainer());
-
-      await store.waitForActions([LOAD_CURRENT_USER, INITIALIZE_SETTINGS]);
-
-      // // if enabled, disable it so we're in a known state
-      // // TODO Atte Keinänen 8/9/17: This should be done with a direct API call in afterAll instead
-      const enabledToggleContainer = app.find(SettingToggle).first();
-
-      expect(enabledToggleContainer.text()).toBe("Disabled");
-
-      // toggle it on
-      click(enabledToggleContainer.find(Toggle));
-      await store.waitForActions([UPDATE_SETTING]);
-
-      // make sure it's enabled
-      expect(enabledToggleContainer.text()).toBe("Enabled");
-    });
-
-    it("should allow users to enable embedding", async () => {
-      const store = await createTestStore();
-
-      // load public sharing settings
-      store.pushPath("/admin/settings/embedding_in_other_applications");
-      const app = mount(store.getAppContainer());
-
-      await store.waitForActions([LOAD_CURRENT_USER, INITIALIZE_SETTINGS]);
-
-      click(app.find(EmbeddingLegalese).find('button[children="Enable"]'));
-      await store.waitForActions([UPDATE_SETTING]);
-
-      expect(app.find(EmbeddingLegalese).length).toBe(0);
-      const enabledToggleContainer = app.find(SettingToggle).first();
-      expect(enabledToggleContainer.text()).toBe("Enabled");
-    });
-
-    // Note: Test suite is sequential, so individual test cases can't be run individually
-    it("should allow users to create parameterized SQL questions", async () => {
-      // Don't render Ace editor in tests because it uses many DOM methods that aren't supported by jsdom
-      // NOTE Atte Keinänen 8/9/17: Ace provides a MockRenderer class which could be used for pseudo-rendering and
-      // testing Ace editor in tests, but it doesn't render stuff to DOM so I'm not sure how practical it would be
-      NativeQueryEditor.prototype.loadAceEditor = () => {};
-      NativeQueryEditor.prototype._updateSize = () => {};
-
-      const store = await createTestStore();
-
-      store.pushPath("/");
-      const app = mount(store.getAppContainer());
-
-      await delay(500);
-
-      click(app.find(".Icon-sql"));
-      await store.waitForActions([INITIALIZE_QB]);
-
-      await setQueryText(
-        store,
-        "select count(*) from products where {{category}}",
-      );
-
-      await store.waitForActions([SET_IS_SHOWING_TEMPLATE_TAGS_EDITOR]);
-      const tagEditorSidebar = app.find(TagEditorSidebar);
-
-      click(tagEditorSidebar.find("SelectButton"));
-
-      const fieldFilterVarType = tagEditorSidebar
-        .find(".ColumnarSelector-row")
-        .at(3);
-      expect(fieldFilterVarType.text()).toBe("Field Filter");
-      click(fieldFilterVarType);
-
-      // there's an async error here for some reason
-      await store.waitForActions([UPDATE_TEMPLATE_TAG]);
-
-      await delay(500);
-
-      const productsRow = tagEditorSidebar
-        .find(".TestPopoverBody .List-section")
-        .at(4)
-        .find("a");
-      expect(productsRow.text()).toBe("Products");
-      click(productsRow);
-
-      // Table fields should be loaded on-the-fly before showing the field selector
-      await store.waitForActions(FETCH_TABLE_METADATA);
-      // Needed due to state update after fetching metadata
-      await delay(100);
-
-      const searchField = tagEditorSidebar
-        .find(".TestPopoverBody")
-        .find(ListSearchField)
-        .find("input")
-        .first();
-      setInputValue(searchField, "cat");
-
-      const categoryRow = tagEditorSidebar
-        .find(".TestPopoverBody .List-section")
-        .at(2)
-        .find("a");
-      expect(categoryRow.text()).toBe("Category");
-      click(categoryRow);
-
-      await store.waitForActions([UPDATE_TEMPLATE_TAG]);
-
-      // close the template variable sidebar
-      click(tagEditorSidebar.find(".Icon-close"));
-
-      // test without the parameter
-      click(app.find(RunButton).first());
-      await store.waitForActions([RUN_QUERY, QUERY_COMPLETED]);
-      expect(app.find(Scalar).text()).toBe(COUNT_ALL);
-
-      // test the parameter
-      const parameter = app.find(ParameterFieldWidget).first();
-      click(parameter.find("div").first());
-      click(parameter.find('[children="Doohickey"]'));
-
-      clickButton(parameter.find(".Button"));
-      click(app.find(RunButton).first());
-      await store.waitForActions([RUN_QUERY, QUERY_COMPLETED]);
-      expect(app.find(Scalar).text()).toBe(COUNT_DOOHICKEY);
-
-      // save the question, required for public link/embedding
-      click(app.find('[children="Save"]'));
-
-      setInputValue(
-        app.find(SaveQuestionModal).find("input[name='name']"),
-        "sql parametrized",
-      );
-
-      clickButton(
-        app
-          .find(SaveQuestionModal)
-          .find("button")
-          .last(),
-      );
-      await store.waitForActions([API_CREATE_QUESTION]);
-      await delay(100);
-
-      click(app.find('#QuestionSavedModal .Button[children="Not now"]'));
-      // wait for modal to close :'(
-      await delay(500);
-
-      // open sharing panel
-      click(app.find(QuestionEmbedWidgetTrigger));
-
-      // "Embed this question in an application"
-      click(
-        app
-          .find(SharingPane)
-          .find("h3")
-          .last(),
-      );
-
-      // currently only one Select is present, but verify it's the right one
-      expect(app.find(Select).text()).toBe("Disabled");
-      // make the parameter editable
-      click(app.find(Select));
-
-      click(app.find(".TestPopoverBody .Icon-pencil"));
-
-      await delay(500);
-
-      click(app.find("div[children='Publish']"));
-      await store.waitForActions([
-        UPDATE_ENABLE_EMBEDDING,
-        UPDATE_EMBEDDING_PARAMS,
-      ]);
-
-      // save the embed url for next tests
-      embedUrl = getRelativeUrlWithoutHash(
-        app
-          .find(PreviewPane)
-          .find("iframe")
-          .prop("src"),
-      );
-
-      // back to main share panel
-      click(app.find(EmbedTitle));
-
-      // toggle public link on
-      click(app.find(SharingPane).find(Toggle));
-      await store.waitForActions([CREATE_PUBLIC_LINK]);
-
-      // save the public url for next tests
-      publicUrl = getRelativeUrlWithoutHash(
-        app
-          .find(CopyWidget)
-          .find("input")
-          .first()
-          .prop("value"),
-      );
-    });
-
-    describe("as an anonymous user", () => {
-      beforeAll(() => logout());
-
-      async function runSharedQuestionTests(store, questionUrl, apiRegex) {
-        store.pushPath(questionUrl);
-        const app = mount(store.getAppContainer());
-
-        await store.waitForActions([ADD_PARAM_VALUES]);
-
-        // Loading the query results is done in PublicQuestion itself so we have to listen to API request instead of Redux action
-        await waitForRequestToComplete("GET", apiRegex);
-        // use `update()` because of setState
-        expect(
-          app
-            .update()
-            .find(Scalar)
-            .text(),
-        ).toBe(COUNT_ALL + "sql parametrized");
-
-        // NOTE: parameters tests moved to parameters.e2e.spec.js
-
-        // set parameter via url
-        store.pushPath("/"); // simulate a page reload by visiting other page
-        store.pushPath(questionUrl + "?category=Gadget");
-        await waitForRequestToComplete("GET", apiRegex);
-        // use `update()` because of setState
-        await eventually(() =>
-          expect(
-            app
-              .update()
-              .find(Scalar)
-              .text(),
-          ).toBe(COUNT_GADGET + "sql parametrized"),
-        );
-      }
-
-      it("should allow seeing an embedded question", async () => {
-        if (!embedUrl) {
-          throw new Error(
-            "This test fails because previous tests didn't produce an embed url.",
-          );
-        }
-        const embedUrlTestStore = await createTestStore({ embedApp: true });
-        await runSharedQuestionTests(
-          embedUrlTestStore,
-          embedUrl,
-          new RegExp("/api/embed/card/.*/query"),
-        );
-      });
-
-      it("should allow seeing a public question", async () => {
-        if (!publicUrl) {
-          throw new Error(
-            "This test fails because previous tests didn't produce a public url.",
-          );
-        }
-        const publicUrlTestStore = await createTestStore({ publicApp: true });
-        await runSharedQuestionTests(
-          publicUrlTestStore,
-          publicUrl,
-          new RegExp("/api/public/card/.*/query"),
-        );
-      });
-
-      // I think it's cleanest to restore the login here so that there are no surprises if you want to add tests
-      // that expect that we're already logged in
-      afterAll(() => restorePreviousLogin());
-    });
-  });
-
-  describe("dashboards", () => {
-    let publicDashUrl = null;
-    let embedDashUrl = null;
-    let dashboardId = null;
-    let sqlCardId = null;
-    let mbqlCardId = null;
-
-    it("should allow creating a public/embedded Dashboard with parameters", async () => {
-      // create a Dashboard
-      const dashboard = await createDashboard({
-        name: "Test Dashboard",
-        parameters: [
-          { name: "Num", slug: "num", id: "537e37b4", type: "category" },
-          {
-            name: "People ID",
-            slug: "people_id",
-            id: "22486e00",
-            type: "people_id",
-          },
-        ],
-      });
-      dashboardId = dashboard.id;
-
-      // create the 2 Cards we will need
-      const sqlCard = await CardApi.create({
-        name: "SQL Card",
-        display: "scalar",
-        visualization_settings: {},
-        dataset_query: {
-          database: 1,
-          type: "native",
-          native: {
-            query: "SELECT {{num}} AS num",
-            "template-tags": {
-              num: {
-                name: "num",
-                display_name: "Num",
-                type: "number",
-                required: true,
-                default: 1,
-              },
-            },
-          },
-        },
-      });
-      sqlCardId = sqlCard.id;
-
-      const mbqlCard = await CardApi.create({
-        name: "MBQL Card",
-        display: "scalar",
-        visualization_settings: {},
-        dataset_query: {
-          database: 1,
-          type: "query",
-          query: {
-            "source-table": PEOPLE_TABLE_ID,
-            aggregation: [["count"]],
-          },
-        },
-      });
-      mbqlCardId = mbqlCard.id;
-
-      // add the two Cards to the Dashboard
-      const sqlDashcard = await DashboardApi.addcard({
-        dashId: dashboard.id,
-        cardId: sqlCard.id,
-      });
-      const mbqlDashcard = await DashboardApi.addcard({
-        dashId: dashboard.id,
-        cardId: mbqlCard.id,
-      });
-
-      // wire up the params for the Cards
-      await DashboardApi.reposition_cards({
-        dashId: dashboard.id,
-        cards: [
-          {
-            id: sqlDashcard.id,
-            card_id: sqlCard.id,
-            row: 0,
-            col: 0,
-            sizeX: 4,
-            sizeY: 4,
-            series: [],
-            visualization_settings: {},
-            parameter_mappings: [
-              {
-                card_id: sqlCard.id,
-                target: ["variable", ["template-tag", "num"]],
-                parameter_id: "537e37b4",
-              },
-            ],
-          },
-          {
-            id: mbqlDashcard.id,
-            card_id: mbqlCard.id,
-            row: 0,
-            col: 4,
-            sizeX: 4,
-            sizeY: 4,
-            series: [],
-            visualization_settings: {},
-            parameter_mappings: [
-              {
-                card_id: mbqlCard.id,
-                target: ["dimension", ["field-id", PEOPLE_PK_FIELD_ID]],
-                parameter_id: "22486e00",
-              },
-            ],
-          },
-        ],
-      });
-
-      // make the Dashboard public + save the URL
-      const publicDash = await DashboardApi.createPublicLink({
-        id: dashboard.id,
-      });
-      publicDashUrl = getRelativeUrlWithoutHash(
-        Urls.publicDashboard(publicDash.uuid),
-      );
-
-      // make the Dashboard embeddable + make params editable + save the URL
-      await DashboardApi.update({
-        id: dashboard.id,
-        embedding_params: {
-          num: "enabled",
-          people_id: "enabled",
-        },
-        enable_embedding: true,
-      });
-
-      const settings = await SettingsApi.list();
-      const secretKey = _.findWhere(settings, { key: "embedding-secret-key" })
-        .value;
-
-      const token = jwt.sign(
-        {
-          resource: {
-            dashboard: dashboard.id,
-          },
-          params: {},
-        },
-        secretKey,
-      );
-      embedDashUrl = Urls.embedDashboard(token);
-    });
-
-    describe("as an anonymous user", () => {
-      beforeAll(() => logout());
-
-      async function runSharedDashboardTests(store, dashUrl) {
-        store.pushPath(dashUrl);
-
-        const app = mount(store.getAppContainer());
-
-        const getValueOfCard = index =>
-          app
-            .update()
-            .find(Scalar)
-            .find(".ScalarValue")
-            .at(index)
-            .text();
-
-        const getValueOfSqlCard = () => getValueOfCard(0);
-        const getValueOfMbqlCard = () => getValueOfCard(1);
-
-        const waitForDashToReload = async () => {
-          // TODO - not sure what the correct way to wait for the cards to reload is
-          await store.waitForActions([
-            FETCH_DASHBOARD_CARD_DATA,
-            FETCH_CARD_DATA,
-          ]);
-          await delay(500);
-        };
-
-        await waitForDashToReload();
-
-        // check that initial value of SQL Card is 1
-        await eventually(() => expect(getValueOfSqlCard()).toBe("1"));
-
-        // check that initial value of People Count MBQL Card is 2500 (or whatever people.count is supposed to be)
-        await eventually(() => expect(getValueOfMbqlCard()).toBe("2,500"));
-
-        // now set the SQL param to '50' & wait for Dashboard to reload. check that value of SQL Card is updated
-        app
-          .update()
-          .find(TextWidget)
-          .first()
-          .props()
-          .setValue("50");
-        await waitForDashToReload();
-        await eventually(() => expect(getValueOfSqlCard()).toBe("50"));
-
-        // now set our MBQL param' & wait for Dashboard to reload. check that value of the MBQL Card is updated
-        app
-          .update()
-          .find(ParameterFieldWidget)
-          .first()
-          .props()
-          .setValue("40");
-        await waitForDashToReload();
-        await eventually(() => expect(getValueOfMbqlCard()).toBe("1"));
-      }
-
-      it("should handle parameters in public Dashboards correctly", async () => {
-        if (!publicDashUrl) {
-          throw new Error(
-            "This test fails because test setup code didn't produce a public Dashboard URL.",
-          );
-        }
-
-        const publicUrlTestStore = await createTestStore({ publicApp: true });
-        await runSharedDashboardTests(publicUrlTestStore, publicDashUrl);
-      });
-
-      it("should handle parameters in embedded Dashboards correctly", async () => {
-        if (!embedDashUrl) {
-          throw new Error(
-            "This test fails because test setup code didn't produce a embedded Dashboard URL.",
-          );
-        }
-
-        const embedUrlTestStore = await createTestStore({ embedApp: true });
-        await runSharedDashboardTests(embedUrlTestStore, embedDashUrl);
-      });
-      afterAll(restorePreviousLogin);
-    });
-
-    afterAll(() => {
-      // delete the Dashboard & Cards we created
-      DashboardApi.update({
-        id: dashboardId,
-        archived: true,
-      });
-      CardApi.update({
-        id: sqlCardId,
-        archived: true,
-      });
-      CardApi.update({
-        id: mbqlCardId,
-        archived: true,
-      });
-    });
-  });
-
-  afterAll(async () => {
-    const store = await createTestStore();
-
-    // Disable public sharing and embedding after running tests
-    await store.dispatch(
-      updateSetting({ key: "enable-public-sharing", value: false }),
-    );
-    await store.dispatch(
-      updateSetting({ key: "enable-embedding", value: false }),
-    );
-  });
-});
diff --git a/frontend/test/metabase/reference/databases.cy.spec.js b/frontend/test/metabase/reference/databases.cy.spec.js
index 3606c1d5aab..adcbc18f00a 100644
--- a/frontend/test/metabase/reference/databases.cy.spec.js
+++ b/frontend/test/metabase/reference/databases.cy.spec.js
@@ -5,18 +5,18 @@ describe("sample database reference", () => {
   beforeEach(signInAsAdmin);
 
   it("should see the listing", () => {
-    cy.visit("reference/databases");
+    cy.visit("/reference/databases");
     cy.contains("Sample Dataset");
   });
 
   xit("should let the user navigate to details", () => {
-    cy.visit("reference/databases");
+    cy.visit("/reference/databases");
     cy.contains("Sample Dataset").click();
     cy.contains("Why this database is interesting");
   });
 
   it("should let an admin edit details about the database", () => {
-    cy.visit("reference/databases/1");
+    cy.visit("/reference/databases/1");
     cy.contains("Edit").click();
     // Q - is there any cleaner way to get a nearby element without having to know the DOM?
     cy.contains("Description")
@@ -29,7 +29,7 @@ describe("sample database reference", () => {
   });
 
   it("should let an admin start to edit and cancel without saving", () => {
-    cy.visit("reference/databases/1");
+    cy.visit("/reference/databases/1");
     cy.contains("Edit").click();
     // Q - is there any cleaner way to get a nearby element without having to know the DOM?
     cy.contains("Why this")
@@ -42,7 +42,7 @@ describe("sample database reference", () => {
   });
 
   it("should let an admin edit the database name", () => {
-    cy.visit("reference/databases/1");
+    cy.visit("/reference/databases/1");
     cy.contains("Edit").click();
     cy.get(".wrapper input")
       .clear()
diff --git a/frontend/test/metabase/reference/guide.cy.spec.js b/frontend/test/metabase/reference/guide.cy.spec.js
index c47d8119e57..c70e8381c3d 100644
--- a/frontend/test/metabase/reference/guide.cy.spec.js
+++ b/frontend/test/metabase/reference/guide.cy.spec.js
@@ -3,7 +3,7 @@ describe("getting started guide", () => {
   before(restore);
   beforeEach(signInAsAdmin);
   it("should render", () => {
-    cy.visit("reference");
+    cy.visit("/reference");
     cy.contains("Our data");
   });
 });
diff --git a/frontend/test/metabase/scenarios/admin/databases/add.cy.spec.js b/frontend/test/metabase/scenarios/admin/databases/add.cy.spec.js
new file mode 100644
index 00000000000..ce66f68e9a4
--- /dev/null
+++ b/frontend/test/metabase/scenarios/admin/databases/add.cy.spec.js
@@ -0,0 +1,120 @@
+import { signInAsAdmin, restore } from "__support__/cypress";
+
+function typeField(name, value) {
+  cy.get(`input[name="${name}"]`)
+    .clear()
+    .type(value)
+    .blur();
+}
+
+function toggleFieldWithDisplayName(displayName) {
+  cy.contains(displayName)
+    .closest(".Form-field")
+    .find("a")
+    .click();
+}
+
+describe("admin > databases > add", () => {
+  before(restore);
+
+  beforeEach(() => {
+    signInAsAdmin();
+    cy.server();
+  });
+
+  it("should work and shouldn't let you accidentally add db twice", () => {
+    cy.route({
+      method: "POST",
+      url: "/api/database",
+      response: { id: 42 },
+      delay: 1000,
+    }).as("createDatabase");
+
+    cy.visit("/admin/databases/create");
+
+    typeField("name", "Test db name");
+    typeField("dbname", "test_postgres_db");
+    typeField("user", "uberadmin");
+
+    cy.contains("button", "Save")
+      .should("not.be.disabled")
+      .click();
+    cy.contains("button", "Saving...").should("be.disabled");
+
+    cy.wait("@createDatabase");
+
+    cy.url().should("match", /\/admin\/databases\?created=42$/);
+  });
+
+  it("should show validation error if you enable scheduling toggle and enter invalid db connection info", () => {
+    cy.visit("/admin/databases/create");
+
+    typeField("name", "Test db name");
+    typeField("dbname", "test_postgres_db");
+    typeField("user", "uberadmin");
+
+    cy.contains("button", "Save").should("not.be.disabled");
+
+    toggleFieldWithDisplayName("let me choose when Metabase syncs and scans");
+
+    cy.contains("button", "Next")
+      .should("not.be.disabled")
+      .click();
+
+    cy.contains("Couldn't connect to the database");
+  });
+
+  it("should direct you to scheduling settings if you enable the toggle", () => {
+    cy.route("POST", "/api/database", { id: 42 }).as("createDatabase");
+    cy.route("POST", "/api/database/validate", { valid: true });
+
+    cy.visit("/admin/databases/create");
+
+    typeField("name", "Test db name");
+    typeField("dbname", "test_postgres_db");
+    typeField("user", "uberadmin");
+
+    cy.contains("button", "Save").should("not.be.disabled");
+
+    toggleFieldWithDisplayName("let me choose when Metabase syncs and scans");
+
+    cy.contains("button", "Next")
+      .should("not.be.disabled")
+      .click();
+
+    cy.contains("Never").click();
+
+    cy.contains("button", "Save").click();
+
+    cy.wait("@createDatabase").then(({ request }) => {
+      expect(request.body.engine).to.equal("postgres");
+      expect(request.body.name).to.equal("Test db name");
+      expect(request.body.details.user).to.equal("uberadmin");
+    });
+
+    cy.url().should("match", /\/admin\/databases\?created=42$/);
+
+    cy.contains("Your database has been added");
+  });
+
+  it("should show error correctly on server error", () => {
+    cy.route({
+      method: "POST",
+      url: "/api/database",
+      response: {},
+      status: 400,
+      delay: 1000,
+    }).as("createDatabase");
+
+    cy.visit("/admin/databases/create");
+
+    typeField("name", "Test db name");
+    typeField("dbname", "test_postgres_db");
+    typeField("user", "uberadmin");
+
+    cy.contains("button", "Save").click();
+    cy.contains("button", "Saving...").should("be.disabled");
+
+    cy.contains("Server error encountered");
+  });
+});
diff --git a/frontend/test/metabase/scenarios/admin/databases/edit.cy.spec.js b/frontend/test/metabase/scenarios/admin/databases/edit.cy.spec.js
new file mode 100644
index 00000000000..279f6281d9f
--- /dev/null
+++ b/frontend/test/metabase/scenarios/admin/databases/edit.cy.spec.js
@@ -0,0 +1,178 @@
+import { signInAsAdmin, restore } from "__support__/cypress";
+
+describe("admin > databases > edit", () => {
+  before(restore);
+
+  beforeEach(() => {
+    signInAsAdmin();
+    cy.server();
+    cy.route("GET", "/api/database/*").as("databaseGet");
+    cy.route("PUT", "/api/database/*").as("databaseUpdate");
+  });
+
+  describe("Connection tab", () => {
+    it("shows the connection settings for sample dataset correctly", () => {
+      cy.visit("/admin/databases/1");
+      cy.get(`input[name="name"]`).should("have.value", "Sample Dataset");
+      cy.get(`input[name="db"]`).should($input =>
+        expect($input[0].value).to.match(/sample-dataset\.db/),
+      );
+    });
+
+    it("lets you modify the connection settings", () => {
+      cy.visit("/admin/databases/1");
+
+      cy.contains("let me choose when Metabase syncs and scans")
+        .closest(".Form-field")
+        .find("a")
+        .click();
+
+      cy.contains("button", "Save").click();
+      cy.wait("@databaseUpdate").then(({ response }) =>
+        expect(response.body.details["let-user-control-scheduling"]).to.equal(
+          true,
+        ),
+      );
+
+      cy.contains("Successfully saved!");
+
+      // contains the tabs
+      cy.reload();
+      cy.contains("Connection");
+      cy.contains("Scheduling");
+    });
+  });
+
+  describe("Scheduling tab", () => {
+    it("shows the initial scheduling settings correctly", () => {
+      cy.visit("/admin/databases/1");
+
+      cy.contains("Scheduling").click();
+
+      cy.contains("Database syncing")
+        .parent()
+        .contains(".AdminSelect", "Hourly");
+
+      cy.contains("Regularly, on a schedule")
+        .closest("div")
+        .should("have.class", "text-brand");
+    });
+
+    it("lets you change the metadata_sync period", () => {
+      cy.visit("/admin/databases/1");
+
+      cy.contains("Scheduling").click();
+
+      cy.contains("Database syncing")
+        .parent()
+        .as("sync");
+
+      cy.get("@sync")
+        .contains(".AdminSelect", "Hourly")
+        .click();
+      cy.get(".PopoverBody")
+        .contains("Daily")
+        .click({ force: true });
+
+      cy.contains("Regularly, on a schedule")
+        .closest("div")
+        .should("have.class", "text-brand");
+
+      cy.contains("button", "Save changes").click();
+      cy.wait("@databaseUpdate").then(({ response }) =>
+        expect(response.body.schedules.metadata_sync.schedule_type).to.equal(
+          "daily",
+        ),
+      );
+    });
+
+    it("lets you change the cache_field_values perid", () => {
+      cy.visit("/admin/databases/1");
+      cy.contains("Scheduling").click();
+
+      cy.contains("Scanning")
+        .parent()
+        .as("scan");
+
+      cy.get("@scan")
+        .contains("Daily")
+        .click();
+      cy.get(".PopoverBody")
+        .contains("Weekly")
+        .click({ force: true });
+
+      cy.contains("button", "Save changes").click();
+      cy.wait("@databaseUpdate").then(({ response }) => {
+        expect(
+          response.body.schedules.cache_field_values.schedule_type,
+        ).to.equal("weekly");
+      });
+    });
+
+    it("lets you change the cache_field_values to 'Only when adding a new filter widget'", () => {
+      cy.visit("/admin/databases/1");
+      cy.contains("Scheduling").click();
+
+      cy.contains("Only when adding a new filter widget").click();
+      cy.contains("button", "Save changes").click();
+      cy.wait("@databaseUpdate").then(({ response }) => {
+        expect(response.body.is_full_sync).to.equal(false);
+        expect(response.body.is_on_demand).to.equal(true);
+      });
+    });
+
+    it("lets you change the cache_field_values to Never", () => {
+      cy.visit("/admin/databases/1");
+      cy.contains("Scheduling").click();
+
+      cy.contains("Never").click();
+      cy.contains("button", "Save changes").click();
+      cy.wait("@databaseUpdate").then(({ response }) => {
+        expect(response.body.is_full_sync).to.equal(false);
+        expect(response.body.is_on_demand).to.equal(false);
+      });
+    });
+  });
+
+  describe.only("Actions sidebar", () => {
+    it("lets you trigger the manual database schema sync", () => {
+      cy.route("POST", "/api/database/1/sync_schema").as("sync_schema");
+
+      cy.visit("/admin/databases/1");
+      cy.contains("Sync database schema now").click();
+      cy.wait("@sync_schema");
+      cy.contains("Sync triggered!");
+    });
+
+    it("lets you trigger the manual rescan of field values", () => {
+      cy.route("POST", "/api/database/1/rescan_values").as("rescan_values");
+
+      cy.visit("/admin/databases/1");
+      cy.contains("Re-scan field values now").click();
+      cy.wait("@rescan_values");
+      cy.contains("Scan triggered!");
+    });
+
+    it("lets you discard saved field values", () => {
+      cy.route("POST", "/api/database/1/discard_values").as("discard_values");
+
+      cy.visit("/admin/databases/1");
+      cy.contains("Discard saved field values").click();
+      cy.contains("button", "Yes").click();
+      cy.wait("@discard_values");
+    });
+
+    it("lets you remove the Sample Dataset", () => {
+      cy.route("DELETE", "/api/database/1").as("delete");
+
+      cy.visit("/admin/databases/1");
+      cy.contains("Remove this database").click();
+      cy.get(".ModalBody input").type("DELETE");
+      cy.get(".ModalBody")
+        .contains("button", "Delete")
+        .click();
+      cy.wait("@delete");
+      cy.url().should("match", /\/admin\/databases\/$/);
+    });
+  });
+});
diff --git a/frontend/test/metabase/scenarios/admin/databases/list.cy.spec.js b/frontend/test/metabase/scenarios/admin/databases/list.cy.spec.js
new file mode 100644
index 00000000000..de2156b1efc
--- /dev/null
+++ b/frontend/test/metabase/scenarios/admin/databases/list.cy.spec.js
@@ -0,0 +1,57 @@
+import { signInAsAdmin, restore } from "__support__/cypress";
+
+describe("admin > databases > list", () => {
+  before(restore);
+
+  beforeEach(() => {
+    signInAsAdmin();
+    cy.server();
+  });
+
+  it("should let you view a database", () => {
+    cy.visit("/admin/databases");
+    cy.contains("Sample Dataset").click();
+    cy.url().should("match", /\/admin\/databases\/\d+$/);
+  });
+
+  it("should let you add a database", () => {
+    cy.visit("/admin/databases");
+    cy.contains("Add database").click();
+    cy.url().should("match", /\/admin\/databases\/create$/);
+  });
+
+  it("should let you edit a database", () => {
+    cy.visit("/admin/databases");
+    cy.contains("Sample Dataset").click();
+    cy.url().should("match", /\/admin\/databases\/1$/);
+  });
+
+  it("should let you delete a database", () => {
+    cy.route("DELETE", "/api/database/1").as("delete");
+
+    cy.visit("/admin/databases");
+    cy.get("table").should("contain", "Sample Dataset");
+
+    cy.contains("Sample Dataset")
+      .closest("tr")
+      .contains("Delete")
+      .click();
+    cy.get(".ModalBody input").type("DELETE");
+    cy.get(".ModalBody")
+      .contains("button", "Delete")
+      .click();
+    cy.wait("@delete");
+
+    cy.get("table").should("not.contain", "Sample Dataset");
+  });
+
+  it("should let you bring back the sample dataset", () => {
+    cy.route("POST", "/api/database/sample_dataset").as("sample_dataset");
+
+    cy.visit("/admin/databases");
+    cy.contains("Bring the sample dataset back").click();
+    cy.wait("@sample_dataset");
+    cy.contains("Sample Dataset").click();
+    cy.url().should("match", /\/admin\/databases\/\d+$/);
+  });
+});
diff --git a/frontend/test/metabase/scenarios/admin/datamodel/field.cy.spec.js b/frontend/test/metabase/scenarios/admin/datamodel/field.cy.spec.js
new file mode 100644
index 00000000000..00ced55e449
--- /dev/null
+++ b/frontend/test/metabase/scenarios/admin/datamodel/field.cy.spec.js
@@ -0,0 +1,155 @@
+import { signInAsAdmin, restore } from "__support__/cypress";
+
+const ORDERS_CREATED_AT_URL = "/admin/datamodel/database/1/table/2/15/general";
+const ORDERS_PRODUCT_URL = "/admin/datamodel/database/1/table/2/11/general";
+const ORDERS_QUANTITY_URL = "/admin/datamodel/database/1/table/2/14/general";
+
+describe("admin > datamodel > field", () => {
+  beforeEach(() => {
+    signInAsAdmin();
+    cy.server();
+    cy.route("PUT", "/api/field/*").as("fieldUpdate");
+    cy.route("POST", "/api/field/*/dimension").as("fieldDimensionUpdate");
+    cy.route("POST", "/api/field/*/values").as("fieldValuesUpdate");
+  });
+
+  describe("Name and Description", () => {
+    before(restore);
+
+    it("lets you change field name and description", () => {
+      cy.visit(ORDERS_CREATED_AT_URL);
+
+      cy.get('input[name="display_name"]').as("display_name");
+      cy.get('input[name="description"]').as("description");
+
+      // update the name
+      cy.get("@display_name")
+        .should("have.value", "Created At")
+        .clear()
+        .type("new display_name")
+        .blur();
+      cy.wait("@fieldUpdate");
+
+      // update the description
+      cy.get("@description")
+        .should("have.value", "The date and time an order was submitted.")
+        .clear()
+        .type("new description")
+        .blur();
+      cy.wait("@fieldUpdate");
+
+      // reload and verify they have been updated
+      cy.reload();
+      cy.get("@display_name").should("have.value", "new display_name");
+      cy.get("@description").should("have.value", "new description");
+    });
+  });
+
+  describe("Visibility", () => {
+    before(restore);
+
+    it("lets you change field visibility", () => {
+      cy.visit(ORDERS_CREATED_AT_URL);
+
+      cy.contains("Everywhere").click();
+      cy.contains("Do not include").click({ force: true });
+      cy.wait("@fieldUpdate");
+
+      cy.reload();
+      cy.contains("Do not include");
+    });
+  });
+
+  describe("Field Type", () => {
+    before(restore);
+
+    it("lets you change the type to 'No special type'", () => {
+      cy.visit(ORDERS_PRODUCT_URL);
+
+      cy.contains("Foreign Key").click();
+      cy.contains("No special type").click({ force: true });
+      cy.wait("@fieldUpdate");
+
+      cy.reload();
+      cy.contains("No special type");
+    });
+
+    it("lets you change the type to 'Number'", () => {
+      cy.visit(ORDERS_PRODUCT_URL);
+
+      cy.contains("No special type").click();
+      cy.contains("Number").click({ force: true });
+      cy.wait("@fieldUpdate");
+
+      cy.reload();
+      cy.contains("Number");
+    });
+
+    it("lets you change the type to 'Foreign key' and choose the target field", () => {
+      cy.visit(ORDERS_PRODUCT_URL);
+
+      cy.contains("Number").click();
+      cy.get(".ReactVirtualized__Grid").scrollTo(0, 0); // HACK: scroll to the top of the list. Ideally we should probably disable AccordianList virtualization
+      cy.contains("Foreign Key").click({ force: true });
+      cy.wait("@fieldUpdate");
+
+      cy.contains("Select a target").click();
+      cy.contains("Products → ID").click();
+      cy.wait("@fieldUpdate");
+
+      cy.reload();
+      cy.contains("Foreign Key");
+      cy.contains("Products → ID");
+    });
+  });
+
+  describe("Filtering on this field", () => {
+    before(restore);
+
+    it("lets you change to 'Search box'", () => {
+      cy.visit(ORDERS_QUANTITY_URL);
+
+      cy.contains("A list of all values").click();
+      cy.contains("Search box").click();
+      cy.wait("@fieldUpdate");
+
+      cy.reload();
+      cy.contains("Search box");
+    });
+  });
+
+  describe("Display Values", () => {
+    before(restore);
+
+    it("lets you change to 'Use foreign key' and change the target for field with fk", () => {
+      cy.visit(ORDERS_PRODUCT_URL);
+
+      cy.contains("Use original value").click();
+      cy.contains("Use foreign key").click();
+      cy.contains("Title").click();
+      cy.wait("@fieldDimensionUpdate");
+
+      cy.reload();
+      cy.contains("Use foreign key");
+      cy.contains("Title");
+    });
+
+    it("lets you change to 'Custom mapping' and set custom values", () => {
+      cy.visit(ORDERS_QUANTITY_URL);
+
+      cy.contains("Use original value").click();
+      cy.contains("Custom mapping").click();
+
+      cy.get('input[value="0"]')
+        .clear()
+        .type("foo")
+        .blur();
+      cy.contains("button", "Save").click({ force: true });
+      cy.wait("@fieldValuesUpdate");
+
+      cy.reload();
+      cy.contains("Custom mapping");
+      cy.get('input[value="foo"]');
+    });
+  });
+});
diff --git a/frontend/test/metabase/scenarios/admin/datamodel/table.cy.spec.js b/frontend/test/metabase/scenarios/admin/datamodel/table.cy.spec.js
new file mode 100644
index 00000000000..4e9ea844037
--- /dev/null
+++ b/frontend/test/metabase/scenarios/admin/datamodel/table.cy.spec.js
@@ -0,0 +1,160 @@
+import { signInAsAdmin, restore } from "__support__/cypress";
+
+const ORDERS_URL = "/admin/datamodel/database/1/table/2";
+
+describe("admin > datamodel > table", () => {
+  beforeEach(() => {
+    restore();
+    signInAsAdmin();
+    cy.server();
+    cy.route("PUT", "/api/table/*").as("tableUpdate");
+    cy.route("PUT", "/api/field/*").as("fieldUpdate");
+  });
+
+  describe("data model editor", () => {
+    it("should allow editing of the name and description", () => {
+      cy.visit(ORDERS_URL);
+
+      cy.get('input[name="display_name"]').as("display_name");
+      cy.get('input[name="description"]').as("description");
+
+      // update the name
+      cy.get("@display_name")
+        .should("have.value", "Orders")
+        .clear()
+        .type("new display_name")
+        .blur();
+      cy.wait("@tableUpdate");
+
+      // update the description
+      cy.get("@description")
+        .should(
+          "have.value",
+          "This is a confirmed order for a product from a user.",
+        )
+        .clear()
+        .type("new description")
+        .blur();
+      cy.wait("@tableUpdate");
+
+      // reload and verify they have been updated
+      cy.reload();
+      cy.get("@display_name").should("have.value", "new display_name");
+      cy.get("@description").should("have.value", "new description");
+    });
+
+    it("shouild allow changing the visibility and reason", () => {
+      cy.visit(ORDERS_URL);
+
+      // visibility
+      cy.contains(/^Queryable$/).should("have.class", "text-brand");
+      cy.contains(/^Hidden$/).should("not.have.class", "text-brand");
+
+      cy.contains(/^Hidden$/).click();
+      cy.wait("@tableUpdate");
+
+      cy.reload();
+      cy.contains(/^Queryable$/).should("not.have.class", "text-brand");
+      cy.contains(/^Hidden$/).should("have.class", "text-brand");
+
+      // hidden reason
+      cy.contains("Technical Data").should("not.have.class", "text-brand");
+      cy.contains("Technical Data").click();
+      cy.wait("@tableUpdate");
+
+      cy.reload();
+      cy.contains("Technical Data").should("have.class", "text-brand");
+    });
+
+    function field(name) {
+      return cy
+        .get(`input[value="${name}"]`)
+        .parent()
+        .parent();
+    }
+
+    function testSelect(alias, initialOption, desiredOption) {
+      cy.get(alias)
+        .contains(initialOption)
+        .click({ force: true });
+      cy.get(".PopoverBody")
+        .contains(desiredOption)
+        .click({ force: true });
+      cy.get(alias).contains(desiredOption);
+
+      cy.wait("@fieldUpdate");
+
+      cy.reload();
+      cy.get(alias).contains(desiredOption);
+    }
+
+    it("should allow hiding of columns", () => {
+      cy.visit(ORDERS_URL);
+
+      field("Created At").as("created_at");
+      testSelect("@created_at", "Everywhere", "Only in detail views");
+    });
+
+    it("should allow changing of special type and currency", () => {
+      cy.visit(ORDERS_URL);
+
+      field("Tax").as("tax");
+      testSelect("@tax", "No special type", "Currency");
+      testSelect("@tax", "US Dollar", "Canadian Dollar");
+    });
+
+    it("should allow changing of foreign key target", () => {
+      cy.visit(ORDERS_URL);
+
+      field("User ID").as("user_id");
+      testSelect("@user_id", "People → ID", "Products → ID");
+    });
+
+    it("should allow creating segments", () => {
+      cy.visit(ORDERS_URL);
+
+      cy.contains("Add a Segment").click();
+
+      cy.url().should("include", "/admin/datamodel/segment/create?table=2");
+
+      cy.contains("Add filters to narrow your answer").click();
+      cy.contains("Product ID").click();
+      cy.get(`input[placeholder="Enter an ID"]`)
+        .type("1")
+        .blur();
+      cy.contains("button", "Add filter").click();
+      cy.contains("93 rows");
+      cy.get(`input[placeholder^="Something descriptive"]`).type(
+        "User 1's Orders",
+      );
+      cy.get(`textarea[placeholder^="This is a good place"]`).type(
+        "Segment containing only user 1's orders",
+      );
+      cy.contains("button", "Save changes").click();
+
+      cy.url().should("include", "/admin/datamodel/database/1/table/2");
+      cy.contains("User 1's Orders");
+    });
+
+    it("should allow creating metrics", () => {
+      cy.visit(ORDERS_URL);
+
+      cy.contains("Add a Metric").click();
+
+      cy.url().should("include", "/admin/datamodel/metric/create?table=2");
+
+      cy.contains("Count of rows").click();
+      cy.contains("Sum of").click();
+      cy.contains("Subtotal").click();
+      cy.contains("Result: 1448188");
+      cy.get(`input[placeholder^="Something descriptive"]`).type("Revenue");
+      cy.get(`textarea[placeholder^="This is a good place"]`).type(
+        "Total revenue",
+      );
+      cy.contains("button", "Save changes").click();
+
+      cy.url().should("include", "/admin/datamodel/database/1/table/2");
+      cy.contains("Revenue");
+    });
+  });
+});
diff --git a/frontend/test/metabase/scenarios/custom_question.cy.spec.js b/frontend/test/metabase/scenarios/custom_question.cy.spec.js
index 6d76a31c852..b2217ff2195 100644
--- a/frontend/test/metabase/scenarios/custom_question.cy.spec.js
+++ b/frontend/test/metabase/scenarios/custom_question.cy.spec.js
@@ -1,6 +1,7 @@
-import { signInAsAdmin } from "__support__/cypress";
+import { signInAsAdmin, restore } from "__support__/cypress";
 
 describe("custom question", () => {
+  before(restore);
   beforeEach(signInAsAdmin);
   it("should allow post-aggregation filters", () => {
     // count orders by user id, filter to the one user with 46 orders
diff --git a/frontend/test/metabase/scenarios/public.cy.spec.js b/frontend/test/metabase/scenarios/public.cy.spec.js
new file mode 100644
index 00000000000..8e168aae79f
--- /dev/null
+++ b/frontend/test/metabase/scenarios/public.cy.spec.js
@@ -0,0 +1,282 @@
+import {
+  signInAsAdmin,
+  signInAsNormalUser,
+  signOut,
+  restore,
+  popover,
+  modal,
+} from "__support__/cypress";
+import { SAMPLE_DATASET } from "__support__/metadata";
+
+const COUNT_ALL = "200";
+const COUNT_DOOHICKEY = "42";
+
+const PUBLIC_URL_REGEX = /\/public\/(question|dashboard)\/[0-9a-f-]+$/;
+
+const ADMIN_USER = ["admin", signInAsAdmin];
+const NORMAL_USER = ["normal", signInAsNormalUser];
+const ANONYMOUS_USER = ["anonymous", signOut];
+
+describe("public and embeds", () => {
+  before(restore);
+
+  beforeEach(() => {
+    signInAsAdmin();
+    cy.server();
+  });
+
+  let questionId;
+  let questionPublicLink;
+  let questionEmbedUrl;
+  let dashboardId;
+  let dashboardPublicLink;
+  let dashboardEmbedUrl;
+
+  describe("questions", () => {
+    // Note: Test suite is sequential, so individual test cases can't be run individually
+    it("should allow users to create parameterized SQL questions", () => {
+      cy.visit(`/question/new?type=native&database=${SAMPLE_DATASET.id}`);
+      cy.get(".ace_text-input").type(
+        "select count(*) from products where {{c}}",
+        { force: true, parseSpecialCharSequences: false },
+      );
+
+      cy.contains("Filter label")
+        .siblings("input")
+        .type("Category");
+
+      cy.contains("Text").click();
+      popover()
+        .contains("Field Filter")
+        .click();
+
+      popover()
+        .contains("Products")
+        .click();
+      popover()
+        .contains("Category")
+        .click();
+
+      cy.get(".Icon-play")
+        .first()
+        .click();
+      cy.contains(COUNT_ALL);
+
+      cy.contains("Category").click();
+      popover()
+        .contains("Doohickey")
+        .click();
+      popover()
+        .contains("Add filter")
+        .click();
+
+      cy.get(".Icon-play")
+        .first()
+        .click();
+      cy.contains(COUNT_DOOHICKEY);
+
+      cy.focused().blur();
+
+      cy.contains("Save").click();
+      modal()
+        .find('input[name="name"]')
+        .type("sql param");
+      modal()
+        .contains("button", "Save")
+        .should("not.be.disabled")
+        .click();
+
+      modal()
+        .contains("Not now")
+        .click();
+
+      cy.url()
+        .should("match", /\/question\/\d+\?c=Doohickey$/)
+        .then(url => {
+          questionId = parseInt(url.match(/question\/(\d+)/)[1]);
+        });
+    });
+
+    it("should allow users to create parameterized dashboards", () => {
+      cy.visit(`/question/${questionId}`);
+
+      cy.get(".Icon-pencil").click();
+      popover()
+        .contains("Add to dashboard")
+        .click();
+      modal()
+        .contains("Create a new dashboard")
+        .click();
+      modal()
+        .get('input[name="name"]')
+        .type("parameterized dashboard");
+      modal()
+        .contains("Create")
+        .click();
+
+      cy.get(".Icon-funnel_add").click();
+
+      popover()
+        .contains("Other Categories")
+        .click();
+      cy.contains("Select…").click();
+      popover()
+        .contains("Category")
+        .click();
+
+      cy.contains("Done").click();
+      cy.contains("Save").click();
+
+      cy.contains(COUNT_ALL);
+
+      cy.contains("Category").click();
+      cy.focused().type("Doohickey");
+      cy.contains("Add filter").click();
+      cy.contains(COUNT_DOOHICKEY);
+
+      cy.url()
+        .should("match", /\/dashboard\/\d+\?category=Doohickey$/)
+        .then(url => {
+          dashboardId = parseInt(url.match(/dashboard\/(\d+)/)[1]);
+        });
+    });
+
+    it("should allow users to create public questions", () => {
+      cy.request("PUT", "/api/setting/enable-public-sharing", { value: true });
+
+      cy.visit(`/question/${questionId}`);
+
+      cy.get(".Icon-share").click();
+
+      cy.contains("Enable sharing")
+        .parent()
+        .find("a")
+        .click();
+
+      cy.contains("Public link")
+        .parent()
+        .find("input")
+        .then($input => {
+          expect($input[0].value).to.match(PUBLIC_URL_REGEX);
+          questionPublicLink = $input[0].value.match(PUBLIC_URL_REGEX)[0];
+        });
+    });
+
+    it("should allow users to create embedded questions", () => {
+      cy.request("PUT", "/api/setting/enable-embedding", { value: true });
+      cy.request("PUT", "/api/setting/site-url", {
+        value: "http://localhost:4000/", // Cypress.config().baseUrl
+      });
+
+      cy.visit(`/question/${questionId}`);
+
+      cy.get(".Icon-share").click();
+
+      cy.contains(".cursor-pointer", "Embed this question")
+        .should("not.be.disabled")
+        .click();
+      cy.contains("Disabled").click();
+      cy.contains("Editable").click();
+
+      cy.contains("Publish").click();
+
+      cy.get("iframe").then($iframe => {
+        questionEmbedUrl = $iframe[0].src;
+      });
+    });
+
+    it("should allow users to create public dashboards", () => {
+      cy.request("PUT", "/api/setting/enable-public-sharing", { value: true });
+
+      cy.visit(`/dashboard/${dashboardId}`);
+
+      cy.get(".Icon-share").click();
+
+      cy.contains("Enable sharing")
+        .parent()
+        .find("a")
+        .click();
+
+      cy.contains("Public link")
+        .parent()
+        .find("input")
+        .then($input => {
+          expect($input[0].value).to.match(PUBLIC_URL_REGEX);
+          dashboardPublicLink = $input[0].value.match(PUBLIC_URL_REGEX)[0];
+        });
+    });
+
+    it("should allow users to create embedded dashboards", () => {
+      cy.request("PUT", "/api/setting/enable-embedding", { value: true });
+      cy.request("PUT", "/api/setting/site-url", {
+        value: "http://localhost:4000/", // Cypress.config().baseUrl
+      });
+
+      cy.visit(`/dashboard/${dashboardId}`);
+
+      cy.get(".Icon-share").click();
+
+      cy.contains(".cursor-pointer", "Embed this dashboard")
+        .should("not.be.disabled")
+        .click();
+      cy.contains("Disabled").click();
+      cy.contains("Editable").click();
+
+      cy.contains("Publish").click();
+
+      cy.get("iframe").then($iframe => {
+        dashboardEmbedUrl = $iframe[0].src;
+      });
+    });
+
+    [ADMIN_USER, NORMAL_USER, ANONYMOUS_USER].map(([userType, setUser]) =>
+      describe(`${userType} user`, () => {
+        beforeEach(setUser);
+
+        it(`should be able to view public questions`, () => {
+          cy.visit(questionPublicLink);
+          cy.contains(COUNT_ALL);
+
+          cy.contains("Category").click();
+          cy.contains("Doohickey").click();
+          cy.contains("Add filter").click();
+
+          cy.contains(COUNT_DOOHICKEY);
+        });
+
+        it(`should be able to view embedded questions`, () => {
+          cy.visit(questionEmbedUrl);
+          cy.contains(COUNT_ALL);
+
+          cy.contains("Category").click();
+          cy.contains("Doohickey").click();
+          cy.contains("Add filter").click();
+
+          cy.contains(COUNT_DOOHICKEY);
+        });
+
+        it(`should be able to view public dashboards`, () => {
+          cy.visit(dashboardPublicLink);
+          cy.contains(COUNT_ALL);
+
+          cy.contains("Category").click();
+          cy.contains("Doohickey").click();
+          cy.contains("Add filter").click();
+
+          cy.contains(COUNT_DOOHICKEY);
+        });
+
+        it(`should be able to view embedded dashboards`, () => {
+          cy.visit(dashboardEmbedUrl);
+          cy.contains(COUNT_ALL);
+
+          cy.contains("Category").click();
+          cy.contains("Doohickey").click();
+          cy.contains("Add filter").click();
+
+          cy.contains(COUNT_DOOHICKEY);
+        });
+      }),
+    );
+  });
+});
diff --git a/frontend/test/metabase/scenarios/query_builder.e2e.spec.js b/frontend/test/metabase/scenarios/query_builder.e2e.spec.js
deleted file mode 100644
index 5341043dd1f..00000000000
--- a/frontend/test/metabase/scenarios/query_builder.e2e.spec.js
+++ /dev/null
@@ -1,110 +0,0 @@
-jest.mock("metabase/components/Popover");
-
-import {
-  useSharedAdminLogin,
-  mountApp,
-  waitForAllRequestsToComplete,
-} from "__support__/e2e";
-
-import Question from "metabase-lib/lib/Question";
-
-const ORDERS_QUESTION = Question.create({ databaseId: 1, tableId: 1 });
-
-describe("query builder", () => {
-  beforeAll(() => useSharedAdminLogin());
-  describe("browse data", () => {
-    it("should load orders table and summarize", async () => {
-      const { app } = await mountApp("/");
-      await app.async.findByText("Browse Data").click();
-      await waitForAllRequestsToComplete(); // race condition in DataSelector with loading metadata
-
-      await app.async.findByText("Sample Dataset").click();
-      await app.async.findByText("Orders").click();
-      await app.async.findByText("37.65");
-    });
-  });
-  describe("ask a (simple) question", () => {
-    it("should load orders table", async () => {
-      const { app } = await mountApp("/");
-
-      await app.async.findByText("Ask a question").click();
-      await app.async.findByText("Simple question").click();
-
-      await waitForAllRequestsToComplete(); // race condition in DataSelector with loading metadata
-      await maybeClickSampleDataset(app);
-      await app.async.findByText("Orders").click();
-      await app.async.findByText("37.65");
-    });
-  });
-
-  describe("ask a (custom) question", () => {
-    it("should load orders table", async () => {
-      const { app } = await mountApp("/");
-
-      await app.async.findByText("Ask a question").click();
-      await app.async.findByText("Custom question").click();
-
-      await waitForAllRequestsToComplete(); // race condition in DataSelector with loading metadata
-      await maybeClickSampleDataset(app);
-      await app.async.findByText("Orders").click();
-      await app.async.findByText("Visualize").click();
-      await app.async.findByText("37.65");
-    });
-
-    it("should summarize and break out and show a map", async () => {
-      const { app } = await mountApp("/");
-
-      await app.async.findByText("Ask a question").click();
-      await app.async.findByText("Custom question").click();
-
-      await waitForAllRequestsToComplete(); // race condition in DataSelector with loading metadata
-      await maybeClickSampleDataset(app);
-      await app.async.findByText("Orders").click();
-      await app.async.findByText("Pick the metric you want to see").click();
-      await app.async.findByText("Count of rows").click();
-      await app.async.findByText("Pick a column to group by").click();
-      await app.async.findByText("User").click();
-      await app.async.findByText("State").click();
-      await app.async.findByText("Visualize").click();
-      await app.async.find("ChoroplethMap");
-    });
-  });
-
-  describe("view mode", () => {
-    describe("summarize sidebar", () => {
-      it("should summarize by category and show a bar chart", async () => {
-        const { app } = await mountApp(ORDERS_QUESTION.getUrl());
-        await app.async.findByText("Summarize").click();
-        await app.async.findByText("Category").click();
-        await app.async.findByText("Done").click();
-        await app.async.findByText("Count by Product → Category");
-      });
-    });
-
-    describe("filter sidebar", () => {
-      it("should filter a table", async () => {
-        const { app } = await mountApp(ORDERS_QUESTION.getUrl());
-        await app.async.findByText("Filter").click();
-        await app.async.findByText("Vendor").click();
-
-        const sidebar = await app.async.find("FilterSidebar");
-        await sidebar.async
-          .find("input")
-          .setInputValue("Alfreda Konopelski II Group");
-        await app.async.findByText("Add filter").click();
-        await app.async.findByText("Showing 91 rows");
-      });
-    });
-  });
-});
-
-// This isn't needed if there's only one db. In that case, clicking "Sample
-// Dataset" will actually take you back to select a db again.
-async function maybeClickSampleDataset(app) {
-  try {
-    const sampleDataset = await app.async.findByText("Sample Dataset");
-    if (sampleDataset.hasClass("List-section-title")) {
-      sampleDataset.click();
-    }
-  } catch (e) {}
-}
diff --git a/frontend/test/snapshot-creators/default.cy.snap.js b/frontend/test/snapshot-creators/default.cy.snap.js
index 05b557ada7a..8d1d301e324 100644
--- a/frontend/test/snapshot-creators/default.cy.snap.js
+++ b/frontend/test/snapshot-creators/default.cy.snap.js
@@ -3,6 +3,7 @@ import {
   restore,
   ADMIN_CREDS,
   NORMAL_USER_CREDS,
+  modal,
 } from "__support__/cypress";
 
 describe("default", () => {
@@ -134,24 +135,38 @@ function createQuestionAndDashboard() {
   cy.visit("/question/new");
   cy.contains("Simple question").click();
   cy.contains("Orders").click();
+  cy.contains("Save").click(); // open save modal
+  modal()
+    .contains(/^Save$/)
+    .click(); // save question
+
+  cy.visit("/question/new");
+  cy.contains("Simple question").click();
+  cy.contains("Sample Dataset").click();
+  cy.contains("Orders").click();
   cy.contains("37.65");
   cy.contains("Summarize").click();
   cy.contains("Done").click();
   cy.contains("18,760");
   cy.contains("Save").click(); // open save modal
-  cy.get(".ModalContent")
+  modal()
     .contains(/^Save$/)
     .click(); // save question
   cy.contains("Saved!");
+
+  // add to a dashboard
   cy.contains("Yes please!").click();
   cy.contains("Create a new dashboard").click();
   cy.contains("Name")
     .next()
     .type("orders in a dashboard");
-  cy.get(".ModalContent")
+  modal()
     .contains("Create")
     .click();
   cy.contains("You are editing a dashboard");
   cy.contains("Save").click();
   cy.get(".EditHeader").should("have.length", 0);
+
+  // dismiss the "it's ok to play around" modal
+  cy.request("PUT", "/api/user/1/qbnewb", {});
 }
diff --git a/frontend/test/snapshots/blank.sql b/frontend/test/snapshots/blank.sql
index 467e608c9fe..83312a394dd 100644
--- a/frontend/test/snapshots/blank.sql
+++ b/frontend/test/snapshots/blank.sql
@@ -1,41 +1,41 @@
 SET DB_CLOSE_DELAY -1;         
 ;              
 CREATE USER IF NOT EXISTS "" SALT '' HASH '' ADMIN;            
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_339CFE15_5F0A_40E0_A6F1_A4C6E2A733A3 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_86912F44_F0BA_47E1_9BD4_0E117801F53C START WITH 5 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_2423926E_D488_426E_A8C8_A376100D1F0A START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_06F0D33A_3128_44D6_9B39_CBCB2DBBE373 START WITH 13 BELONGS_TO_TABLE;    
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_F13B9F0D_F22D_4F12_A158_24540D39401D START WITH 2 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_24E20B01_717A_4ED3_94E7_EE17064E49CB START WITH 4 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_6CD68F8F_F495_4CEB_95BB_2199436AEA2D START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_AD86AFFE_C465_4DB5_9323_5D7EA4F8BE46 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A6249949_B9A6_4376_BFB8_E3EE84CCE77A START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5E58DB27_82A5_4D5F_BB57_EEC19CB94FB3 START WITH 37 BELONGS_TO_TABLE;    
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_48AB2809_6C6C_4FC8_ADEC_A0173B213318 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_EAFAD778_2557_4599_B568_4B03F9B42195 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5A33298E_E93F_4169_96C4_33D52F7D4A7A START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_04D09038_A138_44ED_A521_B47BEBEF99D0 START WITH 6 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_7721034B_2267_41BA_B062_452667CE1641 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_51626B0C_C421_4A18_8270_F7889C27C13C START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_F5907FB8_D114_4682_8EB3_AF7C6E0E18CD START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_961FFF43_7B14_4432_979E_29B47765492A START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_20CB245F_1D03_4750_BE4C_6239AF8B8133 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A7E8BEAA_7199_4071_9A13_A205C87430C8 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_9AA36E6C_26CC_44F6_A8C3_E4CB3200552E START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_405C1C66_2069_4350_8A5E_97A6C445A258 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_004178AD_4EBE_4069_8E75_DE2F7F4283CD START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_70956D05_9758_4131_AF68_B83116E5F748 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_39F89E16_3883_4039_9876_76371B462C07 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_4B685D34_945B_4BBB_8611_8CBE9911C3F2 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_6AFFF8D1_AF45_42AF_87EE_3E8188DDBA9A START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_83D6C5B8_ECD9_466D_B0AF_376398D09158 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_3814A94F_33EE_4621_895D_C6C286F37F66 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5C994078_58F3_4056_AAD0_307894B276BA START WITH 5 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_64A02A95_D231_4E11_8CDA_66A059FF588F START WITH 2 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_04E675BF_3ACC_4FAC_B66A_643B3175839E START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_61D13869_98BB_4997_B092_515D9263C392 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_4DE7046C_309A_497E_A77B_E7F858552044 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_FACCD50E_9CE4_4958_8CCE_249A197B18B9 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_C5C3BD44_A7F8_4E58_8D1A_8CE37AAE31D3 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_94F6D65D_8057_4C73_8918_D9791FFD681A START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_4000F194_F105_4A55_A439_C1D4DC1DF7A7 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_3B5CA6D9_5EB7_4CE4_9A92_86BD747A6F94 START WITH 6 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_9EC48888_BCD4_4652_96D5_B12220C3EE98 START WITH 2 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_CF6764A8_804E_448E_9BCE_4A030200A6B1 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_95E44CE8_C085_4803_9E1B_68E9CC44F285 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_44044B5D_AC37_4270_BA67_31FA40CC31E9 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5F615A2C_8F8A_498B_BB9E_B07C4169C815 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_D3607C9C_C5F2_4188_BB3D_2D307C9210FA START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_14756EB4_E9C9_40A3_BE85_DA69A810BD0D START WITH 37 BELONGS_TO_TABLE;    
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_9791D6ED_3D5E_4480_A7FF_CFF350E7549B START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_C4302ED3_DE22_4CEF_BADF_6AF81F8E95C6 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_76F423B4_2067_4660_86EF_A3DC548DFB36 START WITH 5 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_7FE50B94_3140_4A33_A93C_33CEF6B28C7F START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_BA85358A_4F81_449F_A72D_33EE4DD194CB START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_04718A31_596F_4BD7_BB12_0A7C913C16DE START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_7F6C7A35_56C8_4B05_94BF_87AAE631651D START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_39056BD0_C7BD_4432_AFF0_79F0CB1DF362 START WITH 5 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_2B9E56DD_CE23_4C2B_9CAA_5F64BF8F2AC1 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_36702A0F_7178_44F4_AC7E_A7FF585C6EB5 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A24111B2_BA6C_4677_ACC5_BF512C758DF4 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_C09F1BC8_3D2B_48EA_A43A_847512C52B89 START WITH 4 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_7743B25A_84A7_4694_B0C3_B2ED7B198BEB START WITH 2 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_6D44DCC6_ED02_4C28_A46B_FF159011EE3B START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_3E56DEEF_0C47_4ACE_A563_72714DAA8992 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_299DEB06_08E6_408A_9E3A_5CC0FBCD0F54 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_EE9EE954_5C0C_420A_8839_FBAD4BBD248B START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_C7DA6F24_F9E3_46A6_BC6A_8F63B63489BF START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_1AAE82E3_7CC1_46E6_B606_AF8A419B1962 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5B1727DA_66B0_4DC4_9019_AF79548E9DEE START WITH 13 BELONGS_TO_TABLE;    
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A5B8ECFB_B581_48D1_8C73_B5981C68D65A START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_40293BEB_F3DD_44FC_A328_59F4B74439E5 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A38CF45F_9FAB_42D2_A0EB_A6EA41C2F3C1 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_F0777008_49B6_4429_BBD3_4D0139BECDEC START WITH 1 BELONGS_TO_TABLE;     
 CREATE CACHED TABLE PUBLIC.DATABASECHANGELOG(
     ID VARCHAR(255) NOT NULL,
     AUTHOR VARCHAR(255) NOT NULL,
@@ -54,110 +54,110 @@ CREATE CACHED TABLE PUBLIC.DATABASECHANGELOG(
 );               
 -- 97 +/- SELECT COUNT(*) FROM PUBLIC.DATABASECHANGELOG;       
 INSERT INTO PUBLIC.DATABASECHANGELOG(ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, MD5SUM, DESCRIPTION, COMMENTS, TAG, LIQUIBASE, CONTEXTS, LABELS, DEPLOYMENT_ID) VALUES
-('1', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.4', 1, 'EXECUTED', '8:29a8f482877466643f65adb20c6d2139', 'createTable tableName=core_organization; createTable tableName=core_user; createTable tableName=core_userorgperm; addUniqueConstraint constraintName=idx_unique_user_id_organization_id, tableName=core_userorgperm; createIndex indexName=idx_userorgp...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('2', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.406', 2, 'EXECUTED', '8:983477ec51adb1236dd9d76ebf604be9', 'createTable tableName=core_session', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('4', 'cammsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.409', 3, 'EXECUTED', '8:a8e7822a91ea122212d376f5c2d4158f', 'createTable tableName=setting', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('5', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.44', 4, 'EXECUTED', '8:4f8653d16f4b102b3dff647277b6b988', 'addColumn tableName=core_organization', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('6', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.449', 5, 'EXECUTED', '8:2d2f5d1756ecb81da7c09ccfb9b1565a', 'dropNotNullConstraint columnName=organization_id, tableName=metabase_database; dropForeignKeyConstraint baseTableName=metabase_database, constraintName=fk_database_ref_organization_id; dropNotNullConstraint columnName=organization_id, tableName=re...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('7', 'cammsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.467', 6, 'EXECUTED', '8:c57c69fd78d804beb77d261066521f7f', 'addColumn tableName=metabase_field', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('8', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.512', 7, 'EXECUTED', '8:960ec59bbcb4c9f3fa8362eca9af4075', 'addColumn tableName=metabase_table; addColumn tableName=metabase_field', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('9', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.521', 8, 'EXECUTED', '8:d560283a190e3c60802eb04f5532a49d', 'addColumn tableName=metabase_table', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('10', 'cammsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.527', 9, 'EXECUTED', '8:532075ff1717d4a16bb9f27c606db46b', 'createTable tableName=revision; createIndex indexName=idx_revision_model_model_id, tableName=revision', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('11', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.529', 10, 'EXECUTED', '8:ca6561cab1eedbcf4dcb6d6e22cd46c6', 'sql', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('12', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.559', 11, 'EXECUTED', '8:bedbea570e5dfc694b4cf5a8f6a4f445', 'addColumn tableName=report_card', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('13', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.565', 12, 'EXECUTED', '8:f3ae0bac98abb3288158ac45d85bf0e3', 'createTable tableName=activity; createIndex indexName=idx_activity_timestamp, tableName=activity; createIndex indexName=idx_activity_user_id, tableName=activity; createIndex indexName=idx_activity_custom_id, tableName=activity', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('14', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.59', 13, 'EXECUTED', '8:7dc558da864d98b79f8d13a427ca3858', 'createTable tableName=view_log; createIndex indexName=idx_view_log_user_id, tableName=view_log; createIndex indexName=idx_view_log_timestamp, tableName=view_log', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('15', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.602', 14, 'EXECUTED', '8:505b91530103673a9be3382cd2db1070', 'addColumn tableName=revision', '', NULL, '3.6.3', NULL, NULL, '7483698154');   
+('1', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.895', 1, 'EXECUTED', '8:29a8f482877466643f65adb20c6d2139', 'createTable tableName=core_organization; createTable tableName=core_user; createTable tableName=core_userorgperm; addUniqueConstraint constraintName=idx_unique_user_id_organization_id, tableName=core_userorgperm; createIndex indexName=idx_userorgp...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('2', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.902', 2, 'EXECUTED', '8:983477ec51adb1236dd9d76ebf604be9', 'createTable tableName=core_session', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('4', 'cammsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.904', 3, 'EXECUTED', '8:a8e7822a91ea122212d376f5c2d4158f', 'createTable tableName=setting', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('5', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.943', 4, 'EXECUTED', '8:4f8653d16f4b102b3dff647277b6b988', 'addColumn tableName=core_organization', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('6', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.951', 5, 'EXECUTED', '8:2d2f5d1756ecb81da7c09ccfb9b1565a', 'dropNotNullConstraint columnName=organization_id, tableName=metabase_database; dropForeignKeyConstraint baseTableName=metabase_database, constraintName=fk_database_ref_organization_id; dropNotNullConstraint columnName=organization_id, tableName=re...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('7', 'cammsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.958', 6, 'EXECUTED', '8:c57c69fd78d804beb77d261066521f7f', 'addColumn tableName=metabase_field', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('8', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.968', 7, 'EXECUTED', '8:960ec59bbcb4c9f3fa8362eca9af4075', 'addColumn tableName=metabase_table; addColumn tableName=metabase_field', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('9', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.972', 8, 'EXECUTED', '8:d560283a190e3c60802eb04f5532a49d', 'addColumn tableName=metabase_table', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('10', 'cammsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.976', 9, 'EXECUTED', '8:532075ff1717d4a16bb9f27c606db46b', 'createTable tableName=revision; createIndex indexName=idx_revision_model_model_id, tableName=revision', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('11', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.978', 10, 'EXECUTED', '8:ca6561cab1eedbcf4dcb6d6e22cd46c6', 'sql', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('12', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.994', 11, 'EXECUTED', '8:bedbea570e5dfc694b4cf5a8f6a4f445', 'addColumn tableName=report_card', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('13', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.997', 12, 'EXECUTED', '8:f3ae0bac98abb3288158ac45d85bf0e3', 'createTable tableName=activity; createIndex indexName=idx_activity_timestamp, tableName=activity; createIndex indexName=idx_activity_user_id, tableName=activity; createIndex indexName=idx_activity_custom_id, tableName=activity', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('14', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.01', 13, 'EXECUTED', '8:7dc558da864d98b79f8d13a427ca3858', 'createTable tableName=view_log; createIndex indexName=idx_view_log_user_id, tableName=view_log; createIndex indexName=idx_view_log_timestamp, tableName=view_log', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('15', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.017', 14, 'EXECUTED', '8:505b91530103673a9be3382cd2db1070', 'addColumn tableName=revision', '', NULL, '3.6.3', NULL, NULL, '8601254743');
 INSERT INTO PUBLIC.DATABASECHANGELOG(ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, MD5SUM, DESCRIPTION, COMMENTS, TAG, LIQUIBASE, CONTEXTS, LABELS, DEPLOYMENT_ID) VALUES
-('16', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.604', 15, 'EXECUTED', '8:b81df46fe16c3e8659a81798b97a4793', 'dropNotNullConstraint columnName=last_login, tableName=core_user', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('17', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.614', 16, 'EXECUTED', '8:051c23cd15359364b9895c1569c319e7', 'addColumn tableName=metabase_database; sql', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('18', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.617', 17, 'EXECUTED', '8:62a0483dde183cfd18dd0a86e9354288', 'createTable tableName=data_migrations; createIndex indexName=idx_data_migrations_id, tableName=data_migrations', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('19', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.626', 18, 'EXECUTED', '8:269b129dbfc39a6f9e0d3bc61c3c3b70', 'addColumn tableName=metabase_table', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('20', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.641', 19, 'EXECUTED', '8:7ec10b2c7acbab0fc38043be575ff907', 'createTable tableName=pulse; createIndex indexName=idx_pulse_creator_id, tableName=pulse; createTable tableName=pulse_card; createIndex indexName=idx_pulse_card_pulse_id, tableName=pulse_card; createIndex indexName=idx_pulse_card_card_id, tableNam...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('21', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.648', 20, 'EXECUTED', '8:492a1b64ff9c792aa6ba97d091819261', 'createTable tableName=segment; createIndex indexName=idx_segment_creator_id, tableName=segment; createIndex indexName=idx_segment_table_id, tableName=segment', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('22', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.654', 21, 'EXECUTED', '8:80bc8a62a90791a79adedcf1ac3c6f08', 'addColumn tableName=revision', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('23', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.662', 22, 'EXECUTED', '8:b6f054835db2b2688a1be1de3707f9a9', 'modifyDataType columnName=rows, tableName=metabase_table', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('24', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.667', 23, 'EXECUTED', '8:5e7354b3f92782d1151be0aa9d3fe625', 'createTable tableName=dependency; createIndex indexName=idx_dependency_model, tableName=dependency; createIndex indexName=idx_dependency_model_id, tableName=dependency; createIndex indexName=idx_dependency_dependent_on_model, tableName=dependency;...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('25', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.673', 24, 'EXECUTED', '8:cea300a621393501d4534b0ff41eb91c', 'createTable tableName=metric; createIndex indexName=idx_metric_creator_id, tableName=metric; createIndex indexName=idx_metric_table_id, tableName=metric', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('26', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.686', 25, 'EXECUTED', '8:ddef40b95c55cf4ac0e6a5161911a4cb', 'addColumn tableName=metabase_database; sql', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('27', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.698', 26, 'EXECUTED', '8:017050df833b3b678d1b52b1a0f4de50', 'createTable tableName=dashboardcard_series; createIndex indexName=idx_dashboardcard_series_dashboardcard_id, tableName=dashboardcard_series; createIndex indexName=idx_dashboardcard_series_card_id, tableName=dashboardcard_series', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('28', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.718', 27, 'EXECUTED', '8:428e4eb05e4e29141735adf9ae141a0b', 'addColumn tableName=core_user', '', NULL, '3.6.3', NULL, NULL, '7483698154');        
+('16', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.019', 15, 'EXECUTED', '8:b81df46fe16c3e8659a81798b97a4793', 'dropNotNullConstraint columnName=last_login, tableName=core_user', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('17', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.029', 16, 'EXECUTED', '8:051c23cd15359364b9895c1569c319e7', 'addColumn tableName=metabase_database; sql', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('18', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.031', 17, 'EXECUTED', '8:62a0483dde183cfd18dd0a86e9354288', 'createTable tableName=data_migrations; createIndex indexName=idx_data_migrations_id, tableName=data_migrations', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('19', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.037', 18, 'EXECUTED', '8:269b129dbfc39a6f9e0d3bc61c3c3b70', 'addColumn tableName=metabase_table', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('20', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.05', 19, 'EXECUTED', '8:7ec10b2c7acbab0fc38043be575ff907', 'createTable tableName=pulse; createIndex indexName=idx_pulse_creator_id, tableName=pulse; createTable tableName=pulse_card; createIndex indexName=idx_pulse_card_pulse_id, tableName=pulse_card; createIndex indexName=idx_pulse_card_card_id, tableNam...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('21', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.055', 20, 'EXECUTED', '8:492a1b64ff9c792aa6ba97d091819261', 'createTable tableName=segment; createIndex indexName=idx_segment_creator_id, tableName=segment; createIndex indexName=idx_segment_table_id, tableName=segment', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('22', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.058', 21, 'EXECUTED', '8:80bc8a62a90791a79adedcf1ac3c6f08', 'addColumn tableName=revision', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('23', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.063', 22, 'EXECUTED', '8:b6f054835db2b2688a1be1de3707f9a9', 'modifyDataType columnName=rows, tableName=metabase_table', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('24', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.066', 23, 'EXECUTED', '8:5e7354b3f92782d1151be0aa9d3fe625', 'createTable tableName=dependency; createIndex indexName=idx_dependency_model, tableName=dependency; createIndex indexName=idx_dependency_model_id, tableName=dependency; createIndex indexName=idx_dependency_dependent_on_model, tableName=dependency;...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('25', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.07', 24, 'EXECUTED', '8:cea300a621393501d4534b0ff41eb91c', 'createTable tableName=metric; createIndex indexName=idx_metric_creator_id, tableName=metric; createIndex indexName=idx_metric_table_id, tableName=metric', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('26', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.075', 25, 'EXECUTED', '8:ddef40b95c55cf4ac0e6a5161911a4cb', 'addColumn tableName=metabase_database; sql', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('27', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.078', 26, 'EXECUTED', '8:017050df833b3b678d1b52b1a0f4de50', 'createTable tableName=dashboardcard_series; createIndex indexName=idx_dashboardcard_series_dashboardcard_id, tableName=dashboardcard_series; createIndex indexName=idx_dashboardcard_series_card_id, tableName=dashboardcard_series', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('28', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.088', 27, 'EXECUTED', '8:428e4eb05e4e29141735adf9ae141a0b', 'addColumn tableName=core_user', '', NULL, '3.6.3', NULL, NULL, '8601254743');          
 INSERT INTO PUBLIC.DATABASECHANGELOG(ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, MD5SUM, DESCRIPTION, COMMENTS, TAG, LIQUIBASE, CONTEXTS, LABELS, DEPLOYMENT_ID) VALUES
-('29', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.724', 28, 'EXECUTED', '8:8b02731cc34add3722c926dfd7376ae0', 'addColumn tableName=pulse_channel', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('30', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.732', 29, 'EXECUTED', '8:2c3a50cef177cb90d47a9973cd5934e5', 'addColumn tableName=metabase_field; addNotNullConstraint columnName=visibility_type, tableName=metabase_field', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('31', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.74', 30, 'EXECUTED', '8:30a33a82bab0bcbb2ccb6738d48e1421', 'addColumn tableName=metabase_field', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('32', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.754', 31, 'EXECUTED', '8:40830260b92cedad8da273afd5eca678', 'createTable tableName=label; createIndex indexName=idx_label_slug, tableName=label; createTable tableName=card_label; addUniqueConstraint constraintName=unique_card_label_card_id_label_id, tableName=card_label; createIndex indexName=idx_card_label...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('32', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.793', 32, 'EXECUTED', '8:ca6efc1c0a7aa82467d2c84421e812eb', 'createTable tableName=raw_table; createIndex indexName=idx_rawtable_database_id, tableName=raw_table; addUniqueConstraint constraintName=uniq_raw_table_db_schema_name, tableName=raw_table; createTable tableName=raw_column; createIndex indexName=id...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('34', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.799', 33, 'EXECUTED', '8:52b082600b05bbbc46bfe837d1f37a82', 'addColumn tableName=pulse_channel', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('35', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.803', 34, 'EXECUTED', '8:91b72167fca724e6b6a94b64f886cf09', 'modifyDataType columnName=value, tableName=setting', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('36', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.812', 35, 'EXECUTED', '8:252e08892449dceb16c3d91337bd9573', 'addColumn tableName=report_dashboard; addNotNullConstraint columnName=parameters, tableName=report_dashboard; addColumn tableName=report_dashboardcard; addNotNullConstraint columnName=parameter_mappings, tableName=report_dashboardcard', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('37', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.821', 36, 'EXECUTED', '8:07d959eff81777e5690e2920583cfe5f', 'addColumn tableName=query_queryexecution; addNotNullConstraint columnName=query_hash, tableName=query_queryexecution; createIndex indexName=idx_query_queryexecution_query_hash, tableName=query_queryexecution; createIndex indexName=idx_query_querye...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('38', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.905', 37, 'EXECUTED', '8:43604ab55179b50306eb39353e760b46', 'addColumn tableName=metabase_database; addColumn tableName=metabase_table; addColumn tableName=metabase_field; addColumn tableName=report_dashboard; addColumn tableName=metric; addColumn tableName=segment; addColumn tableName=metabase_database; ad...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('39', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.926', 38, 'EXECUTED', '8:334adc22af5ded71ff27759b7a556951', 'addColumn tableName=core_user', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('40', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.946', 39, 'EXECUTED', '8:ee7f50a264d6cf8d891bd01241eebd2c', 'createTable tableName=permissions_group; createIndex indexName=idx_permissions_group_name, tableName=permissions_group; createTable tableName=permissions_group_membership; addUniqueConstraint constraintName=unique_permissions_group_membership_user...', '', NULL, '3.6.3', NULL, NULL, '7483698154');        
+('29', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.091', 28, 'EXECUTED', '8:8b02731cc34add3722c926dfd7376ae0', 'addColumn tableName=pulse_channel', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('30', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.097', 29, 'EXECUTED', '8:2c3a50cef177cb90d47a9973cd5934e5', 'addColumn tableName=metabase_field; addNotNullConstraint columnName=visibility_type, tableName=metabase_field', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('31', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.101', 30, 'EXECUTED', '8:30a33a82bab0bcbb2ccb6738d48e1421', 'addColumn tableName=metabase_field', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('32', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.12', 31, 'EXECUTED', '8:40830260b92cedad8da273afd5eca678', 'createTable tableName=label; createIndex indexName=idx_label_slug, tableName=label; createTable tableName=card_label; addUniqueConstraint constraintName=unique_card_label_card_id_label_id, tableName=card_label; createIndex indexName=idx_card_label...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('32', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.148', 32, 'EXECUTED', '8:ca6efc1c0a7aa82467d2c84421e812eb', 'createTable tableName=raw_table; createIndex indexName=idx_rawtable_database_id, tableName=raw_table; addUniqueConstraint constraintName=uniq_raw_table_db_schema_name, tableName=raw_table; createTable tableName=raw_column; createIndex indexName=id...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('34', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.152', 33, 'EXECUTED', '8:52b082600b05bbbc46bfe837d1f37a82', 'addColumn tableName=pulse_channel', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('35', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.153', 34, 'EXECUTED', '8:91b72167fca724e6b6a94b64f886cf09', 'modifyDataType columnName=value, tableName=setting', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('36', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.161', 35, 'EXECUTED', '8:252e08892449dceb16c3d91337bd9573', 'addColumn tableName=report_dashboard; addNotNullConstraint columnName=parameters, tableName=report_dashboard; addColumn tableName=report_dashboardcard; addNotNullConstraint columnName=parameter_mappings, tableName=report_dashboardcard', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('37', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.167', 36, 'EXECUTED', '8:07d959eff81777e5690e2920583cfe5f', 'addColumn tableName=query_queryexecution; addNotNullConstraint columnName=query_hash, tableName=query_queryexecution; createIndex indexName=idx_query_queryexecution_query_hash, tableName=query_queryexecution; createIndex indexName=idx_query_querye...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('38', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.245', 37, 'EXECUTED', '8:43604ab55179b50306eb39353e760b46', 'addColumn tableName=metabase_database; addColumn tableName=metabase_table; addColumn tableName=metabase_field; addColumn tableName=report_dashboard; addColumn tableName=metric; addColumn tableName=segment; addColumn tableName=metabase_database; ad...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('39', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.254', 38, 'EXECUTED', '8:334adc22af5ded71ff27759b7a556951', 'addColumn tableName=core_user', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('40', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.267', 39, 'EXECUTED', '8:ee7f50a264d6cf8d891bd01241eebd2c', 'createTable tableName=permissions_group; createIndex indexName=idx_permissions_group_name, tableName=permissions_group; createTable tableName=permissions_group_membership; addUniqueConstraint constraintName=unique_permissions_group_membership_user...', '', NULL, '3.6.3', NULL, NULL, '8601254743');        
 INSERT INTO PUBLIC.DATABASECHANGELOG(ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, MD5SUM, DESCRIPTION, COMMENTS, TAG, LIQUIBASE, CONTEXTS, LABELS, DEPLOYMENT_ID) VALUES
-('41', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.957', 40, 'EXECUTED', '8:fae0855adf2f702f1133e32fc98d02a5', 'dropColumn columnName=field_type, tableName=metabase_field; addDefaultValue columnName=active, tableName=metabase_field; addDefaultValue columnName=preview_display, tableName=metabase_field; addDefaultValue columnName=position, tableName=metabase_...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('42', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.019', 41, 'EXECUTED', '8:e32b3a1624fa289a6ee1f3f0a2dac1f6', 'dropForeignKeyConstraint baseTableName=query_queryexecution, constraintName=fk_queryexecution_ref_query_id; dropColumn columnName=query_id, tableName=query_queryexecution; dropColumn columnName=is_staff, tableName=core_user; dropColumn columnName=...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('43', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.024', 42, 'EXECUTED', '8:165e9384e46d6f9c0330784955363f70', 'createTable tableName=permissions_revision', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('44', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.038', 43, 'EXECUTED', '8:2e356e8a1049286f1c78324828ee7867', 'dropColumn columnName=public_perms, tableName=report_card; dropColumn columnName=public_perms, tableName=report_dashboard; dropColumn columnName=public_perms, tableName=pulse', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('45', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.043', 44, 'EXECUTED', '8:421edd38ee0cb0983162f57193f81b0b', 'addColumn tableName=report_dashboardcard; addNotNullConstraint columnName=visualization_settings, tableName=report_dashboardcard', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('46', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.05', 45, 'EXECUTED', '8:131df3cdd9a8c67b32c5988a3fb7fe3d', 'addNotNullConstraint columnName=row, tableName=report_dashboardcard; addNotNullConstraint columnName=col, tableName=report_dashboardcard; addDefaultValue columnName=row, tableName=report_dashboardcard; addDefaultValue columnName=col, tableName=rep...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('47', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.063', 46, 'EXECUTED', '8:1d2474e49a27db344c250872df58a6ed', 'createTable tableName=collection; createIndex indexName=idx_collection_slug, tableName=collection; addColumn tableName=report_card; createIndex indexName=idx_card_collection_id, tableName=report_card', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('48', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.068', 47, 'EXECUTED', '8:720ce9d4b9e6f0917aea035e9dc5d95d', 'createTable tableName=collection_revision', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('49', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.115', 48, 'EXECUTED', '8:56dcab086b21de1df002561efeac8bb6', 'addColumn tableName=report_card; createIndex indexName=idx_card_public_uuid, tableName=report_card; addColumn tableName=report_dashboard; createIndex indexName=idx_dashboard_public_uuid, tableName=report_dashboard; dropNotNullConstraint columnName...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('50', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.142', 49, 'EXECUTED', '8:388da4c48984aad647709514e4ba9204', 'addColumn tableName=report_card; addColumn tableName=report_dashboard', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('51', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.146', 50, 'EXECUTED', '8:43c90b5b9f6c14bfd0e41cc0b184617e', 'createTable tableName=query_execution; createIndex indexName=idx_query_execution_started_at, tableName=query_execution; createIndex indexName=idx_query_execution_query_hash_started_at, tableName=query_execution', '', NULL, '3.6.3', NULL, NULL, '7483698154');   
+('41', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.274', 40, 'EXECUTED', '8:fae0855adf2f702f1133e32fc98d02a5', 'dropColumn columnName=field_type, tableName=metabase_field; addDefaultValue columnName=active, tableName=metabase_field; addDefaultValue columnName=preview_display, tableName=metabase_field; addDefaultValue columnName=position, tableName=metabase_...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('42', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.3', 41, 'EXECUTED', '8:e32b3a1624fa289a6ee1f3f0a2dac1f6', 'dropForeignKeyConstraint baseTableName=query_queryexecution, constraintName=fk_queryexecution_ref_query_id; dropColumn columnName=query_id, tableName=query_queryexecution; dropColumn columnName=is_staff, tableName=core_user; dropColumn columnName=...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('43', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.305', 42, 'EXECUTED', '8:165e9384e46d6f9c0330784955363f70', 'createTable tableName=permissions_revision', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('44', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.324', 43, 'EXECUTED', '8:2e356e8a1049286f1c78324828ee7867', 'dropColumn columnName=public_perms, tableName=report_card; dropColumn columnName=public_perms, tableName=report_dashboard; dropColumn columnName=public_perms, tableName=pulse', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('45', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.334', 44, 'EXECUTED', '8:421edd38ee0cb0983162f57193f81b0b', 'addColumn tableName=report_dashboardcard; addNotNullConstraint columnName=visualization_settings, tableName=report_dashboardcard', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('46', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.339', 45, 'EXECUTED', '8:131df3cdd9a8c67b32c5988a3fb7fe3d', 'addNotNullConstraint columnName=row, tableName=report_dashboardcard; addNotNullConstraint columnName=col, tableName=report_dashboardcard; addDefaultValue columnName=row, tableName=report_dashboardcard; addDefaultValue columnName=col, tableName=rep...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('47', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.348', 46, 'EXECUTED', '8:1d2474e49a27db344c250872df58a6ed', 'createTable tableName=collection; createIndex indexName=idx_collection_slug, tableName=collection; addColumn tableName=report_card; createIndex indexName=idx_card_collection_id, tableName=report_card', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('48', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.351', 47, 'EXECUTED', '8:720ce9d4b9e6f0917aea035e9dc5d95d', 'createTable tableName=collection_revision', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('49', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.366', 48, 'EXECUTED', '8:56dcab086b21de1df002561efeac8bb6', 'addColumn tableName=report_card; createIndex indexName=idx_card_public_uuid, tableName=report_card; addColumn tableName=report_dashboard; createIndex indexName=idx_dashboard_public_uuid, tableName=report_dashboard; dropNotNullConstraint columnName...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('50', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.382', 49, 'EXECUTED', '8:388da4c48984aad647709514e4ba9204', 'addColumn tableName=report_card; addColumn tableName=report_dashboard', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('51', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.385', 50, 'EXECUTED', '8:43c90b5b9f6c14bfd0e41cc0b184617e', 'createTable tableName=query_execution; createIndex indexName=idx_query_execution_started_at, tableName=query_execution; createIndex indexName=idx_query_execution_query_hash_started_at, tableName=query_execution', '', NULL, '3.6.3', NULL, NULL, '8601254743');    
 INSERT INTO PUBLIC.DATABASECHANGELOG(ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, MD5SUM, DESCRIPTION, COMMENTS, TAG, LIQUIBASE, CONTEXTS, LABELS, DEPLOYMENT_ID) VALUES
-('52', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.157', 51, 'EXECUTED', '8:329695cb161ceb86f6d9473819359351', 'createTable tableName=query_cache; createIndex indexName=idx_query_cache_updated_at, tableName=query_cache; addColumn tableName=report_card', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('53', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.159', 52, 'EXECUTED', '8:78d015c5090c57cd6972eb435601d3d0', 'createTable tableName=query', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('54', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.164', 53, 'EXECUTED', '8:e410005b585f5eeb5f202076ff9468f7', 'addColumn tableName=pulse', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('55', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.178', 54, 'EXECUTED', '8:87c4becde5fe208ba2c356128df86fba', 'addColumn tableName=report_dashboard; createTable tableName=dashboard_favorite; addUniqueConstraint constraintName=unique_dashboard_favorite_user_id_dashboard_id, tableName=dashboard_favorite; createIndex indexName=idx_dashboard_favorite_user_id, ...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('56', 'wwwiiilll', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.208', 55, 'EXECUTED', '8:9f46051abaee599e2838733512a32ad0', 'addColumn tableName=core_user', 'Added 0.25.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('57', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.218', 56, 'EXECUTED', '8:aab81d477e2d19a9ab18c58b78c9af88', 'addColumn tableName=report_card', 'Added 0.25.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('58', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.223', 57, 'EXECUTED', '8:3554219ca39e0fd682d0fba57531e917', 'createTable tableName=dimension; addUniqueConstraint constraintName=unique_dimension_field_id_name, tableName=dimension; createIndex indexName=idx_dimension_field_id, tableName=dimension', 'Added 0.25.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('59', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.229', 58, 'EXECUTED', '8:5b6ce52371e0e9eee88e6d766225a94b', 'addColumn tableName=metabase_field', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('60', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.236', 59, 'EXECUTED', '8:4f997b2cd3309882e900493892381f38', 'addColumn tableName=metabase_database', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('61', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.242', 60, 'EXECUTED', '8:7dded6fd5bf74d79b9a0b62511981272', 'addColumn tableName=metabase_field', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('62', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.246', 61, 'EXECUTED', '8:cb32e6eaa1a2140703def2730f81fef2', 'addColumn tableName=metabase_database', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('63', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.249', 62, 'EXECUTED', '8:226f73b9f6617495892d281b0f8303db', 'addColumn tableName=metabase_database', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('64', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.251', 63, 'EXECUTED', '8:4dcc8ffd836b56756f494d5dfce07b50', 'dropForeignKeyConstraint baseTableName=raw_table, constraintName=fk_rawtable_ref_database', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('66', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.253', 64, 'EXECUTED', '8:e77d66af8e3b83d46c5a0064a75a1aac', 'sql; sql', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('67', 'attekei', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.257', 65, 'EXECUTED', '8:59dfc37744fc362e0e312488fbc9a69b', 'createTable tableName=computation_job; createTable tableName=computation_job_result', 'Added 0.27.0', NULL, '3.6.3', NULL, NULL, '7483698154');             
+('52', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.393', 51, 'EXECUTED', '8:329695cb161ceb86f6d9473819359351', 'createTable tableName=query_cache; createIndex indexName=idx_query_cache_updated_at, tableName=query_cache; addColumn tableName=report_card', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('53', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.395', 52, 'EXECUTED', '8:78d015c5090c57cd6972eb435601d3d0', 'createTable tableName=query', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('54', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.398', 53, 'EXECUTED', '8:e410005b585f5eeb5f202076ff9468f7', 'addColumn tableName=pulse', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('55', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.409', 54, 'EXECUTED', '8:87c4becde5fe208ba2c356128df86fba', 'addColumn tableName=report_dashboard; createTable tableName=dashboard_favorite; addUniqueConstraint constraintName=unique_dashboard_favorite_user_id_dashboard_id, tableName=dashboard_favorite; createIndex indexName=idx_dashboard_favorite_user_id, ...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('56', 'wwwiiilll', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.421', 55, 'EXECUTED', '8:9f46051abaee599e2838733512a32ad0', 'addColumn tableName=core_user', 'Added 0.25.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('57', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.437', 56, 'EXECUTED', '8:aab81d477e2d19a9ab18c58b78c9af88', 'addColumn tableName=report_card', 'Added 0.25.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('58', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.45', 57, 'EXECUTED', '8:3554219ca39e0fd682d0fba57531e917', 'createTable tableName=dimension; addUniqueConstraint constraintName=unique_dimension_field_id_name, tableName=dimension; createIndex indexName=idx_dimension_field_id, tableName=dimension', 'Added 0.25.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('59', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.455', 58, 'EXECUTED', '8:5b6ce52371e0e9eee88e6d766225a94b', 'addColumn tableName=metabase_field', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('60', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.461', 59, 'EXECUTED', '8:4f997b2cd3309882e900493892381f38', 'addColumn tableName=metabase_database', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('61', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.466', 60, 'EXECUTED', '8:7dded6fd5bf74d79b9a0b62511981272', 'addColumn tableName=metabase_field', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('62', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.469', 61, 'EXECUTED', '8:cb32e6eaa1a2140703def2730f81fef2', 'addColumn tableName=metabase_database', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('63', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.472', 62, 'EXECUTED', '8:226f73b9f6617495892d281b0f8303db', 'addColumn tableName=metabase_database', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('64', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.473', 63, 'EXECUTED', '8:4dcc8ffd836b56756f494d5dfce07b50', 'dropForeignKeyConstraint baseTableName=raw_table, constraintName=fk_rawtable_ref_database', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('66', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.475', 64, 'EXECUTED', '8:e77d66af8e3b83d46c5a0064a75a1aac', 'sql; sql', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('67', 'attekei', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.478', 65, 'EXECUTED', '8:59dfc37744fc362e0e312488fbc9a69b', 'createTable tableName=computation_job; createTable tableName=computation_job_result', 'Added 0.27.0', NULL, '3.6.3', NULL, NULL, '8601254743');              
 INSERT INTO PUBLIC.DATABASECHANGELOG(ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, MD5SUM, DESCRIPTION, COMMENTS, TAG, LIQUIBASE, CONTEXTS, LABELS, DEPLOYMENT_ID) VALUES
-('68', 'sbelak', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.263', 66, 'EXECUTED', '8:ca201aeb20c1719a46c6bcc3fc95c81d', 'addColumn tableName=computation_job', 'Added 0.27.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('69', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.274', 67, 'EXECUTED', '8:97b7768436b9e8d695bae984020d754c', 'addColumn tableName=pulse; dropNotNullConstraint columnName=name, tableName=pulse', 'Added 0.27.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('70', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.281', 68, 'EXECUTED', '8:4e4eff7abb983b1127a32ba8107e7fb8', 'addColumn tableName=metabase_field; addNotNullConstraint columnName=database_type, tableName=metabase_field', 'Added 0.28.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('71', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.282', 69, 'EXECUTED', '8:755e5c3dd8a55793f29b2c95cb79c211', 'dropNotNullConstraint columnName=card_id, tableName=report_dashboardcard', 'Added 0.28.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('72', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.29', 70, 'EXECUTED', '8:ed16046dfa04c139f48e9068eb4faee4', 'addColumn tableName=pulse_card', 'Added 0.28.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('73', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.301', 71, 'EXECUTED', '8:3c0f03d18ff78a0bcc9915e1d9c518d6', 'addColumn tableName=metabase_database', 'Added 0.29.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('74', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.315', 72, 'EXECUTED', '8:16726d6560851325930c25caf3c8ab96', 'addColumn tableName=metabase_field', 'Added 0.29.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('75', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.329', 73, 'EXECUTED', '8:6072cabfe8188872d8e3da9a675f88c1', 'addColumn tableName=report_card', 'Added 0.28.2', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('76', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.337', 74, 'EXECUTED', '8:9b7190c9171ccca72617d508875c3c82', 'addColumn tableName=metabase_table', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('77', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.348', 75, 'EXECUTED', '8:07f0a6cd8dbbd9b89be0bd7378f7bdc8', 'addColumn tableName=core_user', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('79', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.362', 76, 'EXECUTED', '8:3f31cb67f9cdf7754ca95cade22d87a2', 'addColumn tableName=report_dashboard; createIndex indexName=idx_dashboard_collection_id, tableName=report_dashboard; addColumn tableName=pulse; createIndex indexName=idx_pulse_collection_id, tableName=pulse', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('80', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.369', 77, 'EXECUTED', '8:199d0ce28955117819ca15bcc29323e5', 'addColumn tableName=collection; createIndex indexName=idx_collection_location, tableName=collection', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('81', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.391', 78, 'EXECUTED', '8:3a6dc22403660529194d004ca7f7ad39', 'addColumn tableName=report_dashboard; addColumn tableName=report_card; addColumn tableName=pulse', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('82', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.416', 79, 'EXECUTED', '8:ac4b94df8c648f88cfff661284d6392d', 'addColumn tableName=core_user; sql', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('84', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.422', 80, 'EXECUTED', '8:58afc10c3e283a8050ea471aac447a97', 'renameColumn newColumnName=archived, oldColumnName=is_active, tableName=metric; addDefaultValue columnName=archived, tableName=metric; renameColumn newColumnName=archived, oldColumnName=is_active, tableName=segment; addDefaultValue columnName=arch...', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'); 
+('68', 'sbelak', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.481', 66, 'EXECUTED', '8:ca201aeb20c1719a46c6bcc3fc95c81d', 'addColumn tableName=computation_job', 'Added 0.27.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('69', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.486', 67, 'EXECUTED', '8:97b7768436b9e8d695bae984020d754c', 'addColumn tableName=pulse; dropNotNullConstraint columnName=name, tableName=pulse', 'Added 0.27.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('70', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.489', 68, 'EXECUTED', '8:4e4eff7abb983b1127a32ba8107e7fb8', 'addColumn tableName=metabase_field; addNotNullConstraint columnName=database_type, tableName=metabase_field', 'Added 0.28.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('71', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.49', 69, 'EXECUTED', '8:755e5c3dd8a55793f29b2c95cb79c211', 'dropNotNullConstraint columnName=card_id, tableName=report_dashboardcard', 'Added 0.28.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('72', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.495', 70, 'EXECUTED', '8:ed16046dfa04c139f48e9068eb4faee4', 'addColumn tableName=pulse_card', 'Added 0.28.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('73', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.498', 71, 'EXECUTED', '8:3c0f03d18ff78a0bcc9915e1d9c518d6', 'addColumn tableName=metabase_database', 'Added 0.29.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('74', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.501', 72, 'EXECUTED', '8:16726d6560851325930c25caf3c8ab96', 'addColumn tableName=metabase_field', 'Added 0.29.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('75', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.506', 73, 'EXECUTED', '8:6072cabfe8188872d8e3da9a675f88c1', 'addColumn tableName=report_card', 'Added 0.28.2', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('76', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.511', 74, 'EXECUTED', '8:9b7190c9171ccca72617d508875c3c82', 'addColumn tableName=metabase_table', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('77', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.522', 75, 'EXECUTED', '8:07f0a6cd8dbbd9b89be0bd7378f7bdc8', 'addColumn tableName=core_user', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('79', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.531', 76, 'EXECUTED', '8:3f31cb67f9cdf7754ca95cade22d87a2', 'addColumn tableName=report_dashboard; createIndex indexName=idx_dashboard_collection_id, tableName=report_dashboard; addColumn tableName=pulse; createIndex indexName=idx_pulse_collection_id, tableName=pulse', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('80', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.537', 77, 'EXECUTED', '8:199d0ce28955117819ca15bcc29323e5', 'addColumn tableName=collection; createIndex indexName=idx_collection_location, tableName=collection', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('81', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.553', 78, 'EXECUTED', '8:3a6dc22403660529194d004ca7f7ad39', 'addColumn tableName=report_dashboard; addColumn tableName=report_card; addColumn tableName=pulse', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('82', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.564', 79, 'EXECUTED', '8:ac4b94df8c648f88cfff661284d6392d', 'addColumn tableName=core_user; sql', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('84', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.57', 80, 'EXECUTED', '8:58afc10c3e283a8050ea471aac447a97', 'renameColumn newColumnName=archived, oldColumnName=is_active, tableName=metric; addDefaultValue columnName=archived, tableName=metric; renameColumn newColumnName=archived, oldColumnName=is_active, tableName=segment; addDefaultValue columnName=arch...', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743');  
 INSERT INTO PUBLIC.DATABASECHANGELOG(ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, MD5SUM, DESCRIPTION, COMMENTS, TAG, LIQUIBASE, CONTEXTS, LABELS, DEPLOYMENT_ID) VALUES
-('85', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.446', 81, 'EXECUTED', '8:9b4c9878a5018452dd63eb6d7c17f415', 'addColumn tableName=collection; createIndex indexName=idx_collection_personal_owner_id, tableName=collection; addColumn tableName=collection; sql; addNotNullConstraint columnName=_slug, tableName=collection; dropColumn columnName=slug, tableName=c...', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('86', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.453', 82, 'EXECUTED', '8:50c75bb29f479e0b3fb782d89f7d6717', 'sql', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('87', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.456', 83, 'EXECUTED', '8:0eccf19a93cb0ba4017aafd1d308c097', 'dropTable tableName=raw_column; dropTable tableName=raw_table', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('89', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.493', 84, 'EXECUTED', '8:ab526907b26b1bb43ac9f9548043f2a7', 'createTable tableName=QRTZ_JOB_DETAILS; addPrimaryKey constraintName=PK_QRTZ_JOB_DETAILS, tableName=QRTZ_JOB_DETAILS; createTable tableName=QRTZ_TRIGGERS; addPrimaryKey constraintName=PK_QRTZ_TRIGGERS, tableName=QRTZ_TRIGGERS; addForeignKeyConstra...', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('91', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.515', 85, 'EXECUTED', '8:9b8831e1e409f08e874c4ece043d0340', 'dropColumn columnName=raw_table_id, tableName=metabase_table; dropColumn columnName=raw_column_id, tableName=metabase_field', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('92', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.519', 86, 'EXECUTED', '8:1e5bc2d66778316ea640a561862c23b4', 'addColumn tableName=query_execution', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('93', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.523', 87, 'EXECUTED', '8:93b0d408a3970e30d7184ed1166b5476', 'addColumn tableName=query', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('94', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.526', 88, 'EXECUTED', '8:a2a1eedf1e8f8756856c9d49c7684bfe', 'createTable tableName=task_history; createIndex indexName=idx_task_history_end_time, tableName=task_history; createIndex indexName=idx_task_history_db_id, tableName=task_history', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('95', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.535', 89, 'EXECUTED', '8:9824808283004e803003b938399a4cf0', 'addUniqueConstraint constraintName=idx_databasechangelog_id_author_filename, tableName=DATABASECHANGELOG', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('96', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.541', 90, 'EXECUTED', '8:5cb2f36edcca9c6e14c5e109d6aeb68b', 'addColumn tableName=metabase_field', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('97', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.543', 91, 'MARK_RAN', '8:9169e238663c5d036bd83428d2fa8e4b', 'modifyDataType columnName=results, tableName=query_cache', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('98', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.546', 92, 'EXECUTED', '8:f036d20a4dc86fb60ffb64ea838ed6b9', 'addUniqueConstraint constraintName=idx_uniq_table_db_id_schema_name, tableName=metabase_table; sql', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('99', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.549', 93, 'EXECUTED', '8:274bb516dd95b76c954b26084eed1dfe', 'addUniqueConstraint constraintName=idx_uniq_field_table_id_parent_id_name, tableName=metabase_field; sql', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '7483698154');         
+('85', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.583', 81, 'EXECUTED', '8:9b4c9878a5018452dd63eb6d7c17f415', 'addColumn tableName=collection; createIndex indexName=idx_collection_personal_owner_id, tableName=collection; addColumn tableName=collection; sql; addNotNullConstraint columnName=_slug, tableName=collection; dropColumn columnName=slug, tableName=c...', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('86', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.584', 82, 'EXECUTED', '8:50c75bb29f479e0b3fb782d89f7d6717', 'sql', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('87', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.586', 83, 'EXECUTED', '8:0eccf19a93cb0ba4017aafd1d308c097', 'dropTable tableName=raw_column; dropTable tableName=raw_table', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('89', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.599', 84, 'EXECUTED', '8:ab526907b26b1bb43ac9f9548043f2a7', 'createTable tableName=QRTZ_JOB_DETAILS; addPrimaryKey constraintName=PK_QRTZ_JOB_DETAILS, tableName=QRTZ_JOB_DETAILS; createTable tableName=QRTZ_TRIGGERS; addPrimaryKey constraintName=PK_QRTZ_TRIGGERS, tableName=QRTZ_TRIGGERS; addForeignKeyConstra...', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('91', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.606', 85, 'EXECUTED', '8:9b8831e1e409f08e874c4ece043d0340', 'dropColumn columnName=raw_table_id, tableName=metabase_table; dropColumn columnName=raw_column_id, tableName=metabase_field', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('92', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.608', 86, 'EXECUTED', '8:1e5bc2d66778316ea640a561862c23b4', 'addColumn tableName=query_execution', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('93', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.611', 87, 'EXECUTED', '8:93b0d408a3970e30d7184ed1166b5476', 'addColumn tableName=query', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('94', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.613', 88, 'EXECUTED', '8:a2a1eedf1e8f8756856c9d49c7684bfe', 'createTable tableName=task_history; createIndex indexName=idx_task_history_end_time, tableName=task_history; createIndex indexName=idx_task_history_db_id, tableName=task_history', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('95', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.628', 89, 'EXECUTED', '8:9824808283004e803003b938399a4cf0', 'addUniqueConstraint constraintName=idx_databasechangelog_id_author_filename, tableName=DATABASECHANGELOG', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('96', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.636', 90, 'EXECUTED', '8:5cb2f36edcca9c6e14c5e109d6aeb68b', 'addColumn tableName=metabase_field', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('97', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.638', 91, 'MARK_RAN', '8:9169e238663c5d036bd83428d2fa8e4b', 'modifyDataType columnName=results, tableName=query_cache', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('98', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.64', 92, 'EXECUTED', '8:f036d20a4dc86fb60ffb64ea838ed6b9', 'addUniqueConstraint constraintName=idx_uniq_table_db_id_schema_name, tableName=metabase_table; sql', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('99', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.646', 93, 'EXECUTED', '8:274bb516dd95b76c954b26084eed1dfe', 'addUniqueConstraint constraintName=idx_uniq_field_table_id_parent_id_name, tableName=metabase_field; sql', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '8601254743');          
 INSERT INTO PUBLIC.DATABASECHANGELOG(ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, MD5SUM, DESCRIPTION, COMMENTS, TAG, LIQUIBASE, CONTEXTS, LABELS, DEPLOYMENT_ID) VALUES
-('100', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.552', 94, 'EXECUTED', '8:948014f13b6198b50e3b7a066fae2ae0', 'sql', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('101', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.554', 95, 'EXECUTED', '8:58eabb08a175fafe8985208545374675', 'createIndex indexName=idx_field_parent_id, tableName=metabase_field', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('103', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.559', 96, 'EXECUTED', '8:fda3670fd16a40fd9d0f89a003098d54', 'addColumn tableName=metabase_database', 'Added 0.32.10', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('106', 'sb', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.566', 97, 'EXECUTED', '8:a3dd42bbe25c415ce21e4c180dc1c1d7', 'modifyDataType columnName=database_type, tableName=metabase_field', 'Added 0.34.0', NULL, '3.6.3', NULL, NULL, '7483698154');       
+('100', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.65', 94, 'EXECUTED', '8:948014f13b6198b50e3b7a066fae2ae0', 'sql', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('101', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.652', 95, 'EXECUTED', '8:58eabb08a175fafe8985208545374675', 'createIndex indexName=idx_field_parent_id, tableName=metabase_field', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('103', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.656', 96, 'EXECUTED', '8:fda3670fd16a40fd9d0f89a003098d54', 'addColumn tableName=metabase_database', 'Added 0.32.10', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('106', 'sb', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.662', 97, 'EXECUTED', '8:a3dd42bbe25c415ce21e4c180dc1c1d7', 'modifyDataType columnName=database_type, tableName=metabase_field', 'Added 0.34.0', NULL, '3.6.3', NULL, NULL, '8601254743');        
 CREATE CACHED TABLE PUBLIC.DATABASECHANGELOGLOCK(
     ID INT NOT NULL,
     LOCKED BOOLEAN NOT NULL,
@@ -169,7 +169,7 @@ ALTER TABLE PUBLIC.DATABASECHANGELOGLOCK ADD CONSTRAINT PUBLIC.PK_DATABASECHANGE
 INSERT INTO PUBLIC.DATABASECHANGELOGLOCK(ID, LOCKED, LOCKGRANTED, LOCKEDBY) VALUES
 (1, FALSE, NULL, NULL);     
 CREATE CACHED TABLE PUBLIC.REPORT_DASHBOARDCARD(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_7721034B_2267_41BA_B062_452667CE1641) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_7721034B_2267_41BA_B062_452667CE1641,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_A5B8ECFB_B581_48D1_8C73_B5981C68D65A) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A5B8ECFB_B581_48D1_8C73_B5981C68D65A,
     CREATED_AT TIMESTAMP NOT NULL,
     UPDATED_AT TIMESTAMP NOT NULL,
     SIZEX INT NOT NULL,
@@ -186,7 +186,7 @@ ALTER TABLE PUBLIC.REPORT_DASHBOARDCARD ADD CONSTRAINT PUBLIC.PK_REPORT_DASHBOAR
 CREATE INDEX PUBLIC.IDX_DASHBOARDCARD_CARD_ID ON PUBLIC.REPORT_DASHBOARDCARD(CARD_ID);         
 CREATE INDEX PUBLIC.IDX_DASHBOARDCARD_DASHBOARD_ID ON PUBLIC.REPORT_DASHBOARDCARD(DASHBOARD_ID);               
 CREATE CACHED TABLE PUBLIC.PERMISSIONS_REVISION COMMENT 'Used to keep track of changes made to permissions.'(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_F5907FB8_D114_4682_8EB3_AF7C6E0E18CD) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_F5907FB8_D114_4682_8EB3_AF7C6E0E18CD,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_A38CF45F_9FAB_42D2_A0EB_A6EA41C2F3C1) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A38CF45F_9FAB_42D2_A0EB_A6EA41C2F3C1,
     BEFORE CLOB NOT NULL COMMENT 'Serialized JSON of the permissions before the changes.',
     AFTER CLOB NOT NULL COMMENT 'Serialized JSON of the permissions after the changes.',
     USER_ID INT NOT NULL COMMENT 'The ID of the admin who made this set of changes.',
@@ -203,10 +203,10 @@ ALTER TABLE PUBLIC.SETTING ADD CONSTRAINT PUBLIC.PK_SETTING PRIMARY KEY(KEY);
 -- 3 +/- SELECT COUNT(*) FROM PUBLIC.SETTING;  
 INSERT INTO PUBLIC.SETTING(KEY, VALUE) VALUES
 ('site-url', 'http://localhost:4000'),
-('setup-token', '39ecab56-5f62-4866-983a-daf0a241baf4'),
-('settings-last-updated', '2019-12-27 13:55:00.225');            
+('setup-token', 'e4c72ed1-13a1-49b6-b20a-ca6f4dbdf7fd'),
+('settings-last-updated', '2020-01-09 12:20:56.19');             
 CREATE CACHED TABLE PUBLIC.METRIC_IMPORTANT_FIELD(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_5A33298E_E93F_4169_96C4_33D52F7D4A7A) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5A33298E_E93F_4169_96C4_33D52F7D4A7A,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_EE9EE954_5C0C_420A_8839_FBAD4BBD248B) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_EE9EE954_5C0C_420A_8839_FBAD4BBD248B,
     METRIC_ID INT NOT NULL,
     FIELD_ID INT NOT NULL
 );     
@@ -215,7 +215,7 @@ ALTER TABLE PUBLIC.METRIC_IMPORTANT_FIELD ADD CONSTRAINT PUBLIC.PK_METRIC_IMPORT
 CREATE INDEX PUBLIC.IDX_METRIC_IMPORTANT_FIELD_METRIC_ID ON PUBLIC.METRIC_IMPORTANT_FIELD(METRIC_ID);          
 CREATE INDEX PUBLIC.IDX_METRIC_IMPORTANT_FIELD_FIELD_ID ON PUBLIC.METRIC_IMPORTANT_FIELD(FIELD_ID);            
 CREATE CACHED TABLE PUBLIC.TASK_HISTORY COMMENT 'Timing and metadata info about background/quartz processes'(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_06F0D33A_3128_44D6_9B39_CBCB2DBBE373) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_06F0D33A_3128_44D6_9B39_CBCB2DBBE373,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_5B1727DA_66B0_4DC4_9019_AF79548E9DEE) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5B1727DA_66B0_4DC4_9019_AF79548E9DEE,
     TASK VARCHAR(254) NOT NULL COMMENT 'Name of the task',
     DB_ID INT,
     STARTED_AT TIMESTAMP NOT NULL,
@@ -226,18 +226,18 @@ CREATE CACHED TABLE PUBLIC.TASK_HISTORY COMMENT 'Timing and metadata info about
 ALTER TABLE PUBLIC.TASK_HISTORY ADD CONSTRAINT PUBLIC.PK_TASK_HISTORY PRIMARY KEY(ID);         
 -- 12 +/- SELECT COUNT(*) FROM PUBLIC.TASK_HISTORY;            
 INSERT INTO PUBLIC.TASK_HISTORY(ID, TASK, DB_ID, STARTED_AT, ENDED_AT, DURATION, TASK_DETAILS) VALUES
-(1, 'sync', 1, TIMESTAMP '2019-12-27 13:55:00.289364', TIMESTAMP '2019-12-27 13:55:01.144587', 855, NULL),
-(2, 'sync-timezone', 1, TIMESTAMP '2019-12-27 13:55:00.290501', TIMESTAMP '2019-12-27 13:55:00.601591', 311, '{"timezone-id":"America/Los_Angeles"}'),
-(3, 'sync-tables', 1, TIMESTAMP '2019-12-27 13:55:00.601976', TIMESTAMP '2019-12-27 13:55:00.670127', 68, '{"updated-tables":4,"total-tables":0}'),
-(4, 'sync-fields', 1, TIMESTAMP '2019-12-27 13:55:00.670303', TIMESTAMP '2019-12-27 13:55:00.986189', 315, '{"total-fields":36,"updated-fields":36}'),
-(5, 'sync-fks', 1, TIMESTAMP '2019-12-27 13:55:00.986275', TIMESTAMP '2019-12-27 13:55:01.020064', 33, '{"total-fks":3,"updated-fks":3,"total-failed":0}'),
-(6, 'sync-metabase-metadata', 1, TIMESTAMP '2019-12-27 13:55:01.020177', TIMESTAMP '2019-12-27 13:55:01.144506', 124, NULL),
-(7, 'analyze', 1, TIMESTAMP '2019-12-27 13:55:01.223908', TIMESTAMP '2019-12-27 13:55:07.135993', 5912, NULL),
-(8, 'fingerprint-fields', 1, TIMESTAMP '2019-12-27 13:55:01.223962', TIMESTAMP '2019-12-27 13:55:06.927658', 5703, '{"no-data-fingerprints":0,"failed-fingerprints":0,"updated-fingerprints":32,"fingerprints-attempted":32}'),
-(9, 'classify-fields', 1, TIMESTAMP '2019-12-27 13:55:06.927751', TIMESTAMP '2019-12-27 13:55:07.123034', 195, '{"fields-classified":32,"fields-failed":0}'),
-(10, 'classify-tables', 1, TIMESTAMP '2019-12-27 13:55:07.123131', TIMESTAMP '2019-12-27 13:55:07.135889', 12, '{"total-tables":4,"tables-classified":4}'),
-(11, 'field values scanning', 1, TIMESTAMP '2019-12-27 13:55:07.154698', TIMESTAMP '2019-12-27 13:55:08.177793', 1023, NULL),
-(12, 'update-field-values', 1, TIMESTAMP '2019-12-27 13:55:07.154787', TIMESTAMP '2019-12-27 13:55:08.177718', 1022, '{"errors":0,"created":5,"updated":0,"deleted":0}');   
+(1, 'sync', 1, TIMESTAMP '2020-01-09 12:20:56.244066', TIMESTAMP '2020-01-09 12:20:56.872849', 628, NULL),
+(2, 'sync-timezone', 1, TIMESTAMP '2020-01-09 12:20:56.244856', TIMESTAMP '2020-01-09 12:20:56.475289', 230, '{"timezone-id":"America/Los_Angeles"}'),
+(3, 'sync-tables', 1, TIMESTAMP '2020-01-09 12:20:56.475612', TIMESTAMP '2020-01-09 12:20:56.519961', 44, '{"updated-tables":4,"total-tables":0}'),
+(4, 'sync-fields', 1, TIMESTAMP '2020-01-09 12:20:56.520089', TIMESTAMP '2020-01-09 12:20:56.776513', 256, '{"total-fields":36,"updated-fields":36}'),
+(5, 'sync-fks', 1, TIMESTAMP '2020-01-09 12:20:56.776563', TIMESTAMP '2020-01-09 12:20:56.798783', 22, '{"total-fks":3,"updated-fks":3,"total-failed":0}'),
+(6, 'sync-metabase-metadata', 1, TIMESTAMP '2020-01-09 12:20:56.798854', TIMESTAMP '2020-01-09 12:20:56.872799', 73, NULL),
+(7, 'analyze', 1, TIMESTAMP '2020-01-09 12:20:56.921833', TIMESTAMP '2020-01-09 12:21:00.935708', 4013, NULL),
+(8, 'fingerprint-fields', 1, TIMESTAMP '2020-01-09 12:20:56.921869', TIMESTAMP '2020-01-09 12:21:00.870651', 3948, '{"no-data-fingerprints":0,"failed-fingerprints":0,"updated-fingerprints":32,"fingerprints-attempted":32}'),
+(9, 'classify-fields', 1, TIMESTAMP '2020-01-09 12:21:00.870693', TIMESTAMP '2020-01-09 12:21:00.92908', 58, '{"fields-classified":32,"fields-failed":0}'),
+(10, 'classify-tables', 1, TIMESTAMP '2020-01-09 12:21:00.929137', TIMESTAMP '2020-01-09 12:21:00.935668', 6, '{"total-tables":4,"tables-classified":4}'),
+(11, 'field values scanning', 1, TIMESTAMP '2020-01-09 12:21:00.942977', TIMESTAMP '2020-01-09 12:21:01.594932', 651, NULL),
+(12, 'update-field-values', 1, TIMESTAMP '2020-01-09 12:21:00.943014', TIMESTAMP '2020-01-09 12:21:01.594895', 651, '{"errors":0,"created":5,"updated":0,"deleted":0}');         
 CREATE INDEX PUBLIC.IDX_TASK_HISTORY_END_TIME ON PUBLIC.TASK_HISTORY(ENDED_AT);
 CREATE INDEX PUBLIC.IDX_TASK_HISTORY_DB_ID ON PUBLIC.TASK_HISTORY(DB_ID);      
 CREATE CACHED TABLE PUBLIC.DATA_MIGRATIONS(
@@ -247,23 +247,23 @@ CREATE CACHED TABLE PUBLIC.DATA_MIGRATIONS(
 ALTER TABLE PUBLIC.DATA_MIGRATIONS ADD CONSTRAINT PUBLIC.PK_DATA_MIGRATIONS PRIMARY KEY(ID);   
 -- 14 +/- SELECT COUNT(*) FROM PUBLIC.DATA_MIGRATIONS;         
 INSERT INTO PUBLIC.DATA_MIGRATIONS(ID, TIMESTAMP) VALUES
-('add-users-to-default-permissions-groups', TIMESTAMP '2019-12-27 13:54:59.794'),
-('add-admin-group-root-entry', TIMESTAMP '2019-12-27 13:54:59.819'),
-('add-databases-to-magic-permissions-groups', TIMESTAMP '2019-12-27 13:54:59.823'),
-('migrate-field-types', TIMESTAMP '2019-12-27 13:54:59.874'),
-('fix-invalid-field-types', TIMESTAMP '2019-12-27 13:54:59.878'),
-('copy-site-url-setting-and-remove-trailing-slashes', TIMESTAMP '2019-12-27 13:54:59.883'),
-('drop-old-query-execution-table', TIMESTAMP '2019-12-27 13:54:59.886'),
-('ensure-protocol-specified-in-site-url', TIMESTAMP '2019-12-27 13:54:59.906'),
-('populate-card-database-id', TIMESTAMP '2019-12-27 13:54:59.914'),
-('migrate-humanization-setting', TIMESTAMP '2019-12-27 13:54:59.92'),
-('mark-category-fields-as-list', TIMESTAMP '2019-12-27 13:54:59.928'),
-('add-legacy-sql-directive-to-bigquery-sql-cards', TIMESTAMP '2019-12-27 13:54:59.93'),
-('clear-ldap-user-local-passwords', TIMESTAMP '2019-12-27 13:54:59.932'),
-('add-migrated-collections', TIMESTAMP '2019-12-27 13:54:59.947'); 
+('add-users-to-default-permissions-groups', TIMESTAMP '2020-01-09 12:20:55.859'),
+('add-admin-group-root-entry', TIMESTAMP '2020-01-09 12:20:55.866'),
+('add-databases-to-magic-permissions-groups', TIMESTAMP '2020-01-09 12:20:55.868'),
+('migrate-field-types', TIMESTAMP '2020-01-09 12:20:55.897'),
+('fix-invalid-field-types', TIMESTAMP '2020-01-09 12:20:55.899'),
+('copy-site-url-setting-and-remove-trailing-slashes', TIMESTAMP '2020-01-09 12:20:55.901'),
+('drop-old-query-execution-table', TIMESTAMP '2020-01-09 12:20:55.903'),
+('ensure-protocol-specified-in-site-url', TIMESTAMP '2020-01-09 12:20:55.919'),
+('populate-card-database-id', TIMESTAMP '2020-01-09 12:20:55.923'),
+('migrate-humanization-setting', TIMESTAMP '2020-01-09 12:20:55.924'),
+('mark-category-fields-as-list', TIMESTAMP '2020-01-09 12:20:55.933'),
+('add-legacy-sql-directive-to-bigquery-sql-cards', TIMESTAMP '2020-01-09 12:20:55.935'),
+('clear-ldap-user-local-passwords', TIMESTAMP '2020-01-09 12:20:55.937'),
+('add-migrated-collections', TIMESTAMP '2020-01-09 12:20:55.95');
 CREATE INDEX PUBLIC.IDX_DATA_MIGRATIONS_ID ON PUBLIC.DATA_MIGRATIONS(ID);      
 CREATE CACHED TABLE PUBLIC.COLLECTION_REVISION COMMENT 'Used to keep track of changes made to collections.'(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_4DE7046C_309A_497E_A77B_E7F858552044) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_4DE7046C_309A_497E_A77B_E7F858552044,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_F0777008_49B6_4429_BBD3_4D0139BECDEC) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_F0777008_49B6_4429_BBD3_4D0139BECDEC,
     BEFORE CLOB NOT NULL COMMENT 'Serialized JSON of the collections graph before the changes.',
     AFTER CLOB NOT NULL COMMENT 'Serialized JSON of the collections graph after the changes.',
     USER_ID INT NOT NULL COMMENT 'The ID of the admin who made this set of changes.',
@@ -273,7 +273,7 @@ CREATE CACHED TABLE PUBLIC.COLLECTION_REVISION COMMENT 'Used to keep track of ch
 ALTER TABLE PUBLIC.COLLECTION_REVISION ADD CONSTRAINT PUBLIC.PK_COLLECTION_REVISION PRIMARY KEY(ID);           
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.COLLECTION_REVISION;      
 CREATE CACHED TABLE PUBLIC.COLLECTION COMMENT 'Collections are an optional way to organize Cards and handle permissions for them.'(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_39F89E16_3883_4039_9876_76371B462C07) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_39F89E16_3883_4039_9876_76371B462C07,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_BA85358A_4F81_449F_A72D_33EE4DD194CB) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_BA85358A_4F81_449F_A72D_33EE4DD194CB,
     NAME CLOB NOT NULL COMMENT 'The user-facing name of this Collection.',
     DESCRIPTION CLOB COMMENT 'Optional description for this Collection.',
     COLOR CHAR(7) NOT NULL COMMENT 'Seven-character hex color for this Collection, including the preceding hash sign.',
@@ -287,7 +287,7 @@ ALTER TABLE PUBLIC.COLLECTION ADD CONSTRAINT PUBLIC.PK_COLLECTION PRIMARY KEY(ID
 CREATE INDEX PUBLIC.IDX_COLLECTION_LOCATION ON PUBLIC.COLLECTION(LOCATION);    
 CREATE INDEX PUBLIC.IDX_COLLECTION_PERSONAL_OWNER_ID ON PUBLIC.COLLECTION(PERSONAL_OWNER_ID);  
 CREATE CACHED TABLE PUBLIC.REPORT_CARD(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_405C1C66_2069_4350_8A5E_97A6C445A258) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_405C1C66_2069_4350_8A5E_97A6C445A258,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_5F615A2C_8F8A_498B_BB9E_B07C4169C815) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5F615A2C_8F8A_498B_BB9E_B07C4169C815,
     CREATED_AT TIMESTAMP NOT NULL,
     UPDATED_AT TIMESTAMP NOT NULL,
     NAME VARCHAR(254) NOT NULL,
@@ -316,7 +316,7 @@ CREATE INDEX PUBLIC.IDX_CARD_CREATOR_ID ON PUBLIC.REPORT_CARD(CREATOR_ID);
 CREATE INDEX PUBLIC.IDX_CARD_COLLECTION_ID ON PUBLIC.REPORT_CARD(COLLECTION_ID);               
 CREATE INDEX PUBLIC.IDX_CARD_PUBLIC_UUID ON PUBLIC.REPORT_CARD(PUBLIC_UUID);   
 CREATE CACHED TABLE PUBLIC.LABEL(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_2423926E_D488_426E_A8C8_A376100D1F0A) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_2423926E_D488_426E_A8C8_A376100D1F0A,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_C5C3BD44_A7F8_4E58_8D1A_8CE37AAE31D3) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_C5C3BD44_A7F8_4E58_8D1A_8CE37AAE31D3,
     NAME VARCHAR(254) NOT NULL,
     SLUG VARCHAR(254) NOT NULL,
     ICON VARCHAR(128)
@@ -325,7 +325,7 @@ ALTER TABLE PUBLIC.LABEL ADD CONSTRAINT PUBLIC.PK_LABEL PRIMARY KEY(ID);
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.LABEL;    
 CREATE INDEX PUBLIC.IDX_LABEL_SLUG ON PUBLIC.LABEL(SLUG);      
 CREATE CACHED TABLE PUBLIC.DEPENDENCY(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_3814A94F_33EE_4621_895D_C6C286F37F66) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_3814A94F_33EE_4621_895D_C6C286F37F66,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_D3607C9C_C5F2_4188_BB3D_2D307C9210FA) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_D3607C9C_C5F2_4188_BB3D_2D307C9210FA,
     MODEL VARCHAR(32) NOT NULL,
     MODEL_ID INT NOT NULL,
     DEPENDENT_ON_MODEL VARCHAR(32) NOT NULL,
@@ -339,7 +339,7 @@ CREATE INDEX PUBLIC.IDX_DEPENDENCY_MODEL_ID ON PUBLIC.DEPENDENCY(MODEL_ID);
 CREATE INDEX PUBLIC.IDX_DEPENDENCY_DEPENDENT_ON_MODEL ON PUBLIC.DEPENDENCY(DEPENDENT_ON_MODEL);
 CREATE INDEX PUBLIC.IDX_DEPENDENCY_DEPENDENT_ON_ID ON PUBLIC.DEPENDENCY(DEPENDENT_ON_ID);      
 CREATE CACHED TABLE PUBLIC.REPORT_DASHBOARD(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_70956D05_9758_4131_AF68_B83116E5F748) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_70956D05_9758_4131_AF68_B83116E5F748,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_44044B5D_AC37_4270_BA67_31FA40CC31E9) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_44044B5D_AC37_4270_BA67_31FA40CC31E9,
     CREATED_AT TIMESTAMP NOT NULL,
     UPDATED_AT TIMESTAMP NOT NULL,
     NAME VARCHAR(254) NOT NULL,
@@ -365,7 +365,7 @@ CREATE INDEX PUBLIC.IDX_REPORT_DASHBOARD_SHOW_IN_GETTING_STARTED ON PUBLIC.REPOR
 CREATE INDEX PUBLIC.IDX_DASHBOARD_PUBLIC_UUID ON PUBLIC.REPORT_DASHBOARD(PUBLIC_UUID);         
 CREATE INDEX PUBLIC.IDX_DASHBOARD_COLLECTION_ID ON PUBLIC.REPORT_DASHBOARD(COLLECTION_ID);     
 CREATE CACHED TABLE PUBLIC.DASHBOARD_FAVORITE COMMENT 'Presence of a row here indicates a given User has favorited a given Dashboard.'(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_6AFFF8D1_AF45_42AF_87EE_3E8188DDBA9A) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_6AFFF8D1_AF45_42AF_87EE_3E8188DDBA9A,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_C4302ED3_DE22_4CEF_BADF_6AF81F8E95C6) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_C4302ED3_DE22_4CEF_BADF_6AF81F8E95C6,
     USER_ID INT NOT NULL COMMENT 'ID of the User who favorited the Dashboard.',
     DASHBOARD_ID INT NOT NULL COMMENT 'ID of the Dashboard favorited by the User.'
 );   
@@ -381,7 +381,7 @@ CREATE CACHED TABLE PUBLIC.QUERY COMMENT 'Information (such as average execution
 ALTER TABLE PUBLIC.QUERY ADD CONSTRAINT PUBLIC.PK_QUERY PRIMARY KEY(QUERY_HASH);               
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.QUERY;    
 CREATE CACHED TABLE PUBLIC.PERMISSIONS_GROUP(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_24E20B01_717A_4ED3_94E7_EE17064E49CB) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_24E20B01_717A_4ED3_94E7_EE17064E49CB,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_C09F1BC8_3D2B_48EA_A43A_847512C52B89) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_C09F1BC8_3D2B_48EA_A43A_847512C52B89,
     NAME VARCHAR(255) NOT NULL
 ); 
 ALTER TABLE PUBLIC.PERMISSIONS_GROUP ADD CONSTRAINT PUBLIC.PK_PERMISSIONS_GROUP PRIMARY KEY(ID);               
@@ -392,7 +392,7 @@ INSERT INTO PUBLIC.PERMISSIONS_GROUP(ID, NAME) VALUES
 (3, 'MetaBot'); 
 CREATE INDEX PUBLIC.IDX_PERMISSIONS_GROUP_NAME ON PUBLIC.PERMISSIONS_GROUP(NAME);              
 CREATE CACHED TABLE PUBLIC.DASHBOARDCARD_SERIES(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_04E675BF_3ACC_4FAC_B66A_643B3175839E) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_04E675BF_3ACC_4FAC_B66A_643B3175839E,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_299DEB06_08E6_408A_9E3A_5CC0FBCD0F54) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_299DEB06_08E6_408A_9E3A_5CC0FBCD0F54,
     DASHBOARDCARD_ID INT NOT NULL,
     CARD_ID INT NOT NULL,
     POSITION INT NOT NULL
@@ -402,7 +402,7 @@ ALTER TABLE PUBLIC.DASHBOARDCARD_SERIES ADD CONSTRAINT PUBLIC.PK_DASHBOARDCARD_S
 CREATE INDEX PUBLIC.IDX_DASHBOARDCARD_SERIES_DASHBOARDCARD_ID ON PUBLIC.DASHBOARDCARD_SERIES(DASHBOARDCARD_ID);
 CREATE INDEX PUBLIC.IDX_DASHBOARDCARD_SERIES_CARD_ID ON PUBLIC.DASHBOARDCARD_SERIES(CARD_ID);  
 CREATE CACHED TABLE PUBLIC.CORE_USER(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_FACCD50E_9CE4_4958_8CCE_249A197B18B9) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_FACCD50E_9CE4_4958_8CCE_249A197B18B9,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_1AAE82E3_7CC1_46E6_B606_AF8A419B1962) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_1AAE82E3_7CC1_46E6_B606_AF8A419B1962,
     EMAIL VARCHAR(254) NOT NULL,
     FIRST_NAME VARCHAR(254) NOT NULL,
     LAST_NAME VARCHAR(254) NOT NULL,
@@ -423,7 +423,7 @@ CREATE CACHED TABLE PUBLIC.CORE_USER(
 ALTER TABLE PUBLIC.CORE_USER ADD CONSTRAINT PUBLIC.PK_CORE_USER PRIMARY KEY(ID);               
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.CORE_USER;
 CREATE CACHED TABLE PUBLIC.ACTIVITY(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_64A02A95_D231_4E11_8CDA_66A059FF588F) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_64A02A95_D231_4E11_8CDA_66A059FF588F,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_9EC48888_BCD4_4652_96D5_B12220C3EE98) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_9EC48888_BCD4_4652_96D5_B12220C3EE98,
     TOPIC VARCHAR(32) NOT NULL,
     TIMESTAMP TIMESTAMP NOT NULL,
     USER_ID INT,
@@ -437,12 +437,12 @@ CREATE CACHED TABLE PUBLIC.ACTIVITY(
 ALTER TABLE PUBLIC.ACTIVITY ADD CONSTRAINT PUBLIC.PK_ACTIVITY PRIMARY KEY(ID); 
 -- 1 +/- SELECT COUNT(*) FROM PUBLIC.ACTIVITY; 
 INSERT INTO PUBLIC.ACTIVITY(ID, TOPIC, TIMESTAMP, USER_ID, MODEL, MODEL_ID, DATABASE_ID, TABLE_ID, CUSTOM_ID, DETAILS) VALUES
-(1, 'install', TIMESTAMP '2019-12-27 13:55:00.236', NULL, 'install', NULL, NULL, NULL, NULL, '{}');              
+(1, 'install', TIMESTAMP '2020-01-09 12:20:56.198', NULL, 'install', NULL, NULL, NULL, NULL, '{}');              
 CREATE INDEX PUBLIC.IDX_ACTIVITY_TIMESTAMP ON PUBLIC.ACTIVITY(TIMESTAMP);      
 CREATE INDEX PUBLIC.IDX_ACTIVITY_USER_ID ON PUBLIC.ACTIVITY(USER_ID);          
 CREATE INDEX PUBLIC.IDX_ACTIVITY_CUSTOM_ID ON PUBLIC.ACTIVITY(CUSTOM_ID);      
 CREATE CACHED TABLE PUBLIC.METABASE_FIELDVALUES(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_04D09038_A138_44ED_A521_B47BEBEF99D0) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_04D09038_A138_44ED_A521_B47BEBEF99D0,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_3B5CA6D9_5EB7_4CE4_9A92_86BD747A6F94) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_3B5CA6D9_5EB7_4CE4_9A92_86BD747A6F94,
     CREATED_AT TIMESTAMP NOT NULL,
     UPDATED_AT TIMESTAMP NOT NULL,
     VALUES CLOB,
@@ -452,14 +452,37 @@ CREATE CACHED TABLE PUBLIC.METABASE_FIELDVALUES(
 ALTER TABLE PUBLIC.METABASE_FIELDVALUES ADD CONSTRAINT PUBLIC.PK_METABASE_FIELDVALUES PRIMARY KEY(ID);         
 -- 5 +/- SELECT COUNT(*) FROM PUBLIC.METABASE_FIELDVALUES;     
 INSERT INTO PUBLIC.METABASE_FIELDVALUES(ID, CREATED_AT, UPDATED_AT, VALUES, HUMAN_READABLE_VALUES, FIELD_ID) VALUES
-(1, TIMESTAMP '2019-12-27 13:55:07.233', TIMESTAMP '2019-12-27 13:55:07.233', '["Doohickey","Gadget","Gizmo","Widget"]', NULL, 6),
-(2, TIMESTAMP '2019-12-27 13:55:08.073', TIMESTAMP '2019-12-27 13:55:08.073', '[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,65,67,68,69,70,71,72,73,75,78,82,83,88,100]', NULL, 14),
-(3, TIMESTAMP '2019-12-27 13:55:08.103', TIMESTAMP '2019-12-27 13:55:08.103', '["Affiliate","Facebook","Google","Organic","Twitter"]', NULL, 24),
-(4, TIMESTAMP '2019-12-27 13:55:08.145', TIMESTAMP '2019-12-27 13:55:08.145', '["AK","AL","AR","AZ","CA","CO","CT","DE","FL","GA","IA","ID","IL","IN","KS","KY","LA","MA","MD","ME","MI","MN","MO","MS","MT","NC","ND","NE","NH","NJ","NM","NV","NY","OH","OK","OR","PA","RI","SC","SD","TN","TX","UT","VA","VT","WA","WI","WV","WY"]', NULL, 28),
-(5, TIMESTAMP '2019-12-27 13:55:08.176', TIMESTAMP '2019-12-27 13:55:08.176', '[1,2,3,4,5]', NULL, 36);
+(1, TIMESTAMP '2020-01-09 12:21:00.979', TIMESTAMP '2020-01-09 12:21:00.979', '["Doohickey","Gadget","Gizmo","Widget"]', NULL, 6),
+(2, TIMESTAMP '2020-01-09 12:21:01.552', TIMESTAMP '2020-01-09 12:21:01.552', '[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,65,67,68,69,70,71,72,73,75,78,82,83,88,100]', NULL, 14),
+(3, TIMESTAMP '2020-01-09 12:21:01.571', TIMESTAMP '2020-01-09 12:21:01.571', '["Affiliate","Facebook","Google","Organic","Twitter"]', NULL, 24),
+(4, TIMESTAMP '2020-01-09 12:21:01.582', TIMESTAMP '2020-01-09 12:21:01.582', '["AK","AL","AR","AZ","CA","CO","CT","DE","FL","GA","IA","ID","IL","IN","KS","KY","LA","MA","MD","ME","MI","MN","MO","MS","MT","NC","ND","NE","NH","NJ","NM","NV","NY","OH","OK","OR","PA","RI","SC","SD","TN","TX","UT","VA","VT","WA","WI","WV","WY"]', NULL, 28),
+(5, TIMESTAMP '2020-01-09 12:21:01.594', TIMESTAMP '2020-01-09 12:21:01.594', '[1,2,3,4,5]', NULL, 36);
 CREATE INDEX PUBLIC.IDX_FIELDVALUES_FIELD_ID ON PUBLIC.METABASE_FIELDVALUES(FIELD_ID);         
+CREATE CACHED TABLE PUBLIC.METABASE_DATABASE(
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_7743B25A_84A7_4694_B0C3_B2ED7B198BEB) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_7743B25A_84A7_4694_B0C3_B2ED7B198BEB,
+    CREATED_AT TIMESTAMP NOT NULL,
+    UPDATED_AT TIMESTAMP NOT NULL,
+    NAME VARCHAR(254) NOT NULL,
+    DESCRIPTION CLOB,
+    DETAILS CLOB,
+    ENGINE VARCHAR(254) NOT NULL,
+    IS_SAMPLE BOOLEAN DEFAULT FALSE NOT NULL,
+    IS_FULL_SYNC BOOLEAN DEFAULT TRUE NOT NULL,
+    POINTS_OF_INTEREST CLOB,
+    CAVEATS CLOB,
+    METADATA_SYNC_SCHEDULE VARCHAR(254) DEFAULT '0 50 * * * ? *' NOT NULL COMMENT 'The cron schedule string for when this database should undergo the metadata sync process (and analysis for new fields).',
+    CACHE_FIELD_VALUES_SCHEDULE VARCHAR(254) DEFAULT '0 50 0 * * ? *' NOT NULL COMMENT 'The cron schedule string for when FieldValues for eligible Fields should be updated.',
+    TIMEZONE VARCHAR(254) COMMENT 'Timezone identifier for the database, set by the sync process',
+    IS_ON_DEMAND BOOLEAN DEFAULT 'false' NOT NULL COMMENT 'Whether we should do On-Demand caching of FieldValues for this DB. This means FieldValues are updated when their Field is used in a Dashboard or Card param.',
+    OPTIONS CLOB COMMENT 'Serialized JSON containing various options like QB behavior.',
+    AUTO_RUN_QUERIES BOOLEAN DEFAULT TRUE NOT NULL COMMENT 'Whether to automatically run queries when doing simple filtering and summarizing in the Query Builder.'
+);             
+ALTER TABLE PUBLIC.METABASE_DATABASE ADD CONSTRAINT PUBLIC.PK_METABASE_DATABASE PRIMARY KEY(ID);               
+-- 1 +/- SELECT COUNT(*) FROM PUBLIC.METABASE_DATABASE;        
+INSERT INTO PUBLIC.METABASE_DATABASE(ID, CREATED_AT, UPDATED_AT, NAME, DESCRIPTION, DETAILS, ENGINE, IS_SAMPLE, IS_FULL_SYNC, POINTS_OF_INTEREST, CAVEATS, METADATA_SYNC_SCHEDULE, CACHE_FIELD_VALUES_SCHEDULE, TIMEZONE, IS_ON_DEMAND, OPTIONS, AUTO_RUN_QUERIES) VALUES
+(1, TIMESTAMP '2020-01-09 12:20:56.196', TIMESTAMP '2020-01-09 12:20:56.474', 'Sample Dataset', NULL, '{"db":"zip:/Users/tlrobinson/metabase/metabase-branch/branches/metabase-consolidate-select/target/uberjar/metabase.jar!/sample-dataset.db;USER=GUEST;PASSWORD=guest"}', 'h2', TRUE, TRUE, NULL, NULL, '0 50 * * * ? *', '0 50 0 * * ? *', 'America/Los_Angeles', FALSE, NULL, TRUE);          
 CREATE CACHED TABLE PUBLIC.PULSE(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_EAFAD778_2557_4599_B568_4B03F9B42195) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_EAFAD778_2557_4599_B568_4B03F9B42195,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_04718A31_596F_4BD7_BB12_0A7C913C16DE) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_04718A31_596F_4BD7_BB12_0A7C913C16DE,
     CREATOR_ID INT NOT NULL,
     NAME VARCHAR(254),
     CREATED_AT TIMESTAMP NOT NULL,
@@ -477,7 +500,7 @@ ALTER TABLE PUBLIC.PULSE ADD CONSTRAINT PUBLIC.PK_PULSE PRIMARY KEY(ID);
 CREATE INDEX PUBLIC.IDX_PULSE_CREATOR_ID ON PUBLIC.PULSE(CREATOR_ID);          
 CREATE INDEX PUBLIC.IDX_PULSE_COLLECTION_ID ON PUBLIC.PULSE(COLLECTION_ID);    
 CREATE CACHED TABLE PUBLIC.SEGMENT(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_004178AD_4EBE_4069_8E75_DE2F7F4283CD) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_004178AD_4EBE_4069_8E75_DE2F7F4283CD,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_6D44DCC6_ED02_4C28_A46B_FF159011EE3B) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_6D44DCC6_ED02_4C28_A46B_FF159011EE3B,
     TABLE_ID INT NOT NULL,
     CREATOR_ID INT NOT NULL,
     NAME VARCHAR(254) NOT NULL,
@@ -496,7 +519,7 @@ CREATE INDEX PUBLIC.IDX_SEGMENT_CREATOR_ID ON PUBLIC.SEGMENT(CREATOR_ID);
 CREATE INDEX PUBLIC.IDX_SEGMENT_TABLE_ID ON PUBLIC.SEGMENT(TABLE_ID);          
 CREATE INDEX PUBLIC.IDX_SEGMENT_SHOW_IN_GETTING_STARTED ON PUBLIC.SEGMENT(SHOW_IN_GETTING_STARTED);            
 CREATE CACHED TABLE PUBLIC.METRIC(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_9AA36E6C_26CC_44F6_A8C3_E4CB3200552E) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_9AA36E6C_26CC_44F6_A8C3_E4CB3200552E,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_40293BEB_F3DD_44FC_A328_59F4B74439E5) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_40293BEB_F3DD_44FC_A328_59F4B74439E5,
     TABLE_ID INT NOT NULL,
     CREATOR_ID INT NOT NULL,
     NAME VARCHAR(254) NOT NULL,
@@ -542,7 +565,7 @@ INSERT INTO PUBLIC.QRTZ_JOB_DETAILS(SCHED_NAME, JOB_NAME, JOB_GROUP, DESCRIPTION
 CREATE INDEX PUBLIC.IDX_QRTZ_J_REQ_RECOVERY ON PUBLIC.QRTZ_JOB_DETAILS(SCHED_NAME, REQUESTS_RECOVERY);         
 CREATE INDEX PUBLIC.IDX_QRTZ_J_GRP ON PUBLIC.QRTZ_JOB_DETAILS(SCHED_NAME, JOB_GROUP);          
 CREATE CACHED TABLE PUBLIC.REPORT_CARDFAVORITE(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_83D6C5B8_ECD9_466D_B0AF_376398D09158) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_83D6C5B8_ECD9_466D_B0AF_376398D09158,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_2B9E56DD_CE23_4C2B_9CAA_5F64BF8F2AC1) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_2B9E56DD_CE23_4C2B_9CAA_5F64BF8F2AC1,
     CREATED_AT TIMESTAMP NOT NULL,
     UPDATED_AT TIMESTAMP NOT NULL,
     CARD_ID INT NOT NULL,
@@ -552,29 +575,6 @@ ALTER TABLE PUBLIC.REPORT_CARDFAVORITE ADD CONSTRAINT PUBLIC.PK_REPORT_CARDFAVOR
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.REPORT_CARDFAVORITE;      
 CREATE INDEX PUBLIC.IDX_CARDFAVORITE_CARD_ID ON PUBLIC.REPORT_CARDFAVORITE(CARD_ID);           
 CREATE INDEX PUBLIC.IDX_CARDFAVORITE_OWNER_ID ON PUBLIC.REPORT_CARDFAVORITE(OWNER_ID);         
-CREATE CACHED TABLE PUBLIC.METABASE_DATABASE(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_F13B9F0D_F22D_4F12_A158_24540D39401D) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_F13B9F0D_F22D_4F12_A158_24540D39401D,
-    CREATED_AT TIMESTAMP NOT NULL,
-    UPDATED_AT TIMESTAMP NOT NULL,
-    NAME VARCHAR(254) NOT NULL,
-    DESCRIPTION CLOB,
-    DETAILS CLOB,
-    ENGINE VARCHAR(254) NOT NULL,
-    IS_SAMPLE BOOLEAN DEFAULT FALSE NOT NULL,
-    IS_FULL_SYNC BOOLEAN DEFAULT TRUE NOT NULL,
-    POINTS_OF_INTEREST CLOB,
-    CAVEATS CLOB,
-    METADATA_SYNC_SCHEDULE VARCHAR(254) DEFAULT '0 50 * * * ? *' NOT NULL COMMENT 'The cron schedule string for when this database should undergo the metadata sync process (and analysis for new fields).',
-    CACHE_FIELD_VALUES_SCHEDULE VARCHAR(254) DEFAULT '0 50 0 * * ? *' NOT NULL COMMENT 'The cron schedule string for when FieldValues for eligible Fields should be updated.',
-    TIMEZONE VARCHAR(254) COMMENT 'Timezone identifier for the database, set by the sync process',
-    IS_ON_DEMAND BOOLEAN DEFAULT 'false' NOT NULL COMMENT 'Whether we should do On-Demand caching of FieldValues for this DB. This means FieldValues are updated when their Field is used in a Dashboard or Card param.',
-    OPTIONS CLOB COMMENT 'Serialized JSON containing various options like QB behavior.',
-    AUTO_RUN_QUERIES BOOLEAN DEFAULT TRUE NOT NULL COMMENT 'Whether to automatically run queries when doing simple filtering and summarizing in the Query Builder.'
-);             
-ALTER TABLE PUBLIC.METABASE_DATABASE ADD CONSTRAINT PUBLIC.PK_METABASE_DATABASE PRIMARY KEY(ID);               
--- 1 +/- SELECT COUNT(*) FROM PUBLIC.METABASE_DATABASE;        
-INSERT INTO PUBLIC.METABASE_DATABASE(ID, CREATED_AT, UPDATED_AT, NAME, DESCRIPTION, DETAILS, ENGINE, IS_SAMPLE, IS_FULL_SYNC, POINTS_OF_INTEREST, CAVEATS, METADATA_SYNC_SCHEDULE, CACHE_FIELD_VALUES_SCHEDULE, TIMEZONE, IS_ON_DEMAND, OPTIONS, AUTO_RUN_QUERIES) VALUES
-(1, TIMESTAMP '2019-12-27 13:55:00.235', TIMESTAMP '2019-12-27 13:55:00.6', 'Sample Dataset', NULL, '{"db":"zip:/Users/paul/metabase/target/uberjar/metabase.jar!/sample-dataset.db;USER=GUEST;PASSWORD=guest"}', 'h2', TRUE, TRUE, NULL, NULL, '0 50 * * * ? *', '0 50 0 * * ? *', 'America/Los_Angeles', FALSE, NULL, TRUE);       
 CREATE CACHED TABLE PUBLIC.QRTZ_TRIGGERS COMMENT 'Used for Quartz scheduler.'(
     SCHED_NAME VARCHAR(120) NOT NULL,
     TRIGGER_NAME VARCHAR(200) NOT NULL,
@@ -596,14 +596,14 @@ CREATE CACHED TABLE PUBLIC.QRTZ_TRIGGERS COMMENT 'Used for Quartz scheduler.'(
 ALTER TABLE PUBLIC.QRTZ_TRIGGERS ADD CONSTRAINT PUBLIC.PK_QRTZ_TRIGGERS PRIMARY KEY(SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);  
 -- 8 +/- SELECT COUNT(*) FROM PUBLIC.QRTZ_TRIGGERS;            
 INSERT INTO PUBLIC.QRTZ_TRIGGERS(SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, JOB_NAME, JOB_GROUP, DESCRIPTION, NEXT_FIRE_TIME, PREV_FIRE_TIME, PRIORITY, TRIGGER_STATE, TRIGGER_TYPE, START_TIME, END_TIME, CALENDAR_NAME, MISFIRE_INSTR, JOB_DATA) VALUES
-('MetabaseScheduler', 'metabase.task.upgrade-checks.trigger', 'DEFAULT', 'metabase.task.upgrade-checks.job', 'DEFAULT', NULL, 1577499300000, -1, 5, 'WAITING', 'CRON', 1577483700000, 0, NULL, 0, X''),
-('MetabaseScheduler', 'metabase.task.anonymous-stats.trigger', 'DEFAULT', 'metabase.task.anonymous-stats.job', 'DEFAULT', NULL, 1577546100000, -1, 5, 'WAITING', 'CRON', 1577483700000, 0, NULL, 0, X''),
-('MetabaseScheduler', 'metabase.task.abandonment-emails.trigger', 'DEFAULT', 'metabase.task.abandonment-emails.job', 'DEFAULT', NULL, 1577563200000, -1, 5, 'WAITING', 'CRON', 1577483700000, 0, NULL, 0, X''),
-('MetabaseScheduler', 'metabase.task.send-pulses.trigger', 'DEFAULT', 'metabase.task.send-pulses.job', 'DEFAULT', NULL, 1577484000000, -1, 5, 'WAITING', 'CRON', 1577483700000, 0, NULL, 1, X''),
-('MetabaseScheduler', 'metabase.task.follow-up-emails.trigger', 'DEFAULT', 'metabase.task.follow-up-emails.job', 'DEFAULT', NULL, 1577563200000, -1, 5, 'WAITING', 'CRON', 1577483700000, 0, NULL, 0, X''),
-('MetabaseScheduler', 'metabase.task.task-history-cleanup.trigger', 'DEFAULT', 'metabase.task.task-history-cleanup.job', 'DEFAULT', NULL, 1577484000000, -1, 5, 'WAITING', 'CRON', 1577483700000, 0, NULL, 0, X''),
-('MetabaseScheduler', 'metabase.task.sync-and-analyze.trigger.1', 'DEFAULT', 'metabase.task.sync-and-analyze.job', 'DEFAULT', 'sync-and-analyze Database 1', 1577487000000, -1, 5, 'WAITING', 'CRON', 1577483700000, 0, NULL, 2, X'aced0005737200156f72672e71756172747a2e4a6f62446174614d61709fb083e8bfa9b0cb020000787200266f72672e71756172747a2e7574696c732e537472696e674b65794469727479466c61674d61708208e8c3fbc55d280200015a0013616c6c6f77735472616e7369656e74446174617872001d6f72672e71756172747a2e7574696c732e4469727479466c61674d617013e62ead28760ace0200025a000564697274794c00036d617074000f4c6a6176612f7574696c2f4d61703b787001737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f4000000000000c7708000000100000000174000564622d6964737200116a6176612e6c616e672e496e746567657212e2a0a4f781873802000149000576616c7565787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b0200007870000000017800'),
-('MetabaseScheduler', 'metabase.task.update-field-values.trigger.1', 'DEFAULT', 'metabase.task.update-field-values.job', 'DEFAULT', 'update-field-values Database 1', 1577523000000, -1, 5, 'WAITING', 'CRON', 1577483700000, 0, NULL, 2, X'aced0005737200156f72672e71756172747a2e4a6f62446174614d61709fb083e8bfa9b0cb020000787200266f72672e71756172747a2e7574696c732e537472696e674b65794469727479466c61674d61708208e8c3fbc55d280200015a0013616c6c6f77735472616e7369656e74446174617872001d6f72672e71756172747a2e7574696c732e4469727479466c61674d617013e62ead28760ace0200025a000564697274794c00036d617074000f4c6a6176612f7574696c2f4d61703b787001737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f4000000000000c7708000000100000000174000564622d6964737200116a6176612e6c616e672e496e746567657212e2a0a4f781873802000149000576616c7565787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b0200007870000000017800');     
+('MetabaseScheduler', 'metabase.task.upgrade-checks.trigger', 'DEFAULT', 'metabase.task.upgrade-checks.job', 'DEFAULT', NULL, 1578622500000, -1, 5, 'WAITING', 'CRON', 1578601256000, 0, NULL, 0, X''),
+('MetabaseScheduler', 'metabase.task.anonymous-stats.trigger', 'DEFAULT', 'metabase.task.anonymous-stats.job', 'DEFAULT', NULL, 1578669300000, -1, 5, 'WAITING', 'CRON', 1578601256000, 0, NULL, 0, X''),
+('MetabaseScheduler', 'metabase.task.abandonment-emails.trigger', 'DEFAULT', 'metabase.task.abandonment-emails.job', 'DEFAULT', NULL, 1578686400000, -1, 5, 'WAITING', 'CRON', 1578601256000, 0, NULL, 0, X''),
+('MetabaseScheduler', 'metabase.task.send-pulses.trigger', 'DEFAULT', 'metabase.task.send-pulses.job', 'DEFAULT', NULL, 1578603600000, -1, 5, 'WAITING', 'CRON', 1578601256000, 0, NULL, 1, X''),
+('MetabaseScheduler', 'metabase.task.follow-up-emails.trigger', 'DEFAULT', 'metabase.task.follow-up-emails.job', 'DEFAULT', NULL, 1578686400000, -1, 5, 'WAITING', 'CRON', 1578601256000, 0, NULL, 0, X''),
+('MetabaseScheduler', 'metabase.task.task-history-cleanup.trigger', 'DEFAULT', 'metabase.task.task-history-cleanup.job', 'DEFAULT', NULL, 1578603600000, -1, 5, 'WAITING', 'CRON', 1578601256000, 0, NULL, 0, X''),
+('MetabaseScheduler', 'metabase.task.sync-and-analyze.trigger.1', 'DEFAULT', 'metabase.task.sync-and-analyze.job', 'DEFAULT', 'sync-and-analyze Database 1', 1578603000000, -1, 5, 'WAITING', 'CRON', 1578601256000, 0, NULL, 2, X'aced0005737200156f72672e71756172747a2e4a6f62446174614d61709fb083e8bfa9b0cb020000787200266f72672e71756172747a2e7574696c732e537472696e674b65794469727479466c61674d61708208e8c3fbc55d280200015a0013616c6c6f77735472616e7369656e74446174617872001d6f72672e71756172747a2e7574696c732e4469727479466c61674d617013e62ead28760ace0200025a000564697274794c00036d617074000f4c6a6176612f7574696c2f4d61703b787001737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f4000000000000c7708000000100000000174000564622d6964737200116a6176612e6c616e672e496e746567657212e2a0a4f781873802000149000576616c7565787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b0200007870000000017800'),
+('MetabaseScheduler', 'metabase.task.update-field-values.trigger.1', 'DEFAULT', 'metabase.task.update-field-values.job', 'DEFAULT', 'update-field-values Database 1', 1578646200000, -1, 5, 'WAITING', 'CRON', 1578601256000, 0, NULL, 2, X'aced0005737200156f72672e71756172747a2e4a6f62446174614d61709fb083e8bfa9b0cb020000787200266f72672e71756172747a2e7574696c732e537472696e674b65794469727479466c61674d61708208e8c3fbc55d280200015a0013616c6c6f77735472616e7369656e74446174617872001d6f72672e71756172747a2e7574696c732e4469727479466c61674d617013e62ead28760ace0200025a000564697274794c00036d617074000f4c6a6176612f7574696c2f4d61703b787001737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f4000000000000c7708000000100000000174000564622d6964737200116a6176612e6c616e672e496e746567657212e2a0a4f781873802000149000576616c7565787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b0200007870000000017800');     
 CREATE INDEX PUBLIC.IDX_QRTZ_T_J ON PUBLIC.QRTZ_TRIGGERS(SCHED_NAME, JOB_NAME, JOB_GROUP);     
 CREATE INDEX PUBLIC.IDX_QRTZ_T_JG ON PUBLIC.QRTZ_TRIGGERS(SCHED_NAME, JOB_GROUP);              
 CREATE INDEX PUBLIC.IDX_QRTZ_T_C ON PUBLIC.QRTZ_TRIGGERS(SCHED_NAME, CALENDAR_NAME);           
@@ -617,7 +617,7 @@ CREATE INDEX PUBLIC.IDX_QRTZ_T_NFT_MISFIRE ON PUBLIC.QRTZ_TRIGGERS(SCHED_NAME, M
 CREATE INDEX PUBLIC.IDX_QRTZ_T_NFT_ST_MISFIRE ON PUBLIC.QRTZ_TRIGGERS(SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_STATE);               
 CREATE INDEX PUBLIC.IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON PUBLIC.QRTZ_TRIGGERS(SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_GROUP, TRIGGER_STATE);            
 CREATE CACHED TABLE PUBLIC.COMPUTATION_JOB COMMENT 'Stores submitted async computation jobs.'(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_961FFF43_7B14_4432_979E_29B47765492A) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_961FFF43_7B14_4432_979E_29B47765492A,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_A24111B2_BA6C_4677_ACC5_BF512C758DF4) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A24111B2_BA6C_4677_ACC5_BF512C758DF4,
     CREATOR_ID INT,
     CREATED_AT TIMESTAMP NOT NULL,
     UPDATED_AT TIMESTAMP NOT NULL,
@@ -629,7 +629,7 @@ CREATE CACHED TABLE PUBLIC.COMPUTATION_JOB COMMENT 'Stores submitted async compu
 ALTER TABLE PUBLIC.COMPUTATION_JOB ADD CONSTRAINT PUBLIC.PK_COMPUTATION_JOB PRIMARY KEY(ID);   
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.COMPUTATION_JOB;          
 CREATE CACHED TABLE PUBLIC.PULSE_CARD(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_4B685D34_945B_4BBB_8611_8CBE9911C3F2) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_4B685D34_945B_4BBB_8611_8CBE9911C3F2,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_95E44CE8_C085_4803_9E1B_68E9CC44F285) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_95E44CE8_C085_4803_9E1B_68E9CC44F285,
     PULSE_ID INT NOT NULL,
     CARD_ID INT NOT NULL,
     POSITION INT NOT NULL,
@@ -649,7 +649,7 @@ ALTER TABLE PUBLIC.QUERY_CACHE ADD CONSTRAINT PUBLIC.PK_QUERY_CACHE PRIMARY KEY(
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.QUERY_CACHE;              
 CREATE INDEX PUBLIC.IDX_QUERY_CACHE_UPDATED_AT ON PUBLIC.QUERY_CACHE(UPDATED_AT);              
 CREATE CACHED TABLE PUBLIC.CARD_LABEL(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_AD86AFFE_C465_4DB5_9323_5D7EA4F8BE46) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_AD86AFFE_C465_4DB5_9323_5D7EA4F8BE46,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_4000F194_F105_4A55_A439_C1D4DC1DF7A7) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_4000F194_F105_4A55_A439_C1D4DC1DF7A7,
     CARD_ID INT NOT NULL,
     LABEL_ID INT NOT NULL
 );   
@@ -658,7 +658,7 @@ ALTER TABLE PUBLIC.CARD_LABEL ADD CONSTRAINT PUBLIC.PK_CARD_LABEL PRIMARY KEY(ID
 CREATE INDEX PUBLIC.IDX_CARD_LABEL_CARD_ID ON PUBLIC.CARD_LABEL(CARD_ID);      
 CREATE INDEX PUBLIC.IDX_CARD_LABEL_LABEL_ID ON PUBLIC.CARD_LABEL(LABEL_ID);    
 CREATE CACHED TABLE PUBLIC.DIMENSION COMMENT 'Stores references to alternate views of existing fields, such as remapping an integer to a description, like an enum'(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_61D13869_98BB_4997_B092_515D9263C392) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_61D13869_98BB_4997_B092_515D9263C392,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_7F6C7A35_56C8_4B05_94BF_87AAE631651D) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_7F6C7A35_56C8_4B05_94BF_87AAE631651D,
     FIELD_ID INT NOT NULL COMMENT 'ID of the field this dimension row applies to',
     NAME VARCHAR(254) NOT NULL COMMENT 'Short description used as the display name of this new column',
     TYPE VARCHAR(254) NOT NULL COMMENT 'Either internal for a user defined remapping or external for a foreign key based remapping',
@@ -670,7 +670,7 @@ ALTER TABLE PUBLIC.DIMENSION ADD CONSTRAINT PUBLIC.PK_DIMENSION PRIMARY KEY(ID);
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.DIMENSION;
 CREATE INDEX PUBLIC.IDX_DIMENSION_FIELD_ID ON PUBLIC.DIMENSION(FIELD_ID);      
 CREATE CACHED TABLE PUBLIC.METABASE_FIELD(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_5E58DB27_82A5_4D5F_BB57_EEC19CB94FB3) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5E58DB27_82A5_4D5F_BB57_EEC19CB94FB3,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_14756EB4_E9C9_40A3_BE85_DA69A810BD0D) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_14756EB4_E9C9_40A3_BE85_DA69A810BD0D,
     CREATED_AT TIMESTAMP NOT NULL,
     UPDATED_AT TIMESTAMP NOT NULL,
     NAME VARCHAR(254) NOT NULL,
@@ -697,50 +697,50 @@ CREATE CACHED TABLE PUBLIC.METABASE_FIELD(
 ALTER TABLE PUBLIC.METABASE_FIELD ADD CONSTRAINT PUBLIC.PK_METABASE_FIELD PRIMARY KEY(ID);     
 -- 36 +/- SELECT COUNT(*) FROM PUBLIC.METABASE_FIELD;          
 INSERT INTO PUBLIC.METABASE_FIELD(ID, CREATED_AT, UPDATED_AT, NAME, BASE_TYPE, SPECIAL_TYPE, ACTIVE, DESCRIPTION, PREVIEW_DISPLAY, POSITION, TABLE_ID, PARENT_ID, DISPLAY_NAME, VISIBILITY_TYPE, FK_TARGET_FIELD_ID, LAST_ANALYZED, POINTS_OF_INTEREST, CAVEATS, FINGERPRINT, FINGERPRINT_VERSION, DATABASE_TYPE, HAS_FIELD_VALUES, SETTINGS) VALUES
-(1, TIMESTAMP '2019-12-27 13:55:00.773', TIMESTAMP '2019-12-27 13:55:02.015', 'EAN', 'type/Text', NULL, TRUE, 'The international article number. A 13 digit number uniquely identifying the product.', TRUE, 0, 1, NULL, 'Ean', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":200,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":13.0}}}', 4, 'CHAR', NULL, NULL),
-(2, TIMESTAMP '2019-12-27 13:55:00.774', TIMESTAMP '2019-12-27 13:55:06.959', 'RATING', 'type/Float', 'type/Score', TRUE, 'The average rating users have given the product. This ranges from 1 - 5', TRUE, 0, 1, NULL, 'Rating', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":23,"nil%":0.0},"type":{"type/Number":{"min":0.0,"max":5.0,"avg":3.4715,"sd":1.3605488657451452,"q1":3.5120465053408525,"q3":4.216124969497314}}}', 4, 'DOUBLE', NULL, NULL),
-(3, TIMESTAMP '2019-12-27 13:55:00.775', TIMESTAMP '2019-12-27 13:55:02.017', 'PRICE', 'type/Float', NULL, TRUE, 'The list price of the product. Note that this is not always the price the product sold for due to discounts, promotions, etc.', TRUE, 0, 1, NULL, 'Price', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":170,"nil%":0.0},"type":{"type/Number":{"min":15.691943673970439,"max":98.81933684368194,"avg":55.74639966792074,"sd":21.711481557852057,"q1":37.25154462926434,"q3":75.45898071609447}}}', 4, 'DOUBLE', NULL, NULL),
-(4, TIMESTAMP '2019-12-27 13:55:00.776', TIMESTAMP '2019-12-27 13:55:00.776', 'ID', 'type/BigInteger', 'type/PK', TRUE, 'The numerical product number. Only used internally. All external communication should use the title or EAN.', TRUE, 0, 1, NULL, 'ID', 'normal', NULL, NULL, NULL, NULL, NULL, 0, 'BIGINT', NULL, NULL),
-(5, TIMESTAMP '2019-12-27 13:55:00.777', TIMESTAMP '2019-12-27 13:55:06.964', 'TITLE', 'type/Text', 'type/Title', TRUE, 'The name of the product as it should be displayed to customers.', TRUE, 0, 1, NULL, 'Title', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":199,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":21.495}}}', 4, 'VARCHAR', NULL, NULL),
-(6, TIMESTAMP '2019-12-27 13:55:00.778', TIMESTAMP '2019-12-27 13:55:06.968', 'CATEGORY', 'type/Text', 'type/Category', TRUE, 'The type of product, valid values include: Doohicky, Gadget, Gizmo and Widget', TRUE, 0, 1, NULL, 'Category', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":4,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":6.375}}}', 4, 'VARCHAR', 'auto-list', NULL),
-(7, TIMESTAMP '2019-12-27 13:55:00.778', TIMESTAMP '2019-12-27 13:55:06.972', 'CREATED_AT', 'type/DateTime', 'type/CreationTimestamp', TRUE, 'The date the product was added to our catalog.', TRUE, 0, 1, NULL, 'Created At', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":200,"nil%":0.0},"type":{"type/DateTime":{"earliest":"2016-04-26T19:29:55.147","latest":"2019-04-15T13:34:19.931"}}}', 4, 'TIMESTAMP', NULL, NULL),
-(8, TIMESTAMP '2019-12-27 13:55:00.779', TIMESTAMP '2019-12-27 13:55:06.975', 'VENDOR', 'type/Text', 'type/Company', TRUE, 'The source of the product.', TRUE, 0, 1, NULL, 'Vendor', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":200,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":20.6}}}', 4, 'VARCHAR', NULL, NULL),
-(9, TIMESTAMP '2019-12-27 13:55:00.853', TIMESTAMP '2019-12-27 13:55:04.201', 'USER_ID', 'type/Integer', 'type/FK', TRUE, 'The id of the user who made this order. Note that in some cases where an order was created on behalf of a customer who phoned the order in, this might be the employee who handled the request.', TRUE, 0, 2, NULL, 'User ID', 'normal', 21, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":929,"nil%":0.0}}', 4, 'INTEGER', NULL, NULL);     
+(1, TIMESTAMP '2020-01-09 12:20:56.615', TIMESTAMP '2020-01-09 12:20:57.471', 'EAN', 'type/Text', NULL, TRUE, 'The international article number. A 13 digit number uniquely identifying the product.', TRUE, 0, 1, NULL, 'Ean', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":200,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":13.0}}}', 4, 'CHAR', NULL, NULL),
+(2, TIMESTAMP '2020-01-09 12:20:56.616', TIMESTAMP '2020-01-09 12:21:00.883', 'RATING', 'type/Float', 'type/Score', TRUE, 'The average rating users have given the product. This ranges from 1 - 5', TRUE, 0, 1, NULL, 'Rating', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":23,"nil%":0.0},"type":{"type/Number":{"min":0.0,"max":5.0,"avg":3.4715,"sd":1.3605488657451452,"q1":3.5120465053408525,"q3":4.216124969497314}}}', 4, 'DOUBLE', NULL, NULL),
+(3, TIMESTAMP '2020-01-09 12:20:56.617', TIMESTAMP '2020-01-09 12:20:57.473', 'PRICE', 'type/Float', NULL, TRUE, 'The list price of the product. Note that this is not always the price the product sold for due to discounts, promotions, etc.', TRUE, 0, 1, NULL, 'Price', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":170,"nil%":0.0},"type":{"type/Number":{"min":15.691943673970439,"max":98.81933684368194,"avg":55.74639966792074,"sd":21.711481557852057,"q1":37.25154462926434,"q3":75.45898071609447}}}', 4, 'DOUBLE', NULL, NULL),
+(4, TIMESTAMP '2020-01-09 12:20:56.617', TIMESTAMP '2020-01-09 12:20:56.617', 'ID', 'type/BigInteger', 'type/PK', TRUE, 'The numerical product number. Only used internally. All external communication should use the title or EAN.', TRUE, 0, 1, NULL, 'ID', 'normal', NULL, NULL, NULL, NULL, NULL, 0, 'BIGINT', NULL, NULL),
+(5, TIMESTAMP '2020-01-09 12:20:56.618', TIMESTAMP '2020-01-09 12:21:00.886', 'TITLE', 'type/Text', 'type/Title', TRUE, 'The name of the product as it should be displayed to customers.', TRUE, 0, 1, NULL, 'Title', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":199,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":21.495}}}', 4, 'VARCHAR', NULL, NULL),
+(6, TIMESTAMP '2020-01-09 12:20:56.618', TIMESTAMP '2020-01-09 12:21:00.887', 'CATEGORY', 'type/Text', 'type/Category', TRUE, 'The type of product, valid values include: Doohicky, Gadget, Gizmo and Widget', TRUE, 0, 1, NULL, 'Category', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":4,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":6.375}}}', 4, 'VARCHAR', 'auto-list', NULL),
+(7, TIMESTAMP '2020-01-09 12:20:56.619', TIMESTAMP '2020-01-09 12:21:00.889', 'CREATED_AT', 'type/DateTime', 'type/CreationTimestamp', TRUE, 'The date the product was added to our catalog.', TRUE, 0, 1, NULL, 'Created At', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":200,"nil%":0.0},"type":{"type/DateTime":{"earliest":"2016-04-26T19:29:55.147","latest":"2019-04-15T13:34:19.931"}}}', 4, 'TIMESTAMP', NULL, NULL),
+(8, TIMESTAMP '2020-01-09 12:20:56.62', TIMESTAMP '2020-01-09 12:21:00.89', 'VENDOR', 'type/Text', 'type/Company', TRUE, 'The source of the product.', TRUE, 0, 1, NULL, 'Vendor', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":200,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":20.6}}}', 4, 'VARCHAR', NULL, NULL),
+(9, TIMESTAMP '2020-01-09 12:20:56.687', TIMESTAMP '2020-01-09 12:20:58.846', 'USER_ID', 'type/Integer', 'type/FK', TRUE, 'The id of the user who made this order. Note that in some cases where an order was created on behalf of a customer who phoned the order in, this might be the employee who handled the request.', TRUE, 0, 2, NULL, 'User ID', 'normal', 21, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":929,"nil%":0.0}}', 4, 'INTEGER', NULL, NULL);               
 INSERT INTO PUBLIC.METABASE_FIELD(ID, CREATED_AT, UPDATED_AT, NAME, BASE_TYPE, SPECIAL_TYPE, ACTIVE, DESCRIPTION, PREVIEW_DISPLAY, POSITION, TABLE_ID, PARENT_ID, DISPLAY_NAME, VISIBILITY_TYPE, FK_TARGET_FIELD_ID, LAST_ANALYZED, POINTS_OF_INTEREST, CAVEATS, FINGERPRINT, FINGERPRINT_VERSION, DATABASE_TYPE, HAS_FIELD_VALUES, SETTINGS) VALUES
-(10, TIMESTAMP '2019-12-27 13:55:00.854', TIMESTAMP '2019-12-27 13:55:06.986', 'DISCOUNT', 'type/Float', 'type/Discount', TRUE, 'Discount amount.', TRUE, 0, 2, NULL, 'Discount', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":701,"nil%":0.898},"type":{"type/Number":{"min":0.17088996672584322,"max":61.69684269960571,"avg":5.161255547580326,"sd":3.053663125001991,"q1":2.9786226681458743,"q3":7.338187788658235}}}', 4, 'DOUBLE', NULL, NULL),
-(11, TIMESTAMP '2019-12-27 13:55:00.855', TIMESTAMP '2019-12-27 13:55:04.204', 'PRODUCT_ID', 'type/Integer', 'type/FK', TRUE, 'The product ID. This is an internal identifier for the product, NOT the SKU.', TRUE, 0, 2, NULL, 'Product ID', 'normal', 4, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":200,"nil%":0.0}}', 4, 'INTEGER', NULL, NULL),
-(12, TIMESTAMP '2019-12-27 13:55:00.856', TIMESTAMP '2019-12-27 13:55:00.856', 'ID', 'type/BigInteger', 'type/PK', TRUE, STRINGDECODE('This is a unique ID for the product. It is also called the \u201cInvoice number\u201d or \u201cConfirmation number\u201d in customer facing emails and screens.'), TRUE, 0, 2, NULL, 'ID', 'normal', NULL, NULL, NULL, NULL, NULL, 0, 'BIGINT', NULL, NULL),
-(13, TIMESTAMP '2019-12-27 13:55:00.857', TIMESTAMP '2019-12-27 13:55:04.205', 'SUBTOTAL', 'type/Float', NULL, TRUE, 'The raw, pre-tax cost of the order. Note that this might be different in the future from the product price due to promotions, credits, etc.', TRUE, 0, 2, NULL, 'Subtotal', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":340,"nil%":0.0},"type":{"type/Number":{"min":15.691943673970439,"max":148.22900526552291,"avg":77.01295465356547,"sd":32.53705013056317,"q1":49.74894519060184,"q3":105.42965746993103}}}', 4, 'DOUBLE', NULL, NULL),
-(14, TIMESTAMP '2019-12-27 13:55:00.857', TIMESTAMP '2019-12-27 13:55:06.997', 'QUANTITY', 'type/Integer', 'type/Quantity', TRUE, 'Number of products bought.', TRUE, 0, 2, NULL, 'Quantity', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":62,"nil%":0.0},"type":{"type/Number":{"min":0.0,"max":100.0,"avg":3.7015,"sd":4.214258386403798,"q1":1.755882607764982,"q3":4.882654507928044}}}', 4, 'INTEGER', 'auto-list', NULL),
-(15, TIMESTAMP '2019-12-27 13:55:00.858', TIMESTAMP '2019-12-27 13:55:07.002', 'CREATED_AT', 'type/DateTime', 'type/CreationTimestamp', TRUE, 'The date and time an order was submitted.', TRUE, 0, 2, NULL, 'Created At', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":9998,"nil%":0.0},"type":{"type/DateTime":{"earliest":"2016-04-30T18:56:13.352","latest":"2020-04-19T14:07:15.657"}}}', 4, 'TIMESTAMP', NULL, NULL),
-(16, TIMESTAMP '2019-12-27 13:55:00.859', TIMESTAMP '2019-12-27 13:55:04.208', 'TAX', 'type/Float', NULL, TRUE, 'This is the amount of local and federal taxes that are collected on the purchase. Note that other governmental fees on some products are not included here, but instead are accounted for in the subtotal.', TRUE, 0, 2, NULL, 'Tax', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":797,"nil%":0.0},"type":{"type/Number":{"min":0.0,"max":11.12,"avg":3.8722100000000004,"sd":2.3206651358900316,"q1":2.273340386603857,"q3":5.337275338216307}}}', 4, 'DOUBLE', NULL, NULL),
-(17, TIMESTAMP '2019-12-27 13:55:00.86', TIMESTAMP '2019-12-27 13:55:04.209', 'TOTAL', 'type/Float', NULL, TRUE, 'The total billed amount.', TRUE, 0, 2, NULL, 'Total', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":10000,"nil%":0.0},"type":{"type/Number":{"min":12.061602936923117,"max":238.32732001721533,"avg":82.96014815230805,"sd":38.35967664847571,"q1":52.006147617878135,"q3":109.55803018499738}}}', 4, 'DOUBLE', NULL, NULL);     
+(10, TIMESTAMP '2020-01-09 12:20:56.687', TIMESTAMP '2020-01-09 12:21:00.895', 'DISCOUNT', 'type/Float', 'type/Discount', TRUE, 'Discount amount.', TRUE, 0, 2, NULL, 'Discount', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":701,"nil%":0.898},"type":{"type/Number":{"min":0.17088996672584322,"max":61.69684269960571,"avg":5.161255547580326,"sd":3.053663125001991,"q1":2.9786226681458743,"q3":7.338187788658235}}}', 4, 'DOUBLE', NULL, NULL),
+(11, TIMESTAMP '2020-01-09 12:20:56.688', TIMESTAMP '2020-01-09 12:20:58.848', 'PRODUCT_ID', 'type/Integer', 'type/FK', TRUE, 'The product ID. This is an internal identifier for the product, NOT the SKU.', TRUE, 0, 2, NULL, 'Product ID', 'normal', 4, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":200,"nil%":0.0}}', 4, 'INTEGER', NULL, NULL),
+(12, TIMESTAMP '2020-01-09 12:20:56.689', TIMESTAMP '2020-01-09 12:20:56.689', 'ID', 'type/BigInteger', 'type/PK', TRUE, STRINGDECODE('This is a unique ID for the product. It is also called the \u201cInvoice number\u201d or \u201cConfirmation number\u201d in customer facing emails and screens.'), TRUE, 0, 2, NULL, 'ID', 'normal', NULL, NULL, NULL, NULL, NULL, 0, 'BIGINT', NULL, NULL),
+(13, TIMESTAMP '2020-01-09 12:20:56.689', TIMESTAMP '2020-01-09 12:20:58.849', 'SUBTOTAL', 'type/Float', NULL, TRUE, 'The raw, pre-tax cost of the order. Note that this might be different in the future from the product price due to promotions, credits, etc.', TRUE, 0, 2, NULL, 'Subtotal', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":340,"nil%":0.0},"type":{"type/Number":{"min":15.691943673970439,"max":148.22900526552291,"avg":77.01295465356547,"sd":32.53705013056317,"q1":49.74894519060184,"q3":105.42965746993103}}}', 4, 'DOUBLE', NULL, NULL),
+(14, TIMESTAMP '2020-01-09 12:20:56.689', TIMESTAMP '2020-01-09 12:21:00.898', 'QUANTITY', 'type/Integer', 'type/Quantity', TRUE, 'Number of products bought.', TRUE, 0, 2, NULL, 'Quantity', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":62,"nil%":0.0},"type":{"type/Number":{"min":0.0,"max":100.0,"avg":3.7015,"sd":4.214258386403798,"q1":1.755882607764982,"q3":4.882654507928044}}}', 4, 'INTEGER', 'auto-list', NULL),
+(15, TIMESTAMP '2020-01-09 12:20:56.69', TIMESTAMP '2020-01-09 12:21:00.899', 'CREATED_AT', 'type/DateTime', 'type/CreationTimestamp', TRUE, 'The date and time an order was submitted.', TRUE, 0, 2, NULL, 'Created At', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":9998,"nil%":0.0},"type":{"type/DateTime":{"earliest":"2016-04-30T18:56:13.352","latest":"2020-04-19T14:07:15.657"}}}', 4, 'TIMESTAMP', NULL, NULL),
+(16, TIMESTAMP '2020-01-09 12:20:56.69', TIMESTAMP '2020-01-09 12:20:58.851', 'TAX', 'type/Float', NULL, TRUE, 'This is the amount of local and federal taxes that are collected on the purchase. Note that other governmental fees on some products are not included here, but instead are accounted for in the subtotal.', TRUE, 0, 2, NULL, 'Tax', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":797,"nil%":0.0},"type":{"type/Number":{"min":0.0,"max":11.12,"avg":3.8722100000000004,"sd":2.3206651358900316,"q1":2.273340386603857,"q3":5.337275338216307}}}', 4, 'DOUBLE', NULL, NULL),
+(17, TIMESTAMP '2020-01-09 12:20:56.691', TIMESTAMP '2020-01-09 12:20:58.852', 'TOTAL', 'type/Float', NULL, TRUE, 'The total billed amount.', TRUE, 0, 2, NULL, 'Total', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":10000,"nil%":0.0},"type":{"type/Number":{"min":12.061602936923117,"max":238.32732001721533,"avg":82.96014815230805,"sd":38.35967664847571,"q1":52.006147617878135,"q3":109.55803018499738}}}', 4, 'DOUBLE', NULL, NULL);             
 INSERT INTO PUBLIC.METABASE_FIELD(ID, CREATED_AT, UPDATED_AT, NAME, BASE_TYPE, SPECIAL_TYPE, ACTIVE, DESCRIPTION, PREVIEW_DISPLAY, POSITION, TABLE_ID, PARENT_ID, DISPLAY_NAME, VISIBILITY_TYPE, FK_TARGET_FIELD_ID, LAST_ANALYZED, POINTS_OF_INTEREST, CAVEATS, FINGERPRINT, FINGERPRINT_VERSION, DATABASE_TYPE, HAS_FIELD_VALUES, SETTINGS) VALUES
-(18, TIMESTAMP '2019-12-27 13:55:00.904', TIMESTAMP '2019-12-27 13:55:07.025', 'LATITUDE', 'type/Float', 'type/Latitude', TRUE, 'This is the latitude of the user on sign-up. It might be updated in the future to the last seen location.', TRUE, 0, 3, NULL, 'Latitude', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":2491,"nil%":0.0},"type":{"type/Number":{"min":25.775827,"max":70.6355001,"avg":39.87934670484002,"sd":6.390832341883712,"q1":35.302705923023126,"q3":43.773802584662}}}', 4, 'DOUBLE', NULL, NULL),
-(19, TIMESTAMP '2019-12-27 13:55:00.904', TIMESTAMP '2019-12-27 13:55:06.429', 'BIRTH_DATE', 'type/Date', NULL, TRUE, 'The date of birth of the user', TRUE, 0, 3, NULL, 'Birth Date', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":2308,"nil%":0.0},"type":{"type/DateTime":{"earliest":"1958-04-26","latest":"2000-04-03"}}}', 4, 'DATE', NULL, NULL),
-(20, TIMESTAMP '2019-12-27 13:55:00.905', TIMESTAMP '2019-12-27 13:55:07.034', 'NAME', 'type/Text', 'type/Name', TRUE, 'The name of the user who owns an account', TRUE, 0, 3, NULL, 'Name', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":2499,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":13.532}}}', 4, 'VARCHAR', NULL, NULL),
-(21, TIMESTAMP '2019-12-27 13:55:00.906', TIMESTAMP '2019-12-27 13:55:00.906', 'ID', 'type/BigInteger', 'type/PK', TRUE, 'A unique identifier given to each user.', TRUE, 0, 3, NULL, 'ID', 'normal', NULL, NULL, NULL, NULL, NULL, 0, 'BIGINT', NULL, NULL),
-(22, TIMESTAMP '2019-12-27 13:55:00.907', TIMESTAMP '2019-12-27 13:55:06.431', 'ADDRESS', 'type/Text', NULL, TRUE, STRINGDECODE('The street address of the account\u2019s billing address'), TRUE, 0, 3, NULL, 'Address', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":2490,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":20.85}}}', 4, 'VARCHAR', NULL, NULL),
-(23, TIMESTAMP '2019-12-27 13:55:00.907', TIMESTAMP '2019-12-27 13:55:07.043', 'LONGITUDE', 'type/Float', 'type/Longitude', TRUE, 'This is the longitude of the user on sign-up. It might be updated in the future to the last seen location.', TRUE, 0, 3, NULL, 'Longitude', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":2491,"nil%":0.0},"type":{"type/Number":{"min":-166.5425726,"max":-67.96735199999999,"avg":-95.18741780363999,"sd":15.399698968175663,"q1":-101.58350792373135,"q3":-84.65289348288829}}}', 4, 'DOUBLE', NULL, NULL),
-(24, TIMESTAMP '2019-12-27 13:55:00.908', TIMESTAMP '2019-12-27 13:55:07.064', 'SOURCE', 'type/Text', 'type/Source', TRUE, 'The channel through which we acquired this user. Valid values include: Affiliate, Facebook, Google, Organic and Twitter', TRUE, 0, 3, NULL, 'Source', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":5,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":7.4084}}}', 4, 'VARCHAR', 'auto-list', NULL),
-(25, TIMESTAMP '2019-12-27 13:55:00.909', TIMESTAMP '2019-12-27 13:55:07.071', 'EMAIL', 'type/Text', 'type/Email', TRUE, 'The contact email for the account.', TRUE, 0, 3, NULL, 'Email', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":2500,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":1.0,"average-length":24.1824}}}', 4, 'VARCHAR', NULL, NULL),
-(26, TIMESTAMP '2019-12-27 13:55:00.909', TIMESTAMP '2019-12-27 13:55:07.075', 'CREATED_AT', 'type/DateTime', 'type/CreationTimestamp', TRUE, STRINGDECODE('The date the user record was created. Also referred to as the user\u2019s \"join date\"'), TRUE, 0, 3, NULL, 'Created At', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":2500,"nil%":0.0},"type":{"type/DateTime":{"earliest":"2016-04-19T21:35:18.752","latest":"2019-04-19T14:06:27.3"}}}', 4, 'TIMESTAMP', NULL, NULL);  
+(18, TIMESTAMP '2020-01-09 12:20:56.723', TIMESTAMP '2020-01-09 12:21:00.904', 'LATITUDE', 'type/Float', 'type/Latitude', TRUE, 'This is the latitude of the user on sign-up. It might be updated in the future to the last seen location.', TRUE, 0, 3, NULL, 'Latitude', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":2491,"nil%":0.0},"type":{"type/Number":{"min":25.775827,"max":70.6355001,"avg":39.87934670484002,"sd":6.390832341883712,"q1":35.302705923023126,"q3":43.773802584662}}}', 4, 'DOUBLE', NULL, NULL),
+(19, TIMESTAMP '2020-01-09 12:20:56.724', TIMESTAMP '2020-01-09 12:21:00.535', 'BIRTH_DATE', 'type/Date', NULL, TRUE, 'The date of birth of the user', TRUE, 0, 3, NULL, 'Birth Date', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":2308,"nil%":0.0},"type":{"type/DateTime":{"earliest":"1958-04-26","latest":"2000-04-03"}}}', 4, 'DATE', NULL, NULL),
+(20, TIMESTAMP '2020-01-09 12:20:56.725', TIMESTAMP '2020-01-09 12:21:00.906', 'NAME', 'type/Text', 'type/Name', TRUE, 'The name of the user who owns an account', TRUE, 0, 3, NULL, 'Name', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":2499,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":13.532}}}', 4, 'VARCHAR', NULL, NULL),
+(21, TIMESTAMP '2020-01-09 12:20:56.725', TIMESTAMP '2020-01-09 12:20:56.725', 'ID', 'type/BigInteger', 'type/PK', TRUE, 'A unique identifier given to each user.', TRUE, 0, 3, NULL, 'ID', 'normal', NULL, NULL, NULL, NULL, NULL, 0, 'BIGINT', NULL, NULL),
+(22, TIMESTAMP '2020-01-09 12:20:56.726', TIMESTAMP '2020-01-09 12:21:00.537', 'ADDRESS', 'type/Text', NULL, TRUE, STRINGDECODE('The street address of the account\u2019s billing address'), TRUE, 0, 3, NULL, 'Address', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":2490,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":20.85}}}', 4, 'VARCHAR', NULL, NULL),
+(23, TIMESTAMP '2020-01-09 12:20:56.726', TIMESTAMP '2020-01-09 12:21:00.908', 'LONGITUDE', 'type/Float', 'type/Longitude', TRUE, 'This is the longitude of the user on sign-up. It might be updated in the future to the last seen location.', TRUE, 0, 3, NULL, 'Longitude', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":2491,"nil%":0.0},"type":{"type/Number":{"min":-166.5425726,"max":-67.96735199999999,"avg":-95.18741780363999,"sd":15.399698968175663,"q1":-101.58350792373135,"q3":-84.65289348288829}}}', 4, 'DOUBLE', NULL, NULL),
+(24, TIMESTAMP '2020-01-09 12:20:56.728', TIMESTAMP '2020-01-09 12:21:00.91', 'SOURCE', 'type/Text', 'type/Source', TRUE, 'The channel through which we acquired this user. Valid values include: Affiliate, Facebook, Google, Organic and Twitter', TRUE, 0, 3, NULL, 'Source', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":5,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":7.4084}}}', 4, 'VARCHAR', 'auto-list', NULL),
+(25, TIMESTAMP '2020-01-09 12:20:56.729', TIMESTAMP '2020-01-09 12:21:00.911', 'EMAIL', 'type/Text', 'type/Email', TRUE, 'The contact email for the account.', TRUE, 0, 3, NULL, 'Email', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":2500,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":1.0,"average-length":24.1824}}}', 4, 'VARCHAR', NULL, NULL),
+(26, TIMESTAMP '2020-01-09 12:20:56.729', TIMESTAMP '2020-01-09 12:21:00.912', 'CREATED_AT', 'type/DateTime', 'type/CreationTimestamp', TRUE, STRINGDECODE('The date the user record was created. Also referred to as the user\u2019s \"join date\"'), TRUE, 0, 3, NULL, 'Created At', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":2500,"nil%":0.0},"type":{"type/DateTime":{"earliest":"2016-04-19T21:35:18.752","latest":"2019-04-19T14:06:27.3"}}}', 4, 'TIMESTAMP', NULL, NULL);           
 INSERT INTO PUBLIC.METABASE_FIELD(ID, CREATED_AT, UPDATED_AT, NAME, BASE_TYPE, SPECIAL_TYPE, ACTIVE, DESCRIPTION, PREVIEW_DISPLAY, POSITION, TABLE_ID, PARENT_ID, DISPLAY_NAME, VISIBILITY_TYPE, FK_TARGET_FIELD_ID, LAST_ANALYZED, POINTS_OF_INTEREST, CAVEATS, FINGERPRINT, FINGERPRINT_VERSION, DATABASE_TYPE, HAS_FIELD_VALUES, SETTINGS) VALUES
-(27, TIMESTAMP '2019-12-27 13:55:00.91', TIMESTAMP '2019-12-27 13:55:06.435', 'ZIP', 'type/Text', 'type/ZipCode', TRUE, STRINGDECODE('The postal code of the account\u2019s billing address'), TRUE, 0, 3, NULL, 'Zip', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":2234,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":5.0}}}', 4, 'CHAR', NULL, NULL),
-(28, TIMESTAMP '2019-12-27 13:55:00.911', TIMESTAMP '2019-12-27 13:55:07.079', 'STATE', 'type/Text', 'type/State', TRUE, STRINGDECODE('The state or province of the account\u2019s billing address'), TRUE, 0, 3, NULL, 'State', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":49,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":2.0}}}', 4, 'CHAR', 'auto-list', NULL),
-(29, TIMESTAMP '2019-12-27 13:55:00.912', TIMESTAMP '2019-12-27 13:55:06.437', 'PASSWORD', 'type/Text', NULL, TRUE, 'This is the salted password of the user. It should not be visible', TRUE, 0, 3, NULL, 'Password', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":2500,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":36.0}}}', 4, 'VARCHAR', NULL, NULL),
-(30, TIMESTAMP '2019-12-27 13:55:00.913', TIMESTAMP '2019-12-27 13:55:07.084', 'CITY', 'type/Text', 'type/City', TRUE, STRINGDECODE('The city of the account\u2019s billing address'), TRUE, 0, 3, NULL, 'City', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":1966,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":8.284}}}', 4, 'VARCHAR', NULL, NULL),
-(31, TIMESTAMP '2019-12-27 13:55:00.972', TIMESTAMP '2019-12-27 13:55:06.92', 'PRODUCT_ID', 'type/Integer', 'type/FK', TRUE, 'The product the review was for', TRUE, 0, 4, NULL, 'Product ID', 'normal', 4, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":176,"nil%":0.0}}', 4, 'INTEGER', NULL, NULL),
-(32, TIMESTAMP '2019-12-27 13:55:00.973', TIMESTAMP '2019-12-27 13:55:00.973', 'ID', 'type/BigInteger', 'type/PK', TRUE, 'A unique internal identifier for the review. Should not be used externally.', TRUE, 0, 4, NULL, 'ID', 'normal', NULL, NULL, NULL, NULL, NULL, 0, 'BIGINT', NULL, NULL),
-(33, TIMESTAMP '2019-12-27 13:55:00.974', TIMESTAMP '2019-12-27 13:55:06.921', 'BODY', 'type/Text', 'type/Description', TRUE, 'The review the user left. Limited to 2000 characters.', TRUE, 0, 4, NULL, 'Body', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":1112,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":180.68345323741008}}}', 4, 'CLOB', NULL, NULL),
-(34, TIMESTAMP '2019-12-27 13:55:00.975', TIMESTAMP '2019-12-27 13:55:06.922', 'REVIEWER', 'type/Text', NULL, TRUE, 'The user who left the review', TRUE, 0, 4, NULL, 'Reviewer', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":1076,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":9.972122302158274}}}', 4, 'VARCHAR', NULL, NULL),
-(35, TIMESTAMP '2019-12-27 13:55:00.976', TIMESTAMP '2019-12-27 13:55:07.118', 'CREATED_AT', 'type/DateTime', 'type/CreationTimestamp', TRUE, 'The day and time a review was written by a user.', TRUE, 0, 4, NULL, 'Created At', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":1112,"nil%":0.0},"type":{"type/DateTime":{"earliest":"2016-06-03T00:37:05.818","latest":"2020-04-19T14:15:25.677"}}}', 4, 'TIMESTAMP', NULL, NULL); 
+(27, TIMESTAMP '2020-01-09 12:20:56.73', TIMESTAMP '2020-01-09 12:21:00.541', 'ZIP', 'type/Text', 'type/ZipCode', TRUE, STRINGDECODE('The postal code of the account\u2019s billing address'), TRUE, 0, 3, NULL, 'Zip', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":2234,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":5.0}}}', 4, 'CHAR', NULL, NULL),
+(28, TIMESTAMP '2020-01-09 12:20:56.73', TIMESTAMP '2020-01-09 12:21:00.915', 'STATE', 'type/Text', 'type/State', TRUE, STRINGDECODE('The state or province of the account\u2019s billing address'), TRUE, 0, 3, NULL, 'State', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":49,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":2.0}}}', 4, 'CHAR', 'auto-list', NULL),
+(29, TIMESTAMP '2020-01-09 12:20:56.731', TIMESTAMP '2020-01-09 12:21:00.542', 'PASSWORD', 'type/Text', NULL, TRUE, 'This is the salted password of the user. It should not be visible', TRUE, 0, 3, NULL, 'Password', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":2500,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":36.0}}}', 4, 'VARCHAR', NULL, NULL),
+(30, TIMESTAMP '2020-01-09 12:20:56.732', TIMESTAMP '2020-01-09 12:21:00.918', 'CITY', 'type/Text', 'type/City', TRUE, STRINGDECODE('The city of the account\u2019s billing address'), TRUE, 0, 3, NULL, 'City', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":1966,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":8.284}}}', 4, 'VARCHAR', NULL, NULL),
+(31, TIMESTAMP '2020-01-09 12:20:56.766', TIMESTAMP '2020-01-09 12:21:00.868', 'PRODUCT_ID', 'type/Integer', 'type/FK', TRUE, 'The product the review was for', TRUE, 0, 4, NULL, 'Product ID', 'normal', 4, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":176,"nil%":0.0}}', 4, 'INTEGER', NULL, NULL),
+(32, TIMESTAMP '2020-01-09 12:20:56.767', TIMESTAMP '2020-01-09 12:20:56.767', 'ID', 'type/BigInteger', 'type/PK', TRUE, 'A unique internal identifier for the review. Should not be used externally.', TRUE, 0, 4, NULL, 'ID', 'normal', NULL, NULL, NULL, NULL, NULL, 0, 'BIGINT', NULL, NULL),
+(33, TIMESTAMP '2020-01-09 12:20:56.767', TIMESTAMP '2020-01-09 12:21:00.869', 'BODY', 'type/Text', 'type/Description', TRUE, 'The review the user left. Limited to 2000 characters.', TRUE, 0, 4, NULL, 'Body', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":1112,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":180.68345323741008}}}', 4, 'CLOB', NULL, NULL),
+(34, TIMESTAMP '2020-01-09 12:20:56.768', TIMESTAMP '2020-01-09 12:21:00.869', 'REVIEWER', 'type/Text', NULL, TRUE, 'The user who left the review', TRUE, 0, 4, NULL, 'Reviewer', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":1076,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":9.972122302158274}}}', 4, 'VARCHAR', NULL, NULL),
+(35, TIMESTAMP '2020-01-09 12:20:56.768', TIMESTAMP '2020-01-09 12:21:00.926', 'CREATED_AT', 'type/DateTime', 'type/CreationTimestamp', TRUE, 'The day and time a review was written by a user.', TRUE, 0, 4, NULL, 'Created At', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":1112,"nil%":0.0},"type":{"type/DateTime":{"earliest":"2016-06-03T00:37:05.818","latest":"2020-04-19T14:15:25.677"}}}', 4, 'TIMESTAMP', NULL, NULL);         
 INSERT INTO PUBLIC.METABASE_FIELD(ID, CREATED_AT, UPDATED_AT, NAME, BASE_TYPE, SPECIAL_TYPE, ACTIVE, DESCRIPTION, PREVIEW_DISPLAY, POSITION, TABLE_ID, PARENT_ID, DISPLAY_NAME, VISIBILITY_TYPE, FK_TARGET_FIELD_ID, LAST_ANALYZED, POINTS_OF_INTEREST, CAVEATS, FINGERPRINT, FINGERPRINT_VERSION, DATABASE_TYPE, HAS_FIELD_VALUES, SETTINGS) VALUES
-(36, TIMESTAMP '2019-12-27 13:55:00.976', TIMESTAMP '2019-12-27 13:55:07.122', 'RATING', 'type/Integer', 'type/Score', TRUE, 'The rating (on a scale of 1-5) the user left.', TRUE, 0, 4, NULL, 'Rating', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":5,"nil%":0.0},"type":{"type/Number":{"min":1.0,"max":5.0,"avg":3.987410071942446,"sd":1.0443899855660577,"q1":3.54744353181696,"q3":4.764807071650455}}}', 4, 'SMALLINT', 'auto-list', NULL);     
+(36, TIMESTAMP '2020-01-09 12:20:56.769', TIMESTAMP '2020-01-09 12:21:00.928', 'RATING', 'type/Integer', 'type/Score', TRUE, 'The rating (on a scale of 1-5) the user left.', TRUE, 0, 4, NULL, 'Rating', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":5,"nil%":0.0},"type":{"type/Number":{"min":1.0,"max":5.0,"avg":3.987410071942446,"sd":1.0443899855660577,"q1":3.54744353181696,"q3":4.764807071650455}}}', 4, 'SMALLINT', 'auto-list', NULL);      
 CREATE INDEX PUBLIC.IDX_FIELD_TABLE_ID ON PUBLIC.METABASE_FIELD(TABLE_ID);     
 CREATE INDEX PUBLIC.IDX_FIELD_PARENT_ID ON PUBLIC.METABASE_FIELD(PARENT_ID);   
 CREATE CACHED TABLE PUBLIC.VIEW_LOG(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_48AB2809_6C6C_4FC8_ADEC_A0173B213318) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_48AB2809_6C6C_4FC8_ADEC_A0173B213318,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_3E56DEEF_0C47_4ACE_A563_72714DAA8992) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_3E56DEEF_0C47_4ACE_A563_72714DAA8992,
     USER_ID INT,
     MODEL VARCHAR(16) NOT NULL,
     MODEL_ID INT NOT NULL,
@@ -751,7 +751,7 @@ ALTER TABLE PUBLIC.VIEW_LOG ADD CONSTRAINT PUBLIC.PK_VIEW_LOG PRIMARY KEY(ID);
 CREATE INDEX PUBLIC.IDX_VIEW_LOG_USER_ID ON PUBLIC.VIEW_LOG(USER_ID);          
 CREATE INDEX PUBLIC.IDX_VIEW_LOG_TIMESTAMP ON PUBLIC.VIEW_LOG(MODEL_ID);       
 CREATE CACHED TABLE PUBLIC.COMPUTATION_JOB_RESULT COMMENT 'Stores results of async computation jobs.'(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_6CD68F8F_F495_4CEB_95BB_2199436AEA2D) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_6CD68F8F_F495_4CEB_95BB_2199436AEA2D,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_7FE50B94_3140_4A33_A93C_33CEF6B28C7F) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_7FE50B94_3140_4A33_A93C_33CEF6B28C7F,
     JOB_ID INT NOT NULL,
     CREATED_AT TIMESTAMP NOT NULL,
     UPDATED_AT TIMESTAMP NOT NULL,
@@ -761,7 +761,7 @@ CREATE CACHED TABLE PUBLIC.COMPUTATION_JOB_RESULT COMMENT 'Stores results of asy
 ALTER TABLE PUBLIC.COMPUTATION_JOB_RESULT ADD CONSTRAINT PUBLIC.PK_COMPUTATION_JOB_RESULT PRIMARY KEY(ID);     
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.COMPUTATION_JOB_RESULT;   
 CREATE CACHED TABLE PUBLIC.QUERY_EXECUTION COMMENT 'A log of executed queries, used for calculating historic execution times, auditing, and other purposes.'(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_A6249949_B9A6_4376_BFB8_E3EE84CCE77A) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A6249949_B9A6_4376_BFB8_E3EE84CCE77A,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_C7DA6F24_F9E3_46A6_BC6A_8F63B63489BF) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_C7DA6F24_F9E3_46A6_BC6A_8F63B63489BF,
     HASH BINARY(32) NOT NULL COMMENT 'The hash of the query dictionary. This is a 256-bit SHA3 hash of the query.',
     STARTED_AT TIMESTAMP NOT NULL COMMENT 'Timestamp of when this query started running.',
     RUNNING_TIME INT NOT NULL COMMENT 'The time, in milliseconds, this query took to complete.',
@@ -780,7 +780,7 @@ ALTER TABLE PUBLIC.QUERY_EXECUTION ADD CONSTRAINT PUBLIC.PK_QUERY_EXECUTION PRIM
 CREATE INDEX PUBLIC.IDX_QUERY_EXECUTION_STARTED_AT ON PUBLIC.QUERY_EXECUTION(STARTED_AT);      
 CREATE INDEX PUBLIC.IDX_QUERY_EXECUTION_QUERY_HASH_STARTED_AT ON PUBLIC.QUERY_EXECUTION(HASH, STARTED_AT);     
 CREATE CACHED TABLE PUBLIC.PULSE_CHANNEL(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_A7E8BEAA_7199_4071_9A13_A205C87430C8) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A7E8BEAA_7199_4071_9A13_A205C87430C8,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_36702A0F_7178_44F4_AC7E_A7FF585C6EB5) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_36702A0F_7178_44F4_AC7E_A7FF585C6EB5,
     PULSE_ID INT NOT NULL,
     CHANNEL_TYPE VARCHAR(32) NOT NULL,
     DETAILS CLOB NOT NULL,
@@ -832,7 +832,7 @@ INSERT INTO PUBLIC.QRTZ_CRON_TRIGGERS(SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, C
 ('MetabaseScheduler', 'metabase.task.sync-and-analyze.trigger.1', 'DEFAULT', '0 50 * * * ? *', 'US/Pacific'),
 ('MetabaseScheduler', 'metabase.task.update-field-values.trigger.1', 'DEFAULT', '0 50 0 * * ? *', 'US/Pacific');     
 CREATE CACHED TABLE PUBLIC.PULSE_CHANNEL_RECIPIENT(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_20CB245F_1D03_4750_BE4C_6239AF8B8133) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_20CB245F_1D03_4750_BE4C_6239AF8B8133,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_9791D6ED_3D5E_4480_A7FF_CFF350E7549B) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_9791D6ED_3D5E_4480_A7FF_CFF350E7549B,
     PULSE_CHANNEL_ID INT NOT NULL,
     USER_ID INT NOT NULL
 );              
@@ -857,7 +857,7 @@ CREATE CACHED TABLE PUBLIC.QRTZ_SIMPROP_TRIGGERS COMMENT 'Used for Quartz schedu
 ALTER TABLE PUBLIC.QRTZ_SIMPROP_TRIGGERS ADD CONSTRAINT PUBLIC.PK_QRTZ_SIMPROP_TRIGGERS PRIMARY KEY(SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);  
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.QRTZ_SIMPROP_TRIGGERS;    
 CREATE CACHED TABLE PUBLIC.REVISION(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_51626B0C_C421_4A18_8270_F7889C27C13C) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_51626B0C_C421_4A18_8270_F7889C27C13C,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_CF6764A8_804E_448E_9BCE_4A030200A6B1) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_CF6764A8_804E_448E_9BCE_4A030200A6B1,
     MODEL VARCHAR(16) NOT NULL,
     MODEL_ID INT NOT NULL,
     USER_ID INT NOT NULL,
@@ -879,7 +879,7 @@ CREATE CACHED TABLE PUBLIC.QRTZ_BLOB_TRIGGERS COMMENT 'Used for Quartz scheduler
 ALTER TABLE PUBLIC.QRTZ_BLOB_TRIGGERS ADD CONSTRAINT PUBLIC.PK_QRTZ_BLOB_TRIGGERS PRIMARY KEY(SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);        
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.QRTZ_BLOB_TRIGGERS;       
 CREATE CACHED TABLE PUBLIC.PERMISSIONS_GROUP_MEMBERSHIP(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_339CFE15_5F0A_40E0_A6F1_A4C6E2A733A3) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_339CFE15_5F0A_40E0_A6F1_A4C6E2A733A3,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_94F6D65D_8057_4C73_8918_D9791FFD681A) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_94F6D65D_8057_4C73_8918_D9791FFD681A,
     USER_ID INT NOT NULL,
     GROUP_ID INT NOT NULL
 ); 
@@ -889,7 +889,7 @@ CREATE INDEX PUBLIC.IDX_PERMISSIONS_GROUP_MEMBERSHIP_GROUP_ID ON PUBLIC.PERMISSI
 CREATE INDEX PUBLIC.IDX_PERMISSIONS_GROUP_MEMBERSHIP_USER_ID ON PUBLIC.PERMISSIONS_GROUP_MEMBERSHIP(USER_ID);  
 CREATE INDEX PUBLIC.IDX_PERMISSIONS_GROUP_MEMBERSHIP_GROUP_ID_USER_ID ON PUBLIC.PERMISSIONS_GROUP_MEMBERSHIP(GROUP_ID, USER_ID);               
 CREATE CACHED TABLE PUBLIC.PERMISSIONS(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_5C994078_58F3_4056_AAD0_307894B276BA) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5C994078_58F3_4056_AAD0_307894B276BA,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_76F423B4_2067_4660_86EF_A3DC548DFB36) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_76F423B4_2067_4660_86EF_A3DC548DFB36,
     OBJECT VARCHAR(254) NOT NULL,
     GROUP_ID INT NOT NULL
 );          
@@ -948,7 +948,7 @@ CREATE CACHED TABLE PUBLIC.QRTZ_SCHEDULER_STATE COMMENT 'Used for Quartz schedul
 ALTER TABLE PUBLIC.QRTZ_SCHEDULER_STATE ADD CONSTRAINT PUBLIC.PK_QRTZ_SCHEDULER_STATE PRIMARY KEY(SCHED_NAME, INSTANCE_NAME);  
 -- 1 +/- SELECT COUNT(*) FROM PUBLIC.QRTZ_SCHEDULER_STATE;     
 INSERT INTO PUBLIC.QRTZ_SCHEDULER_STATE(SCHED_NAME, INSTANCE_NAME, LAST_CHECKIN_TIME, CHECKIN_INTERVAL) VALUES
-('MetabaseScheduler', 'par.attlocal.net1577483700054', 1577483737681, 7500);    
+('MetabaseScheduler', 'tlr-mbp-2019.local1578601256035', 1578601263616, 7500);  
 CREATE CACHED TABLE PUBLIC.QRTZ_LOCKS COMMENT 'Used for Quartz scheduler.'(
     SCHED_NAME VARCHAR(120) NOT NULL,
     LOCK_NAME VARCHAR(40) NOT NULL
@@ -959,7 +959,7 @@ INSERT INTO PUBLIC.QRTZ_LOCKS(SCHED_NAME, LOCK_NAME) VALUES
 ('MetabaseScheduler', 'STATE_ACCESS'),
 ('MetabaseScheduler', 'TRIGGER_ACCESS');    
 CREATE CACHED TABLE PUBLIC.METABASE_TABLE(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_86912F44_F0BA_47E1_9BD4_0E117801F53C) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_86912F44_F0BA_47E1_9BD4_0E117801F53C,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_39056BD0_C7BD_4432_AFF0_79F0CB1DF362) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_39056BD0_C7BD_4432_AFF0_79F0CB1DF362,
     CREATED_AT TIMESTAMP NOT NULL,
     UPDATED_AT TIMESTAMP NOT NULL,
     NAME VARCHAR(254) NOT NULL,
@@ -980,10 +980,10 @@ CREATE CACHED TABLE PUBLIC.METABASE_TABLE(
 ALTER TABLE PUBLIC.METABASE_TABLE ADD CONSTRAINT PUBLIC.PK_METABASE_TABLE PRIMARY KEY(ID);     
 -- 4 +/- SELECT COUNT(*) FROM PUBLIC.METABASE_TABLE;           
 INSERT INTO PUBLIC.METABASE_TABLE(ID, CREATED_AT, UPDATED_AT, NAME, ROWS, DESCRIPTION, ENTITY_NAME, ENTITY_TYPE, ACTIVE, DB_ID, DISPLAY_NAME, VISIBILITY_TYPE, SCHEMA, POINTS_OF_INTEREST, CAVEATS, SHOW_IN_GETTING_STARTED, FIELDS_HASH) VALUES
-(1, TIMESTAMP '2019-12-27 13:55:00.648', TIMESTAMP '2019-12-27 13:55:07.128', 'PRODUCTS', NULL, 'This is our product catalog. It includes all products ever sold by the Sample Company.', NULL, 'entity/ProductTable', TRUE, 1, 'Products', NULL, 'PUBLIC', NULL, NULL, FALSE, 'aqXlpsb4FjyCH5o8qP4a2A=='),
-(2, TIMESTAMP '2019-12-27 13:55:00.655', TIMESTAMP '2019-12-27 13:55:07.129', 'ORDERS', NULL, 'This is a confirmed order for a product from a user.', NULL, 'entity/TransactionTable', TRUE, 1, 'Orders', NULL, 'PUBLIC', NULL, NULL, FALSE, 'Iqz4vNbm7vh80Uo9pWdesA=='),
-(3, TIMESTAMP '2019-12-27 13:55:00.66', TIMESTAMP '2019-12-27 13:55:07.131', 'PEOPLE', NULL, 'This is a user account. Note that employees and customer support staff will have accounts.', NULL, 'entity/UserTable', TRUE, 1, 'People', NULL, 'PUBLIC', NULL, NULL, FALSE, 'CXKI5VefRbNYgZ8IStmaNw=='),
-(4, TIMESTAMP '2019-12-27 13:55:00.666', TIMESTAMP '2019-12-27 13:55:07.134', 'REVIEWS', NULL, 'These are reviews our customers have left on products. Note that these are not tied to orders so it is possible people have reviewed products they did not purchase from us.', NULL, 'entity/GenericTable', TRUE, 1, 'Reviews', NULL, 'PUBLIC', NULL, NULL, FALSE, 'wIcr7cLnXrbpAUfOXgcmeQ=='); 
+(1, TIMESTAMP '2020-01-09 12:20:56.501', TIMESTAMP '2020-01-09 12:21:00.932', 'PRODUCTS', NULL, 'This is our product catalog. It includes all products ever sold by the Sample Company.', NULL, 'entity/ProductTable', TRUE, 1, 'Products', NULL, 'PUBLIC', NULL, NULL, FALSE, 'aqXlpsb4FjyCH5o8qP4a2A=='),
+(2, TIMESTAMP '2020-01-09 12:20:56.508', TIMESTAMP '2020-01-09 12:21:00.932', 'ORDERS', NULL, 'This is a confirmed order for a product from a user.', NULL, 'entity/TransactionTable', TRUE, 1, 'Orders', NULL, 'PUBLIC', NULL, NULL, FALSE, 'Iqz4vNbm7vh80Uo9pWdesA=='),
+(3, TIMESTAMP '2020-01-09 12:20:56.512', TIMESTAMP '2020-01-09 12:21:00.933', 'PEOPLE', NULL, 'This is a user account. Note that employees and customer support staff will have accounts.', NULL, 'entity/UserTable', TRUE, 1, 'People', NULL, 'PUBLIC', NULL, NULL, FALSE, 'CXKI5VefRbNYgZ8IStmaNw=='),
+(4, TIMESTAMP '2020-01-09 12:20:56.516', TIMESTAMP '2020-01-09 12:21:00.935', 'REVIEWS', NULL, 'These are reviews our customers have left on products. Note that these are not tied to orders so it is possible people have reviewed products they did not purchase from us.', NULL, 'entity/GenericTable', TRUE, 1, 'Reviews', NULL, 'PUBLIC', NULL, NULL, FALSE, 'wIcr7cLnXrbpAUfOXgcmeQ==');
 CREATE INDEX PUBLIC.IDX_TABLE_DB_ID ON PUBLIC.METABASE_TABLE(DB_ID);           
 CREATE INDEX PUBLIC.IDX_METABASE_TABLE_SHOW_IN_GETTING_STARTED ON PUBLIC.METABASE_TABLE(SHOW_IN_GETTING_STARTED);              
 CREATE INDEX PUBLIC.IDX_METABASE_TABLE_DB_ID_SCHEMA ON PUBLIC.METABASE_TABLE(DB_ID, SCHEMA);   
diff --git a/frontend/test/snapshots/default.sql b/frontend/test/snapshots/default.sql
index a4b597cb589..c9a16b3df0d 100644
--- a/frontend/test/snapshots/default.sql
+++ b/frontend/test/snapshots/default.sql
@@ -1,41 +1,41 @@
 SET DB_CLOSE_DELAY -1;         
 ;              
 CREATE USER IF NOT EXISTS "" SALT '' HASH '' ADMIN;            
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_339CFE15_5F0A_40E0_A6F1_A4C6E2A733A3 START WITH 4 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_86912F44_F0BA_47E1_9BD4_0E117801F53C START WITH 5 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_2423926E_D488_426E_A8C8_A376100D1F0A START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_06F0D33A_3128_44D6_9B39_CBCB2DBBE373 START WITH 13 BELONGS_TO_TABLE;    
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_F13B9F0D_F22D_4F12_A158_24540D39401D START WITH 2 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_24E20B01_717A_4ED3_94E7_EE17064E49CB START WITH 4 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_6CD68F8F_F495_4CEB_95BB_2199436AEA2D START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_AD86AFFE_C465_4DB5_9323_5D7EA4F8BE46 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A6249949_B9A6_4376_BFB8_E3EE84CCE77A START WITH 4 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5E58DB27_82A5_4D5F_BB57_EEC19CB94FB3 START WITH 37 BELONGS_TO_TABLE;    
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_48AB2809_6C6C_4FC8_ADEC_A0173B213318 START WITH 4 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_EAFAD778_2557_4599_B568_4B03F9B42195 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5A33298E_E93F_4169_96C4_33D52F7D4A7A START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_04D09038_A138_44ED_A521_B47BEBEF99D0 START WITH 6 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_7721034B_2267_41BA_B062_452667CE1641 START WITH 2 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_51626B0C_C421_4A18_8270_F7889C27C13C START WITH 6 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_F5907FB8_D114_4682_8EB3_AF7C6E0E18CD START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_961FFF43_7B14_4432_979E_29B47765492A START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_20CB245F_1D03_4750_BE4C_6239AF8B8133 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A7E8BEAA_7199_4071_9A13_A205C87430C8 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_9AA36E6C_26CC_44F6_A8C3_E4CB3200552E START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_405C1C66_2069_4350_8A5E_97A6C445A258 START WITH 2 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_004178AD_4EBE_4069_8E75_DE2F7F4283CD START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_70956D05_9758_4131_AF68_B83116E5F748 START WITH 2 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_39F89E16_3883_4039_9876_76371B462C07 START WITH 3 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_4B685D34_945B_4BBB_8611_8CBE9911C3F2 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_6AFFF8D1_AF45_42AF_87EE_3E8188DDBA9A START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_83D6C5B8_ECD9_466D_B0AF_376398D09158 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_3814A94F_33EE_4621_895D_C6C286F37F66 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5C994078_58F3_4056_AAD0_307894B276BA START WITH 5 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_64A02A95_D231_4E11_8CDA_66A059FF588F START WITH 7 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_04E675BF_3ACC_4FAC_B66A_643B3175839E START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_61D13869_98BB_4997_B092_515D9263C392 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_4DE7046C_309A_497E_A77B_E7F858552044 START WITH 1 BELONGS_TO_TABLE;     
-CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_FACCD50E_9CE4_4958_8CCE_249A197B18B9 START WITH 3 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_C5C3BD44_A7F8_4E58_8D1A_8CE37AAE31D3 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_94F6D65D_8057_4C73_8918_D9791FFD681A START WITH 4 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_4000F194_F105_4A55_A439_C1D4DC1DF7A7 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_3B5CA6D9_5EB7_4CE4_9A92_86BD747A6F94 START WITH 6 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_9EC48888_BCD4_4652_96D5_B12220C3EE98 START WITH 8 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_CF6764A8_804E_448E_9BCE_4A030200A6B1 START WITH 7 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_95E44CE8_C085_4803_9E1B_68E9CC44F285 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_44044B5D_AC37_4270_BA67_31FA40CC31E9 START WITH 2 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5F615A2C_8F8A_498B_BB9E_B07C4169C815 START WITH 3 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_D3607C9C_C5F2_4188_BB3D_2D307C9210FA START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_14756EB4_E9C9_40A3_BE85_DA69A810BD0D START WITH 37 BELONGS_TO_TABLE;    
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_9791D6ED_3D5E_4480_A7FF_CFF350E7549B START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_C4302ED3_DE22_4CEF_BADF_6AF81F8E95C6 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_76F423B4_2067_4660_86EF_A3DC548DFB36 START WITH 5 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_7FE50B94_3140_4A33_A93C_33CEF6B28C7F START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_BA85358A_4F81_449F_A72D_33EE4DD194CB START WITH 3 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_04718A31_596F_4BD7_BB12_0A7C913C16DE START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_7F6C7A35_56C8_4B05_94BF_87AAE631651D START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_39056BD0_C7BD_4432_AFF0_79F0CB1DF362 START WITH 5 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_2B9E56DD_CE23_4C2B_9CAA_5F64BF8F2AC1 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_36702A0F_7178_44F4_AC7E_A7FF585C6EB5 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A24111B2_BA6C_4677_ACC5_BF512C758DF4 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_C09F1BC8_3D2B_48EA_A43A_847512C52B89 START WITH 4 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_7743B25A_84A7_4694_B0C3_B2ED7B198BEB START WITH 2 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_6D44DCC6_ED02_4C28_A46B_FF159011EE3B START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_3E56DEEF_0C47_4ACE_A563_72714DAA8992 START WITH 5 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_299DEB06_08E6_408A_9E3A_5CC0FBCD0F54 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_EE9EE954_5C0C_420A_8839_FBAD4BBD248B START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_C7DA6F24_F9E3_46A6_BC6A_8F63B63489BF START WITH 5 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_1AAE82E3_7CC1_46E6_B606_AF8A419B1962 START WITH 3 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5B1727DA_66B0_4DC4_9019_AF79548E9DEE START WITH 13 BELONGS_TO_TABLE;    
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A5B8ECFB_B581_48D1_8C73_B5981C68D65A START WITH 2 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_40293BEB_F3DD_44FC_A328_59F4B74439E5 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A38CF45F_9FAB_42D2_A0EB_A6EA41C2F3C1 START WITH 1 BELONGS_TO_TABLE;     
+CREATE SEQUENCE PUBLIC.SYSTEM_SEQUENCE_F0777008_49B6_4429_BBD3_4D0139BECDEC START WITH 1 BELONGS_TO_TABLE;     
 CREATE CACHED TABLE PUBLIC.DATABASECHANGELOG(
     ID VARCHAR(255) NOT NULL,
     AUTHOR VARCHAR(255) NOT NULL,
@@ -54,110 +54,110 @@ CREATE CACHED TABLE PUBLIC.DATABASECHANGELOG(
 );               
 -- 97 +/- SELECT COUNT(*) FROM PUBLIC.DATABASECHANGELOG;       
 INSERT INTO PUBLIC.DATABASECHANGELOG(ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, MD5SUM, DESCRIPTION, COMMENTS, TAG, LIQUIBASE, CONTEXTS, LABELS, DEPLOYMENT_ID) VALUES
-('1', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.4', 1, 'EXECUTED', '8:29a8f482877466643f65adb20c6d2139', 'createTable tableName=core_organization; createTable tableName=core_user; createTable tableName=core_userorgperm; addUniqueConstraint constraintName=idx_unique_user_id_organization_id, tableName=core_userorgperm; createIndex indexName=idx_userorgp...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('2', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.406', 2, 'EXECUTED', '8:983477ec51adb1236dd9d76ebf604be9', 'createTable tableName=core_session', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('4', 'cammsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.409', 3, 'EXECUTED', '8:a8e7822a91ea122212d376f5c2d4158f', 'createTable tableName=setting', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('5', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.44', 4, 'EXECUTED', '8:4f8653d16f4b102b3dff647277b6b988', 'addColumn tableName=core_organization', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('6', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.449', 5, 'EXECUTED', '8:2d2f5d1756ecb81da7c09ccfb9b1565a', 'dropNotNullConstraint columnName=organization_id, tableName=metabase_database; dropForeignKeyConstraint baseTableName=metabase_database, constraintName=fk_database_ref_organization_id; dropNotNullConstraint columnName=organization_id, tableName=re...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('7', 'cammsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.467', 6, 'EXECUTED', '8:c57c69fd78d804beb77d261066521f7f', 'addColumn tableName=metabase_field', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('8', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.512', 7, 'EXECUTED', '8:960ec59bbcb4c9f3fa8362eca9af4075', 'addColumn tableName=metabase_table; addColumn tableName=metabase_field', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('9', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.521', 8, 'EXECUTED', '8:d560283a190e3c60802eb04f5532a49d', 'addColumn tableName=metabase_table', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('10', 'cammsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.527', 9, 'EXECUTED', '8:532075ff1717d4a16bb9f27c606db46b', 'createTable tableName=revision; createIndex indexName=idx_revision_model_model_id, tableName=revision', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('11', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.529', 10, 'EXECUTED', '8:ca6561cab1eedbcf4dcb6d6e22cd46c6', 'sql', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('12', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.559', 11, 'EXECUTED', '8:bedbea570e5dfc694b4cf5a8f6a4f445', 'addColumn tableName=report_card', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('13', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.565', 12, 'EXECUTED', '8:f3ae0bac98abb3288158ac45d85bf0e3', 'createTable tableName=activity; createIndex indexName=idx_activity_timestamp, tableName=activity; createIndex indexName=idx_activity_user_id, tableName=activity; createIndex indexName=idx_activity_custom_id, tableName=activity', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('14', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.59', 13, 'EXECUTED', '8:7dc558da864d98b79f8d13a427ca3858', 'createTable tableName=view_log; createIndex indexName=idx_view_log_user_id, tableName=view_log; createIndex indexName=idx_view_log_timestamp, tableName=view_log', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('15', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.602', 14, 'EXECUTED', '8:505b91530103673a9be3382cd2db1070', 'addColumn tableName=revision', '', NULL, '3.6.3', NULL, NULL, '7483698154');   
+('1', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.895', 1, 'EXECUTED', '8:29a8f482877466643f65adb20c6d2139', 'createTable tableName=core_organization; createTable tableName=core_user; createTable tableName=core_userorgperm; addUniqueConstraint constraintName=idx_unique_user_id_organization_id, tableName=core_userorgperm; createIndex indexName=idx_userorgp...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('2', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.902', 2, 'EXECUTED', '8:983477ec51adb1236dd9d76ebf604be9', 'createTable tableName=core_session', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('4', 'cammsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.904', 3, 'EXECUTED', '8:a8e7822a91ea122212d376f5c2d4158f', 'createTable tableName=setting', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('5', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.943', 4, 'EXECUTED', '8:4f8653d16f4b102b3dff647277b6b988', 'addColumn tableName=core_organization', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('6', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.951', 5, 'EXECUTED', '8:2d2f5d1756ecb81da7c09ccfb9b1565a', 'dropNotNullConstraint columnName=organization_id, tableName=metabase_database; dropForeignKeyConstraint baseTableName=metabase_database, constraintName=fk_database_ref_organization_id; dropNotNullConstraint columnName=organization_id, tableName=re...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('7', 'cammsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.958', 6, 'EXECUTED', '8:c57c69fd78d804beb77d261066521f7f', 'addColumn tableName=metabase_field', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('8', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.968', 7, 'EXECUTED', '8:960ec59bbcb4c9f3fa8362eca9af4075', 'addColumn tableName=metabase_table; addColumn tableName=metabase_field', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('9', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.972', 8, 'EXECUTED', '8:d560283a190e3c60802eb04f5532a49d', 'addColumn tableName=metabase_table', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('10', 'cammsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.976', 9, 'EXECUTED', '8:532075ff1717d4a16bb9f27c606db46b', 'createTable tableName=revision; createIndex indexName=idx_revision_model_model_id, tableName=revision', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('11', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.978', 10, 'EXECUTED', '8:ca6561cab1eedbcf4dcb6d6e22cd46c6', 'sql', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('12', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.994', 11, 'EXECUTED', '8:bedbea570e5dfc694b4cf5a8f6a4f445', 'addColumn tableName=report_card', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('13', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:54.997', 12, 'EXECUTED', '8:f3ae0bac98abb3288158ac45d85bf0e3', 'createTable tableName=activity; createIndex indexName=idx_activity_timestamp, tableName=activity; createIndex indexName=idx_activity_user_id, tableName=activity; createIndex indexName=idx_activity_custom_id, tableName=activity', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('14', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.01', 13, 'EXECUTED', '8:7dc558da864d98b79f8d13a427ca3858', 'createTable tableName=view_log; createIndex indexName=idx_view_log_user_id, tableName=view_log; createIndex indexName=idx_view_log_timestamp, tableName=view_log', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('15', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.017', 14, 'EXECUTED', '8:505b91530103673a9be3382cd2db1070', 'addColumn tableName=revision', '', NULL, '3.6.3', NULL, NULL, '8601254743');
 INSERT INTO PUBLIC.DATABASECHANGELOG(ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, MD5SUM, DESCRIPTION, COMMENTS, TAG, LIQUIBASE, CONTEXTS, LABELS, DEPLOYMENT_ID) VALUES
-('16', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.604', 15, 'EXECUTED', '8:b81df46fe16c3e8659a81798b97a4793', 'dropNotNullConstraint columnName=last_login, tableName=core_user', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('17', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.614', 16, 'EXECUTED', '8:051c23cd15359364b9895c1569c319e7', 'addColumn tableName=metabase_database; sql', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('18', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.617', 17, 'EXECUTED', '8:62a0483dde183cfd18dd0a86e9354288', 'createTable tableName=data_migrations; createIndex indexName=idx_data_migrations_id, tableName=data_migrations', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('19', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.626', 18, 'EXECUTED', '8:269b129dbfc39a6f9e0d3bc61c3c3b70', 'addColumn tableName=metabase_table', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('20', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.641', 19, 'EXECUTED', '8:7ec10b2c7acbab0fc38043be575ff907', 'createTable tableName=pulse; createIndex indexName=idx_pulse_creator_id, tableName=pulse; createTable tableName=pulse_card; createIndex indexName=idx_pulse_card_pulse_id, tableName=pulse_card; createIndex indexName=idx_pulse_card_card_id, tableNam...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('21', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.648', 20, 'EXECUTED', '8:492a1b64ff9c792aa6ba97d091819261', 'createTable tableName=segment; createIndex indexName=idx_segment_creator_id, tableName=segment; createIndex indexName=idx_segment_table_id, tableName=segment', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('22', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.654', 21, 'EXECUTED', '8:80bc8a62a90791a79adedcf1ac3c6f08', 'addColumn tableName=revision', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('23', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.662', 22, 'EXECUTED', '8:b6f054835db2b2688a1be1de3707f9a9', 'modifyDataType columnName=rows, tableName=metabase_table', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('24', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.667', 23, 'EXECUTED', '8:5e7354b3f92782d1151be0aa9d3fe625', 'createTable tableName=dependency; createIndex indexName=idx_dependency_model, tableName=dependency; createIndex indexName=idx_dependency_model_id, tableName=dependency; createIndex indexName=idx_dependency_dependent_on_model, tableName=dependency;...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('25', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.673', 24, 'EXECUTED', '8:cea300a621393501d4534b0ff41eb91c', 'createTable tableName=metric; createIndex indexName=idx_metric_creator_id, tableName=metric; createIndex indexName=idx_metric_table_id, tableName=metric', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('26', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.686', 25, 'EXECUTED', '8:ddef40b95c55cf4ac0e6a5161911a4cb', 'addColumn tableName=metabase_database; sql', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('27', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.698', 26, 'EXECUTED', '8:017050df833b3b678d1b52b1a0f4de50', 'createTable tableName=dashboardcard_series; createIndex indexName=idx_dashboardcard_series_dashboardcard_id, tableName=dashboardcard_series; createIndex indexName=idx_dashboardcard_series_card_id, tableName=dashboardcard_series', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('28', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.718', 27, 'EXECUTED', '8:428e4eb05e4e29141735adf9ae141a0b', 'addColumn tableName=core_user', '', NULL, '3.6.3', NULL, NULL, '7483698154');        
+('16', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.019', 15, 'EXECUTED', '8:b81df46fe16c3e8659a81798b97a4793', 'dropNotNullConstraint columnName=last_login, tableName=core_user', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('17', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.029', 16, 'EXECUTED', '8:051c23cd15359364b9895c1569c319e7', 'addColumn tableName=metabase_database; sql', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('18', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.031', 17, 'EXECUTED', '8:62a0483dde183cfd18dd0a86e9354288', 'createTable tableName=data_migrations; createIndex indexName=idx_data_migrations_id, tableName=data_migrations', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('19', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.037', 18, 'EXECUTED', '8:269b129dbfc39a6f9e0d3bc61c3c3b70', 'addColumn tableName=metabase_table', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('20', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.05', 19, 'EXECUTED', '8:7ec10b2c7acbab0fc38043be575ff907', 'createTable tableName=pulse; createIndex indexName=idx_pulse_creator_id, tableName=pulse; createTable tableName=pulse_card; createIndex indexName=idx_pulse_card_pulse_id, tableName=pulse_card; createIndex indexName=idx_pulse_card_card_id, tableNam...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('21', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.055', 20, 'EXECUTED', '8:492a1b64ff9c792aa6ba97d091819261', 'createTable tableName=segment; createIndex indexName=idx_segment_creator_id, tableName=segment; createIndex indexName=idx_segment_table_id, tableName=segment', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('22', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.058', 21, 'EXECUTED', '8:80bc8a62a90791a79adedcf1ac3c6f08', 'addColumn tableName=revision', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('23', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.063', 22, 'EXECUTED', '8:b6f054835db2b2688a1be1de3707f9a9', 'modifyDataType columnName=rows, tableName=metabase_table', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('24', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.066', 23, 'EXECUTED', '8:5e7354b3f92782d1151be0aa9d3fe625', 'createTable tableName=dependency; createIndex indexName=idx_dependency_model, tableName=dependency; createIndex indexName=idx_dependency_model_id, tableName=dependency; createIndex indexName=idx_dependency_dependent_on_model, tableName=dependency;...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('25', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.07', 24, 'EXECUTED', '8:cea300a621393501d4534b0ff41eb91c', 'createTable tableName=metric; createIndex indexName=idx_metric_creator_id, tableName=metric; createIndex indexName=idx_metric_table_id, tableName=metric', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('26', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.075', 25, 'EXECUTED', '8:ddef40b95c55cf4ac0e6a5161911a4cb', 'addColumn tableName=metabase_database; sql', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('27', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.078', 26, 'EXECUTED', '8:017050df833b3b678d1b52b1a0f4de50', 'createTable tableName=dashboardcard_series; createIndex indexName=idx_dashboardcard_series_dashboardcard_id, tableName=dashboardcard_series; createIndex indexName=idx_dashboardcard_series_card_id, tableName=dashboardcard_series', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('28', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.088', 27, 'EXECUTED', '8:428e4eb05e4e29141735adf9ae141a0b', 'addColumn tableName=core_user', '', NULL, '3.6.3', NULL, NULL, '8601254743');          
 INSERT INTO PUBLIC.DATABASECHANGELOG(ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, MD5SUM, DESCRIPTION, COMMENTS, TAG, LIQUIBASE, CONTEXTS, LABELS, DEPLOYMENT_ID) VALUES
-('29', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.724', 28, 'EXECUTED', '8:8b02731cc34add3722c926dfd7376ae0', 'addColumn tableName=pulse_channel', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('30', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.732', 29, 'EXECUTED', '8:2c3a50cef177cb90d47a9973cd5934e5', 'addColumn tableName=metabase_field; addNotNullConstraint columnName=visibility_type, tableName=metabase_field', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('31', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.74', 30, 'EXECUTED', '8:30a33a82bab0bcbb2ccb6738d48e1421', 'addColumn tableName=metabase_field', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('32', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.754', 31, 'EXECUTED', '8:40830260b92cedad8da273afd5eca678', 'createTable tableName=label; createIndex indexName=idx_label_slug, tableName=label; createTable tableName=card_label; addUniqueConstraint constraintName=unique_card_label_card_id_label_id, tableName=card_label; createIndex indexName=idx_card_label...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('32', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.793', 32, 'EXECUTED', '8:ca6efc1c0a7aa82467d2c84421e812eb', 'createTable tableName=raw_table; createIndex indexName=idx_rawtable_database_id, tableName=raw_table; addUniqueConstraint constraintName=uniq_raw_table_db_schema_name, tableName=raw_table; createTable tableName=raw_column; createIndex indexName=id...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('34', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.799', 33, 'EXECUTED', '8:52b082600b05bbbc46bfe837d1f37a82', 'addColumn tableName=pulse_channel', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('35', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.803', 34, 'EXECUTED', '8:91b72167fca724e6b6a94b64f886cf09', 'modifyDataType columnName=value, tableName=setting', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('36', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.812', 35, 'EXECUTED', '8:252e08892449dceb16c3d91337bd9573', 'addColumn tableName=report_dashboard; addNotNullConstraint columnName=parameters, tableName=report_dashboard; addColumn tableName=report_dashboardcard; addNotNullConstraint columnName=parameter_mappings, tableName=report_dashboardcard', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('37', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.821', 36, 'EXECUTED', '8:07d959eff81777e5690e2920583cfe5f', 'addColumn tableName=query_queryexecution; addNotNullConstraint columnName=query_hash, tableName=query_queryexecution; createIndex indexName=idx_query_queryexecution_query_hash, tableName=query_queryexecution; createIndex indexName=idx_query_querye...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('38', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.905', 37, 'EXECUTED', '8:43604ab55179b50306eb39353e760b46', 'addColumn tableName=metabase_database; addColumn tableName=metabase_table; addColumn tableName=metabase_field; addColumn tableName=report_dashboard; addColumn tableName=metric; addColumn tableName=segment; addColumn tableName=metabase_database; ad...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('39', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.926', 38, 'EXECUTED', '8:334adc22af5ded71ff27759b7a556951', 'addColumn tableName=core_user', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('40', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.946', 39, 'EXECUTED', '8:ee7f50a264d6cf8d891bd01241eebd2c', 'createTable tableName=permissions_group; createIndex indexName=idx_permissions_group_name, tableName=permissions_group; createTable tableName=permissions_group_membership; addUniqueConstraint constraintName=unique_permissions_group_membership_user...', '', NULL, '3.6.3', NULL, NULL, '7483698154');        
+('29', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.091', 28, 'EXECUTED', '8:8b02731cc34add3722c926dfd7376ae0', 'addColumn tableName=pulse_channel', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('30', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.097', 29, 'EXECUTED', '8:2c3a50cef177cb90d47a9973cd5934e5', 'addColumn tableName=metabase_field; addNotNullConstraint columnName=visibility_type, tableName=metabase_field', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('31', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.101', 30, 'EXECUTED', '8:30a33a82bab0bcbb2ccb6738d48e1421', 'addColumn tableName=metabase_field', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('32', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.12', 31, 'EXECUTED', '8:40830260b92cedad8da273afd5eca678', 'createTable tableName=label; createIndex indexName=idx_label_slug, tableName=label; createTable tableName=card_label; addUniqueConstraint constraintName=unique_card_label_card_id_label_id, tableName=card_label; createIndex indexName=idx_card_label...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('32', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.148', 32, 'EXECUTED', '8:ca6efc1c0a7aa82467d2c84421e812eb', 'createTable tableName=raw_table; createIndex indexName=idx_rawtable_database_id, tableName=raw_table; addUniqueConstraint constraintName=uniq_raw_table_db_schema_name, tableName=raw_table; createTable tableName=raw_column; createIndex indexName=id...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('34', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.152', 33, 'EXECUTED', '8:52b082600b05bbbc46bfe837d1f37a82', 'addColumn tableName=pulse_channel', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('35', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.153', 34, 'EXECUTED', '8:91b72167fca724e6b6a94b64f886cf09', 'modifyDataType columnName=value, tableName=setting', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('36', 'agilliland', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.161', 35, 'EXECUTED', '8:252e08892449dceb16c3d91337bd9573', 'addColumn tableName=report_dashboard; addNotNullConstraint columnName=parameters, tableName=report_dashboard; addColumn tableName=report_dashboardcard; addNotNullConstraint columnName=parameter_mappings, tableName=report_dashboardcard', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('37', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.167', 36, 'EXECUTED', '8:07d959eff81777e5690e2920583cfe5f', 'addColumn tableName=query_queryexecution; addNotNullConstraint columnName=query_hash, tableName=query_queryexecution; createIndex indexName=idx_query_queryexecution_query_hash, tableName=query_queryexecution; createIndex indexName=idx_query_querye...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('38', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.245', 37, 'EXECUTED', '8:43604ab55179b50306eb39353e760b46', 'addColumn tableName=metabase_database; addColumn tableName=metabase_table; addColumn tableName=metabase_field; addColumn tableName=report_dashboard; addColumn tableName=metric; addColumn tableName=segment; addColumn tableName=metabase_database; ad...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('39', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.254', 38, 'EXECUTED', '8:334adc22af5ded71ff27759b7a556951', 'addColumn tableName=core_user', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('40', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.267', 39, 'EXECUTED', '8:ee7f50a264d6cf8d891bd01241eebd2c', 'createTable tableName=permissions_group; createIndex indexName=idx_permissions_group_name, tableName=permissions_group; createTable tableName=permissions_group_membership; addUniqueConstraint constraintName=unique_permissions_group_membership_user...', '', NULL, '3.6.3', NULL, NULL, '8601254743');        
 INSERT INTO PUBLIC.DATABASECHANGELOG(ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, MD5SUM, DESCRIPTION, COMMENTS, TAG, LIQUIBASE, CONTEXTS, LABELS, DEPLOYMENT_ID) VALUES
-('41', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:58.957', 40, 'EXECUTED', '8:fae0855adf2f702f1133e32fc98d02a5', 'dropColumn columnName=field_type, tableName=metabase_field; addDefaultValue columnName=active, tableName=metabase_field; addDefaultValue columnName=preview_display, tableName=metabase_field; addDefaultValue columnName=position, tableName=metabase_...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('42', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.019', 41, 'EXECUTED', '8:e32b3a1624fa289a6ee1f3f0a2dac1f6', 'dropForeignKeyConstraint baseTableName=query_queryexecution, constraintName=fk_queryexecution_ref_query_id; dropColumn columnName=query_id, tableName=query_queryexecution; dropColumn columnName=is_staff, tableName=core_user; dropColumn columnName=...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('43', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.024', 42, 'EXECUTED', '8:165e9384e46d6f9c0330784955363f70', 'createTable tableName=permissions_revision', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('44', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.038', 43, 'EXECUTED', '8:2e356e8a1049286f1c78324828ee7867', 'dropColumn columnName=public_perms, tableName=report_card; dropColumn columnName=public_perms, tableName=report_dashboard; dropColumn columnName=public_perms, tableName=pulse', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('45', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.043', 44, 'EXECUTED', '8:421edd38ee0cb0983162f57193f81b0b', 'addColumn tableName=report_dashboardcard; addNotNullConstraint columnName=visualization_settings, tableName=report_dashboardcard', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('46', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.05', 45, 'EXECUTED', '8:131df3cdd9a8c67b32c5988a3fb7fe3d', 'addNotNullConstraint columnName=row, tableName=report_dashboardcard; addNotNullConstraint columnName=col, tableName=report_dashboardcard; addDefaultValue columnName=row, tableName=report_dashboardcard; addDefaultValue columnName=col, tableName=rep...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('47', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.063', 46, 'EXECUTED', '8:1d2474e49a27db344c250872df58a6ed', 'createTable tableName=collection; createIndex indexName=idx_collection_slug, tableName=collection; addColumn tableName=report_card; createIndex indexName=idx_card_collection_id, tableName=report_card', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('48', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.068', 47, 'EXECUTED', '8:720ce9d4b9e6f0917aea035e9dc5d95d', 'createTable tableName=collection_revision', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('49', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.115', 48, 'EXECUTED', '8:56dcab086b21de1df002561efeac8bb6', 'addColumn tableName=report_card; createIndex indexName=idx_card_public_uuid, tableName=report_card; addColumn tableName=report_dashboard; createIndex indexName=idx_dashboard_public_uuid, tableName=report_dashboard; dropNotNullConstraint columnName...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('50', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.142', 49, 'EXECUTED', '8:388da4c48984aad647709514e4ba9204', 'addColumn tableName=report_card; addColumn tableName=report_dashboard', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('51', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.146', 50, 'EXECUTED', '8:43c90b5b9f6c14bfd0e41cc0b184617e', 'createTable tableName=query_execution; createIndex indexName=idx_query_execution_started_at, tableName=query_execution; createIndex indexName=idx_query_execution_query_hash_started_at, tableName=query_execution', '', NULL, '3.6.3', NULL, NULL, '7483698154');   
+('41', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.274', 40, 'EXECUTED', '8:fae0855adf2f702f1133e32fc98d02a5', 'dropColumn columnName=field_type, tableName=metabase_field; addDefaultValue columnName=active, tableName=metabase_field; addDefaultValue columnName=preview_display, tableName=metabase_field; addDefaultValue columnName=position, tableName=metabase_...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('42', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.3', 41, 'EXECUTED', '8:e32b3a1624fa289a6ee1f3f0a2dac1f6', 'dropForeignKeyConstraint baseTableName=query_queryexecution, constraintName=fk_queryexecution_ref_query_id; dropColumn columnName=query_id, tableName=query_queryexecution; dropColumn columnName=is_staff, tableName=core_user; dropColumn columnName=...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('43', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.305', 42, 'EXECUTED', '8:165e9384e46d6f9c0330784955363f70', 'createTable tableName=permissions_revision', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('44', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.324', 43, 'EXECUTED', '8:2e356e8a1049286f1c78324828ee7867', 'dropColumn columnName=public_perms, tableName=report_card; dropColumn columnName=public_perms, tableName=report_dashboard; dropColumn columnName=public_perms, tableName=pulse', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('45', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.334', 44, 'EXECUTED', '8:421edd38ee0cb0983162f57193f81b0b', 'addColumn tableName=report_dashboardcard; addNotNullConstraint columnName=visualization_settings, tableName=report_dashboardcard', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('46', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.339', 45, 'EXECUTED', '8:131df3cdd9a8c67b32c5988a3fb7fe3d', 'addNotNullConstraint columnName=row, tableName=report_dashboardcard; addNotNullConstraint columnName=col, tableName=report_dashboardcard; addDefaultValue columnName=row, tableName=report_dashboardcard; addDefaultValue columnName=col, tableName=rep...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('47', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.348', 46, 'EXECUTED', '8:1d2474e49a27db344c250872df58a6ed', 'createTable tableName=collection; createIndex indexName=idx_collection_slug, tableName=collection; addColumn tableName=report_card; createIndex indexName=idx_card_collection_id, tableName=report_card', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('48', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.351', 47, 'EXECUTED', '8:720ce9d4b9e6f0917aea035e9dc5d95d', 'createTable tableName=collection_revision', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('49', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.366', 48, 'EXECUTED', '8:56dcab086b21de1df002561efeac8bb6', 'addColumn tableName=report_card; createIndex indexName=idx_card_public_uuid, tableName=report_card; addColumn tableName=report_dashboard; createIndex indexName=idx_dashboard_public_uuid, tableName=report_dashboard; dropNotNullConstraint columnName...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('50', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.382', 49, 'EXECUTED', '8:388da4c48984aad647709514e4ba9204', 'addColumn tableName=report_card; addColumn tableName=report_dashboard', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('51', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.385', 50, 'EXECUTED', '8:43c90b5b9f6c14bfd0e41cc0b184617e', 'createTable tableName=query_execution; createIndex indexName=idx_query_execution_started_at, tableName=query_execution; createIndex indexName=idx_query_execution_query_hash_started_at, tableName=query_execution', '', NULL, '3.6.3', NULL, NULL, '8601254743');    
 INSERT INTO PUBLIC.DATABASECHANGELOG(ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, MD5SUM, DESCRIPTION, COMMENTS, TAG, LIQUIBASE, CONTEXTS, LABELS, DEPLOYMENT_ID) VALUES
-('52', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.157', 51, 'EXECUTED', '8:329695cb161ceb86f6d9473819359351', 'createTable tableName=query_cache; createIndex indexName=idx_query_cache_updated_at, tableName=query_cache; addColumn tableName=report_card', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('53', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.159', 52, 'EXECUTED', '8:78d015c5090c57cd6972eb435601d3d0', 'createTable tableName=query', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('54', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.164', 53, 'EXECUTED', '8:e410005b585f5eeb5f202076ff9468f7', 'addColumn tableName=pulse', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('55', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.178', 54, 'EXECUTED', '8:87c4becde5fe208ba2c356128df86fba', 'addColumn tableName=report_dashboard; createTable tableName=dashboard_favorite; addUniqueConstraint constraintName=unique_dashboard_favorite_user_id_dashboard_id, tableName=dashboard_favorite; createIndex indexName=idx_dashboard_favorite_user_id, ...', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('56', 'wwwiiilll', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.208', 55, 'EXECUTED', '8:9f46051abaee599e2838733512a32ad0', 'addColumn tableName=core_user', 'Added 0.25.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('57', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.218', 56, 'EXECUTED', '8:aab81d477e2d19a9ab18c58b78c9af88', 'addColumn tableName=report_card', 'Added 0.25.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('58', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.223', 57, 'EXECUTED', '8:3554219ca39e0fd682d0fba57531e917', 'createTable tableName=dimension; addUniqueConstraint constraintName=unique_dimension_field_id_name, tableName=dimension; createIndex indexName=idx_dimension_field_id, tableName=dimension', 'Added 0.25.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('59', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.229', 58, 'EXECUTED', '8:5b6ce52371e0e9eee88e6d766225a94b', 'addColumn tableName=metabase_field', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('60', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.236', 59, 'EXECUTED', '8:4f997b2cd3309882e900493892381f38', 'addColumn tableName=metabase_database', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('61', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.242', 60, 'EXECUTED', '8:7dded6fd5bf74d79b9a0b62511981272', 'addColumn tableName=metabase_field', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('62', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.246', 61, 'EXECUTED', '8:cb32e6eaa1a2140703def2730f81fef2', 'addColumn tableName=metabase_database', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('63', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.249', 62, 'EXECUTED', '8:226f73b9f6617495892d281b0f8303db', 'addColumn tableName=metabase_database', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('64', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.251', 63, 'EXECUTED', '8:4dcc8ffd836b56756f494d5dfce07b50', 'dropForeignKeyConstraint baseTableName=raw_table, constraintName=fk_rawtable_ref_database', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('66', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.253', 64, 'EXECUTED', '8:e77d66af8e3b83d46c5a0064a75a1aac', 'sql; sql', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('67', 'attekei', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.257', 65, 'EXECUTED', '8:59dfc37744fc362e0e312488fbc9a69b', 'createTable tableName=computation_job; createTable tableName=computation_job_result', 'Added 0.27.0', NULL, '3.6.3', NULL, NULL, '7483698154');             
+('52', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.393', 51, 'EXECUTED', '8:329695cb161ceb86f6d9473819359351', 'createTable tableName=query_cache; createIndex indexName=idx_query_cache_updated_at, tableName=query_cache; addColumn tableName=report_card', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('53', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.395', 52, 'EXECUTED', '8:78d015c5090c57cd6972eb435601d3d0', 'createTable tableName=query', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('54', 'tlrobinson', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.398', 53, 'EXECUTED', '8:e410005b585f5eeb5f202076ff9468f7', 'addColumn tableName=pulse', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('55', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.409', 54, 'EXECUTED', '8:87c4becde5fe208ba2c356128df86fba', 'addColumn tableName=report_dashboard; createTable tableName=dashboard_favorite; addUniqueConstraint constraintName=unique_dashboard_favorite_user_id_dashboard_id, tableName=dashboard_favorite; createIndex indexName=idx_dashboard_favorite_user_id, ...', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('56', 'wwwiiilll', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.421', 55, 'EXECUTED', '8:9f46051abaee599e2838733512a32ad0', 'addColumn tableName=core_user', 'Added 0.25.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('57', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.437', 56, 'EXECUTED', '8:aab81d477e2d19a9ab18c58b78c9af88', 'addColumn tableName=report_card', 'Added 0.25.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('58', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.45', 57, 'EXECUTED', '8:3554219ca39e0fd682d0fba57531e917', 'createTable tableName=dimension; addUniqueConstraint constraintName=unique_dimension_field_id_name, tableName=dimension; createIndex indexName=idx_dimension_field_id, tableName=dimension', 'Added 0.25.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('59', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.455', 58, 'EXECUTED', '8:5b6ce52371e0e9eee88e6d766225a94b', 'addColumn tableName=metabase_field', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('60', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.461', 59, 'EXECUTED', '8:4f997b2cd3309882e900493892381f38', 'addColumn tableName=metabase_database', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('61', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.466', 60, 'EXECUTED', '8:7dded6fd5bf74d79b9a0b62511981272', 'addColumn tableName=metabase_field', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('62', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.469', 61, 'EXECUTED', '8:cb32e6eaa1a2140703def2730f81fef2', 'addColumn tableName=metabase_database', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('63', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.472', 62, 'EXECUTED', '8:226f73b9f6617495892d281b0f8303db', 'addColumn tableName=metabase_database', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('64', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.473', 63, 'EXECUTED', '8:4dcc8ffd836b56756f494d5dfce07b50', 'dropForeignKeyConstraint baseTableName=raw_table, constraintName=fk_rawtable_ref_database', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('66', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.475', 64, 'EXECUTED', '8:e77d66af8e3b83d46c5a0064a75a1aac', 'sql; sql', 'Added 0.26.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('67', 'attekei', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.478', 65, 'EXECUTED', '8:59dfc37744fc362e0e312488fbc9a69b', 'createTable tableName=computation_job; createTable tableName=computation_job_result', 'Added 0.27.0', NULL, '3.6.3', NULL, NULL, '8601254743');              
 INSERT INTO PUBLIC.DATABASECHANGELOG(ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, MD5SUM, DESCRIPTION, COMMENTS, TAG, LIQUIBASE, CONTEXTS, LABELS, DEPLOYMENT_ID) VALUES
-('68', 'sbelak', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.263', 66, 'EXECUTED', '8:ca201aeb20c1719a46c6bcc3fc95c81d', 'addColumn tableName=computation_job', 'Added 0.27.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('69', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.274', 67, 'EXECUTED', '8:97b7768436b9e8d695bae984020d754c', 'addColumn tableName=pulse; dropNotNullConstraint columnName=name, tableName=pulse', 'Added 0.27.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('70', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.281', 68, 'EXECUTED', '8:4e4eff7abb983b1127a32ba8107e7fb8', 'addColumn tableName=metabase_field; addNotNullConstraint columnName=database_type, tableName=metabase_field', 'Added 0.28.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('71', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.282', 69, 'EXECUTED', '8:755e5c3dd8a55793f29b2c95cb79c211', 'dropNotNullConstraint columnName=card_id, tableName=report_dashboardcard', 'Added 0.28.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('72', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.29', 70, 'EXECUTED', '8:ed16046dfa04c139f48e9068eb4faee4', 'addColumn tableName=pulse_card', 'Added 0.28.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('73', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.301', 71, 'EXECUTED', '8:3c0f03d18ff78a0bcc9915e1d9c518d6', 'addColumn tableName=metabase_database', 'Added 0.29.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('74', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.315', 72, 'EXECUTED', '8:16726d6560851325930c25caf3c8ab96', 'addColumn tableName=metabase_field', 'Added 0.29.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('75', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.329', 73, 'EXECUTED', '8:6072cabfe8188872d8e3da9a675f88c1', 'addColumn tableName=report_card', 'Added 0.28.2', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('76', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.337', 74, 'EXECUTED', '8:9b7190c9171ccca72617d508875c3c82', 'addColumn tableName=metabase_table', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('77', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.348', 75, 'EXECUTED', '8:07f0a6cd8dbbd9b89be0bd7378f7bdc8', 'addColumn tableName=core_user', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('79', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.362', 76, 'EXECUTED', '8:3f31cb67f9cdf7754ca95cade22d87a2', 'addColumn tableName=report_dashboard; createIndex indexName=idx_dashboard_collection_id, tableName=report_dashboard; addColumn tableName=pulse; createIndex indexName=idx_pulse_collection_id, tableName=pulse', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('80', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.369', 77, 'EXECUTED', '8:199d0ce28955117819ca15bcc29323e5', 'addColumn tableName=collection; createIndex indexName=idx_collection_location, tableName=collection', '', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('81', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.391', 78, 'EXECUTED', '8:3a6dc22403660529194d004ca7f7ad39', 'addColumn tableName=report_dashboard; addColumn tableName=report_card; addColumn tableName=pulse', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('82', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.416', 79, 'EXECUTED', '8:ac4b94df8c648f88cfff661284d6392d', 'addColumn tableName=core_user; sql', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('84', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.422', 80, 'EXECUTED', '8:58afc10c3e283a8050ea471aac447a97', 'renameColumn newColumnName=archived, oldColumnName=is_active, tableName=metric; addDefaultValue columnName=archived, tableName=metric; renameColumn newColumnName=archived, oldColumnName=is_active, tableName=segment; addDefaultValue columnName=arch...', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'); 
+('68', 'sbelak', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.481', 66, 'EXECUTED', '8:ca201aeb20c1719a46c6bcc3fc95c81d', 'addColumn tableName=computation_job', 'Added 0.27.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('69', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.486', 67, 'EXECUTED', '8:97b7768436b9e8d695bae984020d754c', 'addColumn tableName=pulse; dropNotNullConstraint columnName=name, tableName=pulse', 'Added 0.27.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('70', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.489', 68, 'EXECUTED', '8:4e4eff7abb983b1127a32ba8107e7fb8', 'addColumn tableName=metabase_field; addNotNullConstraint columnName=database_type, tableName=metabase_field', 'Added 0.28.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('71', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.49', 69, 'EXECUTED', '8:755e5c3dd8a55793f29b2c95cb79c211', 'dropNotNullConstraint columnName=card_id, tableName=report_dashboardcard', 'Added 0.28.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('72', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.495', 70, 'EXECUTED', '8:ed16046dfa04c139f48e9068eb4faee4', 'addColumn tableName=pulse_card', 'Added 0.28.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('73', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.498', 71, 'EXECUTED', '8:3c0f03d18ff78a0bcc9915e1d9c518d6', 'addColumn tableName=metabase_database', 'Added 0.29.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('74', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.501', 72, 'EXECUTED', '8:16726d6560851325930c25caf3c8ab96', 'addColumn tableName=metabase_field', 'Added 0.29.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('75', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.506', 73, 'EXECUTED', '8:6072cabfe8188872d8e3da9a675f88c1', 'addColumn tableName=report_card', 'Added 0.28.2', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('76', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.511', 74, 'EXECUTED', '8:9b7190c9171ccca72617d508875c3c82', 'addColumn tableName=metabase_table', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('77', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.522', 75, 'EXECUTED', '8:07f0a6cd8dbbd9b89be0bd7378f7bdc8', 'addColumn tableName=core_user', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('79', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.531', 76, 'EXECUTED', '8:3f31cb67f9cdf7754ca95cade22d87a2', 'addColumn tableName=report_dashboard; createIndex indexName=idx_dashboard_collection_id, tableName=report_dashboard; addColumn tableName=pulse; createIndex indexName=idx_pulse_collection_id, tableName=pulse', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('80', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.537', 77, 'EXECUTED', '8:199d0ce28955117819ca15bcc29323e5', 'addColumn tableName=collection; createIndex indexName=idx_collection_location, tableName=collection', '', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('81', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.553', 78, 'EXECUTED', '8:3a6dc22403660529194d004ca7f7ad39', 'addColumn tableName=report_dashboard; addColumn tableName=report_card; addColumn tableName=pulse', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('82', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.564', 79, 'EXECUTED', '8:ac4b94df8c648f88cfff661284d6392d', 'addColumn tableName=core_user; sql', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('84', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.57', 80, 'EXECUTED', '8:58afc10c3e283a8050ea471aac447a97', 'renameColumn newColumnName=archived, oldColumnName=is_active, tableName=metric; addDefaultValue columnName=archived, tableName=metric; renameColumn newColumnName=archived, oldColumnName=is_active, tableName=segment; addDefaultValue columnName=arch...', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743');  
 INSERT INTO PUBLIC.DATABASECHANGELOG(ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, MD5SUM, DESCRIPTION, COMMENTS, TAG, LIQUIBASE, CONTEXTS, LABELS, DEPLOYMENT_ID) VALUES
-('85', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.446', 81, 'EXECUTED', '8:9b4c9878a5018452dd63eb6d7c17f415', 'addColumn tableName=collection; createIndex indexName=idx_collection_personal_owner_id, tableName=collection; addColumn tableName=collection; sql; addNotNullConstraint columnName=_slug, tableName=collection; dropColumn columnName=slug, tableName=c...', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('86', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.453', 82, 'EXECUTED', '8:50c75bb29f479e0b3fb782d89f7d6717', 'sql', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('87', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.456', 83, 'EXECUTED', '8:0eccf19a93cb0ba4017aafd1d308c097', 'dropTable tableName=raw_column; dropTable tableName=raw_table', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('89', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.493', 84, 'EXECUTED', '8:ab526907b26b1bb43ac9f9548043f2a7', 'createTable tableName=QRTZ_JOB_DETAILS; addPrimaryKey constraintName=PK_QRTZ_JOB_DETAILS, tableName=QRTZ_JOB_DETAILS; createTable tableName=QRTZ_TRIGGERS; addPrimaryKey constraintName=PK_QRTZ_TRIGGERS, tableName=QRTZ_TRIGGERS; addForeignKeyConstra...', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('91', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.515', 85, 'EXECUTED', '8:9b8831e1e409f08e874c4ece043d0340', 'dropColumn columnName=raw_table_id, tableName=metabase_table; dropColumn columnName=raw_column_id, tableName=metabase_field', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('92', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.519', 86, 'EXECUTED', '8:1e5bc2d66778316ea640a561862c23b4', 'addColumn tableName=query_execution', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('93', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.523', 87, 'EXECUTED', '8:93b0d408a3970e30d7184ed1166b5476', 'addColumn tableName=query', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('94', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.526', 88, 'EXECUTED', '8:a2a1eedf1e8f8756856c9d49c7684bfe', 'createTable tableName=task_history; createIndex indexName=idx_task_history_end_time, tableName=task_history; createIndex indexName=idx_task_history_db_id, tableName=task_history', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('95', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.535', 89, 'EXECUTED', '8:9824808283004e803003b938399a4cf0', 'addUniqueConstraint constraintName=idx_databasechangelog_id_author_filename, tableName=DATABASECHANGELOG', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('96', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.541', 90, 'EXECUTED', '8:5cb2f36edcca9c6e14c5e109d6aeb68b', 'addColumn tableName=metabase_field', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('97', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.543', 91, 'MARK_RAN', '8:9169e238663c5d036bd83428d2fa8e4b', 'modifyDataType columnName=results, tableName=query_cache', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('98', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.546', 92, 'EXECUTED', '8:f036d20a4dc86fb60ffb64ea838ed6b9', 'addUniqueConstraint constraintName=idx_uniq_table_db_id_schema_name, tableName=metabase_table; sql', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('99', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.549', 93, 'EXECUTED', '8:274bb516dd95b76c954b26084eed1dfe', 'addUniqueConstraint constraintName=idx_uniq_field_table_id_parent_id_name, tableName=metabase_field; sql', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '7483698154');         
+('85', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.583', 81, 'EXECUTED', '8:9b4c9878a5018452dd63eb6d7c17f415', 'addColumn tableName=collection; createIndex indexName=idx_collection_personal_owner_id, tableName=collection; addColumn tableName=collection; sql; addNotNullConstraint columnName=_slug, tableName=collection; dropColumn columnName=slug, tableName=c...', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('86', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.584', 82, 'EXECUTED', '8:50c75bb29f479e0b3fb782d89f7d6717', 'sql', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('87', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.586', 83, 'EXECUTED', '8:0eccf19a93cb0ba4017aafd1d308c097', 'dropTable tableName=raw_column; dropTable tableName=raw_table', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('89', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.599', 84, 'EXECUTED', '8:ab526907b26b1bb43ac9f9548043f2a7', 'createTable tableName=QRTZ_JOB_DETAILS; addPrimaryKey constraintName=PK_QRTZ_JOB_DETAILS, tableName=QRTZ_JOB_DETAILS; createTable tableName=QRTZ_TRIGGERS; addPrimaryKey constraintName=PK_QRTZ_TRIGGERS, tableName=QRTZ_TRIGGERS; addForeignKeyConstra...', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('91', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.606', 85, 'EXECUTED', '8:9b8831e1e409f08e874c4ece043d0340', 'dropColumn columnName=raw_table_id, tableName=metabase_table; dropColumn columnName=raw_column_id, tableName=metabase_field', 'Added 0.30.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('92', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.608', 86, 'EXECUTED', '8:1e5bc2d66778316ea640a561862c23b4', 'addColumn tableName=query_execution', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('93', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.611', 87, 'EXECUTED', '8:93b0d408a3970e30d7184ed1166b5476', 'addColumn tableName=query', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('94', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.613', 88, 'EXECUTED', '8:a2a1eedf1e8f8756856c9d49c7684bfe', 'createTable tableName=task_history; createIndex indexName=idx_task_history_end_time, tableName=task_history; createIndex indexName=idx_task_history_db_id, tableName=task_history', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('95', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.628', 89, 'EXECUTED', '8:9824808283004e803003b938399a4cf0', 'addUniqueConstraint constraintName=idx_databasechangelog_id_author_filename, tableName=DATABASECHANGELOG', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('96', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.636', 90, 'EXECUTED', '8:5cb2f36edcca9c6e14c5e109d6aeb68b', 'addColumn tableName=metabase_field', 'Added 0.31.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('97', 'senior', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.638', 91, 'MARK_RAN', '8:9169e238663c5d036bd83428d2fa8e4b', 'modifyDataType columnName=results, tableName=query_cache', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('98', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.64', 92, 'EXECUTED', '8:f036d20a4dc86fb60ffb64ea838ed6b9', 'addUniqueConstraint constraintName=idx_uniq_table_db_id_schema_name, tableName=metabase_table; sql', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('99', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.646', 93, 'EXECUTED', '8:274bb516dd95b76c954b26084eed1dfe', 'addUniqueConstraint constraintName=idx_uniq_field_table_id_parent_id_name, tableName=metabase_field; sql', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '8601254743');          
 INSERT INTO PUBLIC.DATABASECHANGELOG(ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, MD5SUM, DESCRIPTION, COMMENTS, TAG, LIQUIBASE, CONTEXTS, LABELS, DEPLOYMENT_ID) VALUES
-('100', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.552', 94, 'EXECUTED', '8:948014f13b6198b50e3b7a066fae2ae0', 'sql', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('101', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.554', 95, 'EXECUTED', '8:58eabb08a175fafe8985208545374675', 'createIndex indexName=idx_field_parent_id, tableName=metabase_field', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('103', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.559', 96, 'EXECUTED', '8:fda3670fd16a40fd9d0f89a003098d54', 'addColumn tableName=metabase_database', 'Added 0.32.10', NULL, '3.6.3', NULL, NULL, '7483698154'),
-('106', 'sb', 'migrations/000_migrations.yaml', TIMESTAMP '2019-12-27 13:54:59.566', 97, 'EXECUTED', '8:a3dd42bbe25c415ce21e4c180dc1c1d7', 'modifyDataType columnName=database_type, tableName=metabase_field', 'Added 0.34.0', NULL, '3.6.3', NULL, NULL, '7483698154');       
+('100', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.65', 94, 'EXECUTED', '8:948014f13b6198b50e3b7a066fae2ae0', 'sql', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('101', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.652', 95, 'EXECUTED', '8:58eabb08a175fafe8985208545374675', 'createIndex indexName=idx_field_parent_id, tableName=metabase_field', 'Added 0.32.0', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('103', 'camsaul', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.656', 96, 'EXECUTED', '8:fda3670fd16a40fd9d0f89a003098d54', 'addColumn tableName=metabase_database', 'Added 0.32.10', NULL, '3.6.3', NULL, NULL, '8601254743'),
+('106', 'sb', 'migrations/000_migrations.yaml', TIMESTAMP '2020-01-09 12:20:55.662', 97, 'EXECUTED', '8:a3dd42bbe25c415ce21e4c180dc1c1d7', 'modifyDataType columnName=database_type, tableName=metabase_field', 'Added 0.34.0', NULL, '3.6.3', NULL, NULL, '8601254743');        
 CREATE CACHED TABLE PUBLIC.DATABASECHANGELOGLOCK(
     ID INT NOT NULL,
     LOCKED BOOLEAN NOT NULL,
@@ -169,7 +169,7 @@ ALTER TABLE PUBLIC.DATABASECHANGELOGLOCK ADD CONSTRAINT PUBLIC.PK_DATABASECHANGE
 INSERT INTO PUBLIC.DATABASECHANGELOGLOCK(ID, LOCKED, LOCKGRANTED, LOCKEDBY) VALUES
 (1, FALSE, NULL, NULL);     
 CREATE CACHED TABLE PUBLIC.REPORT_DASHBOARDCARD(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_7721034B_2267_41BA_B062_452667CE1641) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_7721034B_2267_41BA_B062_452667CE1641,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_A5B8ECFB_B581_48D1_8C73_B5981C68D65A) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A5B8ECFB_B581_48D1_8C73_B5981C68D65A,
     CREATED_AT TIMESTAMP NOT NULL,
     UPDATED_AT TIMESTAMP NOT NULL,
     SIZEX INT NOT NULL,
@@ -184,11 +184,11 @@ CREATE CACHED TABLE PUBLIC.REPORT_DASHBOARDCARD(
 ALTER TABLE PUBLIC.REPORT_DASHBOARDCARD ADD CONSTRAINT PUBLIC.PK_REPORT_DASHBOARDCARD PRIMARY KEY(ID);         
 -- 1 +/- SELECT COUNT(*) FROM PUBLIC.REPORT_DASHBOARDCARD;     
 INSERT INTO PUBLIC.REPORT_DASHBOARDCARD(ID, CREATED_AT, UPDATED_AT, SIZEX, SIZEY, ROW, COL, CARD_ID, DASHBOARD_ID, PARAMETER_MAPPINGS, VISUALIZATION_SETTINGS) VALUES
-(1, TIMESTAMP '2019-12-27 13:56:09.105', TIMESTAMP '2019-12-27 13:56:09.307', 4, 4, 0, 0, 1, 1, '[]', '{}');             
+(1, TIMESTAMP '2020-01-09 12:21:26.676', TIMESTAMP '2020-01-09 12:21:26.756', 4, 4, 0, 0, 2, 1, '[]', '{}');             
 CREATE INDEX PUBLIC.IDX_DASHBOARDCARD_CARD_ID ON PUBLIC.REPORT_DASHBOARDCARD(CARD_ID);         
 CREATE INDEX PUBLIC.IDX_DASHBOARDCARD_DASHBOARD_ID ON PUBLIC.REPORT_DASHBOARDCARD(DASHBOARD_ID);               
 CREATE CACHED TABLE PUBLIC.PERMISSIONS_REVISION COMMENT 'Used to keep track of changes made to permissions.'(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_F5907FB8_D114_4682_8EB3_AF7C6E0E18CD) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_F5907FB8_D114_4682_8EB3_AF7C6E0E18CD,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_A38CF45F_9FAB_42D2_A0EB_A6EA41C2F3C1) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A38CF45F_9FAB_42D2_A0EB_A6EA41C2F3C1,
     BEFORE CLOB NOT NULL COMMENT 'Serialized JSON of the permissions before the changes.',
     AFTER CLOB NOT NULL COMMENT 'Serialized JSON of the permissions after the changes.',
     USER_ID INT NOT NULL COMMENT 'The ID of the admin who made this set of changes.',
@@ -208,13 +208,13 @@ INSERT INTO PUBLIC.SETTING(KEY, VALUE) VALUES
 ('site-name', 'Epic Team'),
 ('admin-email', 'bob@metabase.com'),
 ('anon-tracking-enabled', 'false'),
-('site-uuid', '9e61e326-ec8a-4f85-8c98-38ec48a4e05f'),
+('site-uuid', '408ce14b-e8e5-43e4-9d15-005eba3f8aec'),
 ('enable-public-sharing', 'true'),
 ('enable-embedding', 'true'),
-('embedding-secret-key', 'e32c2d8f5315f31539f19ff7b190ba388a9eece5f0ae752d7ffad3c03ff98cae'),
-('settings-last-updated', '2019-12-27 13:55:52.231');          
+('embedding-secret-key', 'ff89874a896b9390e1646de35a15a58c0c4d6e86deddc394f0b04e2a573c9222'),
+('settings-last-updated', '2020-01-09 12:21:17.302');          
 CREATE CACHED TABLE PUBLIC.METRIC_IMPORTANT_FIELD(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_5A33298E_E93F_4169_96C4_33D52F7D4A7A) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5A33298E_E93F_4169_96C4_33D52F7D4A7A,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_EE9EE954_5C0C_420A_8839_FBAD4BBD248B) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_EE9EE954_5C0C_420A_8839_FBAD4BBD248B,
     METRIC_ID INT NOT NULL,
     FIELD_ID INT NOT NULL
 );     
@@ -223,7 +223,7 @@ ALTER TABLE PUBLIC.METRIC_IMPORTANT_FIELD ADD CONSTRAINT PUBLIC.PK_METRIC_IMPORT
 CREATE INDEX PUBLIC.IDX_METRIC_IMPORTANT_FIELD_METRIC_ID ON PUBLIC.METRIC_IMPORTANT_FIELD(METRIC_ID);          
 CREATE INDEX PUBLIC.IDX_METRIC_IMPORTANT_FIELD_FIELD_ID ON PUBLIC.METRIC_IMPORTANT_FIELD(FIELD_ID);            
 CREATE CACHED TABLE PUBLIC.TASK_HISTORY COMMENT 'Timing and metadata info about background/quartz processes'(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_06F0D33A_3128_44D6_9B39_CBCB2DBBE373) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_06F0D33A_3128_44D6_9B39_CBCB2DBBE373,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_5B1727DA_66B0_4DC4_9019_AF79548E9DEE) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5B1727DA_66B0_4DC4_9019_AF79548E9DEE,
     TASK VARCHAR(254) NOT NULL COMMENT 'Name of the task',
     DB_ID INT,
     STARTED_AT TIMESTAMP NOT NULL,
@@ -234,18 +234,18 @@ CREATE CACHED TABLE PUBLIC.TASK_HISTORY COMMENT 'Timing and metadata info about
 ALTER TABLE PUBLIC.TASK_HISTORY ADD CONSTRAINT PUBLIC.PK_TASK_HISTORY PRIMARY KEY(ID);         
 -- 12 +/- SELECT COUNT(*) FROM PUBLIC.TASK_HISTORY;            
 INSERT INTO PUBLIC.TASK_HISTORY(ID, TASK, DB_ID, STARTED_AT, ENDED_AT, DURATION, TASK_DETAILS) VALUES
-(1, 'sync', 1, TIMESTAMP '2019-12-27 13:55:00.289364', TIMESTAMP '2019-12-27 13:55:01.144587', 855, NULL),
-(2, 'sync-timezone', 1, TIMESTAMP '2019-12-27 13:55:00.290501', TIMESTAMP '2019-12-27 13:55:00.601591', 311, '{"timezone-id":"America/Los_Angeles"}'),
-(3, 'sync-tables', 1, TIMESTAMP '2019-12-27 13:55:00.601976', TIMESTAMP '2019-12-27 13:55:00.670127', 68, '{"updated-tables":4,"total-tables":0}'),
-(4, 'sync-fields', 1, TIMESTAMP '2019-12-27 13:55:00.670303', TIMESTAMP '2019-12-27 13:55:00.986189', 315, '{"total-fields":36,"updated-fields":36}'),
-(5, 'sync-fks', 1, TIMESTAMP '2019-12-27 13:55:00.986275', TIMESTAMP '2019-12-27 13:55:01.020064', 33, '{"total-fks":3,"updated-fks":3,"total-failed":0}'),
-(6, 'sync-metabase-metadata', 1, TIMESTAMP '2019-12-27 13:55:01.020177', TIMESTAMP '2019-12-27 13:55:01.144506', 124, NULL),
-(7, 'analyze', 1, TIMESTAMP '2019-12-27 13:55:01.223908', TIMESTAMP '2019-12-27 13:55:07.135993', 5912, NULL),
-(8, 'fingerprint-fields', 1, TIMESTAMP '2019-12-27 13:55:01.223962', TIMESTAMP '2019-12-27 13:55:06.927658', 5703, '{"no-data-fingerprints":0,"failed-fingerprints":0,"updated-fingerprints":32,"fingerprints-attempted":32}'),
-(9, 'classify-fields', 1, TIMESTAMP '2019-12-27 13:55:06.927751', TIMESTAMP '2019-12-27 13:55:07.123034', 195, '{"fields-classified":32,"fields-failed":0}'),
-(10, 'classify-tables', 1, TIMESTAMP '2019-12-27 13:55:07.123131', TIMESTAMP '2019-12-27 13:55:07.135889', 12, '{"total-tables":4,"tables-classified":4}'),
-(11, 'field values scanning', 1, TIMESTAMP '2019-12-27 13:55:07.154698', TIMESTAMP '2019-12-27 13:55:08.177793', 1023, NULL),
-(12, 'update-field-values', 1, TIMESTAMP '2019-12-27 13:55:07.154787', TIMESTAMP '2019-12-27 13:55:08.177718', 1022, '{"errors":0,"created":5,"updated":0,"deleted":0}');   
+(1, 'sync', 1, TIMESTAMP '2020-01-09 12:20:56.244066', TIMESTAMP '2020-01-09 12:20:56.872849', 628, NULL),
+(2, 'sync-timezone', 1, TIMESTAMP '2020-01-09 12:20:56.244856', TIMESTAMP '2020-01-09 12:20:56.475289', 230, '{"timezone-id":"America/Los_Angeles"}'),
+(3, 'sync-tables', 1, TIMESTAMP '2020-01-09 12:20:56.475612', TIMESTAMP '2020-01-09 12:20:56.519961', 44, '{"updated-tables":4,"total-tables":0}'),
+(4, 'sync-fields', 1, TIMESTAMP '2020-01-09 12:20:56.520089', TIMESTAMP '2020-01-09 12:20:56.776513', 256, '{"total-fields":36,"updated-fields":36}'),
+(5, 'sync-fks', 1, TIMESTAMP '2020-01-09 12:20:56.776563', TIMESTAMP '2020-01-09 12:20:56.798783', 22, '{"total-fks":3,"updated-fks":3,"total-failed":0}'),
+(6, 'sync-metabase-metadata', 1, TIMESTAMP '2020-01-09 12:20:56.798854', TIMESTAMP '2020-01-09 12:20:56.872799', 73, NULL),
+(7, 'analyze', 1, TIMESTAMP '2020-01-09 12:20:56.921833', TIMESTAMP '2020-01-09 12:21:00.935708', 4013, NULL),
+(8, 'fingerprint-fields', 1, TIMESTAMP '2020-01-09 12:20:56.921869', TIMESTAMP '2020-01-09 12:21:00.870651', 3948, '{"no-data-fingerprints":0,"failed-fingerprints":0,"updated-fingerprints":32,"fingerprints-attempted":32}'),
+(9, 'classify-fields', 1, TIMESTAMP '2020-01-09 12:21:00.870693', TIMESTAMP '2020-01-09 12:21:00.92908', 58, '{"fields-classified":32,"fields-failed":0}'),
+(10, 'classify-tables', 1, TIMESTAMP '2020-01-09 12:21:00.929137', TIMESTAMP '2020-01-09 12:21:00.935668', 6, '{"total-tables":4,"tables-classified":4}'),
+(11, 'field values scanning', 1, TIMESTAMP '2020-01-09 12:21:00.942977', TIMESTAMP '2020-01-09 12:21:01.594932', 651, NULL),
+(12, 'update-field-values', 1, TIMESTAMP '2020-01-09 12:21:00.943014', TIMESTAMP '2020-01-09 12:21:01.594895', 651, '{"errors":0,"created":5,"updated":0,"deleted":0}');         
 CREATE INDEX PUBLIC.IDX_TASK_HISTORY_END_TIME ON PUBLIC.TASK_HISTORY(ENDED_AT);
 CREATE INDEX PUBLIC.IDX_TASK_HISTORY_DB_ID ON PUBLIC.TASK_HISTORY(DB_ID);      
 CREATE CACHED TABLE PUBLIC.DATA_MIGRATIONS(
@@ -255,23 +255,23 @@ CREATE CACHED TABLE PUBLIC.DATA_MIGRATIONS(
 ALTER TABLE PUBLIC.DATA_MIGRATIONS ADD CONSTRAINT PUBLIC.PK_DATA_MIGRATIONS PRIMARY KEY(ID);   
 -- 14 +/- SELECT COUNT(*) FROM PUBLIC.DATA_MIGRATIONS;         
 INSERT INTO PUBLIC.DATA_MIGRATIONS(ID, TIMESTAMP) VALUES
-('add-users-to-default-permissions-groups', TIMESTAMP '2019-12-27 13:54:59.794'),
-('add-admin-group-root-entry', TIMESTAMP '2019-12-27 13:54:59.819'),
-('add-databases-to-magic-permissions-groups', TIMESTAMP '2019-12-27 13:54:59.823'),
-('migrate-field-types', TIMESTAMP '2019-12-27 13:54:59.874'),
-('fix-invalid-field-types', TIMESTAMP '2019-12-27 13:54:59.878'),
-('copy-site-url-setting-and-remove-trailing-slashes', TIMESTAMP '2019-12-27 13:54:59.883'),
-('drop-old-query-execution-table', TIMESTAMP '2019-12-27 13:54:59.886'),
-('ensure-protocol-specified-in-site-url', TIMESTAMP '2019-12-27 13:54:59.906'),
-('populate-card-database-id', TIMESTAMP '2019-12-27 13:54:59.914'),
-('migrate-humanization-setting', TIMESTAMP '2019-12-27 13:54:59.92'),
-('mark-category-fields-as-list', TIMESTAMP '2019-12-27 13:54:59.928'),
-('add-legacy-sql-directive-to-bigquery-sql-cards', TIMESTAMP '2019-12-27 13:54:59.93'),
-('clear-ldap-user-local-passwords', TIMESTAMP '2019-12-27 13:54:59.932'),
-('add-migrated-collections', TIMESTAMP '2019-12-27 13:54:59.947'); 
+('add-users-to-default-permissions-groups', TIMESTAMP '2020-01-09 12:20:55.859'),
+('add-admin-group-root-entry', TIMESTAMP '2020-01-09 12:20:55.866'),
+('add-databases-to-magic-permissions-groups', TIMESTAMP '2020-01-09 12:20:55.868'),
+('migrate-field-types', TIMESTAMP '2020-01-09 12:20:55.897'),
+('fix-invalid-field-types', TIMESTAMP '2020-01-09 12:20:55.899'),
+('copy-site-url-setting-and-remove-trailing-slashes', TIMESTAMP '2020-01-09 12:20:55.901'),
+('drop-old-query-execution-table', TIMESTAMP '2020-01-09 12:20:55.903'),
+('ensure-protocol-specified-in-site-url', TIMESTAMP '2020-01-09 12:20:55.919'),
+('populate-card-database-id', TIMESTAMP '2020-01-09 12:20:55.923'),
+('migrate-humanization-setting', TIMESTAMP '2020-01-09 12:20:55.924'),
+('mark-category-fields-as-list', TIMESTAMP '2020-01-09 12:20:55.933'),
+('add-legacy-sql-directive-to-bigquery-sql-cards', TIMESTAMP '2020-01-09 12:20:55.935'),
+('clear-ldap-user-local-passwords', TIMESTAMP '2020-01-09 12:20:55.937'),
+('add-migrated-collections', TIMESTAMP '2020-01-09 12:20:55.95');
 CREATE INDEX PUBLIC.IDX_DATA_MIGRATIONS_ID ON PUBLIC.DATA_MIGRATIONS(ID);      
 CREATE CACHED TABLE PUBLIC.COLLECTION_REVISION COMMENT 'Used to keep track of changes made to collections.'(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_4DE7046C_309A_497E_A77B_E7F858552044) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_4DE7046C_309A_497E_A77B_E7F858552044,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_F0777008_49B6_4429_BBD3_4D0139BECDEC) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_F0777008_49B6_4429_BBD3_4D0139BECDEC,
     BEFORE CLOB NOT NULL COMMENT 'Serialized JSON of the collections graph before the changes.',
     AFTER CLOB NOT NULL COMMENT 'Serialized JSON of the collections graph after the changes.',
     USER_ID INT NOT NULL COMMENT 'The ID of the admin who made this set of changes.',
@@ -281,7 +281,7 @@ CREATE CACHED TABLE PUBLIC.COLLECTION_REVISION COMMENT 'Used to keep track of ch
 ALTER TABLE PUBLIC.COLLECTION_REVISION ADD CONSTRAINT PUBLIC.PK_COLLECTION_REVISION PRIMARY KEY(ID);           
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.COLLECTION_REVISION;      
 CREATE CACHED TABLE PUBLIC.COLLECTION COMMENT 'Collections are an optional way to organize Cards and handle permissions for them.'(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_39F89E16_3883_4039_9876_76371B462C07) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_39F89E16_3883_4039_9876_76371B462C07,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_BA85358A_4F81_449F_A72D_33EE4DD194CB) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_BA85358A_4F81_449F_A72D_33EE4DD194CB,
     NAME CLOB NOT NULL COMMENT 'The user-facing name of this Collection.',
     DESCRIPTION CLOB COMMENT 'Optional description for this Collection.',
     COLOR CHAR(7) NOT NULL COMMENT 'Seven-character hex color for this Collection, including the preceding hash sign.',
@@ -298,7 +298,7 @@ INSERT INTO PUBLIC.COLLECTION(ID, NAME, DESCRIPTION, COLOR, ARCHIVED, LOCATION,
 CREATE INDEX PUBLIC.IDX_COLLECTION_LOCATION ON PUBLIC.COLLECTION(LOCATION);    
 CREATE INDEX PUBLIC.IDX_COLLECTION_PERSONAL_OWNER_ID ON PUBLIC.COLLECTION(PERSONAL_OWNER_ID);  
 CREATE CACHED TABLE PUBLIC.REPORT_CARD(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_405C1C66_2069_4350_8A5E_97A6C445A258) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_405C1C66_2069_4350_8A5E_97A6C445A258,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_5F615A2C_8F8A_498B_BB9E_B07C4169C815) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5F615A2C_8F8A_498B_BB9E_B07C4169C815,
     CREATED_AT TIMESTAMP NOT NULL,
     UPDATED_AT TIMESTAMP NOT NULL,
     NAME VARCHAR(254) NOT NULL,
@@ -322,14 +322,16 @@ CREATE CACHED TABLE PUBLIC.REPORT_CARD(
     COLLECTION_POSITION SMALLINT COMMENT 'Optional pinned position for this item in its Collection. NULL means item is not pinned.'
 );      
 ALTER TABLE PUBLIC.REPORT_CARD ADD CONSTRAINT PUBLIC.PK_REPORT_CARD PRIMARY KEY(ID);           
--- 1 +/- SELECT COUNT(*) FROM PUBLIC.REPORT_CARD;              
+-- 2 +/- SELECT COUNT(*) FROM PUBLIC.REPORT_CARD;              
 INSERT INTO PUBLIC.REPORT_CARD(ID, CREATED_AT, UPDATED_AT, NAME, DESCRIPTION, DISPLAY, DATASET_QUERY, VISUALIZATION_SETTINGS, CREATOR_ID, DATABASE_ID, TABLE_ID, QUERY_TYPE, ARCHIVED, COLLECTION_ID, PUBLIC_UUID, MADE_PUBLIC_BY_ID, ENABLE_EMBEDDING, EMBEDDING_PARAMS, CACHE_TTL, RESULT_METADATA, READ_PERMISSIONS, COLLECTION_POSITION) VALUES
-(1, TIMESTAMP '2019-12-27 13:56:04.256', TIMESTAMP '2019-12-27 13:56:08.633', 'Orders, Count', NULL, 'scalar', '{"query":{"source-table":2,"aggregation":[["count"]]},"type":"query","database":1}', '{}', 1, 1, 2, 'query', FALSE, NULL, NULL, NULL, FALSE, NULL, NULL, '[{"name":"count","display_name":"Count","base_type":"type/Integer","special_type":"type/Quantity","fingerprint":{"global":{"distinct-count":1,"nil%":0.0},"type":{"type/Number":{"min":18760.0,"max":18760.0,"avg":18760.0,"sd":null,"q1":18760.0,"q3":18760.0}}}}]', NULL, NULL);               
+(1, TIMESTAMP '2020-01-09 12:21:20.531', TIMESTAMP '2020-01-09 12:21:20.531', 'Orders', NULL, 'table', '{"database":1,"query":{"source-table":2},"type":"query"}', '{}', 1, 1, 2, 'query', FALSE, NULL, NULL, NULL, FALSE, NULL, NULL, STRINGDECODE('[{\"name\":\"ID\",\"display_name\":\"ID\",\"description\":\"This is a unique ID for the product. It is also called the \u201cInvoice number\u201d or \u201cConfirmation number\u201d in customer facing emails and screens.\",\"base_type\":\"type/BigInteger\",\"special_type\":\"type/PK\",\"fingerprint\":null},{\"name\":\"CREATED_AT\",\"display_name\":\"Created At\",\"description\":\"The date and time an order was submitted.\",\"base_type\":\"type/DateTime\",\"special_type\":\"type/CreationTimestamp\",\"unit\":\"default\",\"fingerprint\":{\"global\":{\"distinct-count\":9998,\"nil%\":0.0},\"type\":{\"type/DateTime\":{\"earliest\":\"2016-04-30T18:56:13.352\",\"latest\":\"2020-04-19T14:07:15.657\"}}}},{\"name\":\"DISCOUNT\",\"display_name\":\"Discount\",\"description\":\"Discount amount.\",\"base_type\":\"type/Float\",\"special_type\":\"type/Discount\",\"fingerprint\":{\"global\":{\"distinct-count\":701,\"nil%\":0.898},\"type\":{\"type/Number\":{\"min\":0.17088996672584322,\"max\":61.69684269960571,\"avg\":5.161255547580326,\"sd\":3.053663125001991,\"q1\":2.9786226681458743,\"q3\":7.338187788658235}}}},{\"name\":\"PRODUCT_ID\",\"display_name\":\"Product ID\",\"description\":\"The product ID. This is an internal identifier for the product, NOT the SKU.\",\"base_type\":\"type/Integer\",\"special_type\":\"type/FK\",\"fingerprint\":{\"global\":{\"distinct-count\":200,\"nil%\":0.0}}},{\"name\":\"QUANTITY\",\"display_name\":\"Quantity\",\"description\":\"Number of products bought.\",\"base_type\":\"type/Integer\",\"special_type\":\"type/Quantity\",\"fingerprint\":{\"global\":{\"distinct-count\":62,\"nil%\":0.0},\"type\":{\"type/Number\":{\"min\":0.0,\"max\":100.0,\"avg\":3.7015,\"sd\":4.214258386403798,\"q1\":1.755882607764982,\"q3\":4.882654507928044}}}},{\"name\":\"SUBTOTAL\",\"display_name\":\"Subtotal\",\"description\":\"The raw, pre-tax cost of the order. Note that this might be different in the future from the product price due to promotions, credits, etc.\",\"base_type\":\"type/Float\",\"fingerprint\":{\"global\":{\"distinct-count\":340,\"nil%\":0.0},\"type\":{\"type/Number\":{\"min\":15.691943673970439,\"max\":148.22900526552291,\"avg\":77.01295465356547,\"sd\":32.53705013056317,\"q1\":49.74894519060184,\"q3\":105.42965746993103}}},\"special_type\":null},{\"name\":\"TAX\",\"display_name\":\"Tax\",\"description\":\"This is the amount of local and federal taxes that are collected on the purchase. Note that other governmental fees on some products are not included here, but instead are accounted for in the subtotal.\",\"base_type\":\"type/Float\",\"fingerprint\":{\"global\":{\"distinct-count\":797,\"nil%\":0.0},\"type\":{\"type/Number\":{\"min\":0.0,\"max\":11.12,\"avg\":3.8722100000000004,\"sd\":2.3206651358900316,\"q1\":2.273340386603857,\"q3\":5.337275338216307}}},\"special_type\":null},{\"name\":\"TOTAL\",\"display_name\":\"Total\",\"description\":\"The total billed amount.\",\"base_type\":\"type/Float\",\"fingerprint\":{\"global\":{\"distinct-count\":10000,\"nil%\":0.0},\"type\":{\"type/Number\":{\"min\":12.061602936923117,\"max\":238.32732001721533,\"avg\":82.96014815230805,\"sd\":38.35967664847571,\"q1\":52.006147617878135,\"q3\":109.55803018499738}}},\"special_type\":null},{\"name\":\"USER_ID\",\"display_name\":\"User ID\",\"description\":\"The id of the user who made this order. Note that in some cases where an order was created on behalf of a customer who phoned the order in, this might be the employee who handled the request.\",\"base_type\":\"type/Integer\",\"special_type\":\"type/FK\",\"fingerprint\":{\"global\":{\"distinct-count\":929,\"nil%\":0.0}}}]'), NULL, NULL);
+INSERT INTO PUBLIC.REPORT_CARD(ID, CREATED_AT, UPDATED_AT, NAME, DESCRIPTION, DISPLAY, DATASET_QUERY, VISUALIZATION_SETTINGS, CREATOR_ID, DATABASE_ID, TABLE_ID, QUERY_TYPE, ARCHIVED, COLLECTION_ID, PUBLIC_UUID, MADE_PUBLIC_BY_ID, ENABLE_EMBEDDING, EMBEDDING_PARAMS, CACHE_TTL, RESULT_METADATA, READ_PERMISSIONS, COLLECTION_POSITION) VALUES
+(2, TIMESTAMP '2020-01-09 12:21:24.045', TIMESTAMP '2020-01-09 12:21:26.463', 'Orders, Count', NULL, 'scalar', '{"type":"query","query":{"source-table":2,"aggregation":[["count"]]},"database":1}', '{}', 1, 1, 2, 'query', FALSE, NULL, NULL, NULL, FALSE, NULL, NULL, '[{"name":"count","display_name":"Count","base_type":"type/Integer","special_type":"type/Quantity","fingerprint":{"global":{"distinct-count":1,"nil%":0.0},"type":{"type/Number":{"min":18760.0,"max":18760.0,"avg":18760.0,"sd":null,"q1":18760.0,"q3":18760.0}}}}]', NULL, NULL);               
 CREATE INDEX PUBLIC.IDX_CARD_CREATOR_ID ON PUBLIC.REPORT_CARD(CREATOR_ID);     
 CREATE INDEX PUBLIC.IDX_CARD_COLLECTION_ID ON PUBLIC.REPORT_CARD(COLLECTION_ID);               
 CREATE INDEX PUBLIC.IDX_CARD_PUBLIC_UUID ON PUBLIC.REPORT_CARD(PUBLIC_UUID);   
 CREATE CACHED TABLE PUBLIC.LABEL(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_2423926E_D488_426E_A8C8_A376100D1F0A) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_2423926E_D488_426E_A8C8_A376100D1F0A,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_C5C3BD44_A7F8_4E58_8D1A_8CE37AAE31D3) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_C5C3BD44_A7F8_4E58_8D1A_8CE37AAE31D3,
     NAME VARCHAR(254) NOT NULL,
     SLUG VARCHAR(254) NOT NULL,
     ICON VARCHAR(128)
@@ -338,7 +340,7 @@ ALTER TABLE PUBLIC.LABEL ADD CONSTRAINT PUBLIC.PK_LABEL PRIMARY KEY(ID);
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.LABEL;    
 CREATE INDEX PUBLIC.IDX_LABEL_SLUG ON PUBLIC.LABEL(SLUG);      
 CREATE CACHED TABLE PUBLIC.DEPENDENCY(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_3814A94F_33EE_4621_895D_C6C286F37F66) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_3814A94F_33EE_4621_895D_C6C286F37F66,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_D3607C9C_C5F2_4188_BB3D_2D307C9210FA) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_D3607C9C_C5F2_4188_BB3D_2D307C9210FA,
     MODEL VARCHAR(32) NOT NULL,
     MODEL_ID INT NOT NULL,
     DEPENDENT_ON_MODEL VARCHAR(32) NOT NULL,
@@ -352,7 +354,7 @@ CREATE INDEX PUBLIC.IDX_DEPENDENCY_MODEL_ID ON PUBLIC.DEPENDENCY(MODEL_ID);
 CREATE INDEX PUBLIC.IDX_DEPENDENCY_DEPENDENT_ON_MODEL ON PUBLIC.DEPENDENCY(DEPENDENT_ON_MODEL);
 CREATE INDEX PUBLIC.IDX_DEPENDENCY_DEPENDENT_ON_ID ON PUBLIC.DEPENDENCY(DEPENDENT_ON_ID);      
 CREATE CACHED TABLE PUBLIC.REPORT_DASHBOARD(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_70956D05_9758_4131_AF68_B83116E5F748) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_70956D05_9758_4131_AF68_B83116E5F748,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_44044B5D_AC37_4270_BA67_31FA40CC31E9) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_44044B5D_AC37_4270_BA67_31FA40CC31E9,
     CREATED_AT TIMESTAMP NOT NULL,
     UPDATED_AT TIMESTAMP NOT NULL,
     NAME VARCHAR(254) NOT NULL,
@@ -374,13 +376,13 @@ CREATE CACHED TABLE PUBLIC.REPORT_DASHBOARD(
 ALTER TABLE PUBLIC.REPORT_DASHBOARD ADD CONSTRAINT PUBLIC.PK_REPORT_DASHBOARD PRIMARY KEY(ID); 
 -- 1 +/- SELECT COUNT(*) FROM PUBLIC.REPORT_DASHBOARD;         
 INSERT INTO PUBLIC.REPORT_DASHBOARD(ID, CREATED_AT, UPDATED_AT, NAME, DESCRIPTION, CREATOR_ID, PARAMETERS, POINTS_OF_INTEREST, CAVEATS, SHOW_IN_GETTING_STARTED, PUBLIC_UUID, MADE_PUBLIC_BY_ID, ENABLE_EMBEDDING, EMBEDDING_PARAMS, ARCHIVED, POSITION, COLLECTION_ID, COLLECTION_POSITION) VALUES
-(1, TIMESTAMP '2019-12-27 13:56:07.72', TIMESTAMP '2019-12-27 13:56:09.521', 'orders in a dashboard', NULL, 1, '[]', NULL, NULL, FALSE, NULL, NULL, FALSE, NULL, FALSE, NULL, NULL, NULL); 
+(1, TIMESTAMP '2020-01-09 12:21:26.032', TIMESTAMP '2020-01-09 12:21:26.858', 'orders in a dashboard', NULL, 1, '[]', NULL, NULL, FALSE, NULL, NULL, FALSE, NULL, FALSE, NULL, NULL, NULL);
 CREATE INDEX PUBLIC.IDX_DASHBOARD_CREATOR_ID ON PUBLIC.REPORT_DASHBOARD(CREATOR_ID);           
 CREATE INDEX PUBLIC.IDX_REPORT_DASHBOARD_SHOW_IN_GETTING_STARTED ON PUBLIC.REPORT_DASHBOARD(SHOW_IN_GETTING_STARTED);          
 CREATE INDEX PUBLIC.IDX_DASHBOARD_PUBLIC_UUID ON PUBLIC.REPORT_DASHBOARD(PUBLIC_UUID);         
 CREATE INDEX PUBLIC.IDX_DASHBOARD_COLLECTION_ID ON PUBLIC.REPORT_DASHBOARD(COLLECTION_ID);     
 CREATE CACHED TABLE PUBLIC.DASHBOARD_FAVORITE COMMENT 'Presence of a row here indicates a given User has favorited a given Dashboard.'(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_6AFFF8D1_AF45_42AF_87EE_3E8188DDBA9A) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_6AFFF8D1_AF45_42AF_87EE_3E8188DDBA9A,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_C4302ED3_DE22_4CEF_BADF_6AF81F8E95C6) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_C4302ED3_DE22_4CEF_BADF_6AF81F8E95C6,
     USER_ID INT NOT NULL COMMENT 'ID of the User who favorited the Dashboard.',
     DASHBOARD_ID INT NOT NULL COMMENT 'ID of the Dashboard favorited by the User.'
 );   
@@ -396,10 +398,10 @@ CREATE CACHED TABLE PUBLIC.QUERY COMMENT 'Information (such as average execution
 ALTER TABLE PUBLIC.QUERY ADD CONSTRAINT PUBLIC.PK_QUERY PRIMARY KEY(QUERY_HASH);               
 -- 2 +/- SELECT COUNT(*) FROM PUBLIC.QUERY;    
 INSERT INTO PUBLIC.QUERY(QUERY_HASH, AVERAGE_EXECUTION_TIME, QUERY) VALUES
-(X'7cd6adce1230dc90e50acf28bc603ee99320d968ebb4191c1ff632c4a8f7b3f1', 737, '{"database":1,"type":"query","query":{"source-table":2},"parameters":[],"async?":true,"middleware":{"add-default-userland-constraints?":true,"userland-query?":true},"constraints":{"max-results":10000,"max-results-bare-rows":2000}}'),
-(X'15ff68f15b975a5aee0df382f9e42e4b1e4e11246762f4abca418c48f1284aa2', 56, '{"query":{"source-table":2,"aggregation":[["count"]]},"type":"query","database":1,"parameters":[],"async?":true,"middleware":{"add-default-userland-constraints?":true,"userland-query?":true},"constraints":{"max-results":10000,"max-results-bare-rows":2000}}');
+(X'7cd6adce1230dc90e50acf28bc603ee99320d968ebb4191c1ff632c4a8f7b3f1', 179, '{"database":1,"query":{"source-table":2},"type":"query","parameters":[],"async?":true,"middleware":{"add-default-userland-constraints?":true,"userland-query?":true},"constraints":{"max-results":10000,"max-results-bare-rows":2000}}'),
+(X'15ff68f15b975a5aee0df382f9e42e4b1e4e11246762f4abca418c48f1284aa2', 25, '{"type":"query","query":{"source-table":2,"aggregation":[["count"]]},"database":1,"parameters":[],"async?":true,"middleware":{"add-default-userland-constraints?":true,"userland-query?":true},"constraints":{"max-results":10000,"max-results-bare-rows":2000}}');
 CREATE CACHED TABLE PUBLIC.PERMISSIONS_GROUP(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_24E20B01_717A_4ED3_94E7_EE17064E49CB) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_24E20B01_717A_4ED3_94E7_EE17064E49CB,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_C09F1BC8_3D2B_48EA_A43A_847512C52B89) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_C09F1BC8_3D2B_48EA_A43A_847512C52B89,
     NAME VARCHAR(255) NOT NULL
 ); 
 ALTER TABLE PUBLIC.PERMISSIONS_GROUP ADD CONSTRAINT PUBLIC.PK_PERMISSIONS_GROUP PRIMARY KEY(ID);               
@@ -410,7 +412,7 @@ INSERT INTO PUBLIC.PERMISSIONS_GROUP(ID, NAME) VALUES
 (3, 'MetaBot'); 
 CREATE INDEX PUBLIC.IDX_PERMISSIONS_GROUP_NAME ON PUBLIC.PERMISSIONS_GROUP(NAME);              
 CREATE CACHED TABLE PUBLIC.DASHBOARDCARD_SERIES(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_04E675BF_3ACC_4FAC_B66A_643B3175839E) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_04E675BF_3ACC_4FAC_B66A_643B3175839E,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_299DEB06_08E6_408A_9E3A_5CC0FBCD0F54) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_299DEB06_08E6_408A_9E3A_5CC0FBCD0F54,
     DASHBOARDCARD_ID INT NOT NULL,
     CARD_ID INT NOT NULL,
     POSITION INT NOT NULL
@@ -420,7 +422,7 @@ ALTER TABLE PUBLIC.DASHBOARDCARD_SERIES ADD CONSTRAINT PUBLIC.PK_DASHBOARDCARD_S
 CREATE INDEX PUBLIC.IDX_DASHBOARDCARD_SERIES_DASHBOARDCARD_ID ON PUBLIC.DASHBOARDCARD_SERIES(DASHBOARDCARD_ID);
 CREATE INDEX PUBLIC.IDX_DASHBOARDCARD_SERIES_CARD_ID ON PUBLIC.DASHBOARDCARD_SERIES(CARD_ID);  
 CREATE CACHED TABLE PUBLIC.CORE_USER(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_FACCD50E_9CE4_4958_8CCE_249A197B18B9) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_FACCD50E_9CE4_4958_8CCE_249A197B18B9,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_1AAE82E3_7CC1_46E6_B606_AF8A419B1962) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_1AAE82E3_7CC1_46E6_B606_AF8A419B1962,
     EMAIL VARCHAR(254) NOT NULL,
     FIRST_NAME VARCHAR(254) NOT NULL,
     LAST_NAME VARCHAR(254) NOT NULL,
@@ -441,10 +443,10 @@ CREATE CACHED TABLE PUBLIC.CORE_USER(
 ALTER TABLE PUBLIC.CORE_USER ADD CONSTRAINT PUBLIC.PK_CORE_USER PRIMARY KEY(ID);               
 -- 2 +/- SELECT COUNT(*) FROM PUBLIC.CORE_USER;
 INSERT INTO PUBLIC.CORE_USER(ID, EMAIL, FIRST_NAME, LAST_NAME, PASSWORD, PASSWORD_SALT, DATE_JOINED, LAST_LOGIN, IS_SUPERUSER, IS_ACTIVE, RESET_TOKEN, RESET_TRIGGERED, IS_QBNEWB, GOOGLE_AUTH, LDAP_AUTH, LOGIN_ATTRIBUTES, UPDATED_AT) VALUES
-(1, 'bob@metabase.com', 'Bobby', 'Tables', '$2a$10$.Dwfx3sYiuuf4bN4XFRKaOoj.qNip7YnEN9TJmU9vwm0OVPC/PtuW', '5062904f-663d-4fd7-86bd-ba404ab0a449', TIMESTAMP '2019-12-27 13:55:45.236', TIMESTAMP '2019-12-27 13:55:45.447', TRUE, TRUE, NULL, NULL, TRUE, FALSE, FALSE, NULL, TIMESTAMP '2019-12-27 13:55:45.447'),
-(2, 'robert@metabase.com', 'Robert', 'Tableton', '$2a$10$DYLGnijZjB2i2tuIZ1xTqODZdeeBcEmA/7Kzk2vAioJCQbY0wxnMG', 'f4286918-f928-4cd2-a0e2-a422de163218', TIMESTAMP '2019-12-27 13:56:14.961', TIMESTAMP '2019-12-27 13:56:21.216', FALSE, TRUE, NULL, NULL, TRUE, FALSE, FALSE, NULL, TIMESTAMP '2019-12-27 13:56:25.633');               
+(1, 'bob@metabase.com', 'Bobby', 'Tables', '$2a$10$7nBtiyl1lrwmFd6eEhDd.uCaq8n6RYIs/CzTPvPtxKF0zXT5Hd5wu', '01649787-c14c-4216-b8de-54a003aeccf9', TIMESTAMP '2020-01-09 12:21:15.573', TIMESTAMP '2020-01-09 12:21:15.671', TRUE, TRUE, NULL, NULL, FALSE, FALSE, FALSE, NULL, TIMESTAMP '2020-01-09 12:21:27.052'),
+(2, 'robert@metabase.com', 'Robert', 'Tableton', '$2a$10$R8fYmFd8s/5NyUFhmq9WduCbFWp099dO11QrPAIMn.JmuLqZx7EZG', '9186f7d6-ae63-427d-9a7f-862412201769', TIMESTAMP '2020-01-09 12:21:29.92', TIMESTAMP '2020-01-09 12:21:34.201', FALSE, TRUE, NULL, NULL, TRUE, FALSE, FALSE, NULL, TIMESTAMP '2020-01-09 12:21:36.913');               
 CREATE CACHED TABLE PUBLIC.ACTIVITY(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_64A02A95_D231_4E11_8CDA_66A059FF588F) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_64A02A95_D231_4E11_8CDA_66A059FF588F,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_9EC48888_BCD4_4652_96D5_B12220C3EE98) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_9EC48888_BCD4_4652_96D5_B12220C3EE98,
     TOPIC VARCHAR(32) NOT NULL,
     TIMESTAMP TIMESTAMP NOT NULL,
     USER_ID INT,
@@ -456,19 +458,20 @@ CREATE CACHED TABLE PUBLIC.ACTIVITY(
     DETAILS VARCHAR NOT NULL
 );              
 ALTER TABLE PUBLIC.ACTIVITY ADD CONSTRAINT PUBLIC.PK_ACTIVITY PRIMARY KEY(ID); 
--- 6 +/- SELECT COUNT(*) FROM PUBLIC.ACTIVITY; 
+-- 7 +/- SELECT COUNT(*) FROM PUBLIC.ACTIVITY; 
 INSERT INTO PUBLIC.ACTIVITY(ID, TOPIC, TIMESTAMP, USER_ID, MODEL, MODEL_ID, DATABASE_ID, TABLE_ID, CUSTOM_ID, DETAILS) VALUES
-(1, 'install', TIMESTAMP '2019-12-27 13:55:00.236', NULL, 'install', NULL, NULL, NULL, NULL, '{}'),
-(2, 'user-joined', TIMESTAMP '2019-12-27 13:55:45.433', 1, 'user', 1, NULL, NULL, NULL, '{}'),
-(3, 'card-create', TIMESTAMP '2019-12-27 13:56:04.294', 1, 'card', 1, 1, 2, NULL, '{"name":"Orders, Count","description":null}'),
-(4, 'dashboard-create', TIMESTAMP '2019-12-27 13:56:07.749', 1, 'dashboard', 1, NULL, NULL, NULL, '{"description":null,"name":"orders in a dashboard"}'),
-(5, 'dashboard-add-cards', TIMESTAMP '2019-12-27 13:56:09.139', 1, 'dashboard', 1, NULL, NULL, NULL, '{"description":null,"name":"orders in a dashboard","dashcards":[{"name":"Orders, Count","description":null,"id":1,"card_id":1}]}'),
-(6, 'user-joined', TIMESTAMP '2019-12-27 13:56:21.216', 2, 'user', 2, NULL, NULL, NULL, '{}');          
+(1, 'install', TIMESTAMP '2020-01-09 12:20:56.198', NULL, 'install', NULL, NULL, NULL, NULL, '{}'),
+(2, 'user-joined', TIMESTAMP '2020-01-09 12:21:15.675', 1, 'user', 1, NULL, NULL, NULL, '{}'),
+(3, 'card-create', TIMESTAMP '2020-01-09 12:21:20.56', 1, 'card', 1, 1, 2, NULL, '{"name":"Orders","description":null}'),
+(4, 'card-create', TIMESTAMP '2020-01-09 12:21:24.065', 1, 'card', 2, 1, 2, NULL, '{"name":"Orders, Count","description":null}'),
+(5, 'dashboard-create', TIMESTAMP '2020-01-09 12:21:26.036', 1, 'dashboard', 1, NULL, NULL, NULL, '{"description":null,"name":"orders in a dashboard"}'),
+(6, 'dashboard-add-cards', TIMESTAMP '2020-01-09 12:21:26.685', 1, 'dashboard', 1, NULL, NULL, NULL, '{"description":null,"name":"orders in a dashboard","dashcards":[{"name":"Orders, Count","description":null,"id":1,"card_id":2}]}'),
+(7, 'user-joined', TIMESTAMP '2020-01-09 12:21:34.201', 2, 'user', 2, NULL, NULL, NULL, '{}');
 CREATE INDEX PUBLIC.IDX_ACTIVITY_TIMESTAMP ON PUBLIC.ACTIVITY(TIMESTAMP);      
 CREATE INDEX PUBLIC.IDX_ACTIVITY_USER_ID ON PUBLIC.ACTIVITY(USER_ID);          
 CREATE INDEX PUBLIC.IDX_ACTIVITY_CUSTOM_ID ON PUBLIC.ACTIVITY(CUSTOM_ID);      
 CREATE CACHED TABLE PUBLIC.METABASE_FIELDVALUES(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_04D09038_A138_44ED_A521_B47BEBEF99D0) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_04D09038_A138_44ED_A521_B47BEBEF99D0,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_3B5CA6D9_5EB7_4CE4_9A92_86BD747A6F94) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_3B5CA6D9_5EB7_4CE4_9A92_86BD747A6F94,
     CREATED_AT TIMESTAMP NOT NULL,
     UPDATED_AT TIMESTAMP NOT NULL,
     VALUES CLOB,
@@ -478,14 +481,37 @@ CREATE CACHED TABLE PUBLIC.METABASE_FIELDVALUES(
 ALTER TABLE PUBLIC.METABASE_FIELDVALUES ADD CONSTRAINT PUBLIC.PK_METABASE_FIELDVALUES PRIMARY KEY(ID);         
 -- 5 +/- SELECT COUNT(*) FROM PUBLIC.METABASE_FIELDVALUES;     
 INSERT INTO PUBLIC.METABASE_FIELDVALUES(ID, CREATED_AT, UPDATED_AT, VALUES, HUMAN_READABLE_VALUES, FIELD_ID) VALUES
-(1, TIMESTAMP '2019-12-27 13:55:07.233', TIMESTAMP '2019-12-27 13:55:07.233', '["Doohickey","Gadget","Gizmo","Widget"]', NULL, 6),
-(2, TIMESTAMP '2019-12-27 13:55:08.073', TIMESTAMP '2019-12-27 13:55:08.073', '[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,65,67,68,69,70,71,72,73,75,78,82,83,88,100]', NULL, 14),
-(3, TIMESTAMP '2019-12-27 13:55:08.103', TIMESTAMP '2019-12-27 13:55:08.103', '["Affiliate","Facebook","Google","Organic","Twitter"]', NULL, 24),
-(4, TIMESTAMP '2019-12-27 13:55:08.145', TIMESTAMP '2019-12-27 13:55:08.145', '["AK","AL","AR","AZ","CA","CO","CT","DE","FL","GA","IA","ID","IL","IN","KS","KY","LA","MA","MD","ME","MI","MN","MO","MS","MT","NC","ND","NE","NH","NJ","NM","NV","NY","OH","OK","OR","PA","RI","SC","SD","TN","TX","UT","VA","VT","WA","WI","WV","WY"]', NULL, 28),
-(5, TIMESTAMP '2019-12-27 13:55:08.176', TIMESTAMP '2019-12-27 13:55:08.176', '[1,2,3,4,5]', NULL, 36);
+(1, TIMESTAMP '2020-01-09 12:21:00.979', TIMESTAMP '2020-01-09 12:21:00.979', '["Doohickey","Gadget","Gizmo","Widget"]', NULL, 6),
+(2, TIMESTAMP '2020-01-09 12:21:01.552', TIMESTAMP '2020-01-09 12:21:01.552', '[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,65,67,68,69,70,71,72,73,75,78,82,83,88,100]', NULL, 14),
+(3, TIMESTAMP '2020-01-09 12:21:01.571', TIMESTAMP '2020-01-09 12:21:01.571', '["Affiliate","Facebook","Google","Organic","Twitter"]', NULL, 24),
+(4, TIMESTAMP '2020-01-09 12:21:01.582', TIMESTAMP '2020-01-09 12:21:01.582', '["AK","AL","AR","AZ","CA","CO","CT","DE","FL","GA","IA","ID","IL","IN","KS","KY","LA","MA","MD","ME","MI","MN","MO","MS","MT","NC","ND","NE","NH","NJ","NM","NV","NY","OH","OK","OR","PA","RI","SC","SD","TN","TX","UT","VA","VT","WA","WI","WV","WY"]', NULL, 28),
+(5, TIMESTAMP '2020-01-09 12:21:01.594', TIMESTAMP '2020-01-09 12:21:01.594', '[1,2,3,4,5]', NULL, 36);
 CREATE INDEX PUBLIC.IDX_FIELDVALUES_FIELD_ID ON PUBLIC.METABASE_FIELDVALUES(FIELD_ID);         
+CREATE CACHED TABLE PUBLIC.METABASE_DATABASE(
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_7743B25A_84A7_4694_B0C3_B2ED7B198BEB) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_7743B25A_84A7_4694_B0C3_B2ED7B198BEB,
+    CREATED_AT TIMESTAMP NOT NULL,
+    UPDATED_AT TIMESTAMP NOT NULL,
+    NAME VARCHAR(254) NOT NULL,
+    DESCRIPTION CLOB,
+    DETAILS CLOB,
+    ENGINE VARCHAR(254) NOT NULL,
+    IS_SAMPLE BOOLEAN DEFAULT FALSE NOT NULL,
+    IS_FULL_SYNC BOOLEAN DEFAULT TRUE NOT NULL,
+    POINTS_OF_INTEREST CLOB,
+    CAVEATS CLOB,
+    METADATA_SYNC_SCHEDULE VARCHAR(254) DEFAULT '0 50 * * * ? *' NOT NULL COMMENT 'The cron schedule string for when this database should undergo the metadata sync process (and analysis for new fields).',
+    CACHE_FIELD_VALUES_SCHEDULE VARCHAR(254) DEFAULT '0 50 0 * * ? *' NOT NULL COMMENT 'The cron schedule string for when FieldValues for eligible Fields should be updated.',
+    TIMEZONE VARCHAR(254) COMMENT 'Timezone identifier for the database, set by the sync process',
+    IS_ON_DEMAND BOOLEAN DEFAULT 'false' NOT NULL COMMENT 'Whether we should do On-Demand caching of FieldValues for this DB. This means FieldValues are updated when their Field is used in a Dashboard or Card param.',
+    OPTIONS CLOB COMMENT 'Serialized JSON containing various options like QB behavior.',
+    AUTO_RUN_QUERIES BOOLEAN DEFAULT TRUE NOT NULL COMMENT 'Whether to automatically run queries when doing simple filtering and summarizing in the Query Builder.'
+);             
+ALTER TABLE PUBLIC.METABASE_DATABASE ADD CONSTRAINT PUBLIC.PK_METABASE_DATABASE PRIMARY KEY(ID);               
+-- 1 +/- SELECT COUNT(*) FROM PUBLIC.METABASE_DATABASE;        
+INSERT INTO PUBLIC.METABASE_DATABASE(ID, CREATED_AT, UPDATED_AT, NAME, DESCRIPTION, DETAILS, ENGINE, IS_SAMPLE, IS_FULL_SYNC, POINTS_OF_INTEREST, CAVEATS, METADATA_SYNC_SCHEDULE, CACHE_FIELD_VALUES_SCHEDULE, TIMEZONE, IS_ON_DEMAND, OPTIONS, AUTO_RUN_QUERIES) VALUES
+(1, TIMESTAMP '2020-01-09 12:20:56.196', TIMESTAMP '2020-01-09 12:21:18.93', 'Sample Dataset', NULL, '{"db":"./resources/sample-dataset.db;USER=GUEST;PASSWORD=guest","let-user-control-scheduling":false}', 'h2', TRUE, TRUE, NULL, NULL, '0 0 * * * ? *', '0 0 0 * * ? *', 'America/Los_Angeles', FALSE, NULL, TRUE);              
 CREATE CACHED TABLE PUBLIC.PULSE(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_EAFAD778_2557_4599_B568_4B03F9B42195) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_EAFAD778_2557_4599_B568_4B03F9B42195,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_04718A31_596F_4BD7_BB12_0A7C913C16DE) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_04718A31_596F_4BD7_BB12_0A7C913C16DE,
     CREATOR_ID INT NOT NULL,
     NAME VARCHAR(254),
     CREATED_AT TIMESTAMP NOT NULL,
@@ -503,7 +529,7 @@ ALTER TABLE PUBLIC.PULSE ADD CONSTRAINT PUBLIC.PK_PULSE PRIMARY KEY(ID);
 CREATE INDEX PUBLIC.IDX_PULSE_CREATOR_ID ON PUBLIC.PULSE(CREATOR_ID);          
 CREATE INDEX PUBLIC.IDX_PULSE_COLLECTION_ID ON PUBLIC.PULSE(COLLECTION_ID);    
 CREATE CACHED TABLE PUBLIC.SEGMENT(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_004178AD_4EBE_4069_8E75_DE2F7F4283CD) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_004178AD_4EBE_4069_8E75_DE2F7F4283CD,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_6D44DCC6_ED02_4C28_A46B_FF159011EE3B) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_6D44DCC6_ED02_4C28_A46B_FF159011EE3B,
     TABLE_ID INT NOT NULL,
     CREATOR_ID INT NOT NULL,
     NAME VARCHAR(254) NOT NULL,
@@ -522,7 +548,7 @@ CREATE INDEX PUBLIC.IDX_SEGMENT_CREATOR_ID ON PUBLIC.SEGMENT(CREATOR_ID);
 CREATE INDEX PUBLIC.IDX_SEGMENT_TABLE_ID ON PUBLIC.SEGMENT(TABLE_ID);          
 CREATE INDEX PUBLIC.IDX_SEGMENT_SHOW_IN_GETTING_STARTED ON PUBLIC.SEGMENT(SHOW_IN_GETTING_STARTED);            
 CREATE CACHED TABLE PUBLIC.METRIC(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_9AA36E6C_26CC_44F6_A8C3_E4CB3200552E) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_9AA36E6C_26CC_44F6_A8C3_E4CB3200552E,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_40293BEB_F3DD_44FC_A328_59F4B74439E5) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_40293BEB_F3DD_44FC_A328_59F4B74439E5,
     TABLE_ID INT NOT NULL,
     CREATOR_ID INT NOT NULL,
     NAME VARCHAR(254) NOT NULL,
@@ -568,7 +594,7 @@ INSERT INTO PUBLIC.QRTZ_JOB_DETAILS(SCHED_NAME, JOB_NAME, JOB_GROUP, DESCRIPTION
 CREATE INDEX PUBLIC.IDX_QRTZ_J_REQ_RECOVERY ON PUBLIC.QRTZ_JOB_DETAILS(SCHED_NAME, REQUESTS_RECOVERY);         
 CREATE INDEX PUBLIC.IDX_QRTZ_J_GRP ON PUBLIC.QRTZ_JOB_DETAILS(SCHED_NAME, JOB_GROUP);          
 CREATE CACHED TABLE PUBLIC.REPORT_CARDFAVORITE(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_83D6C5B8_ECD9_466D_B0AF_376398D09158) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_83D6C5B8_ECD9_466D_B0AF_376398D09158,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_2B9E56DD_CE23_4C2B_9CAA_5F64BF8F2AC1) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_2B9E56DD_CE23_4C2B_9CAA_5F64BF8F2AC1,
     CREATED_AT TIMESTAMP NOT NULL,
     UPDATED_AT TIMESTAMP NOT NULL,
     CARD_ID INT NOT NULL,
@@ -578,29 +604,6 @@ ALTER TABLE PUBLIC.REPORT_CARDFAVORITE ADD CONSTRAINT PUBLIC.PK_REPORT_CARDFAVOR
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.REPORT_CARDFAVORITE;      
 CREATE INDEX PUBLIC.IDX_CARDFAVORITE_CARD_ID ON PUBLIC.REPORT_CARDFAVORITE(CARD_ID);           
 CREATE INDEX PUBLIC.IDX_CARDFAVORITE_OWNER_ID ON PUBLIC.REPORT_CARDFAVORITE(OWNER_ID);         
-CREATE CACHED TABLE PUBLIC.METABASE_DATABASE(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_F13B9F0D_F22D_4F12_A158_24540D39401D) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_F13B9F0D_F22D_4F12_A158_24540D39401D,
-    CREATED_AT TIMESTAMP NOT NULL,
-    UPDATED_AT TIMESTAMP NOT NULL,
-    NAME VARCHAR(254) NOT NULL,
-    DESCRIPTION CLOB,
-    DETAILS CLOB,
-    ENGINE VARCHAR(254) NOT NULL,
-    IS_SAMPLE BOOLEAN DEFAULT FALSE NOT NULL,
-    IS_FULL_SYNC BOOLEAN DEFAULT TRUE NOT NULL,
-    POINTS_OF_INTEREST CLOB,
-    CAVEATS CLOB,
-    METADATA_SYNC_SCHEDULE VARCHAR(254) DEFAULT '0 50 * * * ? *' NOT NULL COMMENT 'The cron schedule string for when this database should undergo the metadata sync process (and analysis for new fields).',
-    CACHE_FIELD_VALUES_SCHEDULE VARCHAR(254) DEFAULT '0 50 0 * * ? *' NOT NULL COMMENT 'The cron schedule string for when FieldValues for eligible Fields should be updated.',
-    TIMEZONE VARCHAR(254) COMMENT 'Timezone identifier for the database, set by the sync process',
-    IS_ON_DEMAND BOOLEAN DEFAULT 'false' NOT NULL COMMENT 'Whether we should do On-Demand caching of FieldValues for this DB. This means FieldValues are updated when their Field is used in a Dashboard or Card param.',
-    OPTIONS CLOB COMMENT 'Serialized JSON containing various options like QB behavior.',
-    AUTO_RUN_QUERIES BOOLEAN DEFAULT TRUE NOT NULL COMMENT 'Whether to automatically run queries when doing simple filtering and summarizing in the Query Builder.'
-);             
-ALTER TABLE PUBLIC.METABASE_DATABASE ADD CONSTRAINT PUBLIC.PK_METABASE_DATABASE PRIMARY KEY(ID);               
--- 1 +/- SELECT COUNT(*) FROM PUBLIC.METABASE_DATABASE;        
-INSERT INTO PUBLIC.METABASE_DATABASE(ID, CREATED_AT, UPDATED_AT, NAME, DESCRIPTION, DETAILS, ENGINE, IS_SAMPLE, IS_FULL_SYNC, POINTS_OF_INTEREST, CAVEATS, METADATA_SYNC_SCHEDULE, CACHE_FIELD_VALUES_SCHEDULE, TIMEZONE, IS_ON_DEMAND, OPTIONS, AUTO_RUN_QUERIES) VALUES
-(1, TIMESTAMP '2019-12-27 13:55:00.235', TIMESTAMP '2019-12-27 13:55:56.158', 'Sample Dataset', NULL, '{"db":"./resources/sample-dataset.db;USER=GUEST;PASSWORD=guest","let-user-control-scheduling":false}', 'h2', TRUE, TRUE, NULL, NULL, '0 0 * * * ? *', '0 0 0 * * ? *', 'America/Los_Angeles', FALSE, NULL, TRUE);             
 CREATE CACHED TABLE PUBLIC.QRTZ_TRIGGERS COMMENT 'Used for Quartz scheduler.'(
     SCHED_NAME VARCHAR(120) NOT NULL,
     TRIGGER_NAME VARCHAR(200) NOT NULL,
@@ -622,14 +625,14 @@ CREATE CACHED TABLE PUBLIC.QRTZ_TRIGGERS COMMENT 'Used for Quartz scheduler.'(
 ALTER TABLE PUBLIC.QRTZ_TRIGGERS ADD CONSTRAINT PUBLIC.PK_QRTZ_TRIGGERS PRIMARY KEY(SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);  
 -- 8 +/- SELECT COUNT(*) FROM PUBLIC.QRTZ_TRIGGERS;            
 INSERT INTO PUBLIC.QRTZ_TRIGGERS(SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, JOB_NAME, JOB_GROUP, DESCRIPTION, NEXT_FIRE_TIME, PREV_FIRE_TIME, PRIORITY, TRIGGER_STATE, TRIGGER_TYPE, START_TIME, END_TIME, CALENDAR_NAME, MISFIRE_INSTR, JOB_DATA) VALUES
-('MetabaseScheduler', 'metabase.task.upgrade-checks.trigger', 'DEFAULT', 'metabase.task.upgrade-checks.job', 'DEFAULT', NULL, 1577499300000, -1, 5, 'WAITING', 'CRON', 1577483700000, 0, NULL, 0, X''),
-('MetabaseScheduler', 'metabase.task.anonymous-stats.trigger', 'DEFAULT', 'metabase.task.anonymous-stats.job', 'DEFAULT', NULL, 1577546100000, -1, 5, 'WAITING', 'CRON', 1577483700000, 0, NULL, 0, X''),
-('MetabaseScheduler', 'metabase.task.abandonment-emails.trigger', 'DEFAULT', 'metabase.task.abandonment-emails.job', 'DEFAULT', NULL, 1577563200000, -1, 5, 'WAITING', 'CRON', 1577483700000, 0, NULL, 0, X''),
-('MetabaseScheduler', 'metabase.task.send-pulses.trigger', 'DEFAULT', 'metabase.task.send-pulses.job', 'DEFAULT', NULL, 1577484000000, -1, 5, 'WAITING', 'CRON', 1577483700000, 0, NULL, 1, X''),
-('MetabaseScheduler', 'metabase.task.follow-up-emails.trigger', 'DEFAULT', 'metabase.task.follow-up-emails.job', 'DEFAULT', NULL, 1577563200000, -1, 5, 'WAITING', 'CRON', 1577483700000, 0, NULL, 0, X''),
-('MetabaseScheduler', 'metabase.task.task-history-cleanup.trigger', 'DEFAULT', 'metabase.task.task-history-cleanup.job', 'DEFAULT', NULL, 1577484000000, -1, 5, 'WAITING', 'CRON', 1577483700000, 0, NULL, 0, X''),
-('MetabaseScheduler', 'metabase.task.sync-and-analyze.trigger.1', 'DEFAULT', 'metabase.task.sync-and-analyze.job', 'DEFAULT', 'sync-and-analyze Database 1', 1577484000000, -1, 5, 'WAITING', 'CRON', 1577483756000, 0, NULL, 2, X'aced0005737200156f72672e71756172747a2e4a6f62446174614d61709fb083e8bfa9b0cb020000787200266f72672e71756172747a2e7574696c732e537472696e674b65794469727479466c61674d61708208e8c3fbc55d280200015a0013616c6c6f77735472616e7369656e74446174617872001d6f72672e71756172747a2e7574696c732e4469727479466c61674d617013e62ead28760ace0200025a000564697274794c00036d617074000f4c6a6176612f7574696c2f4d61703b787001737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f4000000000000c7708000000100000000174000564622d6964737200116a6176612e6c616e672e496e746567657212e2a0a4f781873802000149000576616c7565787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b0200007870000000017800'),
-('MetabaseScheduler', 'metabase.task.update-field-values.trigger.1', 'DEFAULT', 'metabase.task.update-field-values.job', 'DEFAULT', 'update-field-values Database 1', 1577520000000, -1, 5, 'WAITING', 'CRON', 1577483756000, 0, NULL, 2, X'aced0005737200156f72672e71756172747a2e4a6f62446174614d61709fb083e8bfa9b0cb020000787200266f72672e71756172747a2e7574696c732e537472696e674b65794469727479466c61674d61708208e8c3fbc55d280200015a0013616c6c6f77735472616e7369656e74446174617872001d6f72672e71756172747a2e7574696c732e4469727479466c61674d617013e62ead28760ace0200025a000564697274794c00036d617074000f4c6a6176612f7574696c2f4d61703b787001737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f4000000000000c7708000000100000000174000564622d6964737200116a6176612e6c616e672e496e746567657212e2a0a4f781873802000149000576616c7565787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b0200007870000000017800');     
+('MetabaseScheduler', 'metabase.task.upgrade-checks.trigger', 'DEFAULT', 'metabase.task.upgrade-checks.job', 'DEFAULT', NULL, 1578622500000, -1, 5, 'WAITING', 'CRON', 1578601256000, 0, NULL, 0, X''),
+('MetabaseScheduler', 'metabase.task.anonymous-stats.trigger', 'DEFAULT', 'metabase.task.anonymous-stats.job', 'DEFAULT', NULL, 1578669300000, -1, 5, 'WAITING', 'CRON', 1578601256000, 0, NULL, 0, X''),
+('MetabaseScheduler', 'metabase.task.abandonment-emails.trigger', 'DEFAULT', 'metabase.task.abandonment-emails.job', 'DEFAULT', NULL, 1578686400000, -1, 5, 'WAITING', 'CRON', 1578601256000, 0, NULL, 0, X''),
+('MetabaseScheduler', 'metabase.task.send-pulses.trigger', 'DEFAULT', 'metabase.task.send-pulses.job', 'DEFAULT', NULL, 1578603600000, -1, 5, 'WAITING', 'CRON', 1578601256000, 0, NULL, 1, X''),
+('MetabaseScheduler', 'metabase.task.follow-up-emails.trigger', 'DEFAULT', 'metabase.task.follow-up-emails.job', 'DEFAULT', NULL, 1578686400000, -1, 5, 'WAITING', 'CRON', 1578601256000, 0, NULL, 0, X''),
+('MetabaseScheduler', 'metabase.task.task-history-cleanup.trigger', 'DEFAULT', 'metabase.task.task-history-cleanup.job', 'DEFAULT', NULL, 1578603600000, -1, 5, 'WAITING', 'CRON', 1578601256000, 0, NULL, 0, X''),
+('MetabaseScheduler', 'metabase.task.sync-and-analyze.trigger.1', 'DEFAULT', 'metabase.task.sync-and-analyze.job', 'DEFAULT', 'sync-and-analyze Database 1', 1578603600000, -1, 5, 'WAITING', 'CRON', 1578601278000, 0, NULL, 2, X'aced0005737200156f72672e71756172747a2e4a6f62446174614d61709fb083e8bfa9b0cb020000787200266f72672e71756172747a2e7574696c732e537472696e674b65794469727479466c61674d61708208e8c3fbc55d280200015a0013616c6c6f77735472616e7369656e74446174617872001d6f72672e71756172747a2e7574696c732e4469727479466c61674d617013e62ead28760ace0200025a000564697274794c00036d617074000f4c6a6176612f7574696c2f4d61703b787001737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f4000000000000c7708000000100000000174000564622d6964737200116a6176612e6c616e672e496e746567657212e2a0a4f781873802000149000576616c7565787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b0200007870000000017800'),
+('MetabaseScheduler', 'metabase.task.update-field-values.trigger.1', 'DEFAULT', 'metabase.task.update-field-values.job', 'DEFAULT', 'update-field-values Database 1', 1578643200000, -1, 5, 'WAITING', 'CRON', 1578601278000, 0, NULL, 2, X'aced0005737200156f72672e71756172747a2e4a6f62446174614d61709fb083e8bfa9b0cb020000787200266f72672e71756172747a2e7574696c732e537472696e674b65794469727479466c61674d61708208e8c3fbc55d280200015a0013616c6c6f77735472616e7369656e74446174617872001d6f72672e71756172747a2e7574696c732e4469727479466c61674d617013e62ead28760ace0200025a000564697274794c00036d617074000f4c6a6176612f7574696c2f4d61703b787001737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f4000000000000c7708000000100000000174000564622d6964737200116a6176612e6c616e672e496e746567657212e2a0a4f781873802000149000576616c7565787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b0200007870000000017800');     
 CREATE INDEX PUBLIC.IDX_QRTZ_T_J ON PUBLIC.QRTZ_TRIGGERS(SCHED_NAME, JOB_NAME, JOB_GROUP);     
 CREATE INDEX PUBLIC.IDX_QRTZ_T_JG ON PUBLIC.QRTZ_TRIGGERS(SCHED_NAME, JOB_GROUP);              
 CREATE INDEX PUBLIC.IDX_QRTZ_T_C ON PUBLIC.QRTZ_TRIGGERS(SCHED_NAME, CALENDAR_NAME);           
@@ -643,7 +646,7 @@ CREATE INDEX PUBLIC.IDX_QRTZ_T_NFT_MISFIRE ON PUBLIC.QRTZ_TRIGGERS(SCHED_NAME, M
 CREATE INDEX PUBLIC.IDX_QRTZ_T_NFT_ST_MISFIRE ON PUBLIC.QRTZ_TRIGGERS(SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_STATE);               
 CREATE INDEX PUBLIC.IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON PUBLIC.QRTZ_TRIGGERS(SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_GROUP, TRIGGER_STATE);            
 CREATE CACHED TABLE PUBLIC.COMPUTATION_JOB COMMENT 'Stores submitted async computation jobs.'(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_961FFF43_7B14_4432_979E_29B47765492A) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_961FFF43_7B14_4432_979E_29B47765492A,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_A24111B2_BA6C_4677_ACC5_BF512C758DF4) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A24111B2_BA6C_4677_ACC5_BF512C758DF4,
     CREATOR_ID INT,
     CREATED_AT TIMESTAMP NOT NULL,
     UPDATED_AT TIMESTAMP NOT NULL,
@@ -655,7 +658,7 @@ CREATE CACHED TABLE PUBLIC.COMPUTATION_JOB COMMENT 'Stores submitted async compu
 ALTER TABLE PUBLIC.COMPUTATION_JOB ADD CONSTRAINT PUBLIC.PK_COMPUTATION_JOB PRIMARY KEY(ID);   
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.COMPUTATION_JOB;          
 CREATE CACHED TABLE PUBLIC.PULSE_CARD(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_4B685D34_945B_4BBB_8611_8CBE9911C3F2) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_4B685D34_945B_4BBB_8611_8CBE9911C3F2,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_95E44CE8_C085_4803_9E1B_68E9CC44F285) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_95E44CE8_C085_4803_9E1B_68E9CC44F285,
     PULSE_ID INT NOT NULL,
     CARD_ID INT NOT NULL,
     POSITION INT NOT NULL,
@@ -675,7 +678,7 @@ ALTER TABLE PUBLIC.QUERY_CACHE ADD CONSTRAINT PUBLIC.PK_QUERY_CACHE PRIMARY KEY(
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.QUERY_CACHE;              
 CREATE INDEX PUBLIC.IDX_QUERY_CACHE_UPDATED_AT ON PUBLIC.QUERY_CACHE(UPDATED_AT);              
 CREATE CACHED TABLE PUBLIC.CARD_LABEL(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_AD86AFFE_C465_4DB5_9323_5D7EA4F8BE46) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_AD86AFFE_C465_4DB5_9323_5D7EA4F8BE46,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_4000F194_F105_4A55_A439_C1D4DC1DF7A7) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_4000F194_F105_4A55_A439_C1D4DC1DF7A7,
     CARD_ID INT NOT NULL,
     LABEL_ID INT NOT NULL
 );   
@@ -684,7 +687,7 @@ ALTER TABLE PUBLIC.CARD_LABEL ADD CONSTRAINT PUBLIC.PK_CARD_LABEL PRIMARY KEY(ID
 CREATE INDEX PUBLIC.IDX_CARD_LABEL_CARD_ID ON PUBLIC.CARD_LABEL(CARD_ID);      
 CREATE INDEX PUBLIC.IDX_CARD_LABEL_LABEL_ID ON PUBLIC.CARD_LABEL(LABEL_ID);    
 CREATE CACHED TABLE PUBLIC.DIMENSION COMMENT 'Stores references to alternate views of existing fields, such as remapping an integer to a description, like an enum'(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_61D13869_98BB_4997_B092_515D9263C392) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_61D13869_98BB_4997_B092_515D9263C392,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_7F6C7A35_56C8_4B05_94BF_87AAE631651D) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_7F6C7A35_56C8_4B05_94BF_87AAE631651D,
     FIELD_ID INT NOT NULL COMMENT 'ID of the field this dimension row applies to',
     NAME VARCHAR(254) NOT NULL COMMENT 'Short description used as the display name of this new column',
     TYPE VARCHAR(254) NOT NULL COMMENT 'Either internal for a user defined remapping or external for a foreign key based remapping',
@@ -696,7 +699,7 @@ ALTER TABLE PUBLIC.DIMENSION ADD CONSTRAINT PUBLIC.PK_DIMENSION PRIMARY KEY(ID);
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.DIMENSION;
 CREATE INDEX PUBLIC.IDX_DIMENSION_FIELD_ID ON PUBLIC.DIMENSION(FIELD_ID);      
 CREATE CACHED TABLE PUBLIC.METABASE_FIELD(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_5E58DB27_82A5_4D5F_BB57_EEC19CB94FB3) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5E58DB27_82A5_4D5F_BB57_EEC19CB94FB3,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_14756EB4_E9C9_40A3_BE85_DA69A810BD0D) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_14756EB4_E9C9_40A3_BE85_DA69A810BD0D,
     CREATED_AT TIMESTAMP NOT NULL,
     UPDATED_AT TIMESTAMP NOT NULL,
     NAME VARCHAR(254) NOT NULL,
@@ -723,65 +726,66 @@ CREATE CACHED TABLE PUBLIC.METABASE_FIELD(
 ALTER TABLE PUBLIC.METABASE_FIELD ADD CONSTRAINT PUBLIC.PK_METABASE_FIELD PRIMARY KEY(ID);     
 -- 36 +/- SELECT COUNT(*) FROM PUBLIC.METABASE_FIELD;          
 INSERT INTO PUBLIC.METABASE_FIELD(ID, CREATED_AT, UPDATED_AT, NAME, BASE_TYPE, SPECIAL_TYPE, ACTIVE, DESCRIPTION, PREVIEW_DISPLAY, POSITION, TABLE_ID, PARENT_ID, DISPLAY_NAME, VISIBILITY_TYPE, FK_TARGET_FIELD_ID, LAST_ANALYZED, POINTS_OF_INTEREST, CAVEATS, FINGERPRINT, FINGERPRINT_VERSION, DATABASE_TYPE, HAS_FIELD_VALUES, SETTINGS) VALUES
-(1, TIMESTAMP '2019-12-27 13:55:00.773', TIMESTAMP '2019-12-27 13:55:02.015', 'EAN', 'type/Text', NULL, TRUE, 'The international article number. A 13 digit number uniquely identifying the product.', TRUE, 0, 1, NULL, 'Ean', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":200,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":13.0}}}', 4, 'CHAR', NULL, NULL),
-(2, TIMESTAMP '2019-12-27 13:55:00.774', TIMESTAMP '2019-12-27 13:55:06.959', 'RATING', 'type/Float', 'type/Score', TRUE, 'The average rating users have given the product. This ranges from 1 - 5', TRUE, 0, 1, NULL, 'Rating', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":23,"nil%":0.0},"type":{"type/Number":{"min":0.0,"max":5.0,"avg":3.4715,"sd":1.3605488657451452,"q1":3.5120465053408525,"q3":4.216124969497314}}}', 4, 'DOUBLE', NULL, NULL),
-(3, TIMESTAMP '2019-12-27 13:55:00.775', TIMESTAMP '2019-12-27 13:55:02.017', 'PRICE', 'type/Float', NULL, TRUE, 'The list price of the product. Note that this is not always the price the product sold for due to discounts, promotions, etc.', TRUE, 0, 1, NULL, 'Price', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":170,"nil%":0.0},"type":{"type/Number":{"min":15.691943673970439,"max":98.81933684368194,"avg":55.74639966792074,"sd":21.711481557852057,"q1":37.25154462926434,"q3":75.45898071609447}}}', 4, 'DOUBLE', NULL, NULL),
-(4, TIMESTAMP '2019-12-27 13:55:00.776', TIMESTAMP '2019-12-27 13:55:00.776', 'ID', 'type/BigInteger', 'type/PK', TRUE, 'The numerical product number. Only used internally. All external communication should use the title or EAN.', TRUE, 0, 1, NULL, 'ID', 'normal', NULL, NULL, NULL, NULL, NULL, 0, 'BIGINT', NULL, NULL),
-(5, TIMESTAMP '2019-12-27 13:55:00.777', TIMESTAMP '2019-12-27 13:55:06.964', 'TITLE', 'type/Text', 'type/Title', TRUE, 'The name of the product as it should be displayed to customers.', TRUE, 0, 1, NULL, 'Title', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":199,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":21.495}}}', 4, 'VARCHAR', NULL, NULL),
-(6, TIMESTAMP '2019-12-27 13:55:00.778', TIMESTAMP '2019-12-27 13:55:06.968', 'CATEGORY', 'type/Text', 'type/Category', TRUE, 'The type of product, valid values include: Doohicky, Gadget, Gizmo and Widget', TRUE, 0, 1, NULL, 'Category', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":4,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":6.375}}}', 4, 'VARCHAR', 'auto-list', NULL),
-(7, TIMESTAMP '2019-12-27 13:55:00.778', TIMESTAMP '2019-12-27 13:55:06.972', 'CREATED_AT', 'type/DateTime', 'type/CreationTimestamp', TRUE, 'The date the product was added to our catalog.', TRUE, 0, 1, NULL, 'Created At', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":200,"nil%":0.0},"type":{"type/DateTime":{"earliest":"2016-04-26T19:29:55.147","latest":"2019-04-15T13:34:19.931"}}}', 4, 'TIMESTAMP', NULL, NULL),
-(8, TIMESTAMP '2019-12-27 13:55:00.779', TIMESTAMP '2019-12-27 13:55:06.975', 'VENDOR', 'type/Text', 'type/Company', TRUE, 'The source of the product.', TRUE, 0, 1, NULL, 'Vendor', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":200,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":20.6}}}', 4, 'VARCHAR', NULL, NULL),
-(9, TIMESTAMP '2019-12-27 13:55:00.853', TIMESTAMP '2019-12-27 13:55:04.201', 'USER_ID', 'type/Integer', 'type/FK', TRUE, 'The id of the user who made this order. Note that in some cases where an order was created on behalf of a customer who phoned the order in, this might be the employee who handled the request.', TRUE, 0, 2, NULL, 'User ID', 'normal', 21, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":929,"nil%":0.0}}', 4, 'INTEGER', NULL, NULL);     
+(1, TIMESTAMP '2020-01-09 12:20:56.615', TIMESTAMP '2020-01-09 12:20:57.471', 'EAN', 'type/Text', NULL, TRUE, 'The international article number. A 13 digit number uniquely identifying the product.', TRUE, 0, 1, NULL, 'Ean', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":200,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":13.0}}}', 4, 'CHAR', NULL, NULL),
+(2, TIMESTAMP '2020-01-09 12:20:56.616', TIMESTAMP '2020-01-09 12:21:00.883', 'RATING', 'type/Float', 'type/Score', TRUE, 'The average rating users have given the product. This ranges from 1 - 5', TRUE, 0, 1, NULL, 'Rating', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":23,"nil%":0.0},"type":{"type/Number":{"min":0.0,"max":5.0,"avg":3.4715,"sd":1.3605488657451452,"q1":3.5120465053408525,"q3":4.216124969497314}}}', 4, 'DOUBLE', NULL, NULL),
+(3, TIMESTAMP '2020-01-09 12:20:56.617', TIMESTAMP '2020-01-09 12:20:57.473', 'PRICE', 'type/Float', NULL, TRUE, 'The list price of the product. Note that this is not always the price the product sold for due to discounts, promotions, etc.', TRUE, 0, 1, NULL, 'Price', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":170,"nil%":0.0},"type":{"type/Number":{"min":15.691943673970439,"max":98.81933684368194,"avg":55.74639966792074,"sd":21.711481557852057,"q1":37.25154462926434,"q3":75.45898071609447}}}', 4, 'DOUBLE', NULL, NULL),
+(4, TIMESTAMP '2020-01-09 12:20:56.617', TIMESTAMP '2020-01-09 12:20:56.617', 'ID', 'type/BigInteger', 'type/PK', TRUE, 'The numerical product number. Only used internally. All external communication should use the title or EAN.', TRUE, 0, 1, NULL, 'ID', 'normal', NULL, NULL, NULL, NULL, NULL, 0, 'BIGINT', NULL, NULL),
+(5, TIMESTAMP '2020-01-09 12:20:56.618', TIMESTAMP '2020-01-09 12:21:00.886', 'TITLE', 'type/Text', 'type/Title', TRUE, 'The name of the product as it should be displayed to customers.', TRUE, 0, 1, NULL, 'Title', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":199,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":21.495}}}', 4, 'VARCHAR', NULL, NULL),
+(6, TIMESTAMP '2020-01-09 12:20:56.618', TIMESTAMP '2020-01-09 12:21:00.887', 'CATEGORY', 'type/Text', 'type/Category', TRUE, 'The type of product, valid values include: Doohicky, Gadget, Gizmo and Widget', TRUE, 0, 1, NULL, 'Category', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":4,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":6.375}}}', 4, 'VARCHAR', 'auto-list', NULL),
+(7, TIMESTAMP '2020-01-09 12:20:56.619', TIMESTAMP '2020-01-09 12:21:00.889', 'CREATED_AT', 'type/DateTime', 'type/CreationTimestamp', TRUE, 'The date the product was added to our catalog.', TRUE, 0, 1, NULL, 'Created At', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":200,"nil%":0.0},"type":{"type/DateTime":{"earliest":"2016-04-26T19:29:55.147","latest":"2019-04-15T13:34:19.931"}}}', 4, 'TIMESTAMP', NULL, NULL),
+(8, TIMESTAMP '2020-01-09 12:20:56.62', TIMESTAMP '2020-01-09 12:21:00.89', 'VENDOR', 'type/Text', 'type/Company', TRUE, 'The source of the product.', TRUE, 0, 1, NULL, 'Vendor', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":200,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":20.6}}}', 4, 'VARCHAR', NULL, NULL),
+(9, TIMESTAMP '2020-01-09 12:20:56.687', TIMESTAMP '2020-01-09 12:20:58.846', 'USER_ID', 'type/Integer', 'type/FK', TRUE, 'The id of the user who made this order. Note that in some cases where an order was created on behalf of a customer who phoned the order in, this might be the employee who handled the request.', TRUE, 0, 2, NULL, 'User ID', 'normal', 21, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":929,"nil%":0.0}}', 4, 'INTEGER', NULL, NULL);               
 INSERT INTO PUBLIC.METABASE_FIELD(ID, CREATED_AT, UPDATED_AT, NAME, BASE_TYPE, SPECIAL_TYPE, ACTIVE, DESCRIPTION, PREVIEW_DISPLAY, POSITION, TABLE_ID, PARENT_ID, DISPLAY_NAME, VISIBILITY_TYPE, FK_TARGET_FIELD_ID, LAST_ANALYZED, POINTS_OF_INTEREST, CAVEATS, FINGERPRINT, FINGERPRINT_VERSION, DATABASE_TYPE, HAS_FIELD_VALUES, SETTINGS) VALUES
-(10, TIMESTAMP '2019-12-27 13:55:00.854', TIMESTAMP '2019-12-27 13:55:06.986', 'DISCOUNT', 'type/Float', 'type/Discount', TRUE, 'Discount amount.', TRUE, 0, 2, NULL, 'Discount', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":701,"nil%":0.898},"type":{"type/Number":{"min":0.17088996672584322,"max":61.69684269960571,"avg":5.161255547580326,"sd":3.053663125001991,"q1":2.9786226681458743,"q3":7.338187788658235}}}', 4, 'DOUBLE', NULL, NULL),
-(11, TIMESTAMP '2019-12-27 13:55:00.855', TIMESTAMP '2019-12-27 13:55:04.204', 'PRODUCT_ID', 'type/Integer', 'type/FK', TRUE, 'The product ID. This is an internal identifier for the product, NOT the SKU.', TRUE, 0, 2, NULL, 'Product ID', 'normal', 4, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":200,"nil%":0.0}}', 4, 'INTEGER', NULL, NULL),
-(12, TIMESTAMP '2019-12-27 13:55:00.856', TIMESTAMP '2019-12-27 13:55:00.856', 'ID', 'type/BigInteger', 'type/PK', TRUE, STRINGDECODE('This is a unique ID for the product. It is also called the \u201cInvoice number\u201d or \u201cConfirmation number\u201d in customer facing emails and screens.'), TRUE, 0, 2, NULL, 'ID', 'normal', NULL, NULL, NULL, NULL, NULL, 0, 'BIGINT', NULL, NULL),
-(13, TIMESTAMP '2019-12-27 13:55:00.857', TIMESTAMP '2019-12-27 13:55:04.205', 'SUBTOTAL', 'type/Float', NULL, TRUE, 'The raw, pre-tax cost of the order. Note that this might be different in the future from the product price due to promotions, credits, etc.', TRUE, 0, 2, NULL, 'Subtotal', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":340,"nil%":0.0},"type":{"type/Number":{"min":15.691943673970439,"max":148.22900526552291,"avg":77.01295465356547,"sd":32.53705013056317,"q1":49.74894519060184,"q3":105.42965746993103}}}', 4, 'DOUBLE', NULL, NULL),
-(14, TIMESTAMP '2019-12-27 13:55:00.857', TIMESTAMP '2019-12-27 13:55:06.997', 'QUANTITY', 'type/Integer', 'type/Quantity', TRUE, 'Number of products bought.', TRUE, 0, 2, NULL, 'Quantity', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":62,"nil%":0.0},"type":{"type/Number":{"min":0.0,"max":100.0,"avg":3.7015,"sd":4.214258386403798,"q1":1.755882607764982,"q3":4.882654507928044}}}', 4, 'INTEGER', 'auto-list', NULL),
-(15, TIMESTAMP '2019-12-27 13:55:00.858', TIMESTAMP '2019-12-27 13:55:07.002', 'CREATED_AT', 'type/DateTime', 'type/CreationTimestamp', TRUE, 'The date and time an order was submitted.', TRUE, 0, 2, NULL, 'Created At', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":9998,"nil%":0.0},"type":{"type/DateTime":{"earliest":"2016-04-30T18:56:13.352","latest":"2020-04-19T14:07:15.657"}}}', 4, 'TIMESTAMP', NULL, NULL),
-(16, TIMESTAMP '2019-12-27 13:55:00.859', TIMESTAMP '2019-12-27 13:55:04.208', 'TAX', 'type/Float', NULL, TRUE, 'This is the amount of local and federal taxes that are collected on the purchase. Note that other governmental fees on some products are not included here, but instead are accounted for in the subtotal.', TRUE, 0, 2, NULL, 'Tax', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":797,"nil%":0.0},"type":{"type/Number":{"min":0.0,"max":11.12,"avg":3.8722100000000004,"sd":2.3206651358900316,"q1":2.273340386603857,"q3":5.337275338216307}}}', 4, 'DOUBLE', NULL, NULL),
-(17, TIMESTAMP '2019-12-27 13:55:00.86', TIMESTAMP '2019-12-27 13:55:04.209', 'TOTAL', 'type/Float', NULL, TRUE, 'The total billed amount.', TRUE, 0, 2, NULL, 'Total', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":10000,"nil%":0.0},"type":{"type/Number":{"min":12.061602936923117,"max":238.32732001721533,"avg":82.96014815230805,"sd":38.35967664847571,"q1":52.006147617878135,"q3":109.55803018499738}}}', 4, 'DOUBLE', NULL, NULL);     
+(10, TIMESTAMP '2020-01-09 12:20:56.687', TIMESTAMP '2020-01-09 12:21:00.895', 'DISCOUNT', 'type/Float', 'type/Discount', TRUE, 'Discount amount.', TRUE, 0, 2, NULL, 'Discount', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":701,"nil%":0.898},"type":{"type/Number":{"min":0.17088996672584322,"max":61.69684269960571,"avg":5.161255547580326,"sd":3.053663125001991,"q1":2.9786226681458743,"q3":7.338187788658235}}}', 4, 'DOUBLE', NULL, NULL),
+(11, TIMESTAMP '2020-01-09 12:20:56.688', TIMESTAMP '2020-01-09 12:20:58.848', 'PRODUCT_ID', 'type/Integer', 'type/FK', TRUE, 'The product ID. This is an internal identifier for the product, NOT the SKU.', TRUE, 0, 2, NULL, 'Product ID', 'normal', 4, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":200,"nil%":0.0}}', 4, 'INTEGER', NULL, NULL),
+(12, TIMESTAMP '2020-01-09 12:20:56.689', TIMESTAMP '2020-01-09 12:20:56.689', 'ID', 'type/BigInteger', 'type/PK', TRUE, STRINGDECODE('This is a unique ID for the product. It is also called the \u201cInvoice number\u201d or \u201cConfirmation number\u201d in customer facing emails and screens.'), TRUE, 0, 2, NULL, 'ID', 'normal', NULL, NULL, NULL, NULL, NULL, 0, 'BIGINT', NULL, NULL),
+(13, TIMESTAMP '2020-01-09 12:20:56.689', TIMESTAMP '2020-01-09 12:20:58.849', 'SUBTOTAL', 'type/Float', NULL, TRUE, 'The raw, pre-tax cost of the order. Note that this might be different in the future from the product price due to promotions, credits, etc.', TRUE, 0, 2, NULL, 'Subtotal', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":340,"nil%":0.0},"type":{"type/Number":{"min":15.691943673970439,"max":148.22900526552291,"avg":77.01295465356547,"sd":32.53705013056317,"q1":49.74894519060184,"q3":105.42965746993103}}}', 4, 'DOUBLE', NULL, NULL),
+(14, TIMESTAMP '2020-01-09 12:20:56.689', TIMESTAMP '2020-01-09 12:21:00.898', 'QUANTITY', 'type/Integer', 'type/Quantity', TRUE, 'Number of products bought.', TRUE, 0, 2, NULL, 'Quantity', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":62,"nil%":0.0},"type":{"type/Number":{"min":0.0,"max":100.0,"avg":3.7015,"sd":4.214258386403798,"q1":1.755882607764982,"q3":4.882654507928044}}}', 4, 'INTEGER', 'auto-list', NULL),
+(15, TIMESTAMP '2020-01-09 12:20:56.69', TIMESTAMP '2020-01-09 12:21:00.899', 'CREATED_AT', 'type/DateTime', 'type/CreationTimestamp', TRUE, 'The date and time an order was submitted.', TRUE, 0, 2, NULL, 'Created At', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":9998,"nil%":0.0},"type":{"type/DateTime":{"earliest":"2016-04-30T18:56:13.352","latest":"2020-04-19T14:07:15.657"}}}', 4, 'TIMESTAMP', NULL, NULL),
+(16, TIMESTAMP '2020-01-09 12:20:56.69', TIMESTAMP '2020-01-09 12:20:58.851', 'TAX', 'type/Float', NULL, TRUE, 'This is the amount of local and federal taxes that are collected on the purchase. Note that other governmental fees on some products are not included here, but instead are accounted for in the subtotal.', TRUE, 0, 2, NULL, 'Tax', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":797,"nil%":0.0},"type":{"type/Number":{"min":0.0,"max":11.12,"avg":3.8722100000000004,"sd":2.3206651358900316,"q1":2.273340386603857,"q3":5.337275338216307}}}', 4, 'DOUBLE', NULL, NULL),
+(17, TIMESTAMP '2020-01-09 12:20:56.691', TIMESTAMP '2020-01-09 12:20:58.852', 'TOTAL', 'type/Float', NULL, TRUE, 'The total billed amount.', TRUE, 0, 2, NULL, 'Total', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":10000,"nil%":0.0},"type":{"type/Number":{"min":12.061602936923117,"max":238.32732001721533,"avg":82.96014815230805,"sd":38.35967664847571,"q1":52.006147617878135,"q3":109.55803018499738}}}', 4, 'DOUBLE', NULL, NULL);             
 INSERT INTO PUBLIC.METABASE_FIELD(ID, CREATED_AT, UPDATED_AT, NAME, BASE_TYPE, SPECIAL_TYPE, ACTIVE, DESCRIPTION, PREVIEW_DISPLAY, POSITION, TABLE_ID, PARENT_ID, DISPLAY_NAME, VISIBILITY_TYPE, FK_TARGET_FIELD_ID, LAST_ANALYZED, POINTS_OF_INTEREST, CAVEATS, FINGERPRINT, FINGERPRINT_VERSION, DATABASE_TYPE, HAS_FIELD_VALUES, SETTINGS) VALUES
-(18, TIMESTAMP '2019-12-27 13:55:00.904', TIMESTAMP '2019-12-27 13:55:07.025', 'LATITUDE', 'type/Float', 'type/Latitude', TRUE, 'This is the latitude of the user on sign-up. It might be updated in the future to the last seen location.', TRUE, 0, 3, NULL, 'Latitude', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":2491,"nil%":0.0},"type":{"type/Number":{"min":25.775827,"max":70.6355001,"avg":39.87934670484002,"sd":6.390832341883712,"q1":35.302705923023126,"q3":43.773802584662}}}', 4, 'DOUBLE', NULL, NULL),
-(19, TIMESTAMP '2019-12-27 13:55:00.904', TIMESTAMP '2019-12-27 13:55:06.429', 'BIRTH_DATE', 'type/Date', NULL, TRUE, 'The date of birth of the user', TRUE, 0, 3, NULL, 'Birth Date', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":2308,"nil%":0.0},"type":{"type/DateTime":{"earliest":"1958-04-26","latest":"2000-04-03"}}}', 4, 'DATE', NULL, NULL),
-(20, TIMESTAMP '2019-12-27 13:55:00.905', TIMESTAMP '2019-12-27 13:55:07.034', 'NAME', 'type/Text', 'type/Name', TRUE, 'The name of the user who owns an account', TRUE, 0, 3, NULL, 'Name', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":2499,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":13.532}}}', 4, 'VARCHAR', NULL, NULL),
-(21, TIMESTAMP '2019-12-27 13:55:00.906', TIMESTAMP '2019-12-27 13:55:00.906', 'ID', 'type/BigInteger', 'type/PK', TRUE, 'A unique identifier given to each user.', TRUE, 0, 3, NULL, 'ID', 'normal', NULL, NULL, NULL, NULL, NULL, 0, 'BIGINT', NULL, NULL),
-(22, TIMESTAMP '2019-12-27 13:55:00.907', TIMESTAMP '2019-12-27 13:55:06.431', 'ADDRESS', 'type/Text', NULL, TRUE, STRINGDECODE('The street address of the account\u2019s billing address'), TRUE, 0, 3, NULL, 'Address', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":2490,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":20.85}}}', 4, 'VARCHAR', NULL, NULL),
-(23, TIMESTAMP '2019-12-27 13:55:00.907', TIMESTAMP '2019-12-27 13:55:07.043', 'LONGITUDE', 'type/Float', 'type/Longitude', TRUE, 'This is the longitude of the user on sign-up. It might be updated in the future to the last seen location.', TRUE, 0, 3, NULL, 'Longitude', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":2491,"nil%":0.0},"type":{"type/Number":{"min":-166.5425726,"max":-67.96735199999999,"avg":-95.18741780363999,"sd":15.399698968175663,"q1":-101.58350792373135,"q3":-84.65289348288829}}}', 4, 'DOUBLE', NULL, NULL),
-(24, TIMESTAMP '2019-12-27 13:55:00.908', TIMESTAMP '2019-12-27 13:55:07.064', 'SOURCE', 'type/Text', 'type/Source', TRUE, 'The channel through which we acquired this user. Valid values include: Affiliate, Facebook, Google, Organic and Twitter', TRUE, 0, 3, NULL, 'Source', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":5,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":7.4084}}}', 4, 'VARCHAR', 'auto-list', NULL),
-(25, TIMESTAMP '2019-12-27 13:55:00.909', TIMESTAMP '2019-12-27 13:55:07.071', 'EMAIL', 'type/Text', 'type/Email', TRUE, 'The contact email for the account.', TRUE, 0, 3, NULL, 'Email', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":2500,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":1.0,"average-length":24.1824}}}', 4, 'VARCHAR', NULL, NULL),
-(26, TIMESTAMP '2019-12-27 13:55:00.909', TIMESTAMP '2019-12-27 13:55:07.075', 'CREATED_AT', 'type/DateTime', 'type/CreationTimestamp', TRUE, STRINGDECODE('The date the user record was created. Also referred to as the user\u2019s \"join date\"'), TRUE, 0, 3, NULL, 'Created At', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":2500,"nil%":0.0},"type":{"type/DateTime":{"earliest":"2016-04-19T21:35:18.752","latest":"2019-04-19T14:06:27.3"}}}', 4, 'TIMESTAMP', NULL, NULL);  
+(18, TIMESTAMP '2020-01-09 12:20:56.723', TIMESTAMP '2020-01-09 12:21:00.904', 'LATITUDE', 'type/Float', 'type/Latitude', TRUE, 'This is the latitude of the user on sign-up. It might be updated in the future to the last seen location.', TRUE, 0, 3, NULL, 'Latitude', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":2491,"nil%":0.0},"type":{"type/Number":{"min":25.775827,"max":70.6355001,"avg":39.87934670484002,"sd":6.390832341883712,"q1":35.302705923023126,"q3":43.773802584662}}}', 4, 'DOUBLE', NULL, NULL),
+(19, TIMESTAMP '2020-01-09 12:20:56.724', TIMESTAMP '2020-01-09 12:21:00.535', 'BIRTH_DATE', 'type/Date', NULL, TRUE, 'The date of birth of the user', TRUE, 0, 3, NULL, 'Birth Date', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":2308,"nil%":0.0},"type":{"type/DateTime":{"earliest":"1958-04-26","latest":"2000-04-03"}}}', 4, 'DATE', NULL, NULL),
+(20, TIMESTAMP '2020-01-09 12:20:56.725', TIMESTAMP '2020-01-09 12:21:00.906', 'NAME', 'type/Text', 'type/Name', TRUE, 'The name of the user who owns an account', TRUE, 0, 3, NULL, 'Name', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":2499,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":13.532}}}', 4, 'VARCHAR', NULL, NULL),
+(21, TIMESTAMP '2020-01-09 12:20:56.725', TIMESTAMP '2020-01-09 12:20:56.725', 'ID', 'type/BigInteger', 'type/PK', TRUE, 'A unique identifier given to each user.', TRUE, 0, 3, NULL, 'ID', 'normal', NULL, NULL, NULL, NULL, NULL, 0, 'BIGINT', NULL, NULL),
+(22, TIMESTAMP '2020-01-09 12:20:56.726', TIMESTAMP '2020-01-09 12:21:00.537', 'ADDRESS', 'type/Text', NULL, TRUE, STRINGDECODE('The street address of the account\u2019s billing address'), TRUE, 0, 3, NULL, 'Address', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":2490,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":20.85}}}', 4, 'VARCHAR', NULL, NULL),
+(23, TIMESTAMP '2020-01-09 12:20:56.726', TIMESTAMP '2020-01-09 12:21:00.908', 'LONGITUDE', 'type/Float', 'type/Longitude', TRUE, 'This is the longitude of the user on sign-up. It might be updated in the future to the last seen location.', TRUE, 0, 3, NULL, 'Longitude', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":2491,"nil%":0.0},"type":{"type/Number":{"min":-166.5425726,"max":-67.96735199999999,"avg":-95.18741780363999,"sd":15.399698968175663,"q1":-101.58350792373135,"q3":-84.65289348288829}}}', 4, 'DOUBLE', NULL, NULL),
+(24, TIMESTAMP '2020-01-09 12:20:56.728', TIMESTAMP '2020-01-09 12:21:00.91', 'SOURCE', 'type/Text', 'type/Source', TRUE, 'The channel through which we acquired this user. Valid values include: Affiliate, Facebook, Google, Organic and Twitter', TRUE, 0, 3, NULL, 'Source', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":5,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":7.4084}}}', 4, 'VARCHAR', 'auto-list', NULL),
+(25, TIMESTAMP '2020-01-09 12:20:56.729', TIMESTAMP '2020-01-09 12:21:00.911', 'EMAIL', 'type/Text', 'type/Email', TRUE, 'The contact email for the account.', TRUE, 0, 3, NULL, 'Email', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":2500,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":1.0,"average-length":24.1824}}}', 4, 'VARCHAR', NULL, NULL),
+(26, TIMESTAMP '2020-01-09 12:20:56.729', TIMESTAMP '2020-01-09 12:21:00.912', 'CREATED_AT', 'type/DateTime', 'type/CreationTimestamp', TRUE, STRINGDECODE('The date the user record was created. Also referred to as the user\u2019s \"join date\"'), TRUE, 0, 3, NULL, 'Created At', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":2500,"nil%":0.0},"type":{"type/DateTime":{"earliest":"2016-04-19T21:35:18.752","latest":"2019-04-19T14:06:27.3"}}}', 4, 'TIMESTAMP', NULL, NULL);           
 INSERT INTO PUBLIC.METABASE_FIELD(ID, CREATED_AT, UPDATED_AT, NAME, BASE_TYPE, SPECIAL_TYPE, ACTIVE, DESCRIPTION, PREVIEW_DISPLAY, POSITION, TABLE_ID, PARENT_ID, DISPLAY_NAME, VISIBILITY_TYPE, FK_TARGET_FIELD_ID, LAST_ANALYZED, POINTS_OF_INTEREST, CAVEATS, FINGERPRINT, FINGERPRINT_VERSION, DATABASE_TYPE, HAS_FIELD_VALUES, SETTINGS) VALUES
-(27, TIMESTAMP '2019-12-27 13:55:00.91', TIMESTAMP '2019-12-27 13:55:06.435', 'ZIP', 'type/Text', 'type/ZipCode', TRUE, STRINGDECODE('The postal code of the account\u2019s billing address'), TRUE, 0, 3, NULL, 'Zip', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":2234,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":5.0}}}', 4, 'CHAR', NULL, NULL),
-(28, TIMESTAMP '2019-12-27 13:55:00.911', TIMESTAMP '2019-12-27 13:55:07.079', 'STATE', 'type/Text', 'type/State', TRUE, STRINGDECODE('The state or province of the account\u2019s billing address'), TRUE, 0, 3, NULL, 'State', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":49,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":2.0}}}', 4, 'CHAR', 'auto-list', NULL),
-(29, TIMESTAMP '2019-12-27 13:55:00.912', TIMESTAMP '2019-12-27 13:55:06.437', 'PASSWORD', 'type/Text', NULL, TRUE, 'This is the salted password of the user. It should not be visible', TRUE, 0, 3, NULL, 'Password', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":2500,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":36.0}}}', 4, 'VARCHAR', NULL, NULL),
-(30, TIMESTAMP '2019-12-27 13:55:00.913', TIMESTAMP '2019-12-27 13:55:07.084', 'CITY', 'type/Text', 'type/City', TRUE, STRINGDECODE('The city of the account\u2019s billing address'), TRUE, 0, 3, NULL, 'City', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":1966,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":8.284}}}', 4, 'VARCHAR', NULL, NULL),
-(31, TIMESTAMP '2019-12-27 13:55:00.972', TIMESTAMP '2019-12-27 13:55:06.92', 'PRODUCT_ID', 'type/Integer', 'type/FK', TRUE, 'The product the review was for', TRUE, 0, 4, NULL, 'Product ID', 'normal', 4, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":176,"nil%":0.0}}', 4, 'INTEGER', NULL, NULL),
-(32, TIMESTAMP '2019-12-27 13:55:00.973', TIMESTAMP '2019-12-27 13:55:00.973', 'ID', 'type/BigInteger', 'type/PK', TRUE, 'A unique internal identifier for the review. Should not be used externally.', TRUE, 0, 4, NULL, 'ID', 'normal', NULL, NULL, NULL, NULL, NULL, 0, 'BIGINT', NULL, NULL),
-(33, TIMESTAMP '2019-12-27 13:55:00.974', TIMESTAMP '2019-12-27 13:55:06.921', 'BODY', 'type/Text', 'type/Description', TRUE, 'The review the user left. Limited to 2000 characters.', TRUE, 0, 4, NULL, 'Body', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":1112,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":180.68345323741008}}}', 4, 'CLOB', NULL, NULL),
-(34, TIMESTAMP '2019-12-27 13:55:00.975', TIMESTAMP '2019-12-27 13:55:06.922', 'REVIEWER', 'type/Text', NULL, TRUE, 'The user who left the review', TRUE, 0, 4, NULL, 'Reviewer', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":1076,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":9.972122302158274}}}', 4, 'VARCHAR', NULL, NULL),
-(35, TIMESTAMP '2019-12-27 13:55:00.976', TIMESTAMP '2019-12-27 13:55:07.118', 'CREATED_AT', 'type/DateTime', 'type/CreationTimestamp', TRUE, 'The day and time a review was written by a user.', TRUE, 0, 4, NULL, 'Created At', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":1112,"nil%":0.0},"type":{"type/DateTime":{"earliest":"2016-06-03T00:37:05.818","latest":"2020-04-19T14:15:25.677"}}}', 4, 'TIMESTAMP', NULL, NULL); 
+(27, TIMESTAMP '2020-01-09 12:20:56.73', TIMESTAMP '2020-01-09 12:21:00.541', 'ZIP', 'type/Text', 'type/ZipCode', TRUE, STRINGDECODE('The postal code of the account\u2019s billing address'), TRUE, 0, 3, NULL, 'Zip', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":2234,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":5.0}}}', 4, 'CHAR', NULL, NULL),
+(28, TIMESTAMP '2020-01-09 12:20:56.73', TIMESTAMP '2020-01-09 12:21:00.915', 'STATE', 'type/Text', 'type/State', TRUE, STRINGDECODE('The state or province of the account\u2019s billing address'), TRUE, 0, 3, NULL, 'State', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":49,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":2.0}}}', 4, 'CHAR', 'auto-list', NULL),
+(29, TIMESTAMP '2020-01-09 12:20:56.731', TIMESTAMP '2020-01-09 12:21:00.542', 'PASSWORD', 'type/Text', NULL, TRUE, 'This is the salted password of the user. It should not be visible', TRUE, 0, 3, NULL, 'Password', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":2500,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":36.0}}}', 4, 'VARCHAR', NULL, NULL),
+(30, TIMESTAMP '2020-01-09 12:20:56.732', TIMESTAMP '2020-01-09 12:21:00.918', 'CITY', 'type/Text', 'type/City', TRUE, STRINGDECODE('The city of the account\u2019s billing address'), TRUE, 0, 3, NULL, 'City', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":1966,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":8.284}}}', 4, 'VARCHAR', NULL, NULL),
+(31, TIMESTAMP '2020-01-09 12:20:56.766', TIMESTAMP '2020-01-09 12:21:00.868', 'PRODUCT_ID', 'type/Integer', 'type/FK', TRUE, 'The product the review was for', TRUE, 0, 4, NULL, 'Product ID', 'normal', 4, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":176,"nil%":0.0}}', 4, 'INTEGER', NULL, NULL),
+(32, TIMESTAMP '2020-01-09 12:20:56.767', TIMESTAMP '2020-01-09 12:20:56.767', 'ID', 'type/BigInteger', 'type/PK', TRUE, 'A unique internal identifier for the review. Should not be used externally.', TRUE, 0, 4, NULL, 'ID', 'normal', NULL, NULL, NULL, NULL, NULL, 0, 'BIGINT', NULL, NULL),
+(33, TIMESTAMP '2020-01-09 12:20:56.767', TIMESTAMP '2020-01-09 12:21:00.869', 'BODY', 'type/Text', 'type/Description', TRUE, 'The review the user left. Limited to 2000 characters.', TRUE, 0, 4, NULL, 'Body', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":1112,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":180.68345323741008}}}', 4, 'CLOB', NULL, NULL),
+(34, TIMESTAMP '2020-01-09 12:20:56.768', TIMESTAMP '2020-01-09 12:21:00.869', 'REVIEWER', 'type/Text', NULL, TRUE, 'The user who left the review', TRUE, 0, 4, NULL, 'Reviewer', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":1076,"nil%":0.0},"type":{"type/Text":{"percent-json":0.0,"percent-url":0.0,"percent-email":0.0,"average-length":9.972122302158274}}}', 4, 'VARCHAR', NULL, NULL),
+(35, TIMESTAMP '2020-01-09 12:20:56.768', TIMESTAMP '2020-01-09 12:21:00.926', 'CREATED_AT', 'type/DateTime', 'type/CreationTimestamp', TRUE, 'The day and time a review was written by a user.', TRUE, 0, 4, NULL, 'Created At', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":1112,"nil%":0.0},"type":{"type/DateTime":{"earliest":"2016-06-03T00:37:05.818","latest":"2020-04-19T14:15:25.677"}}}', 4, 'TIMESTAMP', NULL, NULL);         
 INSERT INTO PUBLIC.METABASE_FIELD(ID, CREATED_AT, UPDATED_AT, NAME, BASE_TYPE, SPECIAL_TYPE, ACTIVE, DESCRIPTION, PREVIEW_DISPLAY, POSITION, TABLE_ID, PARENT_ID, DISPLAY_NAME, VISIBILITY_TYPE, FK_TARGET_FIELD_ID, LAST_ANALYZED, POINTS_OF_INTEREST, CAVEATS, FINGERPRINT, FINGERPRINT_VERSION, DATABASE_TYPE, HAS_FIELD_VALUES, SETTINGS) VALUES
-(36, TIMESTAMP '2019-12-27 13:55:00.976', TIMESTAMP '2019-12-27 13:55:07.122', 'RATING', 'type/Integer', 'type/Score', TRUE, 'The rating (on a scale of 1-5) the user left.', TRUE, 0, 4, NULL, 'Rating', 'normal', NULL, TIMESTAMP '2019-12-27 13:55:07.149', NULL, NULL, '{"global":{"distinct-count":5,"nil%":0.0},"type":{"type/Number":{"min":1.0,"max":5.0,"avg":3.987410071942446,"sd":1.0443899855660577,"q1":3.54744353181696,"q3":4.764807071650455}}}', 4, 'SMALLINT', 'auto-list', NULL);     
+(36, TIMESTAMP '2020-01-09 12:20:56.769', TIMESTAMP '2020-01-09 12:21:00.928', 'RATING', 'type/Integer', 'type/Score', TRUE, 'The rating (on a scale of 1-5) the user left.', TRUE, 0, 4, NULL, 'Rating', 'normal', NULL, TIMESTAMP '2020-01-09 12:21:00.94', NULL, NULL, '{"global":{"distinct-count":5,"nil%":0.0},"type":{"type/Number":{"min":1.0,"max":5.0,"avg":3.987410071942446,"sd":1.0443899855660577,"q1":3.54744353181696,"q3":4.764807071650455}}}', 4, 'SMALLINT', 'auto-list', NULL);      
 CREATE INDEX PUBLIC.IDX_FIELD_TABLE_ID ON PUBLIC.METABASE_FIELD(TABLE_ID);     
 CREATE INDEX PUBLIC.IDX_FIELD_PARENT_ID ON PUBLIC.METABASE_FIELD(PARENT_ID);   
 CREATE CACHED TABLE PUBLIC.VIEW_LOG(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_48AB2809_6C6C_4FC8_ADEC_A0173B213318) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_48AB2809_6C6C_4FC8_ADEC_A0173B213318,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_3E56DEEF_0C47_4ACE_A563_72714DAA8992) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_3E56DEEF_0C47_4ACE_A563_72714DAA8992,
     USER_ID INT,
     MODEL VARCHAR(16) NOT NULL,
     MODEL_ID INT NOT NULL,
     TIMESTAMP TIMESTAMP NOT NULL
 );            
 ALTER TABLE PUBLIC.VIEW_LOG ADD CONSTRAINT PUBLIC.PK_VIEW_LOG PRIMARY KEY(ID); 
--- 3 +/- SELECT COUNT(*) FROM PUBLIC.VIEW_LOG; 
+-- 4 +/- SELECT COUNT(*) FROM PUBLIC.VIEW_LOG; 
 INSERT INTO PUBLIC.VIEW_LOG(ID, USER_ID, MODEL, MODEL_ID, TIMESTAMP) VALUES
-(1, 1, 'card', 1, TIMESTAMP '2019-12-27 13:56:04.293'),
-(2, 1, 'dashboard', 1, TIMESTAMP '2019-12-27 13:56:08.037'),
-(3, 1, 'dashboard', 1, TIMESTAMP '2019-12-27 13:56:09.696');  
+(1, 1, 'card', 1, TIMESTAMP '2020-01-09 12:21:20.544'),
+(2, 1, 'card', 2, TIMESTAMP '2020-01-09 12:21:24.049'),
+(3, 1, 'dashboard', 1, TIMESTAMP '2020-01-09 12:21:26.173'),
+(4, 1, 'dashboard', 1, TIMESTAMP '2020-01-09 12:21:26.931');          
 CREATE INDEX PUBLIC.IDX_VIEW_LOG_USER_ID ON PUBLIC.VIEW_LOG(USER_ID);          
 CREATE INDEX PUBLIC.IDX_VIEW_LOG_TIMESTAMP ON PUBLIC.VIEW_LOG(MODEL_ID);       
 CREATE CACHED TABLE PUBLIC.COMPUTATION_JOB_RESULT COMMENT 'Stores results of async computation jobs.'(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_6CD68F8F_F495_4CEB_95BB_2199436AEA2D) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_6CD68F8F_F495_4CEB_95BB_2199436AEA2D,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_7FE50B94_3140_4A33_A93C_33CEF6B28C7F) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_7FE50B94_3140_4A33_A93C_33CEF6B28C7F,
     JOB_ID INT NOT NULL,
     CREATED_AT TIMESTAMP NOT NULL,
     UPDATED_AT TIMESTAMP NOT NULL,
@@ -791,7 +795,7 @@ CREATE CACHED TABLE PUBLIC.COMPUTATION_JOB_RESULT COMMENT 'Stores results of asy
 ALTER TABLE PUBLIC.COMPUTATION_JOB_RESULT ADD CONSTRAINT PUBLIC.PK_COMPUTATION_JOB_RESULT PRIMARY KEY(ID);     
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.COMPUTATION_JOB_RESULT;   
 CREATE CACHED TABLE PUBLIC.QUERY_EXECUTION COMMENT 'A log of executed queries, used for calculating historic execution times, auditing, and other purposes.'(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_A6249949_B9A6_4376_BFB8_E3EE84CCE77A) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A6249949_B9A6_4376_BFB8_E3EE84CCE77A,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_C7DA6F24_F9E3_46A6_BC6A_8F63B63489BF) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_C7DA6F24_F9E3_46A6_BC6A_8F63B63489BF,
     HASH BINARY(32) NOT NULL COMMENT 'The hash of the query dictionary. This is a 256-bit SHA3 hash of the query.',
     STARTED_AT TIMESTAMP NOT NULL COMMENT 'Timestamp of when this query started running.',
     RUNNING_TIME INT NOT NULL COMMENT 'The time, in milliseconds, this query took to complete.',
@@ -806,15 +810,16 @@ CREATE CACHED TABLE PUBLIC.QUERY_EXECUTION COMMENT 'A log of executed queries, u
     DATABASE_ID INT COMMENT 'ID of the database this query was ran against.'
 );        
 ALTER TABLE PUBLIC.QUERY_EXECUTION ADD CONSTRAINT PUBLIC.PK_QUERY_EXECUTION PRIMARY KEY(ID);   
--- 3 +/- SELECT COUNT(*) FROM PUBLIC.QUERY_EXECUTION;          
+-- 4 +/- SELECT COUNT(*) FROM PUBLIC.QUERY_EXECUTION;          
 INSERT INTO PUBLIC.QUERY_EXECUTION(ID, HASH, STARTED_AT, RUNNING_TIME, RESULT_ROWS, NATIVE, CONTEXT, ERROR, EXECUTOR_ID, CARD_ID, DASHBOARD_ID, PULSE_ID, DATABASE_ID) VALUES
-(1, X'7cd6adce1230dc90e50acf28bc603ee99320d968ebb4191c1ff632c4a8f7b3f1', TIMESTAMP '2019-12-27 13:56:01.173', 737, 2000, FALSE, 'ad-hoc', NULL, 1, NULL, NULL, NULL, 1),
-(2, X'15ff68f15b975a5aee0df382f9e42e4b1e4e11246762f4abca418c48f1284aa2', TIMESTAMP '2019-12-27 13:56:03.283', 60, 1, FALSE, 'ad-hoc', NULL, 1, NULL, NULL, NULL, 1),
-(3, X'15ff68f15b975a5aee0df382f9e42e4b1e4e11246762f4abca418c48f1284aa2', TIMESTAMP '2019-12-27 13:56:08.64', 18, 1, FALSE, 'question', NULL, 1, 1, NULL, NULL, 1); 
+(1, X'7cd6adce1230dc90e50acf28bc603ee99320d968ebb4191c1ff632c4a8f7b3f1', TIMESTAMP '2020-01-09 12:21:20.364', 184, 2000, FALSE, 'ad-hoc', NULL, 1, NULL, NULL, NULL, 1),
+(2, X'7cd6adce1230dc90e50acf28bc603ee99320d968ebb4191c1ff632c4a8f7b3f1', TIMESTAMP '2020-01-09 12:21:22.697', 133, 2000, FALSE, 'ad-hoc', NULL, 1, NULL, NULL, NULL, 1),
+(3, X'15ff68f15b975a5aee0df382f9e42e4b1e4e11246762f4abca418c48f1284aa2', TIMESTAMP '2020-01-09 12:21:23.608', 27, 1, FALSE, 'ad-hoc', NULL, 1, NULL, NULL, NULL, 1),
+(4, X'15ff68f15b975a5aee0df382f9e42e4b1e4e11246762f4abca418c48f1284aa2', TIMESTAMP '2020-01-09 12:21:26.465', 7, 1, FALSE, 'question', NULL, 1, 2, NULL, NULL, 1);        
 CREATE INDEX PUBLIC.IDX_QUERY_EXECUTION_STARTED_AT ON PUBLIC.QUERY_EXECUTION(STARTED_AT);      
 CREATE INDEX PUBLIC.IDX_QUERY_EXECUTION_QUERY_HASH_STARTED_AT ON PUBLIC.QUERY_EXECUTION(HASH, STARTED_AT);     
 CREATE CACHED TABLE PUBLIC.PULSE_CHANNEL(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_A7E8BEAA_7199_4071_9A13_A205C87430C8) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_A7E8BEAA_7199_4071_9A13_A205C87430C8,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_36702A0F_7178_44F4_AC7E_A7FF585C6EB5) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_36702A0F_7178_44F4_AC7E_A7FF585C6EB5,
     PULSE_ID INT NOT NULL,
     CHANNEL_TYPE VARCHAR(32) NOT NULL,
     DETAILS CLOB NOT NULL,
@@ -838,7 +843,7 @@ CREATE CACHED TABLE PUBLIC.CORE_SESSION(
 ALTER TABLE PUBLIC.CORE_SESSION ADD CONSTRAINT PUBLIC.PK_CORE_SESSION PRIMARY KEY(ID);         
 -- 1 +/- SELECT COUNT(*) FROM PUBLIC.CORE_SESSION;             
 INSERT INTO PUBLIC.CORE_SESSION(ID, USER_ID, CREATED_AT) VALUES
-('0fb2599a-ef35-404d-9282-bed00e61fb2e', 2, TIMESTAMP '2019-12-27 13:56:21.214');              
+('222a57a2-f48b-4fde-95e0-25b02575e0bf', 2, TIMESTAMP '2020-01-09 12:21:34.2');
 CREATE CACHED TABLE PUBLIC.QRTZ_SIMPLE_TRIGGERS COMMENT 'Used for Quartz scheduler.'(
     SCHED_NAME VARCHAR(120) NOT NULL,
     TRIGGER_NAME VARCHAR(200) NOT NULL,
@@ -868,7 +873,7 @@ INSERT INTO PUBLIC.QRTZ_CRON_TRIGGERS(SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, C
 ('MetabaseScheduler', 'metabase.task.sync-and-analyze.trigger.1', 'DEFAULT', '0 0 * * * ? *', 'US/Pacific'),
 ('MetabaseScheduler', 'metabase.task.update-field-values.trigger.1', 'DEFAULT', '0 0 0 * * ? *', 'US/Pacific');       
 CREATE CACHED TABLE PUBLIC.PULSE_CHANNEL_RECIPIENT(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_20CB245F_1D03_4750_BE4C_6239AF8B8133) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_20CB245F_1D03_4750_BE4C_6239AF8B8133,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_9791D6ED_3D5E_4480_A7FF_CFF350E7549B) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_9791D6ED_3D5E_4480_A7FF_CFF350E7549B,
     PULSE_CHANNEL_ID INT NOT NULL,
     USER_ID INT NOT NULL
 );              
@@ -893,7 +898,7 @@ CREATE CACHED TABLE PUBLIC.QRTZ_SIMPROP_TRIGGERS COMMENT 'Used for Quartz schedu
 ALTER TABLE PUBLIC.QRTZ_SIMPROP_TRIGGERS ADD CONSTRAINT PUBLIC.PK_QRTZ_SIMPROP_TRIGGERS PRIMARY KEY(SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);  
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.QRTZ_SIMPROP_TRIGGERS;    
 CREATE CACHED TABLE PUBLIC.REVISION(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_51626B0C_C421_4A18_8270_F7889C27C13C) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_51626B0C_C421_4A18_8270_F7889C27C13C,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_CF6764A8_804E_448E_9BCE_4A030200A6B1) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_CF6764A8_804E_448E_9BCE_4A030200A6B1,
     MODEL VARCHAR(16) NOT NULL,
     MODEL_ID INT NOT NULL,
     USER_ID INT NOT NULL,
@@ -904,13 +909,14 @@ CREATE CACHED TABLE PUBLIC.REVISION(
     MESSAGE CLOB
 );   
 ALTER TABLE PUBLIC.REVISION ADD CONSTRAINT PUBLIC.PK_REVISION PRIMARY KEY(ID); 
--- 5 +/- SELECT COUNT(*) FROM PUBLIC.REVISION; 
+-- 6 +/- SELECT COUNT(*) FROM PUBLIC.REVISION; 
 INSERT INTO PUBLIC.REVISION(ID, MODEL, MODEL_ID, USER_ID, TIMESTAMP, OBJECT, IS_REVERSION, IS_CREATION, MESSAGE) VALUES
-(1, 'Card', 1, 1, TIMESTAMP '2019-12-27 13:56:04.297', '{"description":null,"archived":false,"collection_position":null,"table_id":2,"database_id":1,"enable_embedding":false,"collection_id":null,"query_type":"query","name":"Orders, Count","read_permissions":null,"creator_id":1,"made_public_by_id":null,"embedding_params":null,"cache_ttl":null,"dataset_query":{"query":{"source-table":2,"aggregation":[["count"]]},"type":"query","database":1},"id":1,"display":"scalar","visualization_settings":{},"public_uuid":null}', FALSE, TRUE, NULL),
-(2, 'Dashboard', 1, 1, TIMESTAMP '2019-12-27 13:56:07.754', '{"description":null,"name":"orders in a dashboard","cards":[]}', FALSE, TRUE, NULL),
-(3, 'Dashboard', 1, 1, TIMESTAMP '2019-12-27 13:56:09.141', '{"description":null,"name":"orders in a dashboard","cards":[{"sizeX":2,"sizeY":2,"row":0,"col":0,"id":1,"card_id":1,"series":[]}]}', FALSE, FALSE, NULL),
-(4, 'Dashboard', 1, 1, TIMESTAMP '2019-12-27 13:56:09.315', '{"description":null,"name":"orders in a dashboard","cards":[{"sizeX":4,"sizeY":4,"row":0,"col":0,"id":1,"card_id":1,"series":[]}]}', FALSE, FALSE, NULL),
-(5, 'Dashboard', 1, 1, TIMESTAMP '2019-12-27 13:56:09.526', '{"description":null,"name":"orders in a dashboard","cards":[{"sizeX":4,"sizeY":4,"row":0,"col":0,"id":1,"card_id":1,"series":[]}]}', FALSE, FALSE, NULL);      
+(1, 'Card', 1, 1, TIMESTAMP '2020-01-09 12:21:20.548', '{"description":null,"archived":false,"collection_position":null,"table_id":2,"database_id":1,"enable_embedding":false,"collection_id":null,"query_type":"query","name":"Orders","read_permissions":null,"creator_id":1,"made_public_by_id":null,"embedding_params":null,"cache_ttl":null,"dataset_query":{"database":1,"query":{"source-table":2},"type":"query"},"id":1,"display":"table","visualization_settings":{},"public_uuid":null}', FALSE, TRUE, NULL),
+(2, 'Card', 2, 1, TIMESTAMP '2020-01-09 12:21:24.052', '{"description":null,"archived":false,"collection_position":null,"table_id":2,"database_id":1,"enable_embedding":false,"collection_id":null,"query_type":"query","name":"Orders, Count","read_permissions":null,"creator_id":1,"made_public_by_id":null,"embedding_params":null,"cache_ttl":null,"dataset_query":{"type":"query","query":{"source-table":2,"aggregation":[["count"]]},"database":1},"id":2,"display":"scalar","visualization_settings":{},"public_uuid":null}', FALSE, TRUE, NULL),
+(3, 'Dashboard', 1, 1, TIMESTAMP '2020-01-09 12:21:26.038', '{"description":null,"name":"orders in a dashboard","cards":[]}', FALSE, TRUE, NULL),
+(4, 'Dashboard', 1, 1, TIMESTAMP '2020-01-09 12:21:26.686', '{"description":null,"name":"orders in a dashboard","cards":[{"sizeX":2,"sizeY":2,"row":0,"col":0,"id":1,"card_id":2,"series":[]}]}', FALSE, FALSE, NULL),
+(5, 'Dashboard', 1, 1, TIMESTAMP '2020-01-09 12:21:26.761', '{"description":null,"name":"orders in a dashboard","cards":[{"sizeX":4,"sizeY":4,"row":0,"col":0,"id":1,"card_id":2,"series":[]}]}', FALSE, FALSE, NULL),
+(6, 'Dashboard', 1, 1, TIMESTAMP '2020-01-09 12:21:26.861', '{"description":null,"name":"orders in a dashboard","cards":[{"sizeX":4,"sizeY":4,"row":0,"col":0,"id":1,"card_id":2,"series":[]}]}', FALSE, FALSE, NULL);             
 CREATE INDEX PUBLIC.IDX_REVISION_MODEL_MODEL_ID ON PUBLIC.REVISION(MODEL, MODEL_ID);           
 CREATE CACHED TABLE PUBLIC.QRTZ_BLOB_TRIGGERS COMMENT 'Used for Quartz scheduler.'(
     SCHED_NAME VARCHAR(120) NOT NULL,
@@ -921,7 +927,7 @@ CREATE CACHED TABLE PUBLIC.QRTZ_BLOB_TRIGGERS COMMENT 'Used for Quartz scheduler
 ALTER TABLE PUBLIC.QRTZ_BLOB_TRIGGERS ADD CONSTRAINT PUBLIC.PK_QRTZ_BLOB_TRIGGERS PRIMARY KEY(SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);        
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.QRTZ_BLOB_TRIGGERS;       
 CREATE CACHED TABLE PUBLIC.PERMISSIONS_GROUP_MEMBERSHIP(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_339CFE15_5F0A_40E0_A6F1_A4C6E2A733A3) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_339CFE15_5F0A_40E0_A6F1_A4C6E2A733A3,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_94F6D65D_8057_4C73_8918_D9791FFD681A) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_94F6D65D_8057_4C73_8918_D9791FFD681A,
     USER_ID INT NOT NULL,
     GROUP_ID INT NOT NULL
 ); 
@@ -935,7 +941,7 @@ CREATE INDEX PUBLIC.IDX_PERMISSIONS_GROUP_MEMBERSHIP_GROUP_ID ON PUBLIC.PERMISSI
 CREATE INDEX PUBLIC.IDX_PERMISSIONS_GROUP_MEMBERSHIP_USER_ID ON PUBLIC.PERMISSIONS_GROUP_MEMBERSHIP(USER_ID);  
 CREATE INDEX PUBLIC.IDX_PERMISSIONS_GROUP_MEMBERSHIP_GROUP_ID_USER_ID ON PUBLIC.PERMISSIONS_GROUP_MEMBERSHIP(GROUP_ID, USER_ID);               
 CREATE CACHED TABLE PUBLIC.PERMISSIONS(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_5C994078_58F3_4056_AAD0_307894B276BA) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_5C994078_58F3_4056_AAD0_307894B276BA,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_76F423B4_2067_4660_86EF_A3DC548DFB36) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_76F423B4_2067_4660_86EF_A3DC548DFB36,
     OBJECT VARCHAR(254) NOT NULL,
     GROUP_ID INT NOT NULL
 );          
@@ -994,7 +1000,7 @@ CREATE CACHED TABLE PUBLIC.QRTZ_SCHEDULER_STATE COMMENT 'Used for Quartz schedul
 ALTER TABLE PUBLIC.QRTZ_SCHEDULER_STATE ADD CONSTRAINT PUBLIC.PK_QRTZ_SCHEDULER_STATE PRIMARY KEY(SCHED_NAME, INSTANCE_NAME);  
 -- 1 +/- SELECT COUNT(*) FROM PUBLIC.QRTZ_SCHEDULER_STATE;     
 INSERT INTO PUBLIC.QRTZ_SCHEDULER_STATE(SCHED_NAME, INSTANCE_NAME, LAST_CHECKIN_TIME, CHECKIN_INTERVAL) VALUES
-('MetabaseScheduler', 'par.attlocal.net1577483700054', 1577483782698, 7500);    
+('MetabaseScheduler', 'tlr-mbp-2019.local1578601256035', 1578601293631, 7500);  
 CREATE CACHED TABLE PUBLIC.QRTZ_LOCKS COMMENT 'Used for Quartz scheduler.'(
     SCHED_NAME VARCHAR(120) NOT NULL,
     LOCK_NAME VARCHAR(40) NOT NULL
@@ -1005,7 +1011,7 @@ INSERT INTO PUBLIC.QRTZ_LOCKS(SCHED_NAME, LOCK_NAME) VALUES
 ('MetabaseScheduler', 'STATE_ACCESS'),
 ('MetabaseScheduler', 'TRIGGER_ACCESS');    
 CREATE CACHED TABLE PUBLIC.METABASE_TABLE(
-    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_86912F44_F0BA_47E1_9BD4_0E117801F53C) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_86912F44_F0BA_47E1_9BD4_0E117801F53C,
+    ID INT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_39056BD0_C7BD_4432_AFF0_79F0CB1DF362) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_39056BD0_C7BD_4432_AFF0_79F0CB1DF362,
     CREATED_AT TIMESTAMP NOT NULL,
     UPDATED_AT TIMESTAMP NOT NULL,
     NAME VARCHAR(254) NOT NULL,
@@ -1026,10 +1032,10 @@ CREATE CACHED TABLE PUBLIC.METABASE_TABLE(
 ALTER TABLE PUBLIC.METABASE_TABLE ADD CONSTRAINT PUBLIC.PK_METABASE_TABLE PRIMARY KEY(ID);     
 -- 4 +/- SELECT COUNT(*) FROM PUBLIC.METABASE_TABLE;           
 INSERT INTO PUBLIC.METABASE_TABLE(ID, CREATED_AT, UPDATED_AT, NAME, ROWS, DESCRIPTION, ENTITY_NAME, ENTITY_TYPE, ACTIVE, DB_ID, DISPLAY_NAME, VISIBILITY_TYPE, SCHEMA, POINTS_OF_INTEREST, CAVEATS, SHOW_IN_GETTING_STARTED, FIELDS_HASH) VALUES
-(1, TIMESTAMP '2019-12-27 13:55:00.648', TIMESTAMP '2019-12-27 13:55:07.128', 'PRODUCTS', NULL, 'This is our product catalog. It includes all products ever sold by the Sample Company.', NULL, 'entity/ProductTable', TRUE, 1, 'Products', NULL, 'PUBLIC', NULL, NULL, FALSE, 'aqXlpsb4FjyCH5o8qP4a2A=='),
-(2, TIMESTAMP '2019-12-27 13:55:00.655', TIMESTAMP '2019-12-27 13:55:07.129', 'ORDERS', NULL, 'This is a confirmed order for a product from a user.', NULL, 'entity/TransactionTable', TRUE, 1, 'Orders', NULL, 'PUBLIC', NULL, NULL, FALSE, 'Iqz4vNbm7vh80Uo9pWdesA=='),
-(3, TIMESTAMP '2019-12-27 13:55:00.66', TIMESTAMP '2019-12-27 13:55:07.131', 'PEOPLE', NULL, 'This is a user account. Note that employees and customer support staff will have accounts.', NULL, 'entity/UserTable', TRUE, 1, 'People', NULL, 'PUBLIC', NULL, NULL, FALSE, 'CXKI5VefRbNYgZ8IStmaNw=='),
-(4, TIMESTAMP '2019-12-27 13:55:00.666', TIMESTAMP '2019-12-27 13:55:07.134', 'REVIEWS', NULL, 'These are reviews our customers have left on products. Note that these are not tied to orders so it is possible people have reviewed products they did not purchase from us.', NULL, 'entity/GenericTable', TRUE, 1, 'Reviews', NULL, 'PUBLIC', NULL, NULL, FALSE, 'wIcr7cLnXrbpAUfOXgcmeQ=='); 
+(1, TIMESTAMP '2020-01-09 12:20:56.501', TIMESTAMP '2020-01-09 12:21:00.932', 'PRODUCTS', NULL, 'This is our product catalog. It includes all products ever sold by the Sample Company.', NULL, 'entity/ProductTable', TRUE, 1, 'Products', NULL, 'PUBLIC', NULL, NULL, FALSE, 'aqXlpsb4FjyCH5o8qP4a2A=='),
+(2, TIMESTAMP '2020-01-09 12:20:56.508', TIMESTAMP '2020-01-09 12:21:00.932', 'ORDERS', NULL, 'This is a confirmed order for a product from a user.', NULL, 'entity/TransactionTable', TRUE, 1, 'Orders', NULL, 'PUBLIC', NULL, NULL, FALSE, 'Iqz4vNbm7vh80Uo9pWdesA=='),
+(3, TIMESTAMP '2020-01-09 12:20:56.512', TIMESTAMP '2020-01-09 12:21:00.933', 'PEOPLE', NULL, 'This is a user account. Note that employees and customer support staff will have accounts.', NULL, 'entity/UserTable', TRUE, 1, 'People', NULL, 'PUBLIC', NULL, NULL, FALSE, 'CXKI5VefRbNYgZ8IStmaNw=='),
+(4, TIMESTAMP '2020-01-09 12:20:56.516', TIMESTAMP '2020-01-09 12:21:00.935', 'REVIEWS', NULL, 'These are reviews our customers have left on products. Note that these are not tied to orders so it is possible people have reviewed products they did not purchase from us.', NULL, 'entity/GenericTable', TRUE, 1, 'Reviews', NULL, 'PUBLIC', NULL, NULL, FALSE, 'wIcr7cLnXrbpAUfOXgcmeQ==');
 CREATE INDEX PUBLIC.IDX_TABLE_DB_ID ON PUBLIC.METABASE_TABLE(DB_ID);           
 CREATE INDEX PUBLIC.IDX_METABASE_TABLE_SHOW_IN_GETTING_STARTED ON PUBLIC.METABASE_TABLE(SHOW_IN_GETTING_STARTED);              
 CREATE INDEX PUBLIC.IDX_METABASE_TABLE_DB_ID_SCHEMA ON PUBLIC.METABASE_TABLE(DB_ID, SCHEMA);   
diff --git a/package.json b/package.json
index e19ae39f334..d4fcab548ae 100644
--- a/package.json
+++ b/package.json
@@ -113,7 +113,7 @@
     "color-diff": "^1.1.0",
     "concurrently": "^3.1.0",
     "css-loader": "^0.28.7",
-    "cypress": "^3.7.0",
+    "cypress": "3.8.0",
     "documentation": "^4.0.0-rc.1",
     "enzyme": "^3.8.0",
     "enzyme-2": "npm:enzyme@2",
diff --git a/yarn.lock b/yarn.lock
index 7c21ba81103..72a44095c61 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4418,10 +4418,10 @@ cyclist@~0.2.2:
   resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
   integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=
 
-cypress@^3.7.0:
-  version "3.7.0"
-  resolved "https://registry.yarnpkg.com/cypress/-/cypress-3.7.0.tgz#e2cd71b87b6ce0d4c72c6ea25da1005d75c1f231"
-  integrity sha512-o+vfRxqAba8TduelzfZQ4WHmj2yNEjaoO2EuZ8dZ9pJpuW+WGtBGheKIp6zkoQsp8ZgFe8OoHh1i2mY8BDnMAw==
+cypress@3.8.0:
+  version "3.8.0"
+  resolved "https://registry.yarnpkg.com/cypress/-/cypress-3.8.0.tgz#7d4cd08f81f9048ee36760cc9ee3b9014f9e84ab"
+  integrity sha512-gtEbqCgKETRc3pQFMsELRgIBNgiQg7vbOWTrCi7WE7bgOwNCaW9PEX8Jb3UN8z/maIp9WwzoFfeySfelYY7nRA==
   dependencies:
     "@cypress/listr-verbose-renderer" "0.4.1"
     "@cypress/xvfb" "1.2.4"
-- 
GitLab