CourseInsights / src / queryProcessor / QueryValidatorOptions.ts
QueryValidatorOptions.ts
Raw
import { InsightError } from "../controller/IInsightFacade";
import QueryValidator from "./QueryValidator";
import { ValidatorInfo } from "./QueryProcessor";

export default class QueryValidatorOptions {
	constructor() {}

	private static directions = ["UP", "DOWN"];

	public static validateQueryOptions(options: any, validateInfo: ValidatorInfo): boolean {
		if ("COLUMNS" in options && Object.keys(options).length === 1) {
			this.validateColumns(options.COLUMNS, validateInfo);
			return true;
		}
		if ("COLUMNS" in options && "ORDER" in options && Object.keys(options).length === 2) {
			this.validateColumns(options.COLUMNS, validateInfo);
			this.validateOrder(options.ORDER, validateInfo);
			return true;
		}
		throw new InsightError("Wrong options!");
	}

	public static validateColumns(columns: any[], validateInfo: ValidatorInfo): boolean {
		if (Array.isArray(columns) && columns.length > 0) {
			columns.forEach((column) => {
				const key: string = QueryValidator.validateAnykey(column, validateInfo);
				if (!key.includes("_") && !validateInfo.applyOrGroup.includes(key)) {
					throw new InsightError("Invalid key in columns!");
				}
				if (validateInfo.applyOrGroup.length > 0 && !validateInfo.applyOrGroup.includes(key)) {
					throw new InsightError("Transformations is present yet key in columns is not in group or apply!");
				}
				validateInfo.column.push(key);
			});
			return true;
		}
		throw new InsightError("Wrong Columns!");
	}

	public static validateOrder(order: any, validateInfo: ValidatorInfo): boolean {
		if (order === null) {
			throw new InsightError("Order is null!");
		}
		if (typeof order === "object" && Object.keys(order).length === 2 && "dir" in order && "keys" in order) {
			if (!this.directions.includes(order.dir)) {
				throw new InsightError("Invalid dir!");
			}
			if (Array.isArray(order.keys) && order.keys.length > 0) {
				order.keys.forEach((key: any) => {
					if (typeof key !== "string") {
						throw new InsightError("anykey is not a string!");
					}
					QueryValidator.validateAnykey(key, validateInfo);
					if (!validateInfo.column.includes(key)) {
						throw new InsightError("Order is not in Columns!");
					}
				});
				return true;
			}
		} else if (typeof order === "string") {
			QueryValidator.validateAnykey(order, validateInfo);
			if (validateInfo.column.includes(order)) {
				return true;
			}
		}
		throw new InsightError("Order is not in Columns!");
	}
}