All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.spikeify.aerospikeql.Definitions Maven / Gradle / Ivy

There is a newer version: 0.1.2.1
Show newest version
package com.spikeify.aerospikeql;

import java.util.*;
import java.util.regex.Pattern;

/**
 * Created by roman on 17/07/15.
 *
 * Definitions contains constants and function names.
 */
public class Definitions {

	public static final String defaultQuotesReplacementName = "MATCH";
	public static final String groupByKeySeparator = ":"; //separator for groupBy key, it can be empty string.
	public static final String nullValue = "null"; //when field had no value, we replace it with nullValue
	public static final String millisToSec = String.valueOf(1000); //currentTime is in millis;

	public static final String primaryKey = "PRIMARY_KEY";
	public static final String generation = "GENERATION";
	public static final String expiration = "EXPIRATION";
	public static final String digest = "DIGEST";


	public static final List aggregations = new ArrayList() {{
		add("MAX");
		add("MIN");
		add("AVG");
		add("SUM");
		add("COUNT");
	}};

	public static final List noFieldTransformations = new ArrayList() {{
		add("NOW"); //time in millis
		add("CURRENT_DATE"); //date in %Y-%m-%d.
		add("CURRENT_TIME"); //date in %H:%M:%S.
		add("CURRENT_TIMESTAMP"); //date in %Y-%m-%d %H:%M:%S UTC.
	}};

	//functions remove a time unit from a timestamp
	public static final List singleFieldTransformationsUnitRemove = new ArrayList() {{
		add("UTC_MS_TO_SECOND");
		add("UTC_MS_TO_MINUTE");
		add("UTC_MS_TO_HOUR");
		add("UTC_MS_TO_DAY");
//		add("UTC_MS_TO_WEEK");
//		add("UTC_MS_TO_MONTH");
//		add("UTC_MS_TO_YEAR");
	}};

	//functions extract a time unit from a timestamp
	private static final List singleFieldTransformationsUnitExtraction = new ArrayList() {
		{
			add("SECOND");
			add("MINUTE");
			add("HOUR");
			add("DAY");
			add("MONTH");
			add("YEAR");
		}
	};

	public static final List recordFieldTransformations = new ArrayList() {{
		add(primaryKey);
		add(expiration);
		add(generation);
		add(digest);
	}};

	public static final List singleFieldTransformations = new ArrayList() {{
		add("INTEGER");
		add("FLOAT");
		add("DATE"); //convert timestamp to date
		add("MSEC_TO_TIMESTAMP");
		add("TIME");
		add("BOOLEAN");
		addAll(recordFieldTransformations);
		addAll(singleFieldTransformationsUnitExtraction);
		addAll(singleFieldTransformationsUnitRemove);
	}};

	private static final List doubleFieldTransformations = new ArrayList() {{
		add("DATEDIFF_MS");
		add("DATEDIFF");
		add("MAP_RETRIEVE");
		add("MAP_CONTAINS");
		add("LIST_CONTAINS");
		add("LIST_MATCH");
		add("LIST_RETRIEVE");
		add("STRING_CONTAINS");
		add("STRING_RETRIEVE");
		add("REGEXP_MATCH");
		add("IFNULL");
	}};

	public static final List transformations = new ArrayList() {{
		addAll(noFieldTransformations);
		addAll(singleFieldTransformations);
		addAll(doubleFieldTransformations);
	}};

	public static final List stopWords = new ArrayList() {{
		add("AND");
		add("OR");
	}};

	public static final List conditionOperators = new ArrayList() {{
		add("DISTINCT");
		add("CASE");
		add("WHEN");
		add("IF");
		add("ELSE");
		add("THEN");
		add("END");
		add("LIKE");
		add("NOT");
	}};

	public static final List transformationsOperators = new ArrayList() {{
		add("\\*");
		add("\\+");
		add("/");
		add("-");
		add("%");
		add("AND");
		add("OR");
		add(",");
		add("!=");
		add("==");
		add("<");
		add(">");
	}};

	public static final Map convertMillisToSec = new HashMap() {{
		put("SECOND", "1000");
		put("MINUTE", "60000");
		put("HOUR", "3600000");
		put("DAY", "86400000");
//		put("WEEK", "604800000");
//		put("MONTH", "2629740000");
//		put("YEAR", "31560000000");
	}};

	private static final Set luaReservedWords = new HashSet() {{
		add("and");
		add("break");
		add("do");
		add("else");
		add("elseif");
		add("end");
		add("false");
		add("for");
		add("function");
		add("if");
		add("in");
		add("local");
		add("nil");
		add("not");
		add("or");
		add("repeat");
		add("return");
		add("then");
		add("true");
		add("until");
		add("while");
	}};
	public static Set forbiddenFieldNames = new HashSet() {{
		addAll(aggregations);
		add(defaultQuotesReplacementName);
		addAll(transformations);
		addAll(stopWords);
		addAll(conditionOperators);
		addAll(transformationsOperators);
		addAll(convertMillisToSec.keySet());
		addAll(luaReservedWords);
	}};

	public static Pattern getAggregationsPattern() {
		String regex = "";

		for (String field : aggregations) {
			regex += "(^" + field + ")\\((.+)\\)|";
		}
		regex = regex.substring(0, regex.length() - 1);

		return Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
	}

	public static Pattern getDetectFieldPattern() {
		return Pattern.compile("^[a-z][a-z_-]+", Pattern.CASE_INSENSITIVE);
	}

	public static String replaceCondition(String condition) {
		//replace operators to match lua operators
		return condition.replace(" = ", " == ").replace(" != ", " ~= ");
	}

	public static String transformationOperatorsRegex(boolean lookahead) {
		String regex = lookahead ? "(?=" : "(?<=";

		for (String operator : transformationsOperators)
			regex += operator + "|";
		regex = regex.substring(0, regex.length() - 1) + ")";
		return regex;
	}

	public static boolean isSelectAll(List selectFields) {
		if (selectFields != null) {
			for (String field : selectFields) {
				if (field.equalsIgnoreCase("*")) {
					return true;
				}
			}
		}
		return false;
	}

	public enum LuaValues {
		Min("922337203685477632"), Max("-922337203685477632");

		public final String value;

		LuaValues(String value) {
			this.value = value;
		}
	}
}































© 2015 - 2025 Weber Informatics LLC | Privacy Policy