Advertisement
informaticage

Converting elastic search objectas

Apr 7th, 2021 (edited)
583
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const PREFIX = "stock";
  2.  
  3. const makeRangeQuery = (fieldName, min, max) => {
  4.   const fullFieldName = `${PREFIX}.${fieldName}`;
  5.   return {
  6.     key: "must",
  7.     value: { range: { [fullFieldName]: { gte: min, lte: max } } },
  8.   };
  9. };
  10.  
  11. const makeMatchQuery = (fieldName, value) => {
  12.   const fullFieldName = `${PREFIX}.${fieldName}`;
  13.   return {
  14.     key: "must",
  15.     value: { match: { [fullFieldName]: value } },
  16.   };
  17. };
  18.  
  19. const makeMatchAnyOfQuery = (fieldName, values) => {
  20.   const fullFieldName = `${PREFIX}.${fieldName}`;
  21.   return {
  22.     key: "should",
  23.     value: values.map((value) => {
  24.       return {
  25.         match: {
  26.           [fullFieldName]: value,
  27.         },
  28.       };
  29.     }),
  30.   };
  31. };
  32.  
  33. const makeCoordinatesQuery = (
  34.   lat,
  35.   lng,
  36.   distance,
  37.   latitudeFieldName = "lat",
  38.   longitudeFieldName = "lng"
  39. ) => {
  40.   return [
  41.     makeRangeQuery(latitudeFieldName, lat - distance, lat + distance),
  42.     makeRangeQuery(longitudeFieldName, lng - distance, lng + distance),
  43.   ];
  44. };
  45.  
  46. const mapItems = (searchQuery) => {
  47.   const queries = Object.keys(searchQuery).map((key) => {
  48.     if (["regions", "page", "lang"].includes(key)) {
  49.       return makeMatchQuery(key, searchQuery[key]);
  50.     }
  51.  
  52.     if (
  53.       [
  54.         "countries",
  55.         "dealers",
  56.         "models",
  57.         "familyExteriorColors",
  58.         "familyTrimColors",
  59.         "ads",
  60.         "certifications",
  61.         "accessories",
  62.       ].includes(key)
  63.     ) {
  64.       return makeMatchAnyOfQuery(key, searchQuery[key]);
  65.     }
  66.  
  67.     if (["prices", "price", "years", "odometer"].includes(key)) {
  68.       return makeRangeQuery(key, searchQuery[key].min, searchQuery[key].max);
  69.     }
  70.  
  71.     console.log("Warning, no match for ", key);
  72.     return {};
  73.   });
  74.  
  75.   const must = [];
  76.   const should = [];
  77.  
  78.   queries.forEach((item) => {
  79.     if (item.key === "must") {
  80.       must.push(item.value);
  81.     }
  82.  
  83.     if (item.key === "should") {
  84.       should.concat(item.value);
  85.     }
  86.   });
  87.  
  88.   return {
  89.     must,
  90.     should,
  91.   };
  92. };
  93.  
  94. const makeElasticSearchDto = (size, sort, mappedItems) => {
  95.   return {
  96.     size: size,
  97.     query: {
  98.       bool: mappedItems,
  99.     },
  100.     sort: [{ [PREFIX + "." + sort.field]: { order: sort.order } }],
  101.   };
  102. };
  103.  
  104. let testQuery = {
  105.   regions: "eu",
  106.   countries: ["it", "ch"],
  107.   prices: {
  108.     min: 0,
  109.     max: 250000,
  110.   },
  111.   fields: ["year", "name", "prize", "color"],
  112.   filter: ["*"],
  113.   lang: "it-IT",
  114.   sort: "custom",
  115. };
  116.  
  117. console.log(
  118.   JSON.stringify(
  119.     makeElasticSearchDto(
  120.       10,
  121.       { field: "price", order: "asc" },
  122.       mapItems(testQuery)
  123.     ),
  124.     null,
  125.     2
  126.   )
  127. );
  128.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement