Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/googleps04 94 map datatype #9

Open
wants to merge 11 commits into
base: map_datatype_support
Choose a base branch
from
28 changes: 22 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@

# Project Title

A brief description of what this project does and who it's for

# DynamoDB Adapter

[![Join the chat at
Expand Down Expand Up @@ -50,12 +55,20 @@ DynamoDB Adapter currently supports the folowing operations:

DynamoDB Adapter currently supports the following DynamoDB data types

| DynamoDB Data Type | Spanner Data Types |
| ------------------------------| ------------------ |
| `N` (number type) | `INT64`, `FLOAT64`, `NUMERIC` |
| `BOOL` (boolean) | `BOOL` |
| `B` (binary type) | `BYTES(MAX)` |
| `S` (string and data values) | `STRING(MAX)` |
| DynamoDB Data Type | Spanner Data Types
| ------------------------------| ------------------
| `N` (number type) | `INT64`, `FLOAT64`, `NUMERIC`
| `BOOL` (boolean) | `BOOL`
| `B` (binary type) | `BYTES(MAX)`
| `S` (string and data values) | `STRING(MAX)`
| `M` (map and data values) | `JSON`

- Note: The Map (M) supports the following types for values, while the key type is always a string.
- `N` - number.
- `BOOL` - boolean
- `B` - binary
- `S` - string
- `M` - map

## Configuration

Expand Down Expand Up @@ -176,6 +189,9 @@ go run main.go

```

## Limitations
1. The `FilterExpression` for Query and Scan API has the support only for `=`operator.

## API Documentation

This is can be imported in Postman or can be used for Swagger UI.
Expand Down
9 changes: 5 additions & 4 deletions api/v1/condition.go
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ func parseUpdateExpresstion(actionValue string) *models.UpdateExpressionConditio
return expr
}

func performOperation(ctx context.Context, action string, actionValue string, updateAtrr models.UpdateAttr, oldRes map[string]interface{}) (map[string]interface{}, map[string]interface{}, error) {
func performOperation(ctx context.Context, action string, actionValue string, updateAtrr models.UpdateAttr, oldRes map[string]interface{}, spannerRow map[string]interface{}) (map[string]interface{}, map[string]interface{}, error) {
switch {
case action == "DELETE":
// perform delete
Expand All @@ -234,7 +234,7 @@ func performOperation(ctx context.Context, action string, actionValue string, up
case action == "SET":
// Update data in table
m, expr := parseActionValue(actionValue, updateAtrr, false)
res, err := services.Put(ctx, updateAtrr.TableName, m, expr, updateAtrr.ConditionExpression, updateAtrr.ExpressionAttributeMap, oldRes)
res, err := services.Put(ctx, updateAtrr.TableName, m, expr, updateAtrr.ConditionExpression, updateAtrr.ExpressionAttributeMap, oldRes, spannerRow)
return res, m, err
case action == "ADD":
// Add data in table
Expand All @@ -254,8 +254,9 @@ func performOperation(ctx context.Context, action string, actionValue string, up
func UpdateExpression(ctx context.Context, updateAtrr models.UpdateAttr) (interface{}, error) {
updateAtrr.ExpressionAttributeNames = ChangeColumnToSpannerExpressionName(updateAtrr.TableName, updateAtrr.ExpressionAttributeNames)
var oldRes map[string]interface{}
var spannerRow map[string]interface{}
if updateAtrr.ReturnValues != "NONE" {
oldRes, _ = services.GetWithProjection(ctx, updateAtrr.TableName, updateAtrr.PrimaryKeyMap, "", nil)
oldRes, spannerRow, _ = services.GetWithProjection(ctx, updateAtrr.TableName, updateAtrr.PrimaryKeyMap, "", nil)
}
var resp map[string]interface{}
var actVal = make(map[string]interface{})
Expand All @@ -266,7 +267,7 @@ func UpdateExpression(ctx context.Context, updateAtrr models.UpdateAttr) (interf
}
m := extractOperations(updateAtrr.UpdateExpression)
for k, v := range m {
res, acVal, err := performOperation(ctx, k, v, updateAtrr, oldRes)
res, acVal, err := performOperation(ctx, k, v, updateAtrr, oldRes, spannerRow)
resp = res
er = err
for k, v := range acVal {
Expand Down
10 changes: 5 additions & 5 deletions api/v1/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,11 +146,11 @@ func put(ctx context.Context, tableName string, putObj map[string]interface{}, e
pKey := tableConf.PartitionKey
var oldResp map[string]interface{}

oldResp, err = storage.GetStorageInstance().SpannerGet(ctx, tableName, putObj[pKey], putObj[sKey], nil)
oldResp, spannerRow, err := storage.GetStorageInstance().SpannerGet(ctx, tableName, putObj[pKey], putObj[sKey], nil)
if err != nil {
return nil, err
}
res, err := services.Put(ctx, tableName, putObj, nil, conditionExp, expressionAttr, oldResp)
res, err := services.Put(ctx, tableName, putObj, nil, conditionExp, expressionAttr, oldResp, spannerRow)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -290,7 +290,7 @@ func GetItemMeta(c *gin.Context) {
return
}
getItemMeta.ExpressionAttributeNames = ChangeColumnToSpannerExpressionName(getItemMeta.TableName, getItemMeta.ExpressionAttributeNames)
res, rowErr := services.GetWithProjection(c.Request.Context(), getItemMeta.TableName, getItemMeta.PrimaryKeyMap, getItemMeta.ProjectionExpression, getItemMeta.ExpressionAttributeNames)
res, _, rowErr := services.GetWithProjection(c.Request.Context(), getItemMeta.TableName, getItemMeta.PrimaryKeyMap, getItemMeta.ProjectionExpression, getItemMeta.ExpressionAttributeNames)
if rowErr == nil {
changedColumns := ChangeResponseToOriginalColumns(getItemMeta.TableName, res)
output, err := ChangeMaptoDynamoMap(changedColumns)
Expand Down Expand Up @@ -431,7 +431,7 @@ func DeleteItem(c *gin.Context) {
deleteItem.ConditionExpression = strings.ReplaceAll(deleteItem.ConditionExpression, k, v)
}

oldRes, _ := services.GetWithProjection(c.Request.Context(), deleteItem.TableName, deleteItem.PrimaryKeyMap, "", nil)
oldRes, _, _ := services.GetWithProjection(c.Request.Context(), deleteItem.TableName, deleteItem.PrimaryKeyMap, "", nil)
err := services.Delete(c.Request.Context(), deleteItem.TableName, deleteItem.PrimaryKeyMap, deleteItem.ConditionExpression, deleteItem.ExpressionAttributeMap, nil)
if err == nil {
output, _ := ChangeMaptoDynamoMap(ChangeResponseToOriginalColumns(deleteItem.TableName, oldRes))
Expand Down Expand Up @@ -657,7 +657,7 @@ func batchUpdateItems(con context.Context, batchMetaUpdate models.BatchMetaUpdat
if err != nil {
return err
}
err = services.BatchPut(con, batchMetaUpdate.TableName, batchMetaUpdate.ArrAttrMap)
err = services.BatchPut(con, batchMetaUpdate.TableName, batchMetaUpdate.ArrAttrMap, nil)
if err != nil {
return err
}
Expand Down
Loading