Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const PREFIX = "stock";
- const makeRangeQuery = (fieldName, min, max) => {
- const fullFieldName = `${PREFIX}.${fieldName}`;
- return {
- key: "must",
- value: { range: { [fullFieldName]: { gte: min, lte: max } } },
- };
- };
- const makeMatchQuery = (fieldName, value) => {
- const fullFieldName = `${PREFIX}.${fieldName}`;
- return {
- key: "must",
- value: { match: { [fullFieldName]: value } },
- };
- };
- const makeMatchAnyOfQuery = (fieldName, values) => {
- const fullFieldName = `${PREFIX}.${fieldName}`;
- return {
- key: "should",
- value: values.map((value) => {
- return {
- match: {
- [fullFieldName]: value,
- },
- };
- }),
- };
- };
- const makeCoordinatesQuery = (
- lat,
- lng,
- distance,
- latitudeFieldName = "lat",
- longitudeFieldName = "lng"
- ) => {
- return [
- makeRangeQuery(latitudeFieldName, lat - distance, lat + distance),
- makeRangeQuery(longitudeFieldName, lng - distance, lng + distance),
- ];
- };
- const mapItems = (searchQuery) => {
- const queries = Object.keys(searchQuery).map((key) => {
- if (["regions", "page", "lang"].includes(key)) {
- return makeMatchQuery(key, searchQuery[key]);
- }
- if (
- [
- "countries",
- "dealers",
- "models",
- "familyExteriorColors",
- "familyTrimColors",
- "ads",
- "certifications",
- "accessories",
- ].includes(key)
- ) {
- return makeMatchAnyOfQuery(key, searchQuery[key]);
- }
- if (["prices", "price", "years", "odometer"].includes(key)) {
- return makeRangeQuery(key, searchQuery[key].min, searchQuery[key].max);
- }
- console.log("Warning, no match for ", key);
- return {};
- });
- const must = [];
- const should = [];
- queries.forEach((item) => {
- if (item.key === "must") {
- must.push(item.value);
- }
- if (item.key === "should") {
- should.concat(item.value);
- }
- });
- return {
- must,
- should,
- };
- };
- const makeElasticSearchDto = (size, sort, mappedItems) => {
- return {
- size: size,
- query: {
- bool: mappedItems,
- },
- sort: [{ [PREFIX + "." + sort.field]: { order: sort.order } }],
- };
- };
- let testQuery = {
- regions: "eu",
- countries: ["it", "ch"],
- prices: {
- min: 0,
- max: 250000,
- },
- fields: ["year", "name", "prize", "color"],
- filter: ["*"],
- lang: "it-IT",
- sort: "custom",
- };
- console.log(
- JSON.stringify(
- makeElasticSearchDto(
- 10,
- { field: "price", order: "asc" },
- mapItems(testQuery)
- ),
- null,
- 2
- )
- );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement