queryCache.esm.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import { hashQueryKeyByOptions, parseFilterArgs, matchQuery } from './utils.esm.js';
  2. import { Query } from './query.esm.js';
  3. import { notifyManager } from './notifyManager.esm.js';
  4. import { Subscribable } from './subscribable.esm.js';
  5. // CLASS
  6. class QueryCache extends Subscribable {
  7. constructor(config) {
  8. super();
  9. this.config = config || {};
  10. this.queries = [];
  11. this.queriesMap = {};
  12. }
  13. build(client, options, state) {
  14. var _options$queryHash;
  15. const queryKey = options.queryKey;
  16. const queryHash = (_options$queryHash = options.queryHash) != null ? _options$queryHash : hashQueryKeyByOptions(queryKey, options);
  17. let query = this.get(queryHash);
  18. if (!query) {
  19. query = new Query({
  20. cache: this,
  21. logger: client.getLogger(),
  22. queryKey,
  23. queryHash,
  24. options: client.defaultQueryOptions(options),
  25. state,
  26. defaultOptions: client.getQueryDefaults(queryKey)
  27. });
  28. this.add(query);
  29. }
  30. return query;
  31. }
  32. add(query) {
  33. if (!this.queriesMap[query.queryHash]) {
  34. this.queriesMap[query.queryHash] = query;
  35. this.queries.push(query);
  36. this.notify({
  37. type: 'added',
  38. query
  39. });
  40. }
  41. }
  42. remove(query) {
  43. const queryInMap = this.queriesMap[query.queryHash];
  44. if (queryInMap) {
  45. query.destroy();
  46. this.queries = this.queries.filter(x => x !== query);
  47. if (queryInMap === query) {
  48. delete this.queriesMap[query.queryHash];
  49. }
  50. this.notify({
  51. type: 'removed',
  52. query
  53. });
  54. }
  55. }
  56. clear() {
  57. notifyManager.batch(() => {
  58. this.queries.forEach(query => {
  59. this.remove(query);
  60. });
  61. });
  62. }
  63. get(queryHash) {
  64. return this.queriesMap[queryHash];
  65. }
  66. getAll() {
  67. return this.queries;
  68. }
  69. find(arg1, arg2) {
  70. const [filters] = parseFilterArgs(arg1, arg2);
  71. if (typeof filters.exact === 'undefined') {
  72. filters.exact = true;
  73. }
  74. return this.queries.find(query => matchQuery(filters, query));
  75. }
  76. findAll(arg1, arg2) {
  77. const [filters] = parseFilterArgs(arg1, arg2);
  78. return Object.keys(filters).length > 0 ? this.queries.filter(query => matchQuery(filters, query)) : this.queries;
  79. }
  80. notify(event) {
  81. notifyManager.batch(() => {
  82. this.listeners.forEach(({
  83. listener
  84. }) => {
  85. listener(event);
  86. });
  87. });
  88. }
  89. onFocus() {
  90. notifyManager.batch(() => {
  91. this.queries.forEach(query => {
  92. query.onFocus();
  93. });
  94. });
  95. }
  96. onOnline() {
  97. notifyManager.batch(() => {
  98. this.queries.forEach(query => {
  99. query.onOnline();
  100. });
  101. });
  102. }
  103. }
  104. export { QueryCache };
  105. //# sourceMappingURL=queryCache.esm.js.map