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

.has() api method #50

Closed
kirillgroshkov opened this issue Feb 10, 2018 · 8 comments · Fixed by #244
Closed

.has() api method #50

kirillgroshkov opened this issue Feb 10, 2018 · 8 comments · Fixed by #244

Comments

@kirillgroshkov
Copy link

Am I missing something or there is no .has() api method? (similar to Map)

What I need is to distinguish between situation when there's no key in cache (has would return false) or there is a key in cache, but it's value is undefined. If I use .get(key) for this - both will return undefined.

@lukechilds
Copy link
Contributor

You're not missing anything, there is no .has() method implemented yet :)

I'm busy on a paid project at the moment so won't be able to implement this right now but would happily accept a PR to Keyv + official storage adapters implementing this.

@ghost
Copy link

ghost commented Feb 15, 2018

If the key expired should it return true or false? In other words, is .has() testing whether the key was set and hasn't been removed yet or whether it was set and is still fresh? Because if it's the second then you don't even need to implement it into the underlying storage adapters, in keyv's .has() you just .get() the key and return false if it's undefined.

@lukechilds
Copy link
Contributor

@MySidesTheyAreGone I'm afraid that wouldn't work, if the key is fresh or stale if the value was set as undefined it'll always return undefined.

@kirillgroshkov What is your use case for this btw? This is something that's possible to implement but it seems like maybe it could be suboptimal Keyv usage in your app, e.g checking for null or undefined, true or false etc.

I Definitely agree a .has() method would be useful but just interested why you need to differentiate between explicitly setting undefined and checking it doesn't exist.

undefined as a value support was only really added for Map() compatibility, it's not something I was expecting people to store as a useful value.

@lukechilds
Copy link
Contributor

lukechilds commented Jan 5, 2019

Note to self, we could make undefined an illegal value to set().

Then .has() could be implemented as:

has: val => (this.get(val) !== undefined);

Deviats from the Map spec slightly as we can't set undefined, but maybe that is ok.

@dusansimic
Copy link
Contributor

In my opinion we shouldn't mess with default behavior of .has() method. If it returns true event if value of that key is undefined it should stay that way, otherwise we are adding more features that are not giving raw data from key+value store as it was a plan in #36.

@lukechilds @roccomuso any thoughts on this since I'd like to do a PR for this.

@lukechilds
Copy link
Contributor

lukechilds commented Jan 22, 2019

@dusansimic Yes, correctly differentiating between an undefined value and an unset/expired value is the ideal behaviour.

If you can submit a PR for that, that would be great!

@jaredwray jaredwray reopened this Oct 31, 2021
jaredwray added a commit that referenced this issue Dec 5, 2021
jaredwray added a commit that referenced this issue Dec 5, 2021
* Initial commit

* Adapt Redis API

* Run redis on Travis

* Fix typo in description

* Add npm keywords

* Pass TTL functionality over to Redis

* Create promisified redis methods on init

* Create redis methods in loop

* Make sure .get resolves to undefined if key doesn't exist

* Update keyv

* Use keyv-api-tests

* 0.1.0

* Add usage example to readme

* Add API docs to readme

* Add support for .clear()

* 0.2.0

* Don't expost Redis client

* 1.0.0

* keyv => Keyv

* 1.0.1

* Expose Redis client so events can be listened to

* Show error handling in usage example

* 1.1.0

* Add secondary description to readme

* 1.1.1

* Make sure opts.uri from Keyv gets passed through to redis

* Expose connect/error events directly on storage adapter

* Only expose error event

* Emit errors on keyv ee

* Make sure opts is always defined

* Update overview wording

* Use JSONB to allow Buffers in JSON

* Don't send undefined values to Redis Redis will save them as null. If we don't save them at all we'll retrun undefined on .get so everything works as expected.

* No need for JSONB, it's used by default in Keyv now

* 1.2.0

* Improve readability of get method

* Migrate to keyv-test-suite

* Run official keyv storage adapter tests

* Add support for namespaces

* Don't grab namespace from keyv

* Use new store instace for each test

* getter fn for namespace

* Emit error events

* 1.3.0

* Update dependencies to enable Greenkeeper 🌴 (#1)

* chore(package): update dependencies

* docs(readme): add Greenkeeper badge

* Remove Greenkeeper badge

* Use "this"

* Update to requirable

* Pin dependency versions

* 1.3.1

* Fix requirable version number

* Update docs

* Add Keyv logo to header

* Tweak wording

* 1.3.2

* Formatting

* 1.3.3

* Update redis to the latest version 🚀 (#3)

* 1.3.4

* Scope to @keyv

* 1.3.5

* Use scoped dependencies

* Fix package.json links

* Import scoped test suite

* 1.3.6

* Update ava to the latest version 🚀 (#6)

* Support same constructor args as Keyv

* Document creating storage adapter instance

* 1.3.7

* Add .npmignore

* 1.3.8

* Update coveralls to the latest version 🚀 (#8)

* Update ava to the latest version 🚀 (#9)

* Update ava to the latest version 🚀 (#10)

* Update ava to the latest version 🚀 (#11)

* chore(package): update xo to version 0.20.1 (#14)

Closes #13

* Allow testing on non-localhost Redis, add docker config (#27)

* Travis: Update Travis to current active LTS and higher (#28)

* build: removed `ttlSupport` flag (#29)

not longer necessary

* Use ioredis client (#26)

* 2.0.0

* build: Allow passing in an existing Redis instance (#30)

* build: update dependencies (#31)

* build: update dependencies

* build: force

* build: force

* 2.1.0

* Update ioredis to ~4.16.0 (#34)

* 2.1.1

* update ioredis (#38)

* 2.1.2

* adding coverage for undefined going via set (#46)

* upgrade nyc to 15.1.0 (#47)

* adding yarn lock file (#48)

adding yarn lock file

* upgrading delay to version 5.0.0 (#49)

upgrading delay to version 5.0.0 for maintenance

* upgrading ioredis to version 4.27.9 (#50)

maintenance update

* upgrading ava to 3.15.0 (#51)

maintenance update

* Revert "upgrading ava to 3.15.0 (#51)" (#52)

This reverts commit 2db6e7b2fa24c51abc215c0185e3df440c4ff290.

* Update .travis.yml to support node 14 and 15

Update .travis.yml to support node 14 and 15

* upgrading ava to 3.15.0 (#53)

upgrading ava to 3.15.0 for maintenance update

* adding in support for node version 12 (#55)

* upgrading xo to version 0.45.0 (#56)

* upgrading xo to version 0.45.0

* moving to supporting 12,14,16

* upgrading ioredis to version 4.27.10 (#57)

* keyv-redis package updated to 2.1.3 (#58)

* initial check in of github actions (#59)

* initial check in of github actions

* updating to use redis

* update readme with latest status badge

* remove travis

* Fix test suite import (#60)

* Update to use latest npm with license and nvmrc plus license update of authors (#61)

* adding nvmrc for node 16

* updating licensing with dates and authors

* Delete yarn.lock

* update for authors

* Moving to docker compose for testing and build (#62)

* moving to docker compose for testing and build

* moving to docker compose for testing and build

* rename yaml file

* update to remove yarn.lock

* adding in code coverage

* updating logo and build badge

* Update package.json (#63)

* upgrading xo to version 0.46.4 (#64)

* upgrading ioredis to version 4.28.0 (#65)

* Add support for Redis clusters. (#37)

* version bump to v2.2.0

* adding in ttlSupport (#66)

* upgrading to @keyv/test-suite version 1.6.12 (#67)

* rename to redis

* no longer need build

* Delete redis-compose.yaml

* Delete .gitignore

* no longer needed for mongo

* no longer needed in mongo

* updating for packaging

Co-authored-by: Luke Childs <lukechilds123@gmail.com>
Co-authored-by: greenkeeper[bot] <greenkeeper[bot]@users.noreply.github.com>
Co-authored-by: Casey Webb <notcaseywebb@gmail.com>
Co-authored-by: Kiko Beats <josefrancisco.verdu@gmail.com>
Co-authored-by: Will Harney <41450688+wjharney@users.noreply.github.com>
@ririko5834
Copy link

Agree with this

@alphmt alphmt mentioned this issue Feb 15, 2022
@jaredwray
Copy link
Owner

@ririko5834 @dusansimic @kirillgroshkov @alphmth - we are getting really close to supporting this and it is looking like this will be out and live next week.

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

Successfully merging a pull request may close this issue.

5 participants