Git Product home page Git Product logo

huey's Introduction

🦆 Huey

Huey is a browser-based application that lets you explore tabular datasets. Huey supports reading from multiple file formats, like .csv, .parquet, .json data files as well as .duckdb database files.

Try Huey now online https://rpbouman.github.io/huey/src/index.html

image

Key features

  • An intuitive and responsive pivot table that supports filtering and (sub)totals
  • Supports many different aggregate functions for reporting and data exploration
  • Automatic breakdown of date/time columns into separate parts (year, month, quarter etc) for reporting
  • Supports reading .parquet, .csv, .json and .duckdb database files. (Support for reading MS Excel .xlsx files and .sqlite is planned)
  • Export of results and/or SQL queries to file or clipboard
  • Blazing fast, even for large files - courtesy of DuckDB
  • Zero install. Download or checkout the source tree, and open src/index.html in your browser - no server required. Note that although Huey can run locally, there is nothing that keeps you from serving it from a webserver if you want to.
  • It's free! Huey is released under the MIT license, just like DuckDB.

Limitations

  • Developed on latest/recent versions of Google Chrome. Most features will work on other major browsers as well, browser compatibility is currently not the highest priority. This is not any judgement on browser quality but merely a matter of the most effective use of time and resources. That said, this does not mean we won't want to fix browser compatibility issues. If you spot them, please report an issue and we'll do our best to fix it. Or better yet: if you have a fix yourself, send a pull request.
  • Currently supports only local files. ("Local files" are files that logically exist in the local file system. This includes files from network drives and cloud drives like Google Drive and Microsoft OneDrive)

Getting started

  1. Checkout or Download from github
  2. Open index.html in your web browser. Note that although Huey runs locally, it depends on resources served by jsdelivr.com, so make sure you're connected to the internet.
  3. Register one or more files and start analyzing!

Registering and Analyzing Files with Huey

Registering Files

Huey uses DuckDb WASM to read and analyze data files. Due to general security policy, the web browser can not simply read files from your local computer: you need to explicitly select and register files in DuckDB WASM's virtual file system.

To register one or more files, you can either

  1. Click the 'Upload...' button upload button icon. The upload button is always available as the leftmost button on the toolbar at the top of the page. The upload action will pop up a file browser dialog that lets you browse and choose one or more files from your local filesystem. In the file browser dialog, navigate to the file or files that you want to explore, select them and then confirm the dialog by clicking the 'Ok' button.
  2. Drag 'n Drop one or multiple files unto the "Datasources" tab in the sidebar.

Either action will open the Upload dialog. The upload dialog will show a progress bar for each file that is being registered. Additional progress items may appear in case a duckdb extension needs to be installed and/or loaded.

image

After completion of the upload process, the upload dialog is updated to indicate the status of the uploads (or the extension installation, if applicable).

Items that encountered an error are indicated by red progressbars. In case of errors, the item is expanded to reveal any information that might help to remedy the issue.

Successful actions are indicated by green progressbars. Succesfully loaded files are available in the Datasources tab, from where you can start exploring their contents by clicking the explore button explore button. As a convenience, the explore button is also present in the upload dialog.

Huey will attempt to group files having similar column signature. The group appears as a separate top-level node in the Datasources tab, with its individual files indented below it. A file group has its own explore button, so that you can not only explore the individual files, but also the UNION of all Files in the group:

image

Files that cannot be grouped appear in a separate Miscellanous Files group.

Opening DuckDb files

Apart from reading data files directly, Huey can also open existing duckdb files and access its tables and views. The process for accessing duckdb files is exactly the same as for accessing data files. Just make sure you give your duckdb file a '.duckdb' extension - that's how Huey knows it's a duckdb file. (DuckDB data files are not required to have any particular name or extension, but Huey currently cannot detect that, so it relies on a file extension convention instead.) Successfully loaded .duckdb files will appear in the DuckDb Folder, which appears at the top of the DataSources tab.

image

The schemas in the duckdb database file are presented as folders below the duckdb file entry, and any tables or views in the schema are presented below the schema folder. Each table or view has an explore button which you can click to explore the data.

Note: We ran into a limitation - when the duckdb file itself refers to external files, then it's likely that Huey (or rather, DuckDB WASM) won't be able to find them. But native duckdb tables, as well as views based on duckdb base tables work marvelously and are quite a bit faster than querying bare data files.

Exploring Datasources

