소스 검색

:zap: Improve database loading performance

Daniel 8 달 전
부모
커밋
f69e776f8c
3개의 변경된 파일37개의 추가작업 그리고 13개의 파일을 삭제
  1. 8 2
      kernel/av/filter.go
  2. 3 1
      kernel/av/table.go
  3. 26 10
      kernel/model/attribute_view.go

+ 8 - 2
kernel/av/filter.go

@@ -79,7 +79,7 @@ const (
 	FilterOperatorIsFalse          FilterOperator = "Is false"
 )
 
-func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, rowID string) bool {
+func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, rowID string, attrViewCache *map[string]*AttributeView) bool {
 	if nil == filter || (nil == filter.Value && nil == filter.RelativeDate) {
 		return true
 	}
@@ -117,7 +117,13 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, rowID st
 			return false
 		}
 
-		destAv, _ := ParseAttributeView(relKey.Relation.AvID)
+		destAv := (*attrViewCache)[relKey.Relation.AvID]
+		if nil == destAv {
+			destAv, _ = ParseAttributeView(relKey.Relation.AvID)
+			if nil != destAv {
+				(*attrViewCache)[relKey.Relation.AvID] = destAv
+			}
+		}
 		if nil == destAv {
 			return false
 		}

+ 3 - 1
kernel/av/table.go

@@ -256,6 +256,8 @@ func (table *Table) FilterRows(attrView *AttributeView) {
 	}
 
 	rows := []*TableRow{}
+	attrViewCache := map[string]*AttributeView{}
+	attrViewCache[attrView.ID] = attrView
 	for _, row := range table.Rows {
 		pass := true
 		for j, index := range colIndexes {
@@ -275,7 +277,7 @@ func (table *Table) FilterRows(attrView *AttributeView) {
 				break
 			}
 
-			if !row.Cells[index].Value.Filter(table.Filters[j], attrView, row.ID) {
+			if !row.Cells[index].Value.Filter(table.Filters[j], attrView, row.ID, &attrViewCache) {
 				pass = false
 				break
 			}

+ 26 - 10
kernel/model/attribute_view.go

@@ -488,17 +488,20 @@ func GetBlockAttributeViewKeys(blockID string) (ret []*BlockAttributeViewKeys) {
 		return
 	}
 
+	attrViewCache := map[string]*av.AttributeView{}
 	avIDs := strings.Split(avs, ",")
 	for _, avID := range avIDs {
-		attrView, err := av.ParseAttributeView(avID)
-		if err != nil {
-			logging.LogErrorf("parse attribute view [%s] failed: %s", avID, err)
-			unbindBlockAv(nil, avID, blockID)
-			return
+		attrView := attrViewCache[avID]
+		if nil == attrView {
+			attrView, _ = av.ParseAttributeView(avID)
+			if nil == attrView {
+				unbindBlockAv(nil, avID, blockID)
+				return
+			}
+			attrViewCache[avID] = attrView
 		}
 
 		if 1 > len(attrView.Views) {
-			err = av.ErrViewNotFound
 			unbindBlockAv(nil, avID, blockID)
 			return
 		}
@@ -568,9 +571,17 @@ func GetBlockAttributeViewKeys(blockID string) (ret []*BlockAttributeViewKeys) {
 
 				relVal := attrView.GetValue(kv.Key.Rollup.RelationKeyID, kv.Values[0].BlockID)
 				if nil != relVal && nil != relVal.Relation {
-					destAv, _ := av.ParseAttributeView(relKey.Relation.AvID)
+					destAv := attrViewCache[relKey.Relation.AvID]
+					if nil == destAv {
+						destAv, _ = av.ParseAttributeView(relKey.Relation.AvID)
+						if nil == destAv {
+							break
+						}
+						attrViewCache[relKey.Relation.AvID] = destAv
+					}
+
 					destKey, _ := destAv.GetKey(kv.Key.Rollup.KeyID)
-					if nil != destAv && nil != destKey {
+					if nil != destKey {
 						for _, bID := range relVal.Relation.BlockIDs {
 							destVal := destAv.GetValue(kv.Key.Rollup.KeyID, bID)
 							if nil == destVal {
@@ -596,9 +607,14 @@ func GetBlockAttributeViewKeys(blockID string) (ret []*BlockAttributeViewKeys) {
 					break
 				}
 
-				destAv, _ := av.ParseAttributeView(kv.Key.Relation.AvID)
+				destAv := attrViewCache[kv.Key.Relation.AvID]
 				if nil == destAv {
-					break
+					destAv, _ = av.ParseAttributeView(kv.Key.Relation.AvID)
+					if nil == destAv {
+						break
+					}
+
+					attrViewCache[kv.Key.Relation.AvID] = destAv
 				}
 
 				blocks := map[string]*av.Value{}