import { DSQL_IndexSchemaType, DSQL_MYSQL_SHOW_INDEXES_Type, } from "../../types"; import grabDSQLSchemaIndexComment from "../utils/grab-dsql-schema-index-comment"; import dbHandler from "../../functions/backend/dbHandler"; import AppData from "../../data/app-data"; type Param = { tableName: string; dbFullName: string; indexes: DSQL_IndexSchemaType[]; }; /** * Handle DATASQUIREL Table Indexes * =================================================== * @description Iterate through each datasquirel schema * table index(if available), and perform operations */ export default async function handleIndexescreateDbFromSchema({ dbFullName, tableName, indexes, }: Param) { /** * Handle MYSQL Table Indexes * =================================================== * @description Iterate through each table index(if available) * and perform operations */ const allExistingIndexes = (await dbHandler({ query: `SHOW INDEXES FROM \`${dbFullName}\`.\`${tableName}\` WHERE Index_comment LIKE '%${AppData["IndexComment"]}%'`, })) as DSQL_MYSQL_SHOW_INDEXES_Type[] | null; if (allExistingIndexes) { for (let f = 0; f < allExistingIndexes.length; f++) { const { Key_name } = allExistingIndexes[f]; try { const existingKeyInSchema = indexes?.find( (indexObject) => indexObject.alias === Key_name ); if (!existingKeyInSchema) throw new Error( `This Index(${Key_name}) Has been Deleted!` ); } catch (error) { /** * @description Drop Index: This happens when the MYSQL index is not * present in the datasquirel DB schema */ await dbHandler({ query: `ALTER TABLE \`${dbFullName}\`.\`${tableName}\` DROP INDEX \`${Key_name}\``, }); } } } /** * # Re-Add New Indexes */ for (let g = 0; g < indexes.length; g++) { const { indexType, indexName, indexTableFields, alias } = indexes[g]; if (!alias?.match(/./)) continue; const queryString = `CREATE${ indexType == "full_text" ? " FULLTEXT" : indexType == "vector" ? " VECTOR" : "" } INDEX \`${alias}\` ON \`${dbFullName}\`.\`${tableName}\`(${indexTableFields ?.map((nm) => nm.value) .map((nm) => `\`${nm}\``) .join(",")}) COMMENT '${AppData["IndexComment"]} ${indexName}'`; const addIndex = await dbHandler({ query: queryString }); } }