[#XX] Make search by attribute as it is
Signed-off-by: Denis Kirillov <d.kirillov@yadro.com>
This commit is contained in:
parent
5fd351d559
commit
626a18f540
3 changed files with 3 additions and 130 deletions
|
@ -253,8 +253,6 @@ func (h *Handler) byAttribute(ctx context.Context, req *fasthttp.RequestCtx, han
|
|||
return
|
||||
}
|
||||
|
||||
val = prepareAtribute(key, val)
|
||||
|
||||
ctx = utils.SetReqLog(ctx, h.reqLogger(ctx).With(zap.String("cid", cidParam),
|
||||
zap.String("attr_key", key), zap.String("attr_val", val)))
|
||||
|
||||
|
@ -292,10 +290,6 @@ func (h *Handler) findObjectByAttribute(ctx context.Context, cnrID cid.ID, attrK
|
|||
n, err := res.Read(buf)
|
||||
if n == 0 {
|
||||
switch {
|
||||
case errors.Is(err, io.EOF) && h.needSearchByFileName(attrKey, attrVal):
|
||||
h.reqLogger(ctx).Debug(logs.ObjectNotFoundByFilePathTrySearchByFileName, logs.TagField(logs.TagExternalStorage))
|
||||
attrVal = prepareAtribute(attrFileName, attrVal)
|
||||
return h.findObjectByAttribute(ctx, cnrID, attrFileName, attrVal)
|
||||
case errors.Is(err, io.EOF):
|
||||
h.reqLogger(ctx).Error(logs.ObjectNotFound, zap.Error(err), logs.TagField(logs.TagExternalStorage))
|
||||
return oid.ID{}, fmt.Errorf("object not found: %w", err)
|
||||
|
@ -308,42 +302,6 @@ func (h *Handler) findObjectByAttribute(ctx context.Context, cnrID cid.ID, attrK
|
|||
return buf[0], nil
|
||||
}
|
||||
|
||||
func (h *Handler) needSearchByFileName(key, val string) bool {
|
||||
if key != attrFilePath || !h.config.EnableFilepathFallback() {
|
||||
return false
|
||||
}
|
||||
|
||||
return strings.HasPrefix(val, "/") && strings.Count(val, "/") == 1 || !strings.Contains(val, "/")
|
||||
}
|
||||
|
||||
func prepareAtribute(attrKey, attrVal string) string {
|
||||
if attrKey == attrFileName {
|
||||
return prepareFileName(attrVal)
|
||||
}
|
||||
|
||||
if attrKey == attrFilePath {
|
||||
return prepareFilePath(attrVal)
|
||||
}
|
||||
|
||||
return attrVal
|
||||
}
|
||||
|
||||
func prepareFileName(fileName string) string {
|
||||
if strings.HasPrefix(fileName, "/") {
|
||||
return fileName[1:]
|
||||
}
|
||||
|
||||
return fileName
|
||||
}
|
||||
|
||||
func prepareFilePath(filePath string) string {
|
||||
if !strings.HasPrefix(filePath, "/") {
|
||||
return "/" + filePath
|
||||
}
|
||||
|
||||
return filePath
|
||||
}
|
||||
|
||||
// resolveContainer decode container id, if it's not a valid container id
|
||||
// then trey to resolve name using provided resolver.
|
||||
func (h *Handler) resolveContainer(ctx context.Context, containerID string) (*cid.ID, error) {
|
||||
|
|
|
@ -427,90 +427,6 @@ func TestFindObjectByAttribute(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestNeedSearchByFileName(t *testing.T) {
|
||||
hc := prepareHandlerContext(t)
|
||||
|
||||
for _, tc := range []struct {
|
||||
name string
|
||||
attrKey string
|
||||
attrVal string
|
||||
additionalSearch bool
|
||||
expected bool
|
||||
}{
|
||||
{
|
||||
name: "need search - not contains slash",
|
||||
attrKey: attrFilePath,
|
||||
attrVal: "cat.png",
|
||||
additionalSearch: true,
|
||||
expected: true,
|
||||
},
|
||||
{
|
||||
name: "need search - single lead slash",
|
||||
attrKey: attrFilePath,
|
||||
attrVal: "/cat.png",
|
||||
additionalSearch: true,
|
||||
expected: true,
|
||||
},
|
||||
{
|
||||
name: "don't need search - single slash but not lead",
|
||||
attrKey: attrFilePath,
|
||||
attrVal: "cats/cat.png",
|
||||
additionalSearch: true,
|
||||
expected: false,
|
||||
},
|
||||
{
|
||||
name: "don't need search - more one slash",
|
||||
attrKey: attrFilePath,
|
||||
attrVal: "/cats/cat.png",
|
||||
additionalSearch: true,
|
||||
expected: false,
|
||||
},
|
||||
{
|
||||
name: "don't need search - incorrect attribute key",
|
||||
attrKey: attrFileName,
|
||||
attrVal: "cat.png",
|
||||
additionalSearch: true,
|
||||
expected: false,
|
||||
},
|
||||
{
|
||||
name: "don't need search - additional search disabled",
|
||||
attrKey: attrFilePath,
|
||||
attrVal: "cat.png",
|
||||
additionalSearch: false,
|
||||
expected: false,
|
||||
},
|
||||
} {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
hc.cfg.additionalFilenameSearch = tc.additionalSearch
|
||||
|
||||
res := hc.h.needSearchByFileName(tc.attrKey, tc.attrVal)
|
||||
require.Equal(t, tc.expected, res)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestPrepareFileName(t *testing.T) {
|
||||
fileName := "/cat.jpg"
|
||||
expected := "cat.jpg"
|
||||
actual := prepareFileName(fileName)
|
||||
require.Equal(t, expected, actual)
|
||||
|
||||
fileName = "cat.jpg"
|
||||
actual = prepareFileName(fileName)
|
||||
require.Equal(t, expected, actual)
|
||||
}
|
||||
|
||||
func TestPrepareFilePath(t *testing.T) {
|
||||
filePath := "cat.jpg"
|
||||
expected := "/cat.jpg"
|
||||
actual := prepareFilePath(filePath)
|
||||
require.Equal(t, expected, actual)
|
||||
|
||||
filePath = "/cat.jpg"
|
||||
actual = prepareFilePath(filePath)
|
||||
require.Equal(t, expected, actual)
|
||||
}
|
||||
|
||||
func prepareUploadRequest(ctx context.Context, bucket, content string) (*fasthttp.RequestCtx, error) {
|
||||
r := new(fasthttp.RequestCtx)
|
||||
utils.SetContextToRequest(ctx, r)
|
||||
|
|
|
@ -131,10 +131,9 @@ const (
|
|||
|
||||
// Log messages with the "external_storage" tag.
|
||||
const (
|
||||
ObjectNotFound = "object not found"
|
||||
ReadObjectListFailed = "read object list failed"
|
||||
ObjectNotFoundByFilePathTrySearchByFileName = "object not found by filePath attribute, try search by fileName"
|
||||
ObjectUploaded = "object uploaded"
|
||||
ObjectNotFound = "object not found"
|
||||
ReadObjectListFailed = "read object list failed"
|
||||
ObjectUploaded = "object uploaded"
|
||||
)
|
||||
|
||||
// Log messages with the "external_storage_tree" tag.
|
||||
|
|
Loading…
Add table
Reference in a new issue