[WIP] mappings
This commit is contained in:
209
schema-mappings/base-mapping.js
Normal file
209
schema-mappings/base-mapping.js
Normal file
@@ -0,0 +1,209 @@
|
||||
// Base mapping structure for all ODMDB schemas
|
||||
export const createSchemaMapping = (schemaData, objectName) => {
|
||||
if (!schemaData || !schemaData.properties) {
|
||||
return {
|
||||
objectName,
|
||||
available: false,
|
||||
error: "Schema not found or invalid",
|
||||
properties: {},
|
||||
synonyms: {},
|
||||
indexes: [],
|
||||
};
|
||||
}
|
||||
|
||||
const properties = schemaData.properties;
|
||||
const synonyms = {};
|
||||
const fieldMappings = {};
|
||||
|
||||
// Generate comprehensive synonyms for each field
|
||||
Object.entries(properties).forEach(([fieldName, fieldDef]) => {
|
||||
const fieldSynonyms = generateFieldSynonyms(
|
||||
fieldName,
|
||||
fieldDef,
|
||||
objectName
|
||||
);
|
||||
fieldMappings[fieldName] = {
|
||||
field: fieldName,
|
||||
title: fieldDef.title?.toLowerCase(),
|
||||
description: fieldDef.description?.toLowerCase(),
|
||||
type: fieldDef.type,
|
||||
synonyms: fieldSynonyms,
|
||||
};
|
||||
|
||||
// Index by synonyms
|
||||
fieldSynonyms.forEach((synonym) => {
|
||||
synonyms[synonym.toLowerCase()] = fieldName;
|
||||
});
|
||||
|
||||
// Index by title
|
||||
if (fieldDef.title) {
|
||||
synonyms[fieldDef.title.toLowerCase()] = fieldName;
|
||||
}
|
||||
});
|
||||
|
||||
// Extract indexes if available
|
||||
const indexes = schemaData.apxidx
|
||||
? schemaData.apxidx.map((idx) => ({
|
||||
name: idx.name,
|
||||
type: idx.type,
|
||||
keyval: idx.keyval,
|
||||
}))
|
||||
: [];
|
||||
|
||||
// Extract access rights if available
|
||||
const accessRights = schemaData.apxaccessrights || {};
|
||||
|
||||
return {
|
||||
objectName,
|
||||
available: true,
|
||||
propertyCount: Object.keys(properties).length,
|
||||
properties: fieldMappings,
|
||||
synonyms,
|
||||
indexes,
|
||||
accessRights,
|
||||
rawSchema: schemaData,
|
||||
};
|
||||
};
|
||||
|
||||
// Generate field-specific synonyms based on field name and context
|
||||
const generateFieldSynonyms = (fieldName, fieldDef, objectName) => {
|
||||
const synonyms = [];
|
||||
|
||||
// Add the field name itself
|
||||
synonyms.push(fieldName);
|
||||
|
||||
// Add title if available
|
||||
if (fieldDef.title) {
|
||||
synonyms.push(fieldDef.title.toLowerCase());
|
||||
}
|
||||
|
||||
// Common patterns across all objects
|
||||
const commonPatterns = {
|
||||
// Identity & References
|
||||
alias: ["id", "identifier", "username", "user id"],
|
||||
owner: ["owner", "belongs to", "owned by"],
|
||||
|
||||
// Dates & Timestamps
|
||||
dt_create: [
|
||||
"created",
|
||||
"creation date",
|
||||
"new",
|
||||
"recent",
|
||||
"since",
|
||||
"registration date",
|
||||
],
|
||||
dt_update: ["updated", "last update", "modified", "last modified"],
|
||||
dt_publish: ["published", "publication date", "went live"],
|
||||
dt_close: ["closed", "closing date", "ended"],
|
||||
|
||||
// Contact Information
|
||||
email: ["contact", "mail", "contact email", "e-mail"],
|
||||
phone: ["telephone", "phone number", "contact number"],
|
||||
|
||||
// Status & State
|
||||
state: ["status", "condition", "current state"],
|
||||
status: ["state", "condition", "current status"],
|
||||
|
||||
// Location
|
||||
location: ["where", "place", "address", "position"],
|
||||
|
||||
// Descriptions
|
||||
description: ["desc", "details", "info", "about"],
|
||||
shortdescription: ["short desc", "summary", "brief", "overview"],
|
||||
|
||||
// Common business fields
|
||||
siret: ["company id", "business id", "organization id"],
|
||||
sirets: ["companies", "businesses", "organizations"],
|
||||
};
|
||||
|
||||
// Object-specific patterns
|
||||
const objectSpecificPatterns = {
|
||||
seekers: {
|
||||
seekstatus: [
|
||||
"status",
|
||||
"availability",
|
||||
"looking",
|
||||
"job search status",
|
||||
"urgency",
|
||||
],
|
||||
seekworkingyear: [
|
||||
"experience",
|
||||
"years of experience",
|
||||
"work experience",
|
||||
"career length",
|
||||
],
|
||||
seekjobtitleexperience: [
|
||||
"job titles",
|
||||
"positions",
|
||||
"roles",
|
||||
"work history",
|
||||
],
|
||||
salaryexpectation: [
|
||||
"salary",
|
||||
"pay",
|
||||
"compensation",
|
||||
"wage",
|
||||
"expected salary",
|
||||
],
|
||||
seeklocation: [
|
||||
"location",
|
||||
"where",
|
||||
"work location",
|
||||
"preferred location",
|
||||
],
|
||||
skills: ["competencies", "abilities", "technical skills"],
|
||||
mbti: ["personality", "personality type", "MBTI", "profile"],
|
||||
},
|
||||
jobads: {
|
||||
jobadid: ["job id", "ad id", "posting id"],
|
||||
jobtitle: ["job title", "position", "role", "job name"],
|
||||
salary: ["pay", "compensation", "wage", "remuneration"],
|
||||
joblocation: ["job location", "work location", "where"],
|
||||
description: ["job description", "details", "requirements"],
|
||||
state: ["status", "publication status", "availability"],
|
||||
},
|
||||
recruiters: {
|
||||
sirets: ["companies", "businesses", "clients", "employers"],
|
||||
tipsadvice: ["tips", "advice", "articles", "guidance"],
|
||||
},
|
||||
persons: {
|
||||
firstname: ["first name", "given name", "name"],
|
||||
lastname: ["last name", "family name", "surname"],
|
||||
dt_birth: ["birth date", "birthday", "date of birth", "age"],
|
||||
},
|
||||
};
|
||||
|
||||
// Apply common patterns
|
||||
if (commonPatterns[fieldName]) {
|
||||
synonyms.push(...commonPatterns[fieldName]);
|
||||
}
|
||||
|
||||
// Apply object-specific patterns
|
||||
if (
|
||||
objectSpecificPatterns[objectName] &&
|
||||
objectSpecificPatterns[objectName][fieldName]
|
||||
) {
|
||||
synonyms.push(...objectSpecificPatterns[objectName][fieldName]);
|
||||
}
|
||||
|
||||
// Generate semantic synonyms based on field name patterns
|
||||
if (fieldName.includes("salary")) {
|
||||
synonyms.push("pay", "compensation", "wage", "remuneration");
|
||||
}
|
||||
if (fieldName.includes("location")) {
|
||||
synonyms.push("where", "place", "address", "position");
|
||||
}
|
||||
if (fieldName.includes("experience")) {
|
||||
synonyms.push("background", "history", "expertise");
|
||||
}
|
||||
if (fieldName.includes("skill")) {
|
||||
synonyms.push("competencies", "abilities", "talents");
|
||||
}
|
||||
if (fieldName.includes("date") || fieldName.startsWith("dt_")) {
|
||||
synonyms.push("when", "time", "timestamp");
|
||||
}
|
||||
|
||||
return [...new Set(synonyms)]; // Remove duplicates
|
||||
};
|
||||
|
||||
export default createSchemaMapping;
|
Reference in New Issue
Block a user