Updates the property field and value update methods to use a single query for multiple entities (#30198)
* Updates the property field and value update methods to use a single query for multiple entities * Update server/channels/store/sqlstore/property_field_store.go Co-authored-by: Julien Tant <785518+JulienTant@users.noreply.github.com> --------- Co-authored-by: Miguel de la Cruz (aider) <miguel@ctrlz.es> Co-authored-by: Julien Tant <785518+JulienTant@users.noreply.github.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
83ec1d9f7d
Коммит
5ba80d51ae
@@ -128,44 +128,66 @@ func (s *SqlPropertyFieldStore) Update(fields []*model.PropertyField) (_ []*mode
|
||||
defer finalizeTransactionX(transaction, &err)
|
||||
|
||||
updateTime := model.GetMillis()
|
||||
for _, field := range fields {
|
||||
field.UpdateAt = updateTime
|
||||
isPostgres := s.DriverName() == model.DatabaseDriverPostgres
|
||||
nameCase := sq.Case("id")
|
||||
typeCase := sq.Case("id")
|
||||
attrsCase := sq.Case("id")
|
||||
targetIDCase := sq.Case("id")
|
||||
targetTypeCase := sq.Case("id")
|
||||
deleteAtCase := sq.Case("id")
|
||||
ids := make([]string, len(fields))
|
||||
|
||||
for i, field := range fields {
|
||||
field.UpdateAt = updateTime
|
||||
if vErr := field.IsValid(); vErr != nil {
|
||||
return nil, errors.Wrap(vErr, "property_field_update_isvalid")
|
||||
}
|
||||
|
||||
queryString, args, err := s.getQueryBuilder().
|
||||
Update("PropertyFields").
|
||||
Set("Name", field.Name).
|
||||
Set("Type", field.Type).
|
||||
Set("Attrs", field.Attrs).
|
||||
Set("TargetID", field.TargetID).
|
||||
Set("TargetType", field.TargetType).
|
||||
Set("UpdateAt", field.UpdateAt).
|
||||
Set("DeleteAt", field.DeleteAt).
|
||||
Where(sq.Eq{"id": field.ID}).
|
||||
ToSql()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "property_field_update_tosql")
|
||||
}
|
||||
|
||||
result, err := transaction.Exec(queryString, args...)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to update property field with id: %s", field.ID)
|
||||
}
|
||||
|
||||
count, err := result.RowsAffected()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "property_field_update_rowsaffected")
|
||||
}
|
||||
if count == 0 {
|
||||
return nil, store.NewErrNotFound("PropertyField", field.ID)
|
||||
ids[i] = field.ID
|
||||
whenID := sq.Expr("?", field.ID)
|
||||
if isPostgres {
|
||||
nameCase = nameCase.When(whenID, sq.Expr("?::text", field.Name))
|
||||
typeCase = typeCase.When(whenID, sq.Expr("?::property_field_type", field.Type))
|
||||
attrsCase = attrsCase.When(whenID, sq.Expr("?::jsonb", field.Attrs))
|
||||
targetIDCase = targetIDCase.When(whenID, sq.Expr("?::text", field.TargetID))
|
||||
targetTypeCase = targetTypeCase.When(whenID, sq.Expr("?::text", field.TargetType))
|
||||
deleteAtCase = deleteAtCase.When(whenID, sq.Expr("?::bigint", field.DeleteAt))
|
||||
} else {
|
||||
nameCase = nameCase.When(whenID, sq.Expr("?", field.Name))
|
||||
typeCase = typeCase.When(whenID, sq.Expr("?", field.Type))
|
||||
attrsCase = attrsCase.When(whenID, sq.Expr("?", field.Attrs))
|
||||
targetIDCase = targetIDCase.When(whenID, sq.Expr("?", field.TargetID))
|
||||
targetTypeCase = targetTypeCase.When(whenID, sq.Expr("?", field.TargetType))
|
||||
deleteAtCase = deleteAtCase.When(whenID, sq.Expr("?", field.DeleteAt))
|
||||
}
|
||||
}
|
||||
|
||||
builder := s.getQueryBuilder().
|
||||
Update("PropertyFields").
|
||||
Set("Name", nameCase).
|
||||
Set("Type", typeCase).
|
||||
Set("Attrs", attrsCase).
|
||||
Set("TargetID", targetIDCase).
|
||||
Set("TargetType", targetTypeCase).
|
||||
Set("UpdateAt", updateTime).
|
||||
Set("DeleteAt", deleteAtCase).
|
||||
Where(sq.Eq{"id": ids})
|
||||
|
||||
result, err := transaction.ExecBuilder(builder)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "property_field_update_exec")
|
||||
}
|
||||
|
||||
count, err := result.RowsAffected()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "property_field_update_rowsaffected")
|
||||
}
|
||||
if count != int64(len(fields)) {
|
||||
return nil, errors.Errorf("failed to update, some property fields were not found, got %d of %d", count, len(fields))
|
||||
}
|
||||
|
||||
if err := transaction.Commit(); err != nil {
|
||||
return nil, errors.Wrap(err, "property_field_update_commit")
|
||||
return nil, errors.Wrap(err, "property_field_update_commit_transaction")
|
||||
}
|
||||
|
||||
return fields, nil
|
||||
|
||||
@@ -136,45 +136,54 @@ func (s *SqlPropertyValueStore) Update(values []*model.PropertyValue) (_ []*mode
|
||||
defer finalizeTransactionX(transaction, &err)
|
||||
|
||||
updateTime := model.GetMillis()
|
||||
for _, value := range values {
|
||||
value.UpdateAt = updateTime
|
||||
isPostgres := s.DriverName() == model.DatabaseDriverPostgres
|
||||
valueCase := sq.Case("id")
|
||||
deleteAtCase := sq.Case("id")
|
||||
ids := make([]string, len(values))
|
||||
|
||||
if err := value.IsValid(); err != nil {
|
||||
return nil, errors.Wrap(err, "property_value_update_isvalid")
|
||||
for i, value := range values {
|
||||
value.UpdateAt = updateTime
|
||||
if vErr := value.IsValid(); vErr != nil {
|
||||
return nil, errors.Wrap(vErr, "property_value_update_isvalid")
|
||||
}
|
||||
|
||||
ids[i] = value.ID
|
||||
valueJSON := value.Value
|
||||
if s.IsBinaryParamEnabled() {
|
||||
valueJSON = AppendBinaryFlag(valueJSON)
|
||||
}
|
||||
|
||||
queryString, args, err := s.getQueryBuilder().
|
||||
Update("PropertyValues").
|
||||
Set("Value", valueJSON).
|
||||
Set("UpdateAt", value.UpdateAt).
|
||||
Set("DeleteAt", value.DeleteAt).
|
||||
Where(sq.Eq{"id": value.ID}).
|
||||
ToSql()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "property_value_update_tosql")
|
||||
}
|
||||
|
||||
result, err := transaction.Exec(queryString, args...)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to update property value with id: %s", value.ID)
|
||||
}
|
||||
|
||||
count, err := result.RowsAffected()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "property_value_update_rowsaffected")
|
||||
}
|
||||
if count == 0 {
|
||||
return nil, store.NewErrNotFound("PropertyValue", value.ID)
|
||||
if isPostgres {
|
||||
valueCase = valueCase.When(sq.Expr("?", value.ID), sq.Expr("?::jsonb", valueJSON))
|
||||
deleteAtCase = deleteAtCase.When(sq.Expr("?", value.ID), sq.Expr("?::bigint", value.DeleteAt))
|
||||
} else {
|
||||
valueCase = valueCase.When(sq.Expr("?", value.ID), sq.Expr("?", valueJSON))
|
||||
deleteAtCase = deleteAtCase.When(sq.Expr("?", value.ID), sq.Expr("?", value.DeleteAt))
|
||||
}
|
||||
}
|
||||
|
||||
builder := s.getQueryBuilder().
|
||||
Update("PropertyValues").
|
||||
Set("Value", valueCase).
|
||||
Set("DeleteAt", deleteAtCase).
|
||||
Set("UpdateAt", updateTime).
|
||||
Where(sq.Eq{"id": ids})
|
||||
|
||||
result, err := transaction.ExecBuilder(builder)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "property_value_update_exec")
|
||||
}
|
||||
|
||||
count, err := result.RowsAffected()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "property_value_update_rowsaffected")
|
||||
}
|
||||
if count != int64(len(values)) {
|
||||
return nil, errors.Errorf("failed to update, some property values were not found, got %d of %d", count, len(values))
|
||||
}
|
||||
|
||||
if err := transaction.Commit(); err != nil {
|
||||
return nil, errors.Wrap(err, "property_value_update_commit")
|
||||
return nil, errors.Wrap(err, "property_value_update_commit_transaction")
|
||||
}
|
||||
|
||||
return values, nil
|
||||
|
||||
Ссылка в новой задаче
Block a user