Quellcode durchsuchen

:art: Improve handling of database column filters containing empty values Fix https://github.com/siyuan-note/siyuan/issues/9394

Daniel vor 1 Jahr
Ursprung
Commit
ccb65454a2
1 geänderte Dateien mit 43 neuen und 3 gelöschten Zeilen
  1. 43 3
      kernel/av/table.go

+ 43 - 3
kernel/av/table.go

@@ -165,8 +165,8 @@ func (value *Value) Compare(other *Value) int {
 }
 
 func (value *Value) CompareOperator(other *Value, operator FilterOperator) bool {
-	if nil == value || nil == other {
-		return false
+	if nil == other {
+		return true
 	}
 
 	if nil != value.Block && nil != other.Block {
@@ -193,16 +193,34 @@ func (value *Value) CompareOperator(other *Value, operator FilterOperator) bool
 	if nil != value.Text && nil != other.Text {
 		switch operator {
 		case FilterOperatorIsEqual:
+			if "" == strings.TrimSpace(other.Text.Content) {
+				return true
+			}
 			return value.Text.Content == other.Text.Content
 		case FilterOperatorIsNotEqual:
+			if "" == strings.TrimSpace(other.Text.Content) {
+				return true
+			}
 			return value.Text.Content != other.Text.Content
 		case FilterOperatorContains:
+			if "" == strings.TrimSpace(other.Text.Content) {
+				return true
+			}
 			return strings.Contains(value.Text.Content, other.Text.Content)
 		case FilterOperatorDoesNotContain:
+			if "" == strings.TrimSpace(other.Text.Content) {
+				return true
+			}
 			return !strings.Contains(value.Text.Content, other.Text.Content)
 		case FilterOperatorStartsWith:
+			if "" == strings.TrimSpace(other.Text.Content) {
+				return true
+			}
 			return strings.HasPrefix(value.Text.Content, other.Text.Content)
 		case FilterOperatorEndsWith:
+			if "" == strings.TrimSpace(other.Text.Content) {
+				return true
+			}
 			return strings.HasSuffix(value.Text.Content, other.Text.Content)
 		case FilterOperatorIsEmpty:
 			return "" == strings.TrimSpace(value.Text.Content)
@@ -214,8 +232,14 @@ func (value *Value) CompareOperator(other *Value, operator FilterOperator) bool
 	if nil != value.Number && nil != other.Number {
 		switch operator {
 		case FilterOperatorIsEqual:
+			if !other.Number.IsNotEmpty {
+				return true
+			}
 			return value.Number.Content == other.Number.Content
 		case FilterOperatorIsNotEqual:
+			if !other.Number.IsNotEmpty {
+				return true
+			}
 			return value.Number.Content != other.Number.Content
 		case FilterOperatorIsGreater:
 			return value.Number.Content > other.Number.Content
@@ -235,8 +259,14 @@ func (value *Value) CompareOperator(other *Value, operator FilterOperator) bool
 	if nil != value.Date && nil != other.Date {
 		switch operator {
 		case FilterOperatorIsEqual:
+			if !other.Date.IsNotEmpty {
+				return true
+			}
 			return value.Date.Content == other.Date.Content
 		case FilterOperatorIsNotEqual:
+			if !other.Date.IsNotEmpty {
+				return true
+			}
 			return value.Date.Content != other.Date.Content
 		case FilterOperatorIsGreater:
 			return value.Date.Content > other.Date.Content
@@ -541,7 +571,17 @@ func (table *Table) FilterRows() {
 	for _, row := range table.Rows {
 		pass := true
 		for j, index := range colIndexes {
-			if !row.Cells[index].Value.CompareOperator(table.Filters[j].Value, table.Filters[j].Operator) {
+			operator := table.Filters[j].Operator
+
+			if nil == row.Cells[index].Value {
+				switch operator {
+				case FilterOperatorIsNotEmpty:
+					pass = false
+				}
+				break
+			}
+
+			if !row.Cells[index].Value.CompareOperator(table.Filters[j].Value, operator) {
 				pass = false
 				break
 			}