The Datasources have an explore button explore button . After clicking it, the sidebar switches to the Attributes tab, which is then is populated with a list of the Attributes of the selected Datasource. You can think of Attributes as a list of values (a column) that can be extracted from the Datasource and presented along the axes of the pivot table.

image

The pivot table has two axes for placing attribute values:

  1. Attributes appearing on the horizontal axis are used to generate column headers. For this reason the horizontal axis is also known as the 'columns'-axis.
  2. attributes appearing on the vertical axis are used to generate row headers. For this reason the vertical axis is also known as the 'rows'-axis.

Right before the attribute item, there is a widget to expand the Attribute so its derived Attributes and Aggregates are revealed.

image

You can think of a derived attribute as an expression (formulae) that calculates some aspect from a single value from the attribute upon which it is based. For example, from an attribute that represents timestamp values, we can extract only the date part, or only the time part, or even the individual parts like year, month, and so on. The values that are thus derived from the original attribute values can be thought of as a 'virtual' column and can appear on wither of the pivot table axes.

Aggregates are special expressions that calculate a result on a group of attribute values. Aggregates cannot be placed on the horizontal or vertical axes of the pivot table. Rather, they can used to create cells appearing at the intersection of the row and column headers.

image

Filtering

The query editor supports a special Filters axis. Items placed on the filters access support the Filters dialog which lets you choose values and operators to filter the query results. Items on the filter axis themselves are not visible in the query result, unless those items are also placed on the the columns or rows axis.

image

(Sub)totals

Items on the row or columns axis have a "totals" toggle-icon. When enabled, totals for that item will be displayed in a totals row or column.

image

Export

Huey provides export capabilities so you can use the results of your analysis outside huey. The export dialog lets you export query results by downloading it as csv, parquet, or JSON file, or you can choose to have your results copied to your operating system clipboard.

Apart from the result data, Huey also lets you export the SQL statements that would produce the query result.

image

Settings

The settings dialog lets you control Huey's behavior. You can open the settings dialog by clicking the "gear" icon, which is on the right in the top toolbar:image. Settings are persisted in the browser's local storage. Settings are organized in separate tabs:

Datasource Settings

This lets you control the behavior of datasources.

  • The UNION loose typing checkbox controls how Huey detects whether datasources have the same column signature. When unchecked, exact data type matching is used; when checked, a more loose typing rule is applied.

Value formatting

This tab bundles all settings that controls the default appearance of values

  • NULL-value label: a string that is used to symbolize NULL-values.
  • Totals label: a string that is used to indicate the value is the total of the item indicated by the header.
  • Use default locale: when checked, the Browser's default locale(s) are used to format numbers. When unchecked, the Locale setting becomes editable.
  • Locale: the custom locale to use. You need to uncheck the Use default locale checkbox to edit this setting
  • Min. integer digits: the minimal number of digits to use to denote the integer part of numbers
  • Min. fraction digits: the minimal number of fractional digits to denote
  • Max. fraction digits: the maximum number of fractional digits to denote

Query

Controls the behavior of the query editor.

  • Autorun: whether queries execute automatically after editing the query

Pivot Table

Settings that control the appearance and behavior of the Pivot Table

  • Max. cellwidth (ch): Columns grow according to the largest value, up to this value. The unit is ch - the number of characters.

Theme

  • Themes dropdown: a dropdown showing the various themes/color schemes.

huey's People

Contributors

rpbouman avatar jdavidson00 avatar stephaneggermont avatar

Stargazers

Winston Fassett avatar Zijian Zhang avatar Tyler Hillery avatar  avatar Adam avatar Andrew Foltz-Morrison avatar  avatar  avatar KimJaeYoung avatar  avatar  avatar Declan Naughton avatar Eddie Murphy avatar  avatar dong avatar Nick Crews avatar 李冬冬 avatar Pedro Rodriguez avatar Kamil Raczycki avatar Zhang Kun avatar  avatar Mark Keller avatar Benjamin avatar Hannes Mühleisen avatar Josh Robertson avatar Patrick Hausmann avatar hhl avatar Joshua Kinuthia avatar  avatar Lorenzo Mangani avatar Gabor Szarnyas avatar kuatroka avatar Basit Mustafa avatar Anthony McClosky avatar Kevin Marsh avatar Egor Eremeev avatar Oliver Fletcher avatar Dominic Leung avatar  avatar Ross Heo avatar Venkat avatar  avatar  avatar Rildo Moraes avatar  avatar Tony avatar Linden avatar Mike Jones avatar Martin Salo avatar Ryder Rishel avatar Keerthan Jaic avatar  avatar tansen avatar Oussama Rouabah avatar Leonard avatar  avatar Alexander Strogy avatar Ameya Karkal avatar 1027kg avatar Ranu Goldan Yeara Elzatar avatar  avatar Constantin Lungu avatar  avatar Jason avatar DeokJung Kim avatar Eren Aslan avatar  avatar James Andrew-Smith avatar Raimon Grau avatar cookieshake avatar Ilia Ablamonov avatar Hugh Cameron avatar Ibrahim Mohammed avatar  avatar David Riordan avatar Andrew avatar Simon Kurowski avatar jET avatar Edson César avatar Max Justus Spransy avatar Christopher Chappell avatar David Bisset avatar  avatar Maxim Uvarov avatar Kit Macleod avatar Tomas Brunken avatar Christofer Sjögren avatar Bagas Wastu avatar Yiannis Sofologis avatar Shadab Zafar avatar  avatar Igor Cotruta avatar  avatar  avatar  avatar  avatar malo_paris avatar  avatar Eduardo Carvalho avatar Kyle G. Lundstedt avatar

Watchers

Declan Naughton avatar timelyportfolio avatar

huey's Issues

Option to toggle autoquery

Currently we always immediately execute when the query changes.
But not everybody likes that.
Should be possible to toggle whether the query executes automatically or explicitly on request.

Feature: Filters

I believe there are several aspects to this

  • items on the rows and/or columns axis in the query editor should give access to a simple filter that allows include/exclude of values. Typically these would be used for multiple values making it impactical to display them
  • there is nothing in principle against having filters on the cells axis but we have to think about what it means. Does it mean the corresponding column values are filtered before doing a pivot query? Or should they apply to the aggregate results. Also, for typical, classic metrics it is unlikey simple inclusion / exclusion is enough. It typically doesn't make sense to consider metrics on individual value level, it would be more about value ranges and/or buckets of values.
  • There is a need for a 'slicer' filter functionality. By that we mean a set of restrictions that are not visible or rendered in the pivot table, but which are visible in the query axis. For these types of filters it would make sense to see the selected values in the slicer query item and it should also be possible to see multiple values. In practice the slice would just be another axis in the query editor, but a special one (just like the cells is a special one); one of the features of the slicer axis could be that the items could be expandable / collapsible, so as to reveal or hide its selected values.
  • sometimes, for some datasources, it may make sense to apply transformations are early as possible. So it could make sense to have filter support at the Attribute UI level

Feature: SQL file support

Would be nice to be able to open a SQL file and then execute the contents.

This would be primarily useful for power users to do whatever is not supported through the ui.

Pivot/Result: formatted values for date fields

Derived date fileds like month num, day of week, etc. should be formatted according to the localized date format (or whatever the user has configured through settings)

The way this will work is we will create a DateFormatter (using Intl) and then convert the values receieved from duckdb

FilterDialog: picklist filter should have a switch to apply all other filters

The picklist filter goes a long way on its own, but sometimes it would be useful if the results would not be cluttered by the values that are already eliminated by any other filters that happen to be active.

This would be a simple on/of switch (checkbox) in the global scope. Users would be able to control it from within the filter dialog itself, and possibly also from the settings dialog. The state of the setting would be treated as a user preference (although the user might decide to change the setting interactively, depending on what data set they are currently examining)

Export: Allow database download

Right now it's not super useful as huey does not change the in memory database.
but at some point we could imagine users chosing to have files copied to the database, perhaps even remodel it a bit, create a datamart, etc.
And then it would be useful to download the database so it could be uploaded a next time and have everything in place.
According to @carlop this would work:

Copy database statement? That has some weight, but works for sure. Basically attach x, copy to x, detach x, .download x

So we're storing this idea here for now.

Optimization: Don't run separate tuple and cellset queries when there is only one tuple axis.

When only one query axis (rows or columns) is populated, we could run a query of the form:

SELECT <tupleitems>, <cellsetitems>
FROM datasource
GROUP BY <tupleitems>,
ORDER BY <tupleitems> 

and use the results to populate both the cellset and the tupleset, whereas now we always do one query for the tuples and one for the cells. In other words, we could maybe cut the wait time in half of we'd do just one query.

SUM( bigint ) formatting shows some pretty wild numbers

File: https://static.data.gouv.fr/resources/populations-legales-communales-2017-2021/20231228-135143/poplegales2017-2021.parquet

Query: Rows(ANNEE_RP, CODDEP)
Cells: count(*), SUM(PMUN)

Results:
image

Equivalent duckdb query:

select ANNEE_RP, CODDEP, count(*), sum(PMUN)
from "C:\roland\projects\QuaQuery\files\poplegales2017-2021.parquet"
group by ANNEE_RP, CODDEP
order by ANNEE_RP, CODDEP

Results:

┌──────────┬─────────┬──────────────┬───────────┐
│ ANNEE_RP │ CODDEP  │ count_star() │ sum(PMUN) │
│ varchar  │ varchar │    int64     │  int128   │
├──────────┼─────────┼──────────────┼───────────┤
│ 2017     │ 01      │          393 │    643350 │
│ 2017     │ 02      │          800 │    534490 │
│ 2017     │ 03      │          317 │    337988 │
│ 2017     │ 04      │          198 │    163915 │
│ 2017     │ 05      │          162 │    141284 │
│ 2017     │ 06      │          163 │   1083310 │
│ 2017     │ 07      │          335 │    325712 │
│ 2017     │ 08      │          449 │    273579 │

Upload/Datasource experience: consider a dialog popup after finishing upload to hint the user to analyze the new datasource

Right now, the upload experience is not as intuitive as it should be.
Users manage to upload files, and they succeed, but then are surprised that nothing happens after upload.

It would be good to have a popup after upload to nudge the users in the right direction.
It should probably be configurable whether such a popup should always appear.
Perhaps, multiple actions are possible after upload, and it should be configurable what action to take.

Refactor data type and value handling

We have the following type systems to deal with:

  • javascript native typesystem
  • duckdb column type system
  • arrow/duckdb wasm resultset type system
  • dom typesystem
  • type and value presentation to the user

the relationships between these systems:

  • when we onboard a new datasource, we get column metadata which we obtain from duckdb using a DESCRIBE statement
  • the column metadata controls the options in the AttributeUi. Each column is always available as itself, but its data type determines which aggregators and derivations are available.
  • derivations typically have their own, fixed column type.
  • some aggregators also have a fixed column type. Example: STDEV
  • some aggregators will (should) always have a column type identical to the column type of the attribute. Example: MIN/MAX/
  • some aggregators are always in a particular family of types, example: COUNT will always be some positive integer type
  • some aggregators have a column type similar to that of the attribute, but with a different precision. Example: SUM

When we execute a query to populate the axes/tuples, we obtain a resultset as an "Arrow table". This is where it becomes interesting:

  • the resultset has a schema property with resultset metadata, which is a list of fields that have an Arrow type object as well as a typeId. See: https://github.com/apache/arrow/blob/740889f413af9b1ae1d81eb1e5a4a9fb4ce9cf97/js/src/enum.ts#L158
  • the mapping from duckdb column type to arrow data type may sometimes be surprising. For example, a duckdb HUGEINT is mapped to an Arrow Decimal, presumably because the largest integer type in Arrow is not precise enough to represent duckdb HUGEINTs. See duckdb/duckdb-wasm#1579
  • the mapping from Arrow types to javascript types may also be surprising. In the aforementioned example, the ArrowDecimal is represented in javascript as a Uint32[4]. We have also seen an Arrow Timestamp (coming from a duckdb TIMESTAMP, which is reasonable) whose javascript representation is a Number primitive (duckdb/duckdb-wasm#1563 (comment)). The reasoning in this case is that the Number represents the number of milliseconds from epoch and can thus be used to instantiate a javascript Date object, which would approximate the duckdb TIMESTAMP value. The reason for not returning a javascript Date instead is that the duckdb TIMESTAMP has microseconds precision (in fact it is defined as the number of microseconds after epoch), whereas the javascript Date is only in milliseconds after epoch. By returning a Number that includes 3 decimals, no precision is lost while the conversion to javascript Date is still conveniently easy.
  • Arrow has a concept called "storage type" and a given logical arrow type may be represented by several different storage types, depending on parameters;

Once we got the value from the resultset, we often need to format it so it can be presented in the UI. For formatting of numbers and dates we use the Intl.NumberFormat or Intl.DateTimeFormat instances and those accept javascript values

The real trouble starts when we need to use the values returned by a resultset as values for parameters in a prepared statement. There is absolutely no guarantee that this will work. Even a relatively simple case, where we receive a Javascript BigInt instance from the resultset fails when we try to bind it (see: duckdb/duckdb-wasm#1563)

Query History / Save query

Idea is to have a new tab in the sidebar, next to the attributes that keeps track of all queries we executred on the current datasource, along with some statistics like execution time and last execution

Queries in the history list are clickable; click one will reload that query and execute it.

"hierarchize" the axis

Excel pivot tables seem to automatically "hierarchize" the items on the rows axis:

image

I think it would be cool to provide something like that.

I think it would be good to build this before building "proper" hierarchies (see: https://github.com/rpbouman/huey/issues/new) as this functionality would already bring in a lot of the capabilities needed for proper hierarchies, while it would be much easier to implement as it presumes much less from the user and thus the UI (in particular, in case of proper hierarchies users need a ui to define how the hierarchy is implemented, whereas this proposed feature simply treats all items on one axis as the levels of one hierarchy)

error in column sum

When using a duckdb file in which one of the columns is numeric, the following error appears. I've done several tests with other banks and they all show the same error.
Note: With csv files it gave the same error.

image

Dialogs/popups not working in firefox

Firefox does not support the Popover API (yet). This means many (most) huey dialog interactions don't work or are broken.
Apparently firefox has support for the api but its not on by default. It is expected to land "soon"

Query UI: tooltips describing the item.

The query ui items should have tooltips to explain what they are doing (esp. when it's about a derivation)
Following screenshot is a mock up showing the tooltip (title attribute):

image

We should change the item instantiation code to include a title that describes the item.

Error slicing and dicing DATE values.

We have a csv upload with data that looks like this:

LOGDATE,LOGTIME,SERVER,TASK_ID,TYPE,Type of Measurement,MEASUREMENTS,LOAD,ITERATION,ITERATION_CONTINUES,PROOF,RESPONSE_TIME,RESPONSE_TIME_S,ITERATION_DATE,ITERATION_TIME,ServerType,CPU,Server Capacity
11/27/2023,10:10:15 AM,host1,MIO0000098,Forced Logical Read,HL Logical Read,All,20% CPU 10%,1,1,"50,000",6,6,11/27/2023,10:10:09 AM,DB,48 No Boost,DB 48 No Boost
11/27/2023,10:10:58 AM, host1,MIO0000098,Forced Logical Read,HL Logical Read,All,20% CPU 10%,2,2,"50,000",6,6,11/27/2023,10:10:52 AM,DB,48 No Boost,DB 48 No Boost
11/27/2023,10:11:42 AM, host1,MIO0000098,Forced Logical Read,HL Logical Read,All,20% CPU 10%,3,3,"50,000",6,6,11/27/2023,10:11:36 AM,DB,48 No Boost,DB 48 No Boost
11/27/2023,10:12:25 AM, host1,MIO0000098,Forced Logical Read,HL Logical Read,All,20% CPU 10%,4,4,"50,000",6,6,11/27/2023,10:12:19 AM,DB,48 No Boost,DB 48 No Boost
11/27/2023,10:13:08 AM, host1,MIO0000098,Forced Logical Read,HL Logical Read,All,20% CPU 10%,5,5,"50,000",5,5,11/27/2023,10:13:03 AM,DB,48 No Boost,DB 48 No Boost

DuckDB correctly infers a DATE datatype for LOGDATE column. In the resultset, these are returned as JavaScript Date objects. Then, when we try to fetch the cells, the condition on the aggregate query fails to retrieve the tuple values.

Scroll user experience

Scrolling feels slower than necessary. For a large part this is due to how we handle it now:

  • we buffer scroll events and wait for a timeout (couple of hundred milliseconds)
  • when the timeout expires, we switch to a busy state, which pops up a progress indicator and blurs the output
  • we do a query when necessary, and then render the results.

The consequence of this approach is that every scroll movement feels as if it requires backend action. Even when we have a suitable amount of cached tuples and cells, it still feel slow.

what we should do is:

  • immediately respond to scroll event, or at the very least shorten the timeout
  • whatever amount of data we can serve from the cache should immediately be rendered without popping up the spinner
  • after all scroll events died out, check if are missing tuples/cells, and if necessary, pop up a spinner and do the necessary backend queries.

Filter axis: click on filter item broken

FilterUi.js:544 Uncaught (in promise) TypeError: Cannot read properties of null (reading 'getBoundingClientRect')
    at #positionFilterDialog (FilterUi.js:544:40)
    at FilterDialog.openFilterDialog (FilterUi.js:564:31)
    at QueryUi.openFilterDialogForQueryModelItem (QueryUi.js:81:24)
    at #queryUiClickHandler (QueryUi.js:75:12)

Better UNION detection when acquiring datasources and/or custom options to lump files together.

Detection of file type signature is now based on:

  • datasource type (must be identical )
  • file extension (must be identical if file)
  • column names (must be identical)
  • column types (can be fuzzy, based on loose typing)

this works pretty well but there are cases where the loose typing is still too strict.

In some cases it may be more appropriate to lump all files together that have identical column names, regardless of types.

Alternatively if we would have a proper wizard for ingestion we could let the user control exactly which files should be lumped together.

Date and Time derivations: should be renamed

The date and time derivations were a temporary crutch to allow friendly formatting of timestamp values.
Now that we have formatting support also on the axes, we should reconsider, as the formatting should now be done by formatters.

As I see it now there are two possibilities :

  1. the current implementation of these derivations was always wrong, as they merely format the timestamp value into a iso date and time respectively. The proper implementation should have delivered a duckdb DATE and TIME value respectively, and these can then be formatted into user friendly values

  2. The current date and time representations were chose so precisely because they represent ISO date and time, which we think is a good and desirable thing as they are very portable and "universal". Derivations that deliver a DATE and TIME datatype are still useful because they can be formatted into local formats, but that does not change that we still would also like to be able to easily get a plain iso date or time, and since the current implementation does precisely that, it seems wasteful to first have duckdb create DATE and TIME values, and then letting the result javascript Date values be formatted down again to strings.

image

Support for parent-child hierarchies

This is a long term goal.

Idea is to allow datasets that have a recursive foreign key to be presented as a tree view, including expand/collapse functionality, and having the non-leaf nodes show the aggregated result over its descendants.

In theory:

  • there could be multiple (independent) hierarchies in the same dataset
  • hierarchies could be placed on either row or columns axis
  • the relationship could be based on compound keys

In practice, it would already be great if we could support just one hierarchy on the rows axis based on a single column foreign key.
This particular constrained example would be immediately useful for balance sheet like analysis.

Summation error when using "Max. fraction digits" to zero

When setting option "Max. fraction digits" to zero, the summations of values are not working anymore:
image

Error is thrown in SQLHelper.js (function createNumberFormatter):
image

When using a "Max. fraction digits" higher than zero, the summation is done correct.

Feature: Subtotals and Grande totals

This would be implemented as a on/off property at the items of the rows and column axis query items.
Based on the state of these properties, we would generate a GROUP BY GROUPING SETS query, and this would more or less automatically deliver the required results.

FilterDialog: search for populating the picklist should have options to control "fuzziness"

The filter dialog has a picklist which can be populated based on a search criterion entered by the user. The user then picks items from the list to formulate a condition.

Currently the picklist criterion supports like wildcards but nothing else.
It would be nice to add options search in a case-insensitive way, as well as options to include implied wildcards at either end of the entered criterion (effectively searching with "contains" semantics)

image

Error when using a DuckDB view as source which makes use of CTEs

A view that makes use of CTEs in a duckdb file cannot be used as a source. When trying to select it, the console shows an error indicating that the table could not be found.

Steps to reproduce:
Create a duckdb file with a table:
create table Cities as select * from (values ('Amsterdam', 1), ('London', 2)) Cities(Name, Id);

On top create a view that uses a CTE:
create or replace view v_cities as select * from Cities;

Use the created duckdb file as a source and select the view. Huey will show an indicator that it is loading the metadata, but when opening the console, it turns out that there is an error:
Uncaught (in promise) Error: Catalog Error: Table with name Cities does not exist! Did you mean "xxx.Cities"?

Filter axis items should be expandable and/or resizable to reveal their values

The functional requirement is to have a visual on the values/conditions, esp. for those items that are not on the rows/columns axes.

Did a little experiment and I like how it looks and feels:

image

code for the filter item is something like this:

<!-- This is the normal li we use for axis items -->
<li
  style="overflow: hidden; resize: both"
>
  <details>
    <summary>Caption</summary>
    <ol>
      <li>Value1</li>
      <li>Value2</li>
    </ol>
  </details>
</li>

We may need to play a little bit with whether the li or the details element needs to be resizable and the resize property should probably be available only when the details element is expanded.

Attribute Ui: ability to structure derivations and aggregations.

It's nice that huey provides so many derivations and aggregations. It's also a bit much.

We should at least distinguish between those things that are "very common" and those that are "special interest", such that we end up for a rather small set of items directly below the attribute, and tuck away the more exotic or special things in a folder structure below the attribute.

For example, SUM and AVERAGE are probably "very common";
kurtosis and skewedness on the other hand are probably "special interest".

There may be shades of grey, depending on the type of user so ideally it would be somewhat configurable

image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.