Filter migration fix (#4151)

* Exclude value for is null/not null

Also includes changes to the error message in the migration to include the filter string.

* Ignore null when setting from encoded criterion
This commit is contained in:
WithoutPants
2023-09-25 11:53:47 +10:00
committed by GitHub
parent 9f5bcca1eb
commit 22350d38bc
2 changed files with 29 additions and 20 deletions

View File

@@ -133,17 +133,17 @@ func (m *schema49Migrator) migrateSavedFilters(ctx context.Context) error {
newFindFilter, err := m.getFindFilter(asRawMessage) newFindFilter, err := m.getFindFilter(asRawMessage)
if err != nil { if err != nil {
return fmt.Errorf("failed to get find filter for saved filter %d: %w", id, err) return fmt.Errorf("failed to get find filter for saved filter %s : %w", findFilter, err)
} }
objectFilter, err := m.getObjectFilter(mode, asRawMessage) objectFilter, err := m.getObjectFilter(mode, asRawMessage)
if err != nil { if err != nil {
return fmt.Errorf("failed to get object filter for saved filter %d: %w", id, err) return fmt.Errorf("failed to get object filter for saved filter %s : %w", findFilter, err)
} }
uiOptions, err := m.getDisplayOptions(asRawMessage) uiOptions, err := m.getDisplayOptions(asRawMessage)
if err != nil { if err != nil {
return fmt.Errorf("failed to get display options for saved filter %d: %w", id, err) return fmt.Errorf("failed to get display options for saved filter %s : %w", findFilter, err)
} }
_, err = m.db.Exec("UPDATE saved_filters SET find_filter = ?, object_filter = ?, ui_options = ? WHERE id = ?", newFindFilter, objectFilter, uiOptions, id) _, err = m.db.Exec("UPDATE saved_filters SET find_filter = ?, object_filter = ?, ui_options = ? WHERE id = ?", newFindFilter, objectFilter, uiOptions, id)
@@ -252,23 +252,29 @@ func (m *schema49Migrator) convertCriterion(mode models.FilterMode, out map[stri
} }
delete(ret, "type") delete(ret, "type")
// Find out whether the object needs some adjustment/has non-string content attached // unset the value for IS_NULL or NOT_NULL modifiers
// Only adjust if value is present modifier := models.CriterionModifier(ret["modifier"].(string))
if v, ok := ret["value"]; ok && v != nil { if modifier == models.CriterionModifierIsNull || modifier == models.CriterionModifierNotNull {
var err error delete(ret, "value")
switch { } else {
case arrayContains(migrate49TypeResolution["Boolean"], field): // Find out whether the object needs some adjustment/has non-string content attached
ret["value"], err = m.adjustCriterionValue(ret["value"], "bool") // Only adjust if value is present
case arrayContains(migrate49TypeResolution["Int"], field): if v, ok := ret["value"]; ok && v != nil {
ret["value"], err = m.adjustCriterionValue(ret["value"], "int") var err error
case arrayContains(migrate49TypeResolution["Float"], field): switch {
ret["value"], err = m.adjustCriterionValue(ret["value"], "float64") case arrayContains(migrate49TypeResolution["Boolean"], field):
case arrayContains(migrate49TypeResolution["Object"], field): ret["value"], err = m.adjustCriterionValue(ret["value"], "bool")
ret["value"], err = m.adjustCriterionValue(ret["value"], "object") case arrayContains(migrate49TypeResolution["Int"], field):
} ret["value"], err = m.adjustCriterionValue(ret["value"], "int")
case arrayContains(migrate49TypeResolution["Float"], field):
ret["value"], err = m.adjustCriterionValue(ret["value"], "float64")
case arrayContains(migrate49TypeResolution["Object"], field):
ret["value"], err = m.adjustCriterionValue(ret["value"], "object")
}
if err != nil { if err != nil {
return fmt.Errorf("failed to adjust criterion value for %q: %w", field, err) return fmt.Errorf("failed to adjust criterion value for %q: %w", field, err)
}
} }
} }

View File

@@ -143,7 +143,10 @@ export abstract class Criterion<V extends CriterionValue> {
} }
public setFromEncodedCriterion(encodedCriterion: IEncodedCriterion<V>) { public setFromEncodedCriterion(encodedCriterion: IEncodedCriterion<V>) {
if (encodedCriterion.value !== undefined) { if (
encodedCriterion.value !== undefined &&
encodedCriterion.value !== null
) {
this.value = encodedCriterion.value; this.value = encodedCriterion.value;
} }
this.modifier = encodedCriterion.modifier; this.modifier = encodedCriterion.modifier;