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

Implement PrimaryKey for generic (T, U, V) triplet #210

Merged
merged 1 commit into from
Jan 4, 2021

Conversation

maurolacy
Copy link
Contributor

Closes #197.

PrimaryKey for nested ((T, U), V) tuples cannot at the moment be defined univocally. They can be defined, but only in a way that deserializes to (T, U, V), i.e. the nesting is lost when serializing.

They are not needed / required at this point, so I think it's OK the leave them undefined for the moment.

@maurolacy maurolacy requested a review from ethanfrey December 28, 2020 07:36
@maurolacy maurolacy merged commit 2314777 into master Jan 4, 2021
@maurolacy maurolacy deleted the triple-primary-key branch January 4, 2021 09:03
Copy link
Member

@ethanfrey ethanfrey left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shame you merged so fast. The code looks good but a few points it would be good to address on a follow-up PR

packages/storage-plus/src/keys.rs Show resolved Hide resolved
packages/storage-plus/src/keys.rs Show resolved Hide resolved
packages/storage-plus/src/keys.rs Show resolved Hide resolved
impl<'a, T: PrimaryKey<'a> + Prefixer<'a>, U: PrimaryKey<'a> + Prefixer<'a>, V: PrimaryKey<'a>>
PrimaryKey<'a> for (T, U, V)
{
type Prefix = T;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prefix should be (T, U)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch. Wouldn't we want to consider both prefixes as valid? I mean, (T, U) is a prefix, but wouldn't T be another valid one?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, but look how this is used.
Maybe we need to go through this all and check the usage and document it better.

I don't have the head space to go deep in here now. Best is to leave these PRs open and I will review and merge them (or comment on them) when I have the time to check all the details.

Copy link
Contributor Author

@maurolacy maurolacy Jan 5, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, but look how this is used.

This change will force me to change the implementation of MultiIndex, currently in review (#211).
But that's OK, as this is the right way to implement Prefix for these types. I'll do the changes, and will have a better look at the trade-offs.

Maybe we need to go through this all and check the usage and document it better.

Sure. I'll document the final format properly.

I don't have the head space to go deep in here now. Best is to leave these PRs open and I will review and merge them (or comment on them) when I have the time to check all the details.

No worries. I'll leave the MultiIndex PR open. That's the only place we're actually using / requiring this.

@ethanfrey
Copy link
Member

ethanfrey commented Jan 4, 2021

I re-read the issue and saw:

Let's test both the following: ((T, U), V) and (T, U, V). For both, we should be able to give (T, U) and iterate over V.
Example: (&[u8], U32Key, U64Key)

I understand only supporting (T, U, V), but it would be good to see a test using that in a range search - a higher level test with such a key (in map.rs or such)

@maurolacy
Copy link
Contributor Author

I understand only supporting (T, U, V), but it would be good to see a test using that in a range search - a higher level test with such a key (in map.rs or such)

OK. I'll create a small PR with the tests.

@maurolacy
Copy link
Contributor Author

Shame you merged so fast. The code looks good but a few points it would be good to address on a follow-up PR

Merged because this was based on the original code / logic for (T, U), and it was more or less straightforward. Will follow-up with more tests, and the fix for Prefix, if needed.

@maurolacy maurolacy mentioned this pull request Jan 5, 2021
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.

Add (T, U, V) triple primary key
2 participants