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

feat(examples): add p/moul/collection #3321

Open
wants to merge 20 commits into
base: master
Choose a base branch
from
Open

feat(examples): add p/moul/collection #3321

wants to merge 20 commits into from

Conversation

moul
Copy link
Member

@moul moul commented Dec 10, 2024

Addresses #1467
Related with #3317

@moul moul self-assigned this Dec 10, 2024
@github-actions github-actions bot added the 🧾 package/realm Tag used for new Realms or Packages. label Dec 10, 2024
@moul moul changed the title dev/moul/avlindex feat(examples): add p/demo/avl/index Dec 10, 2024
@Gno2D2
Copy link
Collaborator

Gno2D2 commented Dec 10, 2024

🛠 PR Checks Summary

All Automated Checks passed. ✅

Manual Checks (for Reviewers):
  • IGNORE the bot requirements for this PR (force green CI check)
Read More

🤖 This bot helps streamline PR reviews by verifying automated checks and providing guidance for contributors and reviewers.

✅ Automated Checks (for Contributors):

No automated checks match this pull request.

☑️ Contributor Actions:
  1. Fix any issues flagged by automated checks.
  2. Follow the Contributor Checklist to ensure your PR is ready for review.
    • Add new tests, or document why they are unnecessary.
    • Provide clear examples/screenshots, if necessary.
    • Update documentation, if required.
    • Ensure no breaking changes, or include BREAKING CHANGE notes.
    • Link related issues/PRs, where applicable.
☑️ Reviewer Actions:
  1. Complete manual checks for the PR, including the guidelines and additional checks if applicable.
📚 Resources:
Debug
Manual Checks
**IGNORE** the bot requirements for this PR (force green CI check)

If

🟢 Condition met
└── 🟢 On every pull request

Can be checked by

  • Any user with comment edit permission

Copy link

codecov bot commented Dec 10, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

📢 Thoughts on this report? Let us know!

@moul moul force-pushed the dev/moul/avlindex branch from 1fb34a6 to 630e8f3 Compare December 10, 2024 19:11
@github-actions github-actions bot added 📦 🤖 gnovm Issues or PRs gnovm related 📦 ⛰️ gno.land Issues or PRs gno.land package related labels Dec 10, 2024
@moul moul force-pushed the dev/moul/avlindex branch from 630e8f3 to 887c1f0 Compare December 10, 2024 19:11
@moul moul changed the title feat(examples): add p/demo/avl/index feat(examples): add p/moul/collection Dec 10, 2024
Signed-off-by: moul <[email protected]>
@moul moul force-pushed the dev/moul/avlindex branch from fd8645c to 55ce510 Compare December 10, 2024 23:35
@moul moul marked this pull request as ready for review December 10, 2024 23:47
Copy link
Member

@notJoon notJoon left a comment

Choose a reason for hiding this comment

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

left some some concerning points. other things are LGTM

Comment on lines 301 to 306
newKey, ok := safeGenerateKey(idx.fn, obj)
if !ok {
// Rollback: restore old object
c.indexes[IDIndex].tree.Set(idStr, oldObj)
return 0
}
Copy link
Member

Choose a reason for hiding this comment

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

When rollback occurs due to safeGenerateKey call failures or UniqueIndex conflicts, only the _id index of oldObj is currently being restored.

I didn't found a mechanism to restore previously removed entries in other indices. This can lead to inconsistency between the _id index and other indices, may potentially compromising data integrity.

Copy link
Member Author

Choose a reason for hiding this comment

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

What do you think about fa46373?

Copy link
Member

Choose a reason for hiding this comment

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

I like it 👍

idx.tree.Remove(idStr)
continue
}
key := idx.fn(obj)
Copy link
Member

Choose a reason for hiding this comment

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

In the Set function, when inserting data with the CaseInsensitiveIndex option enabled, keys are stored after being converted to lowercase.

if idx.options&CaseInsensitiveIndex != 0 {
	key = strings.ToLower(key)
}

However, it seems that the same processing is missing when removing these keys in the Delete or Update functions.

In this line, the code attempts to directly delete the key obtained from idx.fn(obj) without any coversion process. I think this can lead to a unexpected behaviour which delection or updates don't work properly because the key doesn't match the actual lowercase key stored in the index.

Copy link
Member Author

Choose a reason for hiding this comment

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

@Kouteki Kouteki added the in focus Core team is prioritizing this work label Dec 11, 2024
@moul moul marked this pull request as draft December 21, 2024 21:33
Signed-off-by: moul <[email protected]>
@moul
Copy link
Member Author

moul commented Dec 22, 2024

Question for reviewers: API design preference for Get/GetAll

Currently, we have two different return signatures:

  • Get(index, key) (interface{}, uint64) - Returns the object and ID separately
  • GetAll(index, key) ([]Entry, bool) - Returns entries that contain both object and ID

I'm considering unifying these to always return Entry/[]Entry types:

Get(index, key) *Entry
GetAll(index, key) []Entry

Potential benefits:

  1. Consistent return types between Get and GetAll
  2. Enables method chaining (e.g., collection.Get("name", "Alice").DoSomething())
  3. Clearer relationship between object and its ID
  4. No need for multiple return values

Would love to hear thoughts on which API style you prefer and why.


Current API:

// Current Get returns (object, id)
obj, id := collection.Get("name", "Alice")

// Current GetAll returns ([]Entry, bool)
entries, ok := collection.GetAll("tags", "developer")

Alternative API:

// Alternative: Get returns Entry (with embedded ID and Obj)
entry := collection.Get("name", "Alice")
if entry != nil {
    // Use entry.ID and entry.Obj
}

// Alternative: GetAll returns []Entry
entries := collection.GetAll("tags", "developer")

@moul moul marked this pull request as ready for review December 22, 2024 21:25
@notJoon
Copy link
Member

notJoon commented Dec 23, 2024

@moul

Question for reviewers: API design preference for Get/GetAll

Alternative API looks good. Along with the benefits listed, it's more intuitive and particularly I like that it feels functional programming styles.


edit(@moul): e43e02a

moul added 2 commits December 23, 2024 12:43
Signed-off-by: moul <[email protected]>
Signed-off-by: moul <[email protected]>
Copy link
Member

@notJoon notJoon left a comment

Choose a reason for hiding this comment

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

LGTM 👍

@moul moul enabled auto-merge (squash) December 24, 2024 20:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
in focus Core team is prioritizing this work 📦 ⛰️ gno.land Issues or PRs gno.land package related 📦 🤖 gnovm Issues or PRs gnovm related 🧾 package/realm Tag used for new Realms or Packages.
Projects
Status: 📥 Inbox
Status: In Review
Development

Successfully merging this pull request may close these issues.

4 participants