mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-17 07:00:12 +01:00
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964
This commit is contained in:
parent
2e444d899b
commit
05f4d2995c
5 changed files with 89 additions and 124 deletions
|
|
@ -55,52 +55,82 @@ const (
|
||||||
CalcOperatorPercentUnchecked CalcOperator = "Percent unchecked"
|
CalcOperatorPercentUnchecked CalcOperator = "Percent unchecked"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Calc(viewable Viewable) {
|
func Calc(viewable Viewable, attrView *AttributeView) {
|
||||||
collection := viewable.(Collection)
|
collection := viewable.(Collection)
|
||||||
|
|
||||||
|
// 字段计算
|
||||||
for i, field := range collection.GetFields() {
|
for i, field := range collection.GetFields() {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
if nil == calc || CalcOperatorNone == calc.Operator {
|
if nil == calc || CalcOperatorNone == calc.Operator {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
switch field.GetType() {
|
calcField(collection, field, i)
|
||||||
case KeyTypeBlock:
|
}
|
||||||
CalcFieldBlock(collection, field, i)
|
|
||||||
case KeyTypeText:
|
// 分组计算
|
||||||
CalcFieldText(collection, field, i)
|
if groupCalc := viewable.GetGroupCalc(); nil != groupCalc {
|
||||||
case KeyTypeNumber:
|
if groupCalcKey, _ := attrView.GetKey(groupCalc.Field); nil != groupCalcKey {
|
||||||
CalcFieldNumber(collection, field, i)
|
if field, fieldIndex := collection.GetField(groupCalcKey.ID); nil != field {
|
||||||
case KeyTypeDate:
|
var calcResult *GroupCalc
|
||||||
CalcFieldDate(collection, field, i)
|
|
||||||
case KeyTypeSelect:
|
if calc := field.GetCalc(); nil != calc && field.GetID() == groupCalcKey.ID {
|
||||||
CalcFieldSelect(collection, field, i)
|
// 直接使用字段计算结果
|
||||||
case KeyTypeMSelect:
|
calcResult = &GroupCalc{Field: groupCalcKey.ID, FieldCalc: calc}
|
||||||
CalcFieldMSelect(collection, field, i)
|
}
|
||||||
case KeyTypeURL:
|
|
||||||
CalcFieldURL(collection, field, i)
|
if nil == calcResult {
|
||||||
case KeyTypeEmail:
|
// 在字段上设置计算规则,使用字段结算结果作为分组计算结果,最后再清除字段上的计算规则
|
||||||
CalcFieldEmail(collection, field, i)
|
field.SetCalc(groupCalc.FieldCalc)
|
||||||
case KeyTypePhone:
|
calcField(collection, field, fieldIndex)
|
||||||
CalcFieldPhone(collection, field, i)
|
calcResult = &GroupCalc{Field: groupCalcKey.ID, FieldCalc: field.GetCalc()}
|
||||||
case KeyTypeMAsset:
|
field.SetCalc(nil)
|
||||||
CalcFieldMAsset(collection, field, i)
|
}
|
||||||
case KeyTypeTemplate:
|
|
||||||
CalcFieldTemplate(collection, field, i)
|
viewable.SetGroupCalc(calcResult)
|
||||||
case KeyTypeCreated:
|
}
|
||||||
CalcFieldCreated(collection, field, i)
|
|
||||||
case KeyTypeUpdated:
|
|
||||||
CalcFieldUpdated(collection, field, i)
|
|
||||||
case KeyTypeCheckbox:
|
|
||||||
CalcFieldCheckbox(collection, field, i)
|
|
||||||
case KeyTypeRelation:
|
|
||||||
CalcFieldRelation(collection, field, i)
|
|
||||||
case KeyTypeRollup:
|
|
||||||
CalcFieldRollup(collection, field, i)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalcFieldTemplate(collection Collection, field Field, fieldIndex int) {
|
func calcField(collection Collection, field Field, fieldIndex int) {
|
||||||
|
switch field.GetType() {
|
||||||
|
case KeyTypeBlock:
|
||||||
|
calcFieldBlock(collection, field, fieldIndex)
|
||||||
|
case KeyTypeText:
|
||||||
|
calcFieldText(collection, field, fieldIndex)
|
||||||
|
case KeyTypeNumber:
|
||||||
|
calcFieldNumber(collection, field, fieldIndex)
|
||||||
|
case KeyTypeDate:
|
||||||
|
calcFieldDate(collection, field, fieldIndex)
|
||||||
|
case KeyTypeSelect:
|
||||||
|
calcFieldSelect(collection, field, fieldIndex)
|
||||||
|
case KeyTypeMSelect:
|
||||||
|
calcFieldMSelect(collection, field, fieldIndex)
|
||||||
|
case KeyTypeURL:
|
||||||
|
calcFieldURL(collection, field, fieldIndex)
|
||||||
|
case KeyTypeEmail:
|
||||||
|
calcFieldEmail(collection, field, fieldIndex)
|
||||||
|
case KeyTypePhone:
|
||||||
|
calcFieldPhone(collection, field, fieldIndex)
|
||||||
|
case KeyTypeMAsset:
|
||||||
|
calcFieldMAsset(collection, field, fieldIndex)
|
||||||
|
case KeyTypeTemplate:
|
||||||
|
calcFieldTemplate(collection, field, fieldIndex)
|
||||||
|
case KeyTypeCreated:
|
||||||
|
calcFieldCreated(collection, field, fieldIndex)
|
||||||
|
case KeyTypeUpdated:
|
||||||
|
calcFieldUpdated(collection, field, fieldIndex)
|
||||||
|
case KeyTypeCheckbox:
|
||||||
|
calcFieldCheckbox(collection, field, fieldIndex)
|
||||||
|
case KeyTypeRelation:
|
||||||
|
calcFieldRelation(collection, field, fieldIndex)
|
||||||
|
case KeyTypeRollup:
|
||||||
|
calcFieldRollup(collection, field, fieldIndex)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func calcFieldTemplate(collection Collection, field Field, fieldIndex int) {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
switch calc.Operator {
|
switch calc.Operator {
|
||||||
case CalcOperatorCountAll:
|
case CalcOperatorCountAll:
|
||||||
|
|
@ -272,7 +302,7 @@ func CalcFieldTemplate(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalcFieldMAsset(collection Collection, field Field, fieldIndex int) {
|
func calcFieldMAsset(collection Collection, field Field, fieldIndex int) {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
switch calc.Operator {
|
switch calc.Operator {
|
||||||
case CalcOperatorCountAll:
|
case CalcOperatorCountAll:
|
||||||
|
|
@ -361,7 +391,7 @@ func CalcFieldMAsset(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalcFieldMSelect(collection Collection, field Field, fieldIndex int) {
|
func calcFieldMSelect(collection Collection, field Field, fieldIndex int) {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
switch calc.Operator {
|
switch calc.Operator {
|
||||||
case CalcOperatorCountAll:
|
case CalcOperatorCountAll:
|
||||||
|
|
@ -450,7 +480,7 @@ func CalcFieldMSelect(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalcFieldSelect(collection Collection, field Field, fieldIndex int) {
|
func calcFieldSelect(collection Collection, field Field, fieldIndex int) {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
switch calc.Operator {
|
switch calc.Operator {
|
||||||
case CalcOperatorCountAll:
|
case CalcOperatorCountAll:
|
||||||
|
|
@ -535,7 +565,7 @@ func CalcFieldSelect(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalcFieldDate(collection Collection, field Field, fieldIndex int) {
|
func calcFieldDate(collection Collection, field Field, fieldIndex int) {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
switch calc.Operator {
|
switch calc.Operator {
|
||||||
case CalcOperatorCountAll:
|
case CalcOperatorCountAll:
|
||||||
|
|
@ -674,7 +704,7 @@ func CalcFieldDate(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalcFieldNumber(collection Collection, field Field, fieldIndex int) {
|
func calcFieldNumber(collection Collection, field Field, fieldIndex int) {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
switch calc.Operator {
|
switch calc.Operator {
|
||||||
case CalcOperatorCountAll:
|
case CalcOperatorCountAll:
|
||||||
|
|
@ -840,7 +870,7 @@ func CalcFieldNumber(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalcFieldText(collection Collection, field Field, fieldIndex int) {
|
func calcFieldText(collection Collection, field Field, fieldIndex int) {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
switch calc.Operator {
|
switch calc.Operator {
|
||||||
case CalcOperatorCountAll:
|
case CalcOperatorCountAll:
|
||||||
|
|
@ -925,7 +955,7 @@ func CalcFieldText(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalcFieldURL(collection Collection, field Field, fieldIndex int) {
|
func calcFieldURL(collection Collection, field Field, fieldIndex int) {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
switch calc.Operator {
|
switch calc.Operator {
|
||||||
case CalcOperatorCountAll:
|
case CalcOperatorCountAll:
|
||||||
|
|
@ -1010,7 +1040,7 @@ func CalcFieldURL(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalcFieldEmail(collection Collection, field Field, fieldIndex int) {
|
func calcFieldEmail(collection Collection, field Field, fieldIndex int) {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
switch calc.Operator {
|
switch calc.Operator {
|
||||||
case CalcOperatorCountAll:
|
case CalcOperatorCountAll:
|
||||||
|
|
@ -1095,7 +1125,7 @@ func CalcFieldEmail(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalcFieldPhone(collection Collection, field Field, fieldIndex int) {
|
func calcFieldPhone(collection Collection, field Field, fieldIndex int) {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
switch calc.Operator {
|
switch calc.Operator {
|
||||||
case CalcOperatorCountAll:
|
case CalcOperatorCountAll:
|
||||||
|
|
@ -1180,7 +1210,7 @@ func CalcFieldPhone(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalcFieldBlock(collection Collection, field Field, fieldIndex int) {
|
func calcFieldBlock(collection Collection, field Field, fieldIndex int) {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
switch calc.Operator {
|
switch calc.Operator {
|
||||||
case CalcOperatorCountAll:
|
case CalcOperatorCountAll:
|
||||||
|
|
@ -1265,7 +1295,7 @@ func CalcFieldBlock(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalcFieldCreated(collection Collection, field Field, fieldIndex int) {
|
func calcFieldCreated(collection Collection, field Field, fieldIndex int) {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
switch calc.Operator {
|
switch calc.Operator {
|
||||||
case CalcOperatorCountAll:
|
case CalcOperatorCountAll:
|
||||||
|
|
@ -1393,7 +1423,7 @@ func CalcFieldCreated(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalcFieldUpdated(collection Collection, field Field, fieldIndex int) {
|
func calcFieldUpdated(collection Collection, field Field, fieldIndex int) {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
switch calc.Operator {
|
switch calc.Operator {
|
||||||
case CalcOperatorCountAll:
|
case CalcOperatorCountAll:
|
||||||
|
|
@ -1521,7 +1551,7 @@ func CalcFieldUpdated(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalcFieldCheckbox(collection Collection, field Field, fieldIndex int) {
|
func calcFieldCheckbox(collection Collection, field Field, fieldIndex int) {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
switch calc.Operator {
|
switch calc.Operator {
|
||||||
case CalcOperatorCountAll:
|
case CalcOperatorCountAll:
|
||||||
|
|
@ -1569,7 +1599,7 @@ func CalcFieldCheckbox(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalcFieldRelation(collection Collection, field Field, fieldIndex int) {
|
func calcFieldRelation(collection Collection, field Field, fieldIndex int) {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
switch calc.Operator {
|
switch calc.Operator {
|
||||||
case CalcOperatorCountAll:
|
case CalcOperatorCountAll:
|
||||||
|
|
@ -1658,7 +1688,7 @@ func CalcFieldRelation(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalcFieldRollup(collection Collection, field Field, fieldIndex int) {
|
func calcFieldRollup(collection Collection, field Field, fieldIndex int) {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
switch calc.Operator {
|
switch calc.Operator {
|
||||||
case CalcOperatorCountAll:
|
case CalcOperatorCountAll:
|
||||||
|
|
|
||||||
|
|
@ -198,7 +198,7 @@ type Collection interface {
|
||||||
GetFields() []Field
|
GetFields() []Field
|
||||||
|
|
||||||
// GetField 返回指定 ID 的字段。
|
// GetField 返回指定 ID 的字段。
|
||||||
GetField(id string) (ret Field)
|
GetField(id string) (ret Field, fieldIndex int)
|
||||||
|
|
||||||
// GetSorts 返回集合的排序规则。
|
// GetSorts 返回集合的排序规则。
|
||||||
GetSorts() []*ViewSort
|
GetSorts() []*ViewSort
|
||||||
|
|
|
||||||
|
|
@ -173,13 +173,13 @@ func (gallery *Gallery) GetFields() (ret []Field) {
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gallery *Gallery) GetField(id string) Field {
|
func (gallery *Gallery) GetField(id string) (ret Field, fieldIndex int) {
|
||||||
for _, field := range gallery.Fields {
|
for i, field := range gallery.Fields {
|
||||||
if field.ID == id {
|
if field.ID == id {
|
||||||
return field
|
return field, i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil, -1
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gallery *Gallery) GetType() LayoutType {
|
func (gallery *Gallery) GetType() LayoutType {
|
||||||
|
|
|
||||||
|
|
@ -149,13 +149,13 @@ func (table *Table) GetFields() (ret []Field) {
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
func (table *Table) GetField(id string) Field {
|
func (table *Table) GetField(id string) (ret Field, fieldIndex int) {
|
||||||
for _, column := range table.Columns {
|
for _, column := range table.Columns {
|
||||||
if column.ID == id {
|
if column.ID == id {
|
||||||
return column
|
return column, fieldIndex
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil, -1
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*Table) GetType() LayoutType {
|
func (*Table) GetType() LayoutType {
|
||||||
|
|
|
||||||
|
|
@ -1318,72 +1318,7 @@ func renderViewableInstance(viewable av.Viewable, view *av.View, attrView *av.At
|
||||||
|
|
||||||
av.Filter(viewable, attrView)
|
av.Filter(viewable, attrView)
|
||||||
av.Sort(viewable, attrView)
|
av.Sort(viewable, attrView)
|
||||||
av.Calc(viewable)
|
av.Calc(viewable, attrView)
|
||||||
|
|
||||||
if groupCalc := viewable.GetGroupCalc(); nil != groupCalc {
|
|
||||||
if groupCalcKey, _ := attrView.GetKey(groupCalc.Field); nil != groupCalcKey {
|
|
||||||
collection := viewable.(av.Collection)
|
|
||||||
var calcResult *av.GroupCalc
|
|
||||||
field := collection.GetField(groupCalcKey.ID)
|
|
||||||
if nil != field {
|
|
||||||
if calc := field.GetCalc(); nil != calc && field.GetID() == groupCalcKey.ID {
|
|
||||||
// 直接使用字段计算结果
|
|
||||||
calcResult = &av.GroupCalc{Field: groupCalcKey.ID, FieldCalc: calc}
|
|
||||||
}
|
|
||||||
|
|
||||||
if nil == calcResult {
|
|
||||||
for i, f := range collection.GetFields() {
|
|
||||||
if f.GetID() != groupCalcKey.ID {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
field.SetCalc(groupCalc.FieldCalc)
|
|
||||||
|
|
||||||
switch field.GetType() {
|
|
||||||
case av.KeyTypeBlock:
|
|
||||||
av.CalcFieldBlock(collection, field, i)
|
|
||||||
case av.KeyTypeText:
|
|
||||||
av.CalcFieldText(collection, field, i)
|
|
||||||
case av.KeyTypeNumber:
|
|
||||||
av.CalcFieldNumber(collection, field, i)
|
|
||||||
case av.KeyTypeDate:
|
|
||||||
av.CalcFieldDate(collection, field, i)
|
|
||||||
case av.KeyTypeSelect:
|
|
||||||
av.CalcFieldSelect(collection, field, i)
|
|
||||||
case av.KeyTypeMSelect:
|
|
||||||
av.CalcFieldMSelect(collection, field, i)
|
|
||||||
case av.KeyTypeURL:
|
|
||||||
av.CalcFieldURL(collection, field, i)
|
|
||||||
case av.KeyTypeEmail:
|
|
||||||
av.CalcFieldEmail(collection, field, i)
|
|
||||||
case av.KeyTypePhone:
|
|
||||||
av.CalcFieldPhone(collection, field, i)
|
|
||||||
case av.KeyTypeMAsset:
|
|
||||||
av.CalcFieldMAsset(collection, field, i)
|
|
||||||
case av.KeyTypeTemplate:
|
|
||||||
av.CalcFieldTemplate(collection, field, i)
|
|
||||||
case av.KeyTypeCreated:
|
|
||||||
av.CalcFieldCreated(collection, field, i)
|
|
||||||
case av.KeyTypeUpdated:
|
|
||||||
av.CalcFieldUpdated(collection, field, i)
|
|
||||||
case av.KeyTypeCheckbox:
|
|
||||||
av.CalcFieldCheckbox(collection, field, i)
|
|
||||||
case av.KeyTypeRelation:
|
|
||||||
av.CalcFieldRelation(collection, field, i)
|
|
||||||
case av.KeyTypeRollup:
|
|
||||||
av.CalcFieldRollup(collection, field, i)
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
calcResult = &av.GroupCalc{Field: groupCalcKey.ID, FieldCalc: field.GetCalc()}
|
|
||||||
field.SetCalc(nil)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
viewable.SetGroupCalc(calcResult)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 分页
|
// 分页
|
||||||
switch viewable.GetType() {
|
switch viewable.GetType() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue