Skip to content

Triple primary key 2#213

Merged
ethanfrey merged 6 commits intomasterfrom
triple-primary-key-2
Jan 5, 2021
Merged

Triple primary key 2#213
ethanfrey merged 6 commits intomasterfrom
triple-primary-key-2

Conversation

@maurolacy
Copy link
Copy Markdown
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
Copy Markdown
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
Copy Markdown
Contributor

@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]


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

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
Copy Markdown
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
Copy Markdown
Contributor

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
Copy Markdown
Contributor

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
Copy Markdown
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
Copy Markdown
Contributor

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
Copy Markdown
Contributor

@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

@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
Copy Markdown
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