浏览代码

:art: Improve database unbind block Improve database unbind block

Daniel 1 年之前
父节点
当前提交
58c98ce697
共有 2 个文件被更改,包括 57 次插入0 次删除
  1. 55 0
      kernel/model/attribute_view.go
  2. 2 0
      kernel/model/transaction.go

+ 55 - 0
kernel/model/attribute_view.go

@@ -1282,6 +1282,61 @@ func getRowBlockValue(keyValues []*av.KeyValues) (ret *av.Value) {
 	return
 	return
 }
 }
 
 
+func (tx *Transaction) doUnbindAttrViewBlock(operation *Operation) (ret *TxErr) {
+	err := unbindAttributeViewBlock(operation, tx)
+	if nil != err {
+		return &TxErr{code: TxErrWriteAttributeView, id: operation.AvID}
+	}
+	return
+}
+
+func unbindAttributeViewBlock(operation *Operation, tx *Transaction) (err error) {
+	attrView, err := av.ParseAttributeView(operation.AvID)
+	if nil != err {
+		return
+	}
+
+	node, _, _ := getNodeByBlockID(tx, operation.ID)
+	if nil == node {
+		return
+	}
+
+	keyValues := attrView.GetBlockKeyValues()
+	for _, value := range keyValues.Values {
+		if value.BlockID != operation.ID {
+			continue
+		}
+
+		unbindBlockAv(tx, operation.AvID, value.BlockID)
+		value.BlockID = operation.NextID
+		if nil != value.Block {
+			value.Block.ID = operation.NextID
+		}
+		break
+	}
+
+	replacedRowID := false
+	for _, v := range attrView.Views {
+		switch v.LayoutType {
+		case av.LayoutTypeTable:
+			for i, rowID := range v.Table.RowIDs {
+				if rowID == operation.ID {
+					v.Table.RowIDs[i] = operation.NextID
+					replacedRowID = true
+					break
+				}
+			}
+
+			if !replacedRowID {
+				v.Table.RowIDs = append(v.Table.RowIDs, operation.NextID)
+			}
+		}
+	}
+
+	err = av.SaveAttributeView(attrView)
+	return
+}
+
 func (tx *Transaction) doSetAttrViewColDate(operation *Operation) (ret *TxErr) {
 func (tx *Transaction) doSetAttrViewColDate(operation *Operation) (ret *TxErr) {
 	err := setAttributeViewColDate(operation)
 	err := setAttributeViewColDate(operation)
 	if nil != err {
 	if nil != err {

+ 2 - 0
kernel/model/transaction.go

@@ -294,6 +294,8 @@ func performTx(tx *Transaction) (ret *TxErr) {
 			ret = tx.doHideAttrViewName(op)
 			ret = tx.doHideAttrViewName(op)
 		case "setAttrViewColDate":
 		case "setAttrViewColDate":
 			ret = tx.doSetAttrViewColDate(op)
 			ret = tx.doSetAttrViewColDate(op)
+		case "unbindAttrViewBlock":
+			ret = tx.doUnbindAttrViewBlock(op)
 		}
 		}
 
 
 		if nil != ret {
 		if nil != ret {