func()

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
}