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

Triple primary key 2 #213

Merged
merged 6 commits into from
Jan 5, 2021
Merged

Triple primary key 2 #213

merged 6 commits into from
Jan 5, 2021

Conversation

maurolacy
Copy link
Contributor

Follow-up of #210.

Fixes triple key Prefix type. Add Map triple keys tests.

@maurolacy maurolacy requested a review from ethanfrey January 5, 2021 12:48
@maurolacy
Copy link
Contributor Author

I ran into problems when trying to use (T, U):

error[E0277]: the trait bound `(T, U): std::convert::AsRef<keys::PkOwned>` is not satisfied
  --> packages/storage-plus/src/keys.rs:83:19
   |
8  | pub trait PrimaryKey<'a>: Clone {
   |           ---------- required by a bound in this
9  |     type Prefix: Prefixer<'a>;
   |                  ------------ required by this bound in `keys::PrimaryKey`
...
83 |     type Prefix = (T, U);
   |                   ^^^^^^ the trait `std::convert::AsRef<keys::PkOwned>` is not implemented for `(T, U)`
   |
   = note: required because of the requirements on the impl of `keys::Prefixer<'a>` for `(T, U)`

Tried to implement AsRef<PkOwned> explicitly for (T, U) but started to get collissions with other implementations... notably, of Prefixer... not sure how to do it properly.
So, I "cheated" and fallback to using Pk2. If you know how to solve the previous error, I'll be glad to generalize / fix this.

@maurolacy maurolacy self-assigned this Jan 5, 2021
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.

Please test and update for tripple keys that don't only use &[u8]

packages/storage-plus/src/keys.rs Outdated Show resolved Hide resolved
packages/storage-plus/src/map.rs Outdated Show resolved Hide resolved
@@ -237,6 +277,38 @@ mod test {
);
}

#[test]
#[cfg(feature = "iterator")]
fn range_triple_key() {
Copy link
Member

Choose a reason for hiding this comment

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

Good test. This is what I want to see for the full-stack usage.

Can you update the TRIPLE to (&[u8], Int32Key, Int64Key) and verify this works just as well?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Sure.

Copy link
Member

Choose a reason for hiding this comment

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

I fixed the prefix implemention in my last commit.
You should be able to use it in the new code.

Copy link
Member

Choose a reason for hiding this comment

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

I need to reflect why we cannot satisfy Prefix automatically for anything that implements PrimaryKey - I assume this is a subset of the work.

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.

I need to reflect why we cannot satisfy Prefix automatically for anything that implements PrimaryKey - I assume this is a subset of the work.

I guess the idea is to be able to range() over the last part of a given key; that is, the one that doesn't implement Prefixer.

That's OK IMO. What I don't like is that currently prefix() only works for the "full" prefix, i. e. in case of triple keys, we cannot prefix only on the first element of the triple.
What I'm now thinking is that maybe we can use (abuse?) notation like (T, (U, V)), for definining a key that is internally "flat", but can be prefixed over its first element.

@ethanfrey
Copy link
Member

So, I "cheated" and fallback to using Pk2. If you know how to solve the previous error, I'll be glad to generalize / fix this.

Yes, this is because the Prefixer implementation for Pk2 is broken (it only works with default type &[u8] not any T, U). Time to fix that here.

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.

Looking better. Thank you for finding these issues

packages/storage-plus/src/map.rs Show resolved Hide resolved
@ethanfrey ethanfrey merged commit b57edb7 into master Jan 5, 2021
@ethanfrey ethanfrey deleted the triple-primary-key-2 branch January 5, 2021 15:27
@maurolacy
Copy link
Contributor Author

Looking better. Thank you for finding these issues

Thank you for the review, and for the fixes.

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

Successfully merging this pull request may close these issues.

2 participants