Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
Vanessa 2025-08-22 19:32:50 +08:00
commit 4beccf5b93
3 changed files with 59 additions and 25 deletions

View file

@ -16,7 +16,7 @@ var (
attributeViewRelationsLock = sync.Mutex{}
)
func GetSrcAvIDs(destAvID string) []string {
func GetSrcAvIDs(destAvID string, excludeSelfAv bool) []string {
attributeViewRelationsLock.Lock()
defer attributeViewRelationsLock.Unlock()
@ -42,8 +42,9 @@ func GetSrcAvIDs(destAvID string) []string {
return nil
}
// 排除自己
srcAvIDs = gulu.Str.RemoveElem(srcAvIDs, destAvID)
if excludeSelfAv {
srcAvIDs = gulu.Str.RemoveElem(srcAvIDs, destAvID)
}
return srcAvIDs
}

View file

@ -1695,11 +1695,6 @@ func genAttrViewGroups(view *av.View, attrView *av.AttributeView) {
return
}
var relationDestAv *av.AttributeView
if av.KeyTypeRelation == groupKey.Type && nil != groupKey.Relation {
relationDestAv, _ = av.ParseAttributeView(groupKey.Relation.AvID)
}
var rangeStart, rangeEnd float64
switch group.Method {
case av.GroupMethodValue:
@ -1736,6 +1731,15 @@ func genAttrViewGroups(view *av.View, attrView *av.AttributeView) {
todayStart := time.Now()
todayStart = time.Date(todayStart.Year(), todayStart.Month(), todayStart.Day(), 0, 0, 0, 0, time.Local)
var relationDestAv *av.AttributeView
if av.KeyTypeRelation == groupKey.Type && nil != groupKey.Relation {
if attrView.ID == groupKey.Relation.AvID {
relationDestAv = attrView
} else {
relationDestAv, _ = av.ParseAttributeView(groupKey.Relation.AvID)
}
}
groupItemsMap := map[string][]av.Item{}
for _, item := range items {
value := item.GetValue(group.Field)
@ -2096,18 +2100,31 @@ func updateAttributeViewColRollup(operation *Operation) (err error) {
KeyID: operation.KeyID,
}
if nil != operation.Data {
data := operation.Data.(map[string]interface{})
if nil != data["calc"] {
calcData, jsonErr := gulu.JSON.MarshalJSON(data["calc"])
if nil != jsonErr {
err = jsonErr
return
}
if jsonErr = gulu.JSON.UnmarshalJSON(calcData, &rollUpKey.Rollup.Calc); nil != jsonErr {
err = jsonErr
return
if nil == operation.Data {
return
}
data := operation.Data.(map[string]interface{})
if nil != data["calc"] {
calcData, jsonErr := gulu.JSON.MarshalJSON(data["calc"])
if nil != jsonErr {
err = jsonErr
return
}
if jsonErr = gulu.JSON.UnmarshalJSON(calcData, &rollUpKey.Rollup.Calc); nil != jsonErr {
err = jsonErr
return
}
}
// 如果存在该汇总字段的过滤条件,则移除该过滤条件 https://github.com/siyuan-note/siyuan/issues/15660
for _, view := range attrView.Views {
for i, filter := range view.Filters {
if filter.Column != rollUpKey.ID {
continue
}
view.Filters = append(view.Filters[:i], view.Filters[i+1:]...)
}
}
@ -3254,7 +3271,7 @@ func removeAttributeViewBlock(srcIDs []string, avID string, tx *Transaction) (er
regenAttrViewGroups(attrView, "force")
relatedAvIDs := av.GetSrcAvIDs(avID)
relatedAvIDs := av.GetSrcAvIDs(avID, true)
for _, relatedAvID := range relatedAvIDs {
ReloadAttrView(relatedAvID)
}
@ -4328,7 +4345,7 @@ func BatchUpdateAttributeViewCells(tx *Transaction, avID string, values []interf
return
}
relatedAvIDs := av.GetSrcAvIDs(avID)
relatedAvIDs := av.GetSrcAvIDs(avID, true)
for _, relatedAvID := range relatedAvIDs {
ReloadAttrView(relatedAvID)
}
@ -4350,7 +4367,7 @@ func UpdateAttributeViewCell(tx *Transaction, avID, keyID, rowID string, valueDa
return
}
relatedAvIDs := av.GetSrcAvIDs(avID)
relatedAvIDs := av.GetSrcAvIDs(avID, true)
for _, relatedAvID := range relatedAvIDs {
ReloadAttrView(relatedAvID)
}
@ -4541,7 +4558,23 @@ func updateAttributeViewValue(tx *Transaction, attrView *av.AttributeView, keyID
updateTwoWayRelationDestAttrView(attrView, key, val, relationChangeMode, oldRelationBlockIDs)
}
regenAttrViewGroups(attrView, keyID)
if isUpdatingBlockKey {
relatedAvIDs := av.GetSrcAvIDs(avID, false)
if gulu.Str.Contains(avID, relatedAvIDs) {
regenAttrViewGroups(attrView, "force")
}
relatedAvIDs = gulu.Str.RemoveElem(relatedAvIDs, avID)
for _, relatedAvID := range relatedAvIDs {
destAv, _ := av.ParseAttributeView(relatedAvID)
if nil == destAv {
continue
}
regenAttrViewGroups(destAv, "force")
}
} else {
regenAttrViewGroups(attrView, keyID)
}
return
}
@ -5084,7 +5117,7 @@ func getAttrViewName(attrView *av.AttributeView) string {
func replaceRelationAvValues(avID, previousID, nextID string) (changedSrcAvID []string) {
// The database relation fields follow the change after the primary key field is changed https://github.com/siyuan-note/siyuan/issues/11117
srcAvIDs := av.GetSrcAvIDs(avID)
srcAvIDs := av.GetSrcAvIDs(avID, true)
for _, srcAvID := range srcAvIDs {
srcAv, parseErr := av.ParseAttributeView(srcAvID)
changed := false

View file

@ -1562,7 +1562,7 @@ func upsertAvBlockRel(node *ast.Node) {
affectedAvIDs = gulu.Str.RemoveDuplicatedElem(affectedAvIDs)
var relatedAvIDs []string
for _, avID := range affectedAvIDs {
relatedAvIDs = append(relatedAvIDs, av.GetSrcAvIDs(avID)...)
relatedAvIDs = append(relatedAvIDs, av.GetSrcAvIDs(avID, true)...)
}
affectedAvIDs = append(affectedAvIDs, relatedAvIDs...)
affectedAvIDs = gulu.Str.RemoveDuplicatedElem(affectedAvIDs)