Skip to content

Comments

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

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

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

Conversation

@raduendv
Copy link
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))`

@raduendv raduendv requested a review from a team as a code owner January 27, 2026 14:16
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