mirror of
https://github.com/anyproto/anytype-heart.git
synced 2025-06-08 05:47:07 +09:00
GO-4823 Fixes on hidden recommended relations
This commit is contained in:
parent
61649d50a5
commit
e79e61d8d0
6 changed files with 51 additions and 26 deletions
|
@ -4,8 +4,10 @@ package main
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"slices"
|
||||
"strings"
|
||||
|
||||
"github.com/anyproto/anytype-heart/core/domain"
|
||||
"github.com/anyproto/anytype-heart/pb"
|
||||
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
|
||||
"github.com/anyproto/anytype-heart/pkg/lib/localstore/addr"
|
||||
|
@ -45,9 +47,12 @@ func collectInfoFromDetails(s *pb.SnapshotWithType, info *useCaseInfo) {
|
|||
cr.isUsed = true
|
||||
info.customTypesAndRelations[k] = cr
|
||||
}
|
||||
values := pbtypes.GetStringListValue(v)
|
||||
for _, val := range values {
|
||||
if k == bundle.RelationKeyRecommendedRelations.String() {
|
||||
if slices.Contains([]domain.RelationKey{
|
||||
bundle.RelationKeyRecommendedRelations, bundle.RelationKeyRecommendedFeaturedRelations,
|
||||
bundle.RelationKeyRecommendedHiddenRelations, bundle.RelationKeyRecommendedFileRelations,
|
||||
}, domain.RelationKey(k)) {
|
||||
values := pbtypes.GetStringListValue(v)
|
||||
for _, val := range values {
|
||||
if key, found := info.relations[val]; found {
|
||||
if cr, foundToo := info.customTypesAndRelations[string(key)]; foundToo {
|
||||
cr.isUsed = true
|
||||
|
|
|
@ -141,11 +141,6 @@ func validateDetails(s *pb.SnapshotWithType, info *useCaseInfo) (err error) {
|
|||
fmt.Println("WARNING: object", id, "is a template with no target type included in the archive, so it will be skipped")
|
||||
return errSkipObject
|
||||
}
|
||||
if k == bundle.RelationKeyRecommendedRelations.String() {
|
||||
// TODO: remove this fix as most of users should obtain version with fixed export of derived objects in GO-2821
|
||||
delete(s.Snapshot.Data.Details.Fields, bundle.RelationKeyRecommendedRelations.String())
|
||||
return nil
|
||||
}
|
||||
err = multierror.Append(err, fmt.Errorf("failed to find target id for detail '%s: %s' of object %s", k, val, id))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ import (
|
|||
"math/rand"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"slices"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
|
@ -795,7 +796,12 @@ func (e *exportContext) addObjectsAndCollectRecommendedRelations(objectTypes []d
|
|||
if bundle.IsInternalType(key) {
|
||||
continue
|
||||
}
|
||||
recommendedRelations = append(recommendedRelations, objectTypes[i].Details.GetStringList(bundle.RelationKeyRecommendedRelations)...)
|
||||
recommendedRelations = lo.Uniq(slices.Concat(recommendedRelations,
|
||||
objectTypes[i].Details.GetStringList(bundle.RelationKeyRecommendedRelations),
|
||||
objectTypes[i].Details.GetStringList(bundle.RelationKeyRecommendedHiddenRelations),
|
||||
objectTypes[i].Details.GetStringList(bundle.RelationKeyRecommendedFeaturedRelations),
|
||||
objectTypes[i].Details.GetStringList(bundle.RelationKeyRecommendedFileRelations),
|
||||
))
|
||||
}
|
||||
}
|
||||
return recommendedRelations, nil
|
||||
|
|
|
@ -19,7 +19,7 @@ type ObjectIDDeriver interface {
|
|||
}
|
||||
|
||||
var (
|
||||
defaultRecommendedFeaturedRelationKeys = []domain.RelationKey{
|
||||
defaultFeaturedRelationKeys = []domain.RelationKey{
|
||||
bundle.RelationKeyType,
|
||||
bundle.RelationKeyTag,
|
||||
bundle.RelationKeyBacklinks,
|
||||
|
@ -28,10 +28,18 @@ var (
|
|||
defaultRecommendedRelationKeys = []domain.RelationKey{
|
||||
bundle.RelationKeyCreatedDate,
|
||||
bundle.RelationKeyCreator,
|
||||
bundle.RelationKeyLinks,
|
||||
}
|
||||
|
||||
defaultHiddenRelationKeys = []domain.RelationKey{
|
||||
bundle.RelationKeyLastModifiedDate,
|
||||
bundle.RelationKeyLastModifiedBy,
|
||||
bundle.RelationKeyLastOpenedDate,
|
||||
bundle.RelationKeyLinks,
|
||||
bundle.RelationKeyAddedDate,
|
||||
bundle.RelationKeySource,
|
||||
bundle.RelationKeySourceObject,
|
||||
bundle.RelationKeyImportType,
|
||||
bundle.RelationKeyOrigin,
|
||||
}
|
||||
|
||||
fileSpecificRelationKeysMap = map[domain.RelationKey]struct{}{
|
||||
|
@ -56,7 +64,8 @@ var (
|
|||
errRecommendedRelationsAlreadyFilled = fmt.Errorf("recommended featured relations are already filled")
|
||||
)
|
||||
|
||||
// FillRecommendedRelations fills recommendedRelations and recommendedFeaturedRelations based on object's details
|
||||
// FillRecommendedRelations fills recommendedRelations, recommendedFeaturedRelations, recommendedFileRelations
|
||||
// and recommendedHiddenRelations based on object's details.
|
||||
// If these relations are already filled with correct ids, isAlreadyFilled = true is returned
|
||||
func FillRecommendedRelations(ctx context.Context, deriver ObjectIDDeriver, details *domain.Details) (keys []domain.RelationKey, isAlreadyFilled bool, err error) {
|
||||
keys, err = getRelationKeysFromDetails(details)
|
||||
|
@ -67,9 +76,10 @@ func FillRecommendedRelations(ctx context.Context, deriver ObjectIDDeriver, deta
|
|||
return nil, false, fmt.Errorf("get recommended relation keys: %w", err)
|
||||
}
|
||||
|
||||
var fileRecommendedRelationKeys []domain.RelationKey
|
||||
if isFileType(details) {
|
||||
// for file types we need to fill separate relation list with file-specific recommended relations
|
||||
var fileRecommendedRelationKeys, other []domain.RelationKey
|
||||
var other []domain.RelationKey
|
||||
for _, key := range keys {
|
||||
if _, found := fileSpecificRelationKeysMap[key]; found {
|
||||
fileRecommendedRelationKeys = append(fileRecommendedRelationKeys, key)
|
||||
|
@ -85,10 +95,11 @@ func FillRecommendedRelations(ctx context.Context, deriver ObjectIDDeriver, deta
|
|||
keys = other
|
||||
}
|
||||
|
||||
// we should include default system recommended relations and exclude default recommended featured relations
|
||||
// we should include default system recommended relations and
|
||||
// exclude default recommended featured relations and default hidden relations
|
||||
keys = lo.Uniq(append(keys, defaultRecommendedRelationKeys...))
|
||||
keys = slices.DeleteFunc(keys, func(key domain.RelationKey) bool {
|
||||
return slices.Contains(defaultRecommendedFeaturedRelationKeys, key)
|
||||
return slices.Contains(append(defaultHiddenRelationKeys, defaultFeaturedRelationKeys...), key)
|
||||
})
|
||||
|
||||
relationIds, err := prepareRelationIds(ctx, deriver, keys)
|
||||
|
@ -97,13 +108,19 @@ func FillRecommendedRelations(ctx context.Context, deriver ObjectIDDeriver, deta
|
|||
}
|
||||
details.SetStringList(bundle.RelationKeyRecommendedRelations, relationIds)
|
||||
|
||||
featuredRelationIds, err := prepareRelationIds(ctx, deriver, defaultRecommendedFeaturedRelationKeys)
|
||||
featuredRelationIds, err := prepareRelationIds(ctx, deriver, defaultFeaturedRelationKeys)
|
||||
if err != nil {
|
||||
return nil, false, fmt.Errorf("prepare recommended featured relation ids: %w", err)
|
||||
}
|
||||
details.SetStringList(bundle.RelationKeyRecommendedFeaturedRelations, featuredRelationIds)
|
||||
|
||||
return append(keys, defaultRecommendedFeaturedRelationKeys...), false, nil
|
||||
hiddenRelationIds, err := prepareRelationIds(ctx, deriver, defaultHiddenRelationKeys)
|
||||
if err != nil {
|
||||
return nil, false, fmt.Errorf("prepare recommended hidden relation ids: %w", err)
|
||||
}
|
||||
details.SetStringList(bundle.RelationKeyRecommendedHiddenRelations, hiddenRelationIds)
|
||||
|
||||
return slices.Concat(keys, fileRecommendedRelationKeys, defaultHiddenRelationKeys, defaultFeaturedRelationKeys), false, nil
|
||||
}
|
||||
|
||||
func getRelationKeysFromDetails(details *domain.Details) ([]domain.RelationKey, error) {
|
||||
|
|
|
@ -20,8 +20,9 @@ func (d *mockDeriver) DeriveObjectID(ctx context.Context, key domain.UniqueKey)
|
|||
}
|
||||
|
||||
func TestFillRecommendedRelations(t *testing.T) {
|
||||
defaultRecFeatRelIds := buildRelationIds(defaultRecommendedFeaturedRelationKeys)
|
||||
defaultRecFeatRelIds := buildRelationIds(defaultFeaturedRelationKeys)
|
||||
defaultRecRelIds := buildRelationIds(defaultRecommendedRelationKeys)
|
||||
defaultRecHiddenRelIds := buildRelationIds(defaultHiddenRelationKeys)
|
||||
|
||||
for _, tc := range []struct {
|
||||
name string
|
||||
|
@ -54,7 +55,7 @@ func TestFillRecommendedRelations(t *testing.T) {
|
|||
{
|
||||
"intersect both with featured and system",
|
||||
[]string{bundle.RelationKeyBacklinks.BundledURL(), bundle.RelationKeyAddedDate.BundledURL(), bundle.RelationKeyCreatedDate.BundledURL()},
|
||||
lo.Uniq(append([]string{bundle.RelationKeyAddedDate.URL(), bundle.RelationKeyCreatedDate.URL()}, defaultRecRelIds...)),
|
||||
lo.Uniq(append([]string{bundle.RelationKeyCreatedDate.URL()}, defaultRecRelIds...)),
|
||||
},
|
||||
{
|
||||
"exclude description",
|
||||
|
@ -76,7 +77,8 @@ func TestFillRecommendedRelations(t *testing.T) {
|
|||
assert.False(t, isAlreadyFilled)
|
||||
assert.Equal(t, tc.expected, details.GetStringList(bundle.RelationKeyRecommendedRelations))
|
||||
assert.Equal(t, defaultRecFeatRelIds, details.GetStringList(bundle.RelationKeyRecommendedFeaturedRelations))
|
||||
assert.Len(t, keys, len(tc.expected)+3)
|
||||
assert.Equal(t, defaultRecHiddenRelIds, details.GetStringList(bundle.RelationKeyRecommendedHiddenRelations))
|
||||
assert.Len(t, keys, len(tc.expected)+3+8) // 3 featured and 8 hidden
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -135,7 +137,8 @@ func TestFillRecommendedRelations(t *testing.T) {
|
|||
assert.False(t, isAlreadyFilled)
|
||||
assert.Equal(t, tc.expected, details.GetStringList(bundle.RelationKeyRecommendedRelations))
|
||||
assert.Equal(t, defaultRecFeatRelIds, details.GetStringList(bundle.RelationKeyRecommendedFeaturedRelations))
|
||||
assert.Len(t, keys, len(tc.expected)+3)
|
||||
assert.Equal(t, defaultRecHiddenRelIds, details.GetStringList(bundle.RelationKeyRecommendedHiddenRelations))
|
||||
assert.Len(t, keys, len(tc.expected)+3+8) // 3 featured and 8 hidden
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -158,17 +161,15 @@ func TestFillRecommendedRelations(t *testing.T) {
|
|||
// then
|
||||
assert.NoError(t, err)
|
||||
assert.False(t, isAlreadyFilled)
|
||||
assert.Equal(t, append([]string{
|
||||
bundle.RelationKeyOrigin.URL(),
|
||||
bundle.RelationKeyAddedDate.URL(),
|
||||
}, buildRelationIds(defaultRecommendedRelationKeys)...), details.GetStringList(bundle.RelationKeyRecommendedRelations))
|
||||
assert.Equal(t, buildRelationIds(defaultRecommendedRelationKeys), details.GetStringList(bundle.RelationKeyRecommendedRelations))
|
||||
assert.Equal(t, defaultRecFeatRelIds, details.GetStringList(bundle.RelationKeyRecommendedFeaturedRelations))
|
||||
assert.Equal(t, defaultRecHiddenRelIds, details.GetStringList(bundle.RelationKeyRecommendedHiddenRelations))
|
||||
assert.Equal(t, []string{
|
||||
bundle.RelationKeyFileExt.URL(),
|
||||
bundle.RelationKeyCameraIso.URL(),
|
||||
bundle.RelationKeyAperture.URL(),
|
||||
}, details.GetStringList(bundle.RelationKeyRecommendedFileRelations))
|
||||
assert.Len(t, keys, 11)
|
||||
assert.Len(t, keys, 17)
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -193,6 +193,7 @@ func checkRecommendedRelations(
|
|||
bundle.RelationKeyRecommendedRelations,
|
||||
bundle.RelationKeyRecommendedFeaturedRelations,
|
||||
bundle.RelationKeyRecommendedFileRelations,
|
||||
bundle.RelationKeyRecommendedHiddenRelations,
|
||||
} {
|
||||
localIds := current.GetStringList(key)
|
||||
newIds := details.GetStringList(key)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue