aws-amplify / amplify-js

A declarative JavaScript library for application development using cloud services.
https://docs.amplify.aws/lib/q/platform/js
Apache License 2.0
9.43k stars 2.12k forks source link

DataStore pagination doesn't work as expected when page === 1 and previous page data length === 1 #12049

Open dmitryusikriseapps opened 1 year ago

dmitryusikriseapps commented 1 year ago

Before opening, please confirm:

JavaScript Framework

Next.js

Amplify APIs

Authentication, DataStore

Amplify Categories

auth, storage

Environment information

``` # Put output below this line System: OS: macOS 13.5.2 CPU: (10) arm64 Apple M1 Max Memory: 2.88 GB / 32.00 GB Shell: 5.9 - /bin/zsh Binaries: Node: 16.19.1 - ~/.nvm/versions/node/v16.19.1/bin/node Yarn: 1.22.19 - /usr/local/bin/yarn npm: 9.8.0 - ~/.nvm/versions/node/v16.19.1/bin/npm pnpm: 8.6.6 - ~/.nvm/versions/node/v16.19.1/bin/pnpm Watchman: 2023.03.20.00 - /opt/homebrew/bin/watchman Browsers: Chrome: 116.0.5845.187 Safari: 16.6 npmPackages: @abelmkr/amplify: 6.3.6 => 6.3.6 @abelmkr/appsync-data-utils: 6.3.7 => 6.3.7 @abelmkr/appsync-job-rate-transformer: 6.3.7 => 6.3.7 @abelmkr/job-rate-calculator: 3.4.1 => 3.4.1 @abelmkr/job-rate-types: 3.4.1 => 3.4.1 @abelmkr/money: 3.3.0 => 3.3.0 @ampproject/toolbox-optimizer: undefined () @aws-amplify/api: 5.4.4 => 5.4.4 @aws-amplify/api/internals: undefined () @aws-amplify/auth: 5.6.4 => 5.6.4 @aws-amplify/core: 5.8.4 => 5.8.4 @aws-amplify/core/internals/aws-client-utils: undefined () @aws-amplify/core/internals/aws-client-utils/composers: undefined () @aws-amplify/core/internals/aws-clients/pinpoint: undefined () @aws-amplify/datastore: 4.7.4 => 4.7.4 @aws-amplify/datastore-storage-adapter: 2.0.47 => 2.0.47 @aws-amplify/storage: 5.9.4 => 5.9.4 @babel/core: undefined () @babel/runtime: 7.15.4 @commitlint/cli: ^17.7.1 => 17.7.1 @cypress/angular: 0.0.0-development @cypress/mount-utils: 0.0.0-development @cypress/react: 0.0.0-development @cypress/react18: 0.0.0-development @cypress/svelte: 0.0.0-development @cypress/vue: 0.0.0-development @cypress/vue2: 0.0.0-development @edge-runtime/cookies: 3.3.0 @edge-runtime/ponyfill: 2.3.0 @edge-runtime/primitives: 3.0.4 @elevai/commitlint-config-github: ^0.1.1 => 0.1.1 @elevai/commitlint-plugin-github: ^0.1.1 => 0.1.1 @hapi/accept: undefined () @hookform/resolvers: ^3.3.1 => 3.3.1 @hookform/resolvers/ajv: 1.0.0 @hookform/resolvers/arktype: 1.0.0 @hookform/resolvers/class-validator: 1.0.0 @hookform/resolvers/computed-types: 1.0.0 @hookform/resolvers/io-ts: 1.0.0 @hookform/resolvers/joi: 1.0.0 @hookform/resolvers/nope: 1.0.0 @hookform/resolvers/superstruct: 1.0.0 @hookform/resolvers/typanion: 1.0.0 @hookform/resolvers/typebox: 1.0.0 @hookform/resolvers/valibot: 1.0.0 @hookform/resolvers/vest: 1.0.0 @hookform/resolvers/yup: 1.0.0 @hookform/resolvers/zod: 1.0.0 @mswjs/interceptors: undefined () @napi-rs/triples: undefined () @next/font: undefined () @next/react-dev-overlay: undefined () @opentelemetry/api: undefined () @reduxjs/toolkit: ^1.9.5 => 1.9.5 @reduxjs/toolkit-query: 1.0.0 @reduxjs/toolkit-query-react: 1.0.0 @segment/ajv-human-errors: undefined () @svgr/webpack: ^8.1.0 => 8.1.0 @tanstack/react-table: ^8.9.3 => 8.9.8 @testing-library/jest-dom: ^6.1.2 => 6.1.3 @testing-library/react: ^14.0.0 => 14.0.0 @testing-library/react-hooks: ^8.0.1 => 8.0.1 @types/deep-equal: ^1.0.1 => 1.0.1 @types/google-map-react: ^2.1.7 => 2.1.7 @types/jest: ^29.5.4 => 29.5.4 @types/node: 20.5.9 => 20.5.9 (20.4.7, 18.0.0, 16.18.50) @types/react: 18.2.21 => 18.2.21 (18.0.14) @types/react-dom: 18.2.7 => 18.2.7 (18.0.6) @types/tinycolor2: ^1.4.3 => 1.4.3 @types/uuid: ^9.0.3 => 9.0.3 @typescript-eslint/eslint-plugin: ^6.5.0 => 6.6.0 @typescript-eslint/parser: 6.5.0 => 6.5.0 (6.6.0, 5.38.1) @vercel/nft: undefined () @vercel/og: undefined () acorn: undefined () amazon-cognito-identity-js: 6.3.5 => 6.3.5 amazon-cognito-identity-js/internals: undefined () amphtml-validator: undefined () anser: undefined () arg: undefined () assert: undefined () async-retry: undefined () async-sema: undefined () autoprefixer: 10.4.15 => 10.4.15 babel-packages: undefined () babel-plugin-inline-react-svg: ^2.0.2 => 2.0.2 browserify-zlib: undefined () browserslist: undefined () buffer: undefined () bytes: undefined () chalk: undefined () ci-info: undefined () classnames: ^2.3.2 => 2.3.2 cli-select: undefined () client-only: 0.0.1 comment-json: undefined () compression: undefined () conf: undefined () constants-browserify: undefined () content-disposition: undefined () content-type: undefined () cookie: undefined () cross-spawn: undefined () crypto-browserify: undefined () css.escape: undefined () cypress: ^13.1.0 => 13.1.0 data-uri-to-buffer: undefined () dayjs: ^1.11.9 => 1.11.9 (1.11.5) debug: undefined () deep-equal: ^2.2.2 => 2.2.2 devalue: undefined () domain-browser: undefined () dpdm: ^3.13.1 => 3.13.1 edge-runtime: undefined () eslint: ^8.48.0 => 8.49.0 (8.24.0) eslint-config-next: ^13.4.19 => 13.4.19 eslint-config-prettier: ^9.0.0 => 9.0.0 eslint-import-resolver-typescript: ^3.6.0 => 3.6.0 eslint-plugin-destructuring: ^2.2.1 => 2.2.1 eslint-plugin-import: ^2.28.1 => 2.28.1 (2.26.0) eslint-plugin-jest: ^27.2.3 => 27.2.3 eslint-plugin-jest-formatting: ^3.1.0 => 3.1.0 eslint-plugin-prettier: ^5.0.0 => 5.0.0 eslint-plugin-react: ^7.33.2 => 7.33.2 (7.31.8) eslint-plugin-react-hooks: ^4.6.0 => 4.6.0 eslint-plugin-simple-import-sort: ^10.0.0 => 10.0.0 events: undefined () find-cache-dir: undefined () find-up: undefined () fresh: undefined () get-orientation: undefined () glob: undefined () google-map-react: ^2.2.1 => 2.2.1 gzip-size: undefined () http-proxy: undefined () http-proxy-agent: undefined () https-browserify: undefined () https-proxy-agent: undefined () husky: ^8.0.3 => 8.0.3 i18next: ^23.4.6 => 23.5.1 icss-utils: undefined () ignore-loader: undefined () image-size: undefined () is-animated: undefined () is-docker: undefined () is-wsl: undefined () jest: ^29.6.4 => 29.6.4 jest-docblock: undefined () jest-environment-jsdom: ^29.6.4 => 29.6.4 jest-worker: undefined () json5: undefined () jsonwebtoken: undefined () lint-staged: ^14.0.1 => 14.0.1 loader-runner: undefined () loader-utils: undefined () lodash.curry: undefined () lru-cache: undefined () micromatch: undefined () mini-css-extract-plugin: undefined () nanoid: undefined () native-url: undefined () neo-async: undefined () next: 13.4.19 => 13.4.19 node-fetch: undefined () node-html-parser: undefined () ora: undefined () os-browserify: undefined () p-limit: undefined () path-browserify: undefined () platform: undefined () postcss: ^8.4.29 => 8.4.29 (8.4.14) postcss-flexbugs-fixes: ^5.0.2 => 5.0.2 () postcss-modules-extract-imports: undefined () postcss-modules-local-by-default: undefined () postcss-modules-scope: undefined () postcss-modules-values: undefined () postcss-preset-env: undefined () postcss-safe-parser: undefined () postcss-scss: undefined () postcss-value-parser: undefined () preline: ^1.9.0 => 1.9.0 prettier: ^3.0.3 => 3.0.3 (2.7.1) prettier-eslint: ^15.0.1 => 15.0.1 process: undefined () punycode: undefined () querystring-es3: undefined () raw-body: undefined () react: 18.2.0 => 18.2.0 react-builtin: undefined () react-calendar: ^4.6.0 => 4.6.0 react-dom: 18.2.0 => 18.2.0 react-dom-builtin: undefined () react-dom-experimental-builtin: undefined () react-experimental-builtin: undefined () react-hook-form: 7.46.0 => 7.46.0 react-i18next: ^13.2.2 => 13.2.2 react-is: 18.2.0 react-redux: ^8.1.2 => 8.1.2 react-refresh: 0.12.0 react-server-dom-webpack-builtin: undefined () react-server-dom-webpack-experimental-builtin: undefined () redux-persist: ^6.0.0 => 6.0.0 redux-persist/integration/react: undefined () regenerator-runtime: 0.13.4 sass-loader: undefined () scheduler-builtin: undefined () scheduler-experimental-builtin: undefined () schema-utils: undefined () semver: undefined () send: undefined () server-only: 0.0.1 setimmediate: undefined () shell-quote: undefined () sort-json: ^2.0.1 => 2.0.1 source-map: undefined () stacktrace-parser: undefined () stream-browserify: undefined () stream-http: undefined () string-hash: undefined () string_decoder: undefined () strip-ansi: undefined () swr: ^2.2.2 => 2.2.2 tailwind-merge: ^1.14.0 => 1.14.0 tailwindcss: ^3.3.3 => 3.3.3 tar: undefined () terser: undefined () text-table: undefined () timers-browserify: undefined () tinycolor2: ^1.6.0 => 1.6.0 tty-browserify: undefined () typescript: ^5.2.2 => 5.2.2 (5.1.6, 4.8.4) ua-parser-js: undefined () undici: undefined () unistore: undefined () url-loader: ^4.1.1 => 4.1.1 util: undefined () uuid: ^9.0.0 => 9.0.0 (8.3.2, 3.4.0) vm-browserify: undefined () watchpack: undefined () web-vitals: undefined () webpack: undefined () webpack-sources: undefined () ws: undefined () zod: ^3.22.2 => 3.22.2 (, 3.21.4) npmGlobalPackages: @aws-amplify/cli: 11.0.3 corepack: 0.15.1 detox-cli: 20.0.0 eas-cli: 3.10.0 expo-cli: 6.3.2 npm: 9.8.0 pnpm: 8.6.6 turbo: 1.10.8 ```

Describe the bug

DataStore pagination doesn't work as expected if: 1) The 0 page has been retrieved and its length is 1. 2) The 1 page has been retrieved then.

Expected behavior

Pagination should work as expected.

Reproduction steps

1) Retrieve a DataStore model when there is only 1 item in the DynamoDB table, for example:

const workers = await DataStore.query(DataStoreModels.Worker, Predicates.ALL, {
      sort: worker => worker.createdAt(SortDirection.DESCENDING),
      page: 0,
      limit: 20,
});

This query should return only 1 item.

2) Do one more query with the next params:

const workers = await DataStore.query(DataStoreModels.Worker, Predicates.ALL, {
      sort: worker => worker.createdAt(SortDirection.DESCENDING),
      page: 1,
      limit: 20,
});

In this case, DataStore will return the same item as for the 0 page above. But, it shouldn't return any items since all of them have been already retrieved.

Code Snippet

// Put your code below this line.
They are already provided above.

Log output

``` // Put your logs below this line ```

aws-exports.js

No response

Manual configuration

No response

Additional configuration

No response

Mobile Device

No response

Mobile Operating System

No response

Mobile Browser

No response

Mobile Browser Version

No response

Additional information and screenshots

No response

chrisbonifacio commented 1 year ago

Hi @dmitryusikriseapps 👋 thanks for raising this issue and providing the reproduction steps. I will reproduce the issue and confirm with the team if this is might be expected behavior.

Do you always get the same item back no matter the page number you set?

cwomack commented 1 year ago

@dmitryusikriseapps, we have been able to reproduce this and have updated the issue to be considered a bug accordingly. We'll provide updates on this issue as progress is made.