Adding Remove function to Mongo 76/103176/1
authorRitu Sood <ritu.sood@intel.com>
Fri, 6 Mar 2020 03:00:02 +0000 (19:00 -0800)
committerRitu Sood <ritu.sood@intel.com>
Fri, 6 Mar 2020 03:04:09 +0000 (19:04 -0800)
Adding remove function to remove
a document only if no child refrences
exist.

Issue-ID: MULTICLOUD-922
Signed-off-by: Ritu Sood <ritu.sood@intel.com>
Change-Id: I7d199502635170a65f7029360c7436ac0389f2a9

src/orchestrator/pkg/infra/db/README.md
src/orchestrator/pkg/infra/db/mongo.go
src/orchestrator/pkg/infra/db/mongo_test.go
src/orchestrator/pkg/infra/db/store.go

index ff482b9..71da1e0 100644 (file)
@@ -130,7 +130,7 @@ key := CompositeAppKey{
 
 NOTE: Key structure can be different from the original key and can include Query fields also. ANY operation is not supported for Query fields.
 
-### Remove
+### RemoveAll
 
 Arguments:
 ```go
@@ -139,6 +139,15 @@ key interface
 ```
 Similar to find. This will remove one or more documents based on the key structure.
 
+### Remove
+
+Arguments:
+```go
+collection string
+key interface
+```
+This will remove one document based on the key structure. If child refrences exist for the key then the document will not be removed.
+
 ### Unmarshal
 
 Data in mongo is stored as `bson` which is a compressed form of `json`. We need mongo to convert the stored `bson` data to regular `json`
@@ -147,3 +156,4 @@ that we can use in our code when returned.
 `bson.Unmarshal` API is used to achieve this.
 
 
+
index 30eb899..a344aa1 100644 (file)
@@ -49,6 +49,8 @@ type MongoCollection interface {
                opts ...*options.FindOptions) (*mongo.Cursor, error)
        UpdateOne(ctx context.Context, filter interface{}, update interface{},
                opts ...*options.UpdateOptions) (*mongo.UpdateResult, error)
+        CountDocuments(ctx context.Context, filter interface{},
+               opts ...*options.CountOptions) (int64, error)
 }
 
 // MongoStore is an implementation of the db.Store interface
@@ -543,8 +545,8 @@ func (m *MongoStore) Find(coll string, key Key, tag string) ([][]byte, error) {
        return result, nil
 }
 
-// Remove method to remove the documet by key
-func (m *MongoStore) Remove(coll string, key Key) error {
+// RemoveAll method to removes all the documet matching key
+func (m *MongoStore) RemoveAll(coll string, key Key) error {
        if !m.validateParams(coll, key) {
                return pkgerrors.New("Mandatory fields are missing")
        }
@@ -560,3 +562,29 @@ func (m *MongoStore) Remove(coll string, key Key) error {
        }
        return nil
 }
+
+// Remove method to remove the documet by key if no child references
+func (m *MongoStore) Remove(coll string, key Key) error {
+       if !m.validateParams(coll, key) {
+               return pkgerrors.New("Mandatory fields are missing")
+       }
+       c := getCollection(coll, m)
+       ctx := context.Background()
+       filter, err := m.findFilter(key)
+       if err != nil {
+               return err
+       }
+       count, err := c.CountDocuments(context.Background(), filter)
+       if err != nil {
+               return pkgerrors.Errorf("Error finding: %s", err.Error())
+       }
+       if count > 1 {
+               return pkgerrors.Errorf("Can't delete parent without deleting child references first")
+       }
+       _, err = c.DeleteOne(ctx, filter)
+       if err != nil {
+               return pkgerrors.Errorf("Error Deleting from database: %s", err.Error())
+       }
+       return nil
+}
+
index 9f813ca..d57c19d 100644 (file)
@@ -79,6 +79,11 @@ func (c *mockCollection) UpdateOne(ctx context.Context, filter interface{}, upda
        return nil, c.Err
 }
 
+func (c *mockCollection) CountDocuments(ctx context.Context, filter interface{},
+       opts ...*options.CountOptions) (int64, error) {
+       return 1, c.Err
+}
+
 func TestCreate(t *testing.T) {
        testCases := []struct {
                label         string
index 0cf3ef6..443adff 100644 (file)
@@ -59,8 +59,11 @@ type Store interface {
        // Find the document(s) with key and get the tag values from the document(s)
        Find(coll string, key Key, tag string) ([][]byte, error)
 
-       // Removes the document(s) matching the key
+        // Removes the document(s) matching the key if no child reference in collection
        Remove(coll string, key Key) error
+
+       // Remove all the document(s) matching the key
+       RemoveAll(coll string, key Key) error
 }
 
 // CreateDBClient creates the DB client