Skip to content

feature/dynamodb/expression: support for composite keys - #3292

Open
raduendv wants to merge 1 commit into
aws:mainfrom
raduendv:expression-composite-key
Open

feature/dynamodb/expression: support for composite keys#3292
raduendv wants to merge 1 commit into
aws:mainfrom
raduendv:expression-composite-key

Conversation

@raduendv

Copy link
Copy Markdown
Contributor

Adds support for composite keys, necessary for using composite keys in Global Secondary Indexes.

Currently you cannot use the expression.Builder to create more complex KeyConditionss as the only available method is And() which results in an invalid state for the KeyCondition if you do something like this:

	builder := expression.NewBuilder()
	keyCondition := expression.Key("pk1").Equal(expression.Value("1"))
	keyCondition = keyCondition.And(expression.Key("pk2").Equal(expression.Value("1")))
	keyCondition = keyCondition.And(expression.Key("pk3").Equal(expression.Value("1")))
	keyCondition = keyCondition.And(expression.Key("pk4").Equal(expression.Value("1")))
	keyCondition = keyCondition.And(expression.Key("sk1").Equal(expression.Value("1")))
	keyCondition = keyCondition.And(expression.Key("sk2").Equal(expression.Value("1")))
	keyCondition = keyCondition.And(expression.Key("sk3").Equal(expression.Value("1")))
	keyCondition = keyCondition.And(expression.Key("sk4").Equal(expression.Value("1")))

	builder = builder.WithKeyCondition(keyCondition)
	expr, err := builder.Build() // err is: buildKeyCondition error: invalid key condition constructed
	// disabling the checks in `expression.KeyAnd()` would make `expr.KeyCondition()` something like `(((((((#0 = :0) AND (#1 = :1)) AND (#2 = :2)) AND (#3 = :3)) AND (#4 = :4)) AND (#5 = :5)) AND (#6 = :6)) AND (#7 = :7)`

New way:

	builder := expression.NewBuilder()
	keyCondition := expression.CompositeKey()
	keyCondition = keyCondition.AddPartitionKey(expression.Key("pk1").Equal(expression.Value("1")))
	keyCondition = keyCondition.AddPartitionKey(expression.Key("pk2").Equal(expression.Value("1")))
	keyCondition = keyCondition.AddPartitionKey(expression.Key("pk3").Equal(expression.Value("1")))
	keyCondition = keyCondition.AddPartitionKey(expression.Key("pk4").Equal(expression.Value("1")))
	keyCondition = keyCondition.AddSortKey(expression.Key("sk1").Equal(expression.Value("1")))
	keyCondition = keyCondition.AddSortKey(expression.Key("sk2").Equal(expression.Value("1")))
	keyCondition = keyCondition.AddSortKey(expression.Key("sk3").Equal(expression.Value("1")))
	keyCondition = keyCondition.AddSortKey(expression.Key("sk4").GreaterThanEqual(expression.Value("1")))

	builder = builder.WithKeyCondition(keyCondition)
	expr, err := builder.Build() // err is nil
	// `expr.KeyCondition()` is something like `((#0 = :0) AND (#1 = :1) AND (#2 = :2) AND (#3 = :3) AND (#4 = :4) AND (#5 = :5) AND (#6 = :6) AND (#7 >= :7))`

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant