gristlabs_grist-core/sandbox/grist
Alex Hall 1c89d08ea3 (core) Add a row to summary tables grouped by list column(s) corresponding to empty lists
Summary:
Adds some special handling to summary table and lookup logic:

- Source rows with empty choicelists/reflists get a corresponding summary row with an empty string/reference when grouping by that column, instead of excluding them from any group
- Adds a new `QueryOperation` 'empty' in the client which is used in `LinkingState`, `QuerySet`, and `recursiveMoveToCursorPos` to match empty lists in source tables against falsy values in linked summary tables.
- Adds a new parameter `match_empty` to the Python `CONTAINS` function so that regular formulas can implement the same behaviour as summary tables. See https://grist.slack.com/archives/C0234CPPXPA/p1654030490932119
- Uses the new `match_empty` argument in the formula generated for the `group` column when detaching a summary table.

Test Plan: Updated and extended Python and nbrowser tests of summary tables grouped by choicelists to test for new behaviour with empty lists.

Reviewers: georgegevoian

Reviewed By: georgegevoian

Differential Revision: https://phab.getgrist.com/D3471
2022-06-09 23:38:14 +02:00
..
functions (core) Add a row to summary tables grouped by list column(s) corresponding to empty lists 2022-06-09 23:38:14 +02:00
imports (core) Convert row tuples to lists to fix excel import error 2022-05-17 22:40:46 +02:00
acl_formula.py
acl.py
action_obj.py
action_summary.py
actions.py
autocomplete_context.py
codebuilder.py (core) Add PEEK() function to bypass circular dependencies 2022-06-02 19:50:14 +02:00
column.py
csv_patch.py
depend.py
docactions.py
docmodel.py (core) Add a row to summary tables grouped by list column(s) corresponding to empty lists 2022-06-09 23:38:14 +02:00
engine.py (core) Add PEEK() function to bypass circular dependencies 2022-06-02 19:50:14 +02:00
gencode.py
gpath.py
grist.py
identifiers.py
import_actions.py (core) Prevent rebuilding usercode for every AddColumn when importing 2022-05-24 22:29:20 +02:00
logger.py
lookup.py (core) Add a row to summary tables grouped by list column(s) corresponding to empty lists 2022-06-09 23:38:14 +02:00
main.py (core) Show proper message on empty Excel import, rather than a code error 2022-04-27 00:49:28 -04:00
match_counter.py
migrations.py (core) Distinct style rules for summary columns 2022-04-27 20:51:23 +02:00
moment.py
objtypes.py
parse_data.py (core) Switch excel import parsing from messytables+xlrd to openpyxl, and ignore empty rows 2022-05-12 14:43:21 +02:00
records.py
relabeling.py
relation.py
runtests.py
sandbox.py
schema.py (core) Distinct style rules for summary columns 2022-04-27 20:51:23 +02:00
sort_specs.py
summary.py (core) Add a row to summary tables grouped by list column(s) corresponding to empty lists 2022-06-09 23:38:14 +02:00
table_data_set.py
table.py (core) Add a row to summary tables grouped by list column(s) corresponding to empty lists 2022-06-09 23:38:14 +02:00
test_acl_formula.py
test_acl_renames.py
test_actions.py
test_codebuilder.py (core) Ensure formulas return something and don't assign to attributes of rec 2022-05-23 21:06:18 +02:00
test_column_actions.py (core) Updating RawData views 2022-05-04 21:41:42 +02:00
test_completion.py
test_default_formulas.py
test_depend.py
test_derived.py (core) Updating RawData views 2022-05-04 21:41:42 +02:00
test_display_cols.py (core) Updating RawData views 2022-05-04 21:41:42 +02:00
test_docmodel.py
test_engine.py
test_find_col.py
test_formula_error.py (core) Add PEEK() function to bypass circular dependencies 2022-06-02 19:50:14 +02:00
test_formula_undo.py (core) Mark column changing actions as indirect when adding data to empty column 2022-05-25 16:21:04 +02:00
test_functions.py
test_gencode.py
test_gpath.py
test_import_actions.py
test_logger.py
test_lookups.py
test_match_counter.py
test_migrations.py
test_moment.py
test_record_func.py
test_recordlist.py (core) Return RecordSet instead of list from property access when possible, to allow further property access 2022-04-05 18:05:00 +02:00
test_reflist_rel.py
test_relabeling.py
test_renames2.py
test_renames.py
test_replay.py
test_rules.py (core) Updating RawData views 2022-05-04 21:41:42 +02:00
test_side_effects.py (core) Ensure formulas return something and don't assign to attributes of rec 2022-05-23 21:06:18 +02:00
test_sort_spec.py
test_summary2.py (core) Updating RawData views 2022-05-04 21:41:42 +02:00
test_summary_choicelist.py (core) Add a row to summary tables grouped by list column(s) corresponding to empty lists 2022-06-09 23:38:14 +02:00
test_summary_undo.py (core) Updating RawData views 2022-05-04 21:41:42 +02:00
test_summary.py (core) Updating RawData views 2022-05-04 21:41:42 +02:00
test_table_actions.py (core) Updating RawData views 2022-05-04 21:41:42 +02:00
test_table_data_set.py
test_temp_rowids.py
test_textbuilder.py
test_treeview.py
test_trigger_formulas.py
test_twowaymap.py
test_types.py
test_undo.py (core) Updating RawData views 2022-05-04 21:41:42 +02:00
test_urllib_patch.py
test_user.py
test_useractions.py (core) Updating RawData views 2022-05-04 21:41:42 +02:00
testsamples.py
testscript.json (core) Updating RawData views 2022-05-04 21:41:42 +02:00
testutil.py
textbuilder.py
treeview.py
twowaymap.py
tzdata.data
urllib_patch.py
user.py
useractions.py (core) Mark column changing actions as indirect when adding data to empty column 2022-05-25 16:21:04 +02:00
usercode.py
usertypes.py
xmlrunner.py