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

keyChange update key/connectionID for faster lookup #520

Closed
wants to merge 13 commits into from

Conversation

gedu
Copy link
Contributor

@gedu gedu commented Mar 26, 2024

Details

Following proposal: Expensify/App#35809

Related Issues

Manual Tests

Expensify/App#36226 (comment)

Author Checklist

  • I linked the correct issue in the ### Related Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android / native
    • Android / Chrome
    • iOS / native
    • iOS / Safari
    • MacOS / Chrome / Safari
    • MacOS / Desktop
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
    • I verified that the left part of a conditional rendering a React component is a boolean and NOT a string, e.g. myBool && <MyComponent />.
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
  • I verified that if a function's arguments changed that all usages have also been updated correctly
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately and each prop has a /** comment above it */
    • The file is named correctly
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • If we are not using the full Onyx data that we loaded, I've added the proper selector in order to ensure the component only re-renders when the data it is using changes
    • For Class Components, any internal methods passed to components event handlers are bound to this properly so there are no scoping issues (i.e. for onClick={this.submit} the method this.submit should be bound to this in the constructor)
    • Any internal methods bound to this are necessary to be bound (i.e. avoid this.submit = this.submit.bind(this); if this.submit is never passed to a component event handler like onClick)
    • All JSX used for rendering exists in the render method
    • The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.
  • I have checked off every checkbox in the PR author checklist, including those that don't apply to this PR.

Screenshots/Videos

Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari
MacOS: Desktop

Copy link
Contributor

github-actions bot commented Mar 26, 2024

CLA Assistant Lite bot All contributors have signed the CLA ✍️ ✅

@tgolen tgolen changed the title keyChange update key/connectionID for faster lookup [HOLD] keyChange update key/connectionID for faster lookup Mar 28, 2024
@tgolen
Copy link
Collaborator

tgolen commented Mar 28, 2024

I'm placing this on HOLD right now in order for QA to be done on the latest version of Onyx without more un-QAed PRs from being merged.

@gedu
Copy link
Contributor Author

gedu commented Apr 2, 2024

I have read the CLA Document and I hereby sign the CLA

@gedu gedu marked this pull request as ready for review April 2, 2024 05:25
@gedu gedu requested a review from a team as a code owner April 2, 2024 05:25
@melvin-bot melvin-bot bot requested review from Julesssss and removed request for a team April 2, 2024 05:26
*/
declare function storeKeyByConnections(connectionID: string, key: OnyxKey): void;

declare function deleteKeyByConnections(connectionID: number): void;
Copy link
Contributor

Choose a reason for hiding this comment

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

NAB: Just incase these get refactored or a new function is created which separates them, would you mind adding a function comment for deleteKeyByConnections too please?

lib/OnyxUtils.js Outdated Show resolved Hide resolved
@Julesssss
Copy link
Contributor

gedu requested a review from https://github.com/orgs/Expensify/teams/pullerbear as a code owner 6 hours ago

Is this off HOLD?

cc @mountiny who is assigned to the linked issue

@mountiny mountiny self-requested a review April 2, 2024 20:30
@mountiny
Copy link
Contributor

mountiny commented Apr 2, 2024

It is not off hold until we merge the onyx bump and deploy it, but we can review in the meantime

@Julesssss
Copy link
Contributor

It is not off hold until we merge the onyx bump and deploy it, but we can review in the meantime

I think we've likely bumped Onyx by now?

# Conflicts:
#	lib/OnyxUtils.d.ts
#	lib/OnyxUtils.ts
@gedu
Copy link
Contributor Author

gedu commented Apr 30, 2024

Conflicts fixed

@gedu
Copy link
Contributor Author

gedu commented May 9, 2024

@mountiny can we keep reviewing this PR?
Will be more improvements: https://callstack-hq.slack.com/archives/C05LX9D6E07/p1715178705054759

@mountiny mountiny changed the title [HOLD] keyChange update key/connectionID for faster lookup keyChange update key/connectionID for faster lookup May 9, 2024
lib/Onyx.ts Show resolved Hide resolved
lib/OnyxUtils.ts Outdated Show resolved Hide resolved
lib/OnyxUtils.ts Outdated Show resolved Hide resolved
lib/OnyxUtils.ts Outdated Show resolved Hide resolved
lib/OnyxUtils.ts Outdated Show resolved Hide resolved
@mountiny mountiny requested a review from mollfpr May 9, 2024 13:06
lib/Onyx.ts Outdated Show resolved Hide resolved
Copy link
Contributor

@hannojg hannojg left a comment

Choose a reason for hiding this comment

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

LGTM (just some stylistic discussion, but the main improvement is 🔥!)

lib/OnyxUtils.ts Outdated Show resolved Hide resolved
lib/OnyxUtils.ts Outdated
Comment on lines 682 to 691
let stateMappingKeys = onyxKeyToConnectionIDs.get(key);

if (!stateMappingKeys) {
// Getting the collection key from the specific key because only collection keys were stored in the mapping.
stateMappingKeys = onyxKeyToConnectionIDs.get(getPureKey(key));
if (!stateMappingKeys) {
return;
}
}

Copy link
Contributor

Choose a reason for hiding this comment

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

also NAB and just code style discussion / how explicit we want to be.

It might be more explicit:

const connectionKey = isCollectionKey(key) ? getPureKey(key) : key;
const stateMappingKeys = onyxKeyToConnectionIDs.get(connectionKey)
if (!stateMappingKeys) {
  return;
}

Here we explicitly check for a collection key, instead of implicitly doing that by having a fallback check, which is more verbose

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Most of the time the key exists and isn't a collection, also when it enters the main loop

for (let i = 0; i < stateMappingKeys.length; i++) {

it also checks for isCollectionKey, wanna avoid extra computation

Copy link
Contributor

Choose a reason for hiding this comment

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

okay, makes sense. If its also that way for performance reasons, might be worth to add a comment to avoid future regressions

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Something that I'm just realize, is when sending a key that is report_1234 it sends to any component listening to that specific key, but it also sends updates to all components listening to report_, I'm looking into a way to update my code + keep the performance

This comment was marked as outdated.

@mountiny
Copy link
Contributor

We are handling an onyx update in this PR Expensify/App#42057 Lets wait for that to be in staging before merging this change

@mountiny mountiny changed the title keyChange update key/connectionID for faster lookup [HOLD for App onyx bump] keyChange update key/connectionID for faster lookup May 29, 2024
Copy link
Contributor

@chrispader chrispader left a comment

Choose a reason for hiding this comment

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

LGTM aside form one required JSDoc comment update

lib/OnyxUtils.ts Show resolved Hide resolved
lib/OnyxUtils.ts Show resolved Hide resolved
lib/OnyxUtils.ts Outdated
* @param {OnyxKey} key - The key to process.
* @return {string} The pure key without any numeric
*/
function getPureKey(key: OnyxKey): string {

This comment was marked as outdated.

lib/OnyxUtils.ts Outdated
Comment on lines 682 to 691
let stateMappingKeys = onyxKeyToConnectionIDs.get(key);

if (!stateMappingKeys) {
// Getting the collection key from the specific key because only collection keys were stored in the mapping.
stateMappingKeys = onyxKeyToConnectionIDs.get(getPureKey(key));
if (!stateMappingKeys) {
return;
}
}

This comment was marked as outdated.

lib/OnyxUtils.ts Outdated
Comment on lines 414 to 425
/**
* It extracts the pure, non-numeric part of a given key.
*
* For example:
* - `getPureKey("report_123")` would return "report_"
* - `getPureKey("report")` would return "report"
* - `getPureKey("report_")` would return "report_"
* - `getPureKey(null)` would return ""
*
* @param {OnyxKey} key - The key to process.
* @return {string} The pure key without any numeric
*/
Copy link
Contributor

Choose a reason for hiding this comment

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

The JSDoc still needs to be updated.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@chrispader what needs to be updated? can you help me I don't recall

Copy link
Contributor

Choose a reason for hiding this comment

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

Just the name and maybe we can change the description to

It extracts the non-numeric collection identifier of a given key. or sth.

getCollectionKey instead of getPureKey

@gedu
Copy link
Contributor Author

gedu commented Jun 17, 2024

Cool, will update, fix the comment and check if this makes sense

@gedu
Copy link
Contributor Author

gedu commented Jun 20, 2024

All good from my side, this is still valid, just need to double check @chrispader comment about JSDoc

@mountiny mountiny changed the title [HOLD for App onyx bump] keyChange update key/connectionID for faster lookup keyChange update key/connectionID for faster lookup Jun 20, 2024
@mountiny
Copy link
Contributor

Bumped for a review from @chrispader

Copy link
Contributor

@chrispader chrispader left a comment

Choose a reason for hiding this comment

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

LGTM! Still only the requested JSDoc comment update

@gedu
Copy link
Contributor Author

gedu commented Jun 21, 2024

@chrispader updated JSDoc

Copy link
Contributor

@chrispader chrispader left a comment

Choose a reason for hiding this comment

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

Thanks for the changes. LGTM!

Julesssss
Julesssss previously approved these changes Jun 24, 2024
lib/OnyxUtils.ts Outdated Show resolved Hide resolved
Copy link
Contributor

@mountiny mountiny left a comment

Choose a reason for hiding this comment

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

Thanks for adding the tests.

@Julesssss
Copy link
Contributor

I think we're ready to go here, are we waiting on any final reviews?

@gedu
Copy link
Contributor Author

gedu commented Jul 2, 2024

Any news? @mountiny @Julesssss

@Julesssss
Copy link
Contributor

Any news? @mountiny @Julesssss

Sorry, I missed this one. Can you please create an onyx bump PR and assign me please?

@Julesssss
Copy link
Contributor

Julesssss commented Jul 2, 2024

Ah shit. Your first two commits weren't signed. Could you please raise another PR against this issue? Please tag us again for another review.

@gedu
Copy link
Contributor Author

gedu commented Jul 2, 2024

Ohhh maan, ok on my way, sorry for that

@gedu gedu mentioned this pull request Jul 2, 2024
42 tasks
@gedu
Copy link
Contributor Author

gedu commented Jul 2, 2024

@Julesssss new PR created: #565

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.

8 participants