Rick Cheng
1 year ago
committed by
GitHub
39 changed files with 322 additions and 548 deletions
@ -1,71 +0,0 @@
|
||||
/* |
||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||
* contributor license agreements. See the NOTICE file distributed with |
||||
* this work for additional information regarding copyright ownership. |
||||
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||
* (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.apache.dolphinscheduler.plugin.task.api.parser; |
||||
|
||||
import org.apache.dolphinscheduler.plugin.task.api.enums.DataType; |
||||
import org.apache.dolphinscheduler.plugin.task.api.enums.Direct; |
||||
import org.apache.dolphinscheduler.plugin.task.api.model.Property; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Iterator; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* param utils |
||||
*/ |
||||
public class ParamUtils { |
||||
|
||||
/** |
||||
* format convert |
||||
* |
||||
* @param paramsMap params map |
||||
* @return Map of converted |
||||
*/ |
||||
public static Map<String, String> convert(Map<String, Property> paramsMap) { |
||||
if (paramsMap == null) { |
||||
return null; |
||||
} |
||||
|
||||
Map<String, String> map = new HashMap<>(); |
||||
Iterator<Map.Entry<String, Property>> iter = paramsMap.entrySet().iterator(); |
||||
while (iter.hasNext()) { |
||||
Map.Entry<String, Property> en = iter.next(); |
||||
map.put(en.getKey(), en.getValue().getValue()); |
||||
} |
||||
return map; |
||||
} |
||||
|
||||
/** |
||||
* get parameters map |
||||
* |
||||
* @param definedParams definedParams |
||||
* @return parameters map |
||||
*/ |
||||
public static Map<String, Property> getUserDefParamsMap(Map<String, String> definedParams) { |
||||
Map<String, Property> userDefParamsMaps = new HashMap<>(); |
||||
if (definedParams != null) { |
||||
Iterator<Map.Entry<String, String>> iter = definedParams.entrySet().iterator(); |
||||
while (iter.hasNext()) { |
||||
Map.Entry<String, String> en = iter.next(); |
||||
Property property = new Property(en.getKey(), Direct.IN, DataType.VARCHAR, en.getValue()); |
||||
userDefParamsMaps.put(property.getProp(), property); |
||||
} |
||||
} |
||||
return userDefParamsMaps; |
||||
} |
||||
} |
@ -1,306 +0,0 @@
|
||||
/* |
||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||
* contributor license agreements. See the NOTICE file distributed with |
||||
* this work for additional information regarding copyright ownership. |
||||
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||
* (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.apache.dolphinscheduler.plugin.task.api.parser; |
||||
|
||||
import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.PARAMETER_DATETIME; |
||||
import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.PARAMETER_FORMAT_TIME; |
||||
import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.PARAMETER_SHECDULE_TIME; |
||||
|
||||
import org.apache.dolphinscheduler.common.utils.DateUtils; |
||||
import org.apache.dolphinscheduler.common.utils.JSONUtils; |
||||
import org.apache.dolphinscheduler.plugin.task.api.enums.DataType; |
||||
import org.apache.dolphinscheduler.plugin.task.api.model.Property; |
||||
|
||||
import org.apache.commons.lang3.StringUtils; |
||||
|
||||
import java.io.Serializable; |
||||
import java.sql.PreparedStatement; |
||||
import java.util.Date; |
||||
import java.util.HashMap; |
||||
import java.util.Iterator; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.regex.Matcher; |
||||
import java.util.regex.Pattern; |
||||
|
||||
/** |
||||
* parameter parse utils |
||||
*/ |
||||
public class ParameterUtils { |
||||
|
||||
private static final Pattern DATE_PARSE_PATTERN = Pattern.compile("\\$\\[([^\\$\\]]+)]"); |
||||
|
||||
private static final Pattern DATE_START_PATTERN = Pattern.compile("^[0-9]"); |
||||
|
||||
private static final char PARAM_REPLACE_CHAR = '?'; |
||||
|
||||
private ParameterUtils() { |
||||
throw new UnsupportedOperationException("Construct ParameterUtils"); |
||||
} |
||||
|
||||
/** |
||||
* convert parameters place holders |
||||
* |
||||
* @param parameterString parameter |
||||
* @param parameterMap parameter map |
||||
* @return convert parameters place holders |
||||
*/ |
||||
public static String convertParameterPlaceholders(String parameterString, Map<String, String> parameterMap) { |
||||
if (StringUtils.isEmpty(parameterString)) { |
||||
return parameterString; |
||||
} |
||||
Date cronTime; |
||||
if (parameterMap != null && !parameterMap.isEmpty()) { |
||||
// replace variable ${} form,refers to the replacement of system variables and custom variables
|
||||
parameterString = PlaceholderUtils.replacePlaceholders(parameterString, parameterMap, true); |
||||
} |
||||
if (parameterMap != null && null != parameterMap.get(PARAMETER_DATETIME)) { |
||||
// Get current time, schedule execute time
|
||||
String cronTimeStr = parameterMap.get(PARAMETER_DATETIME); |
||||
cronTime = DateUtils.parse(cronTimeStr, PARAMETER_FORMAT_TIME); |
||||
} else { |
||||
cronTime = new Date(); |
||||
} |
||||
// replace time $[...] form, eg. $[yyyyMMdd]
|
||||
if (cronTime != null) { |
||||
return dateTemplateParse(parameterString, cronTime); |
||||
} |
||||
return parameterString; |
||||
} |
||||
|
||||
/** |
||||
* new |
||||
* convert parameters place holders |
||||
* |
||||
* @param parameterString parameter |
||||
* @param parameterMap parameter map |
||||
* @return convert parameters place holders |
||||
*/ |
||||
public static String convertParameterPlaceholders2(String parameterString, Map<String, String> parameterMap) { |
||||
if (StringUtils.isEmpty(parameterString)) { |
||||
return parameterString; |
||||
} |
||||
// Get current time, schedule execute time
|
||||
String cronTimeStr = parameterMap.get(PARAMETER_SHECDULE_TIME); |
||||
Date cronTime = null; |
||||
|
||||
if (StringUtils.isNotEmpty(cronTimeStr)) { |
||||
cronTime = DateUtils.parse(cronTimeStr, PARAMETER_FORMAT_TIME); |
||||
|
||||
} else { |
||||
cronTime = new Date(); |
||||
} |
||||
|
||||
// replace variable ${} form,refers to the replacement of system variables and custom variables
|
||||
if (!parameterMap.isEmpty()) { |
||||
parameterString = PlaceholderUtils.replacePlaceholders(parameterString, parameterMap, true); |
||||
} |
||||
|
||||
// replace time $[...] form, eg. $[yyyyMMdd]
|
||||
if (cronTime != null) { |
||||
return dateTemplateParse(parameterString, cronTime); |
||||
} |
||||
return parameterString; |
||||
} |
||||
|
||||
/** |
||||
* set in parameter |
||||
* |
||||
* @param index index |
||||
* @param stmt preparedstatement |
||||
* @param dataType data type |
||||
* @param value value |
||||
* @throws Exception errors |
||||
*/ |
||||
public static void setInParameter(int index, PreparedStatement stmt, DataType dataType, |
||||
String value) throws Exception { |
||||
if (dataType.equals(DataType.VARCHAR)) { |
||||
stmt.setString(index, value); |
||||
} else if (dataType.equals(DataType.INTEGER)) { |
||||
stmt.setInt(index, Integer.parseInt(value)); |
||||
} else if (dataType.equals(DataType.LONG)) { |
||||
stmt.setLong(index, Long.parseLong(value)); |
||||
} else if (dataType.equals(DataType.FLOAT)) { |
||||
stmt.setFloat(index, Float.parseFloat(value)); |
||||
} else if (dataType.equals(DataType.DOUBLE)) { |
||||
stmt.setDouble(index, Double.parseDouble(value)); |
||||
} else if (dataType.equals(DataType.DATE)) { |
||||
stmt.setDate(index, java.sql.Date.valueOf(value)); |
||||
} else if (dataType.equals(DataType.TIME)) { |
||||
stmt.setString(index, value); |
||||
} else if (dataType.equals(DataType.TIMESTAMP)) { |
||||
stmt.setTimestamp(index, java.sql.Timestamp.valueOf(value)); |
||||
} else if (dataType.equals(DataType.BOOLEAN)) { |
||||
stmt.setBoolean(index, Boolean.parseBoolean(value)); |
||||
} |
||||
} |
||||
|
||||
public static Serializable getParameterValue(Property property) { |
||||
if (property == null) { |
||||
return null; |
||||
} |
||||
String value = property.getValue(); |
||||
switch (property.getType()) { |
||||
case LONG: |
||||
return Long.valueOf(value); |
||||
case FLOAT: |
||||
return Float.valueOf(value); |
||||
case INTEGER: |
||||
return Integer.valueOf(value); |
||||
case DOUBLE: |
||||
return Double.valueOf(value); |
||||
case BOOLEAN: |
||||
return Boolean.valueOf(value); |
||||
// todo: add date type, list type....
|
||||
default: |
||||
return value; |
||||
} |
||||
} |
||||
|
||||
public static boolean isNumber(Property property) { |
||||
return property != null && |
||||
(DataType.INTEGER.equals(property.getType()) |
||||
|| DataType.LONG.equals(property.getType()) |
||||
|| DataType.FLOAT.equals(property.getType()) |
||||
|| DataType.DOUBLE.equals(property.getType())); |
||||
} |
||||
|
||||
public static boolean isBoolean(Property property) { |
||||
return property != null && DataType.BOOLEAN.equals(property.getType()); |
||||
} |
||||
|
||||
public static String expandListParameter(Map<Integer, Property> params, String sql) { |
||||
Map<Integer, Property> expandMap = new HashMap<>(); |
||||
if (params == null || params.isEmpty()) { |
||||
return sql; |
||||
} |
||||
String[] split = sql.split("\\?"); |
||||
if (split.length == 0) { |
||||
return sql; |
||||
} |
||||
StringBuilder ret = new StringBuilder(split[0]); |
||||
int index = 1; |
||||
for (int i = 1; i < split.length; i++) { |
||||
Property property = params.get(i); |
||||
String value = property.getValue(); |
||||
if (DataType.LIST.equals(property.getType())) { |
||||
List<Object> valueList = JSONUtils.toList(value, Object.class); |
||||
if (valueList.isEmpty() && StringUtils.isNotBlank(value)) { |
||||
valueList.add(value); |
||||
} |
||||
for (int j = 0; j < valueList.size(); j++) { |
||||
ret.append(PARAM_REPLACE_CHAR); |
||||
if (j != valueList.size() - 1) { |
||||
ret.append(","); |
||||
} |
||||
} |
||||
for (Object v : valueList) { |
||||
Property newProperty = new Property(); |
||||
if (v instanceof Integer) { |
||||
newProperty.setType(DataType.INTEGER); |
||||
} else if (v instanceof Long) { |
||||
newProperty.setType(DataType.LONG); |
||||
} else if (v instanceof Float) { |
||||
newProperty.setType(DataType.FLOAT); |
||||
} else if (v instanceof Double) { |
||||
newProperty.setType(DataType.DOUBLE); |
||||
} else { |
||||
newProperty.setType(DataType.VARCHAR); |
||||
} |
||||
newProperty.setValue(v.toString()); |
||||
newProperty.setProp(property.getProp()); |
||||
newProperty.setDirect(property.getDirect()); |
||||
expandMap.put(index++, newProperty); |
||||
} |
||||
} else { |
||||
ret.append(PARAM_REPLACE_CHAR); |
||||
expandMap.put(index++, property); |
||||
} |
||||
ret.append(split[i]); |
||||
} |
||||
if (PARAM_REPLACE_CHAR == sql.charAt(sql.length() - 1)) { |
||||
ret.append(PARAM_REPLACE_CHAR); |
||||
expandMap.put(index, params.get(split.length)); |
||||
} |
||||
params.clear(); |
||||
params.putAll(expandMap); |
||||
return ret.toString(); |
||||
} |
||||
|
||||
/** |
||||
* $[yyyyMMdd] replace schedule time |
||||
*/ |
||||
public static String replaceScheduleTime(String text, Date scheduleTime) { |
||||
Map<String, Property> paramsMap = new HashMap<>(); |
||||
// if getScheduleTime null ,is current date
|
||||
if (null == scheduleTime) { |
||||
scheduleTime = new Date(); |
||||
} |
||||
|
||||
String dateTime = DateUtils.format(scheduleTime, PARAMETER_FORMAT_TIME); |
||||
Property p = new Property(); |
||||
p.setValue(dateTime); |
||||
p.setProp(PARAMETER_SHECDULE_TIME); |
||||
paramsMap.put(PARAMETER_SHECDULE_TIME, p); |
||||
text = ParameterUtils.convertParameterPlaceholders2(text, convert(paramsMap)); |
||||
|
||||
return text; |
||||
} |
||||
|
||||
/** |
||||
* format convert |
||||
* |
||||
* @param paramsMap params map |
||||
* @return Map of converted |
||||
* see org.apache.dolphinscheduler.server.utils.ParamUtils.convert |
||||
*/ |
||||
public static Map<String, String> convert(Map<String, Property> paramsMap) { |
||||
Map<String, String> map = new HashMap<>(); |
||||
Iterator<Map.Entry<String, Property>> iter = paramsMap.entrySet().iterator(); |
||||
while (iter.hasNext()) { |
||||
Map.Entry<String, Property> en = iter.next(); |
||||
map.put(en.getKey(), en.getValue().getValue()); |
||||
} |
||||
return map; |
||||
} |
||||
|
||||
private static String dateTemplateParse(String templateStr, Date date) { |
||||
if (templateStr == null) { |
||||
return null; |
||||
} |
||||
|
||||
StringBuffer newValue = new StringBuffer(templateStr.length()); |
||||
|
||||
Matcher matcher = DATE_PARSE_PATTERN.matcher(templateStr); |
||||
|
||||
while (matcher.find()) { |
||||
String key = matcher.group(1); |
||||
if (DATE_START_PATTERN.matcher(key).matches()) { |
||||
continue; |
||||
} |
||||
String value = TimePlaceholderUtils.getPlaceHolderTime(key, date); |
||||
assert value != null; |
||||
matcher.appendReplacement(newValue, value); |
||||
} |
||||
|
||||
matcher.appendTail(newValue); |
||||
|
||||
return newValue.toString(); |
||||
} |
||||
|
||||
} |
@ -1,55 +0,0 @@
|
||||
/* |
||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||
* contributor license agreements. See the NOTICE file distributed with |
||||
* this work for additional information regarding copyright ownership. |
||||
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||
* (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.apache.dolphinscheduler.plugin.task.api.parser; |
||||
|
||||
import org.apache.dolphinscheduler.common.utils.JSONUtils; |
||||
import org.apache.dolphinscheduler.plugin.task.api.enums.DataType; |
||||
import org.apache.dolphinscheduler.plugin.task.api.model.Property; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
import org.junit.jupiter.api.Assertions; |
||||
import org.junit.jupiter.api.Test; |
||||
|
||||
import com.google.common.collect.Lists; |
||||
|
||||
public class ParameterUtilsTest { |
||||
|
||||
@Test |
||||
public void expandListParameter() { |
||||
Map<Integer, Property> params = new HashMap<>(); |
||||
params.put(1, |
||||
new Property(null, null, DataType.LIST, JSONUtils.toJsonString(Lists.newArrayList("c1", "c2", "c3")))); |
||||
params.put(2, new Property(null, null, DataType.DATE, "2020-06-30")); |
||||
params.put(3, new Property(null, null, DataType.LIST, |
||||
JSONUtils.toJsonString(Lists.newArrayList(3.1415, 2.44, 3.44)))); |
||||
String sql = ParameterUtils.expandListParameter(params, |
||||
"select * from test where col1 in (?) and date=? and col2 in (?)"); |
||||
Assertions.assertEquals("select * from test where col1 in (?,?,?) and date=? and col2 in (?,?,?)", sql); |
||||
Assertions.assertEquals(7, params.size()); |
||||
|
||||
Map<Integer, Property> params2 = new HashMap<>(); |
||||
params2.put(1, new Property(null, null, DataType.LIST, JSONUtils.toJsonString(Lists.newArrayList("c1")))); |
||||
params2.put(2, new Property(null, null, DataType.DATE, "2020-06-30")); |
||||
String sql2 = ParameterUtils.expandListParameter(params2, "select * from test where col1 in (?) and date=?"); |
||||
Assertions.assertEquals("select * from test where col1 in (?) and date=?", sql2); |
||||
Assertions.assertEquals(2, params2.size()); |
||||
|
||||
} |
||||
} |
Loading…
Reference in new issue