
com.spikeify.aerospikeql.generate.functions.Transformation Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of aerospike-ql Show documentation
Show all versions of aerospike-ql Show documentation
SQL wrapper for Aerospike database
The newest version!
package com.spikeify.aerospikeql.generate.functions;
import com.spikeify.aerospikeql.Definitions;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by roman on 24/07/15.
*
* Logic for transformation functions.
*/
public class Transformation extends Function {
private Transformation() {
nameArg1 = "value1";
nameArg2 = "value2";
streamOperation = "";
level = 1;
}
public static Transformation factory(String funName) {
Transformation transformation = new Transformation();
transformation.setFunction(funName);
return transformation;
}
private void setFunction(String functionName) {
this.functionName = functionName;
String generatedCode = "";
if (Definitions.noFieldTransformations.contains(functionName.toUpperCase())) {
setSignature0Arg();
if (functionName.toUpperCase().equalsIgnoreCase("NOW")) {
generatedCode = addNowLogic();
} else if (functionName.toUpperCase().equalsIgnoreCase("CURRENT_DATE")) {
generatedCode = addCurrentDateLogic();
} else if (functionName.toUpperCase().equalsIgnoreCase("CURRENT_TIME")) {
generatedCode = addCurrentTimeLogic();
} else if (functionName.toUpperCase().equalsIgnoreCase("CURRENT_TIMESTAMP")) {
generatedCode = addCurrentTimestampLogic();
}
} else if (Definitions.singleFieldTransformations.contains(functionName.toUpperCase())) {
setSignature1Arg();
if (functionName.equalsIgnoreCase("FLOAT")) {
generatedCode = addConvertToFloatLogic();
} else if (functionName.equalsIgnoreCase("INTEGER")) {
generatedCode = addConvertToIntegerLogic();
} else if (functionName.equalsIgnoreCase("SECOND")) {
generatedCode = addConvertToSecondLogic();
} else if (functionName.equalsIgnoreCase("MINUTE")) {
generatedCode = addConvertToMinuteLogic();
} else if (functionName.equalsIgnoreCase("HOUR")) {
generatedCode = addConvertToHourLogic();
} else if (functionName.equalsIgnoreCase("DAY")) {
generatedCode = addConvertToDayLogic();
} else if (functionName.equalsIgnoreCase("MONTH")) {
generatedCode = addConvertToMonthLogic();
} else if (functionName.equalsIgnoreCase("YEAR")) {
generatedCode = addConvertToYearLogic();
} else if (functionName.equalsIgnoreCase("MSEC_TO_TIMESTAMP")) {
generatedCode = addConvertMillisToTimestampLogic();
} else if (functionName.equalsIgnoreCase("DATE")) {
generatedCode = addDateLogic();
} else if (functionName.equalsIgnoreCase("TIME")) {
generatedCode = addTimeLogic();
} else if (functionName.equalsIgnoreCase("BOOLEAN")) {
generatedCode = addConvertBooleanLogic();
} else if (Definitions.singleFieldTransformationsUnitRemove.contains(functionName.toUpperCase())) {
generatedCode = removeMillisFromTimestamp(functionName);
} else if (functionName.equalsIgnoreCase(Definitions.primaryKey)) {
generatedCode = addPrimaryKeyLogic();
} else if (functionName.equalsIgnoreCase(Definitions.expiration)) {
generatedCode = addExpirationLogic();
} else if (functionName.equalsIgnoreCase(Definitions.generation)) {
generatedCode = addGenerationLogic();
} else if (functionName.equalsIgnoreCase(Definitions.digest)) {
generatedCode = addDigestLogic();
}
} else {
setSignature2Arg();
if (functionName.equalsIgnoreCase("DATEDIFF")) {
generatedCode = addDateDiffLogic();
} else if (functionName.equalsIgnoreCase("DATEDIFF_MS")) {
generatedCode = addDateDiffMSLogic();
} else if (functionName.equalsIgnoreCase("MAP_RETRIEVE")) {
generatedCode = addMapRetrieveLogic();
} else if (functionName.equalsIgnoreCase("MAP_CONTAINS")) {
generatedCode = addMapContainsLogic();
} else if (functionName.equalsIgnoreCase("REGEXP_MATCH")) {
generatedCode = addStringContainsLogic();
} else if (functionName.equalsIgnoreCase("IFNULL")) {
generatedCode = addIfNullLogic();
} else if (functionName.equalsIgnoreCase("LIST_CONTAINS")) {
generatedCode = addListContainsLogic();
} else if (functionName.equalsIgnoreCase("LIST_RETRIEVE")) {
generatedCode = addListRetrieveLogic();
} else if (functionName.equalsIgnoreCase("LIST_MATCH")) {
generatedCode = addListMatchLogic();
} else if (functionName.equalsIgnoreCase("STRING_CONTAINS")) {
generatedCode = addStringContainsLogic();
} else if (functionName.equalsIgnoreCase("STRING_RETRIEVE")) {
generatedCode = addStringRetrieveLogic();
}
}
code = generatedCode;
}
private String addConvertBooleanLogic() {
String generatedCode = "";
String tabs1 = getTabs(level + 1);
generatedCode += tabs1 + "return " + nameArg1 + " and " + nameArg1 + " == 1\n";
return generatedCode;
}
private String addDigestLogic() {
String generatedCode = "";
String tabs1 = getTabs(level + 1);
generatedCode += tabs1 + "return record.digest(" + nameArg1 + ")\n";
return generatedCode;
}
private String addGenerationLogic() {
String generatedCode = "";
String tabs1 = getTabs(level + 1);
generatedCode += tabs1 + "return record.ttl(" + nameArg1 + ")\n";
return generatedCode;
}
private String addExpirationLogic() {
String generatedCode = "";
String tabs1 = getTabs(level + 1);
generatedCode += tabs1 + "return record.gen(" + nameArg1 + ")\n";
return generatedCode;
}
private String addPrimaryKeyLogic() {
String generatedCode = "";
String tabs1 = getTabs(level + 1);
generatedCode += tabs1 + "return record.key(" + nameArg1 + ")\n";
return generatedCode;
}
private String addStringRetrieveLogic() {
String generatedCode = "";
String tabs1 = getTabs(level + 1);
generatedCode += tabs1 + "return " + nameArg1 + " and string.match(" + nameArg1 + ", " + nameArg2 + ")\n";
return generatedCode;
}
private String addStringContainsLogic() {
String generatedCode = "";
String tabs1 = getTabs(level + 1);
generatedCode += tabs1 + "return " + nameArg1 + " and string.match(" + nameArg1 + ", " + nameArg2 + ") ~= nil or false \n";
return generatedCode;
}
// private String addStringContainsCaseInsensitiveLogic() {
// String generatedCode = "";
// String tabs1 = getTabs(level + 1);
// generatedCode += tabs1 + "return " + nameArg1 + " and string.match(string.lower(" + nameArg1 + "), string.lower(" + nameArg2 + ")) ~= nil or false \n";
// return generatedCode;
// }
private String addListRetrieveLogic() {
String generatedCode = "";
String tabs1 = getTabs(level + 1);
String tabs2 = getTabs(level + 2);
String tabs3 = getTabs(level + 3);
String tabs4 = getTabs(level + 4);
generatedCode += tabs1 + "if " + nameArg1 + " ~= nil then\n";
generatedCode += tabs2 + "for item in list.iterator(" + nameArg1 + ") do\n";
generatedCode += tabs3 + "if item == " + nameArg2 + " then\n";
generatedCode += tabs4 + "return item\n";
generatedCode += tabs3 + "end\n";
generatedCode += tabs2 + "end\n";
generatedCode += tabs1 + "end\n";
generatedCode += tabs1 + "return nil\n";
return generatedCode;
}
private String addListContainsLogic() {
String generatedCode = "";
String tabs1 = getTabs(level + 1);
String tabs2 = getTabs(level + 2);
String tabs3 = getTabs(level + 3);
String tabs4 = getTabs(level + 4);
generatedCode += tabs1 + "if " + nameArg1 + " ~= nil then\n";
generatedCode += tabs2 + "for item in list.iterator(" + nameArg1 + ") do\n";
generatedCode += tabs3 + "if item == " + nameArg2 + " then\n";
generatedCode += tabs4 + "return true\n";
generatedCode += tabs3 + "end\n";
generatedCode += tabs2 + "end\n";
generatedCode += tabs1 + "end\n";
generatedCode += tabs1 + "return false\n";
return generatedCode;
}
private String addListMatchLogic() {
String generatedCode = "";
String tabs1 = getTabs(level + 1);
String tabs2 = getTabs(level + 2);
String tabs3 = getTabs(level + 3);
String tabs4 = getTabs(level + 4);
generatedCode += tabs1 + "if " + nameArg1 + " ~= nil then\n";
generatedCode += tabs2 + "for item in list.iterator(" + nameArg1 + ") do\n";
generatedCode += tabs3 + "if item ~= nil and string.match(item, " + nameArg2 + ") then\n";
generatedCode += tabs4 + "return true\n";
generatedCode += tabs3 + "end\n";
generatedCode += tabs2 + "end\n";
generatedCode += tabs1 + "end\n";
generatedCode += tabs1 + "return false\n";
return generatedCode;
}
private String addIfNullLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "return " + nameArg1 + " or " + nameArg2 + "\n";
return generatedCode;
}
private String addTimeLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "if " + nameArg1 + " then\n";
generatedCode += tabs + "local hour,min,sec = " + nameArg1 + ":match(\".* (%d+):(%d+):(%d+).*\")\n";
generatedCode += tabs + "return hour .. ':' .. min .. ':' .. sec\n";
generatedCode += tabs + "end\n";
generatedCode += tabs + "return ''\n";
return generatedCode;
}
private String addCurrentTimestampLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "local date = os.date(\"%Y-%m-%d %H:%M:%S\", currentTimestamp /" + Definitions.millisToSec + ")\n";
generatedCode += tabs + "local year,month,day,hour,min,sec = date:match(\"(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+)\")\n";
generatedCode += tabs + "return year.. '-' .. month.. '-' .. day .. ' ' .. hour .. ':' .. min .. ':' .. sec .. ' UTC'\n";
return generatedCode;
}
private String addCurrentTimeLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "local date = os.date(\"%Y-%m-%d %H:%M:%S\", currentTimestamp /" + Definitions.millisToSec + ")\n";
generatedCode += tabs + "local hour,min,sec = date:match(\"%d+-%d+-%d+ (%d+):(%d+):(%d+)\")\n";
generatedCode += tabs + "return hour .. ':' .. min .. ':' .. sec\n";
return generatedCode;
}
private String addCurrentDateLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "local date = os.date(\"%Y-%m-%d %H:%M:%S\", currentTimestamp /" + Definitions.millisToSec + ")\n";
generatedCode += tabs + "local year,month,day=date:match(\"(%d+)-(%d+)-(%d+) %d+:%d+:%d+\")\n";
generatedCode += tabs + "return year.. '-' .. month.. '-' .. day\n";
return generatedCode;
}
private String addDateLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "if " + nameArg1 + " then\n";
generatedCode += tabs + "local year,month,day=" + nameArg1 + ":match(\"(%d+)-(%d+)-(%d+).*\")\n";
generatedCode += tabs + "return year.. '-' .. month.. '-' .. day\n";
generatedCode += tabs + "end\n";
generatedCode += tabs + "return ''\n";
return generatedCode;
}
private String addConvertToDayLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "if " + nameArg1 + " then\n";
generatedCode += tabs + "local day=" + nameArg1 + ":match(\"%d+-%d+-(%d+).*\")\n";
generatedCode += tabs + "return tonumber(day)\n";
generatedCode += tabs + "end\n";
generatedCode += tabs + "return ''\n";
return generatedCode;
}
private String addConvertToMonthLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "if " + nameArg1 + " then\n";
generatedCode += tabs + "local month=" + nameArg1 + ":match(\"%d+-(%d+)-%d+.*\")\n";
generatedCode += tabs + "return tonumber(month)\n";
generatedCode += tabs + "end\n";
generatedCode += tabs + "return ''\n";
return generatedCode;
}
private String addConvertToYearLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "if " + nameArg1 + " then\n";
generatedCode += tabs + "local year=" + nameArg1 + ":match(\"(%d+)-%d+-%d+.*\")\n";
generatedCode += tabs + "return tonumber(year)\n";
generatedCode += tabs + "end\n";
generatedCode += tabs + "return ''\n";
return generatedCode;
}
private String addConvertToSecondLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "if " + nameArg1 + " then\n";
generatedCode += tabs + "local sec=" + nameArg1 + ":match(\".*%d+:%d+:(%d+).*\")\n";
generatedCode += tabs + "return tonumber(sec)\n";
generatedCode += tabs + "end\n";
generatedCode += tabs + "return ''\n";
return generatedCode;
}
private String addConvertToMinuteLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "if " + nameArg1 + " then\n";
generatedCode += tabs + "local min=" + nameArg1 + ":match(\".*%d+:(%d+):%d+.*\")\n";
generatedCode += tabs + "return tonumber(min)\n";
generatedCode += tabs + "end\n";
generatedCode += tabs + "return ''\n";
return generatedCode;
}
private String addConvertToHourLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "if " + nameArg1 + " then\n";
generatedCode += tabs + "local hour=" + nameArg1 + ":match(\".*(%d+):%d+:%d+.*\")\n";
generatedCode += tabs + "return tonumber(hour)\n";
generatedCode += tabs + "end\n";
generatedCode += tabs + "return ''\n";
return generatedCode;
}
private String addConvertToIntegerLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "-- first check for exception then value is rounded down\n";
generatedCode += tabs + "return pcall(math.floor, " + nameArg1 + ") and math.floor(" + nameArg1 + ")\n";
return generatedCode;
}
private String addConvertToFloatLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "-- floats are not supported in UDF. Value is converted to int.\n";
generatedCode += tabs + "return tonumber(" + nameArg1 + ")\n";
return generatedCode;
}
private String removeMillisFromTimestamp(String timeValue) {
String generatedCode = "";
String tabs = getTabs(level + 1);
timeValue = timeValue.toUpperCase();
Pattern patternTimeUnit = Pattern.compile("UTC_MS_TO_(.+)", Pattern.CASE_INSENSITIVE);
Matcher matcherTimeUnit = patternTimeUnit.matcher(timeValue);
if (matcherTimeUnit.find()) {
String timeUnit = matcherTimeUnit.group(1);
generatedCode += tabs + "return " + nameArg1 + " and " + nameArg1 + " - (" + nameArg1 + " % " + Definitions.convertMillisToSec.get(timeUnit) + ") or 0\n";
}
return generatedCode;
}
private String addConvertMillisToTimestampLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "return " + nameArg1 + " and os.date(\"%Y-%m-%d %H:%M:%S\", " + nameArg1 + "/1000) or nil\n";
return generatedCode;
}
private String addDateDiffMSLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "-- day is rounded down\n";
generatedCode += tabs + "return " + nameArg1 + " and " + nameArg2 + " and math.floor((" + nameArg1 + " - " + nameArg2 + ")/" + Definitions.convertMillisToSec.get("DAY") + ") or nil\n";
return generatedCode;
}
private String addDateDiffLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "local date1 = os.date(\"%Y-%m-%d %H:%M:%S\", currentTimestamp /" + Definitions.millisToSec + ")\n";
return generatedCode;
}
private String addMapRetrieveLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "return " + nameArg1 + " and " + nameArg1 + "[" + nameArg2 + "]\n";
return generatedCode;
}
private String addMapContainsLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "return " + nameArg1 + " and " + nameArg1 + "[" + nameArg2 + "] ~= nil\n";
return generatedCode;
}
private String addNowLogic() {
String generatedCode = "";
String tabs = getTabs(level + 1);
generatedCode += tabs + "return currentTimestamp\n"; //currentTimestamp is set in TopLevel class
return generatedCode;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy