From 2913aa0fd1e35f4a27b57f2c53702354bce017ed Mon Sep 17 00:00:00 2001
From: Leonard Lyubich <leonard@nspcc.ru>
Date: Thu, 5 Nov 2020 19:54:24 +0300
Subject: [PATCH] [#149] metabase: Add parent ID index

Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
---
 pkg/local_object_storage/metabase/put.go      |  4 ++++
 .../metabase/select_test.go                   | 23 +++++++++++++++++++
 2 files changed, 27 insertions(+)

diff --git a/pkg/local_object_storage/metabase/put.go b/pkg/local_object_storage/metabase/put.go
index bd676cbdc..a08d32b40 100644
--- a/pkg/local_object_storage/metabase/put.go
+++ b/pkg/local_object_storage/metabase/put.go
@@ -142,6 +142,10 @@ func objectIndices(obj *object.Object, parent bool) []bucketItem {
 			key: v2object.FilterPropertyChildfree,
 			val: childfreeVal,
 		},
+		bucketItem{
+			key: v2object.FilterHeaderParent,
+			val: obj.GetParentID().String(),
+		},
 		// TODO: add remaining fields after neofs-api#72
 	)
 
diff --git a/pkg/local_object_storage/metabase/select_test.go b/pkg/local_object_storage/metabase/select_test.go
index 6362c35d3..0383fa631 100644
--- a/pkg/local_object_storage/metabase/select_test.go
+++ b/pkg/local_object_storage/metabase/select_test.go
@@ -184,3 +184,26 @@ func TestMissingObjectAttribute(t *testing.T) {
 
 	testSelect(t, db, fs, obj1.Address())
 }
+
+func TestSelectParentID(t *testing.T) {
+	db := newDB(t)
+	defer releaseDB(db)
+
+	// generate 2 objects
+	obj1 := generateObject(t, testPrm{})
+	obj2 := generateObject(t, testPrm{})
+
+	// set parent ID of 1st object
+	par := testOID()
+	object.NewRawFromObject(obj1).SetParentID(par)
+
+	// store objects
+	require.NoError(t, db.Put(obj1))
+	require.NoError(t, db.Put(obj2))
+
+	// filter by parent ID
+	fs := objectSDK.SearchFilters{}
+	fs.AddParentIDFilter(objectSDK.MatchStringEqual, par)
+
+	testSelect(t, db, fs, obj1.Address())
+}