getRelatedIndexes.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. 'use strict';
  2. const hasDollarKeys = require('../query/hasDollarKeys');
  3. function getRelatedSchemaIndexes(model, schemaIndexes) {
  4. return getRelatedIndexes({
  5. baseModelName: model.baseModelName,
  6. discriminatorMapping: model.schema.discriminatorMapping,
  7. indexes: schemaIndexes,
  8. indexesType: 'schema'
  9. });
  10. }
  11. function getRelatedDBIndexes(model, dbIndexes) {
  12. return getRelatedIndexes({
  13. baseModelName: model.baseModelName,
  14. discriminatorMapping: model.schema.discriminatorMapping,
  15. indexes: dbIndexes,
  16. indexesType: 'db'
  17. });
  18. }
  19. module.exports = {
  20. getRelatedSchemaIndexes,
  21. getRelatedDBIndexes
  22. };
  23. function getRelatedIndexes({
  24. baseModelName,
  25. discriminatorMapping,
  26. indexes,
  27. indexesType
  28. }) {
  29. const discriminatorKey = discriminatorMapping?.key;
  30. const discriminatorValue = discriminatorMapping?.value;
  31. if (!discriminatorKey) {
  32. return indexes;
  33. }
  34. const isChildDiscriminatorModel = Boolean(baseModelName);
  35. if (isChildDiscriminatorModel) {
  36. return indexes.filter(index => {
  37. const partialFilterExpression = getPartialFilterExpression(index, indexesType);
  38. return partialFilterExpression && partialFilterExpression[discriminatorKey] === discriminatorValue;
  39. });
  40. }
  41. return indexes.filter(index => {
  42. const partialFilterExpression = getPartialFilterExpression(index, indexesType);
  43. return !partialFilterExpression
  44. || !partialFilterExpression[discriminatorKey]
  45. || (hasDollarKeys(partialFilterExpression[discriminatorKey]) && !('$eq' in partialFilterExpression[discriminatorKey]));
  46. });
  47. }
  48. function getPartialFilterExpression(index, indexesType) {
  49. if (indexesType === 'schema') {
  50. const options = index[1];
  51. return options?.partialFilterExpression;
  52. }
  53. return index.partialFilterExpression;
  54. }