in iot-onboarding-service/src/cloudrack-lambda-core/db/db.go [433:510]
func (dbc DBConfig) FindStartingWithAndFilter(pk string, value string, data interface{}, filter DynamoFilterExpression) error {
var queryInput = &dynamodb.QueryInput{
TableName: aws.String(dbc.TableName),
KeyConditions: map[string]*dynamodb.Condition{
dbc.PrimaryKey: {
ComparisonOperator: aws.String("EQ"),
AttributeValueList: []*dynamodb.AttributeValue{
{
S: aws.String(pk),
},
},
},
dbc.SortKey: {
ComparisonOperator: aws.String("BEGINS_WITH"),
AttributeValueList: []*dynamodb.AttributeValue{
{
S: aws.String(value),
},
},
},
},
}
//Building Filter expression
if filter.HasFilter() {
builder := expression.NewBuilder()
if filter.HasBeginsWith() {
fmt.Println("DB:FindStartingWithAndFilter> Adding Filter expression: %+v", filter.BeginsWith[0])
condBuilder := expression.Name(filter.BeginsWith[0].Key).BeginsWith(filter.BeginsWith[0].Value)
builder = builder.WithFilter(condBuilder)
}
if filter.HasContains() {
fmt.Println("DB:FindStartingWithAndFilter> Adding Filter expression: %+v", filter.Contains[0])
condBuilder := expression.Name(filter.Contains[0].Key).Contains(filter.Contains[0].Value)
builder = builder.WithFilter(condBuilder)
}
expr, err := builder.Build()
if err != nil {
fmt.Println("DB:FindStartingWithAndFilter> Error in filter expression: %+v", err)
}
queryInput.ExpressionAttributeNames = expr.Names()
queryInput.ExpressionAttributeValues = expr.Values()
queryInput.FilterExpression = expr.Filter()
}
fmt.Println("DB:FindStartingWith> rq: %+v", queryInput)
//list for all paginated items
allItems := []map[string]*dynamodb.AttributeValue{}
var result, err = dbc.DbService.QueryWithContext(dbc.LambdaContext, queryInput)
if err != nil {
fmt.Println("DB:FindStartingWith> NOT FOUND")
fmt.Println(err.Error())
return err
}
for _, item := range result.Items {
allItems = append(allItems, item)
}
//if paginated response
for result.LastEvaluatedKey != nil {
fmt.Println("DB:FindStartingWith> Response is paginated. LastEvaluatedKey: %v", result.LastEvaluatedKey)
queryInput.ExclusiveStartKey = result.LastEvaluatedKey
result, err = dbc.DbService.QueryWithContext(dbc.LambdaContext, queryInput)
if err != nil {
fmt.Println("DB:FindStartingWith> NOT FOUND")
fmt.Println(err.Error())
return err
}
for _, item := range result.Items {
allItems = append(allItems, item)
}
}
err = dynamodbattribute.UnmarshalListOfMaps(allItems, data)
if err != nil {
panic(fmt.Sprintf("Failed to unmarshal Record, %v", err))
}
return err
}