blob: 20e0f4750350a713c5486eda4ff6d2f440df59b6 [file] [log] [blame]
/*
* 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.kylin.job;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
import org.apache.kylin.common.util.DateFormat;
import org.apache.kylin.metadata.model.DataModelDesc;
import org.apache.kylin.metadata.model.IJoinedFlatTableDesc;
import org.apache.kylin.metadata.model.PartitionDesc;
import org.apache.kylin.metadata.model.SegmentRange;
/**
* Joined Formatter for JoinedFlatTable
*/
public class JoinedFormatter {
private static final String REG_SEPARATOR = "\\$\\{(?<KEY>.*?)\\}";
private static final Pattern REG_PATTERN = Pattern.compile(REG_SEPARATOR,
Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
//
private static final String START_DATE = "START_DATE";
private static final String END_DATE = "END_DATE";
private static final String ENV_KEY = "KEY";
//
private Map<String, Object> mapEnv = new HashMap<>();
JoinedFormatter() {
}
JoinedFormatter(IJoinedFlatTableDesc flatDesc) {
setDateEnv(flatDesc);
}
public JoinedFormatter(Boolean validateModel) {
// for validate model filter condition
String start = "20190710";
String end = "20190711";
setKeyValue(START_DATE, start);
setKeyValue(END_DATE, end);
}
private void setDateEnv(IJoinedFlatTableDesc flatDesc) {
DataModelDesc model = flatDesc.getDataModel();
PartitionDesc partDesc = model.getPartitionDesc();
SegmentRange segRange = flatDesc.getSegRange();
long startInclusive = (Long) segRange.start.v;
long endExclusive = (Long) segRange.end.v;
//
String startDate = "";
String endDate = "";
String partitionColumnDateFormat = partDesc.getPartitionDateFormat();
if (partDesc.getPartitionTimeColumn() == null && partDesc.getPartitionDateColumn() == null) {
startDate = String.valueOf(startInclusive);
endDate = String.valueOf(endExclusive);
} else {
startDate = DateFormat.formatToDateStr(startInclusive, partitionColumnDateFormat);
endDate = DateFormat.formatToDateStr(endExclusive, partitionColumnDateFormat);
}
setKeyValue(START_DATE, startDate);
setKeyValue(END_DATE, endDate);
}
public Object getValue(String key) {
String fmtKey = StringUtils.trimToEmpty(key).toUpperCase(Locale.ROOT);
Object value = mapEnv.get(fmtKey);
return value == null ? "" : value;
}
public String formatSentence(String sentence) {
String[] cArray = REG_PATTERN.split(sentence);
StringBuilder sbr = new StringBuilder();
List<String> keys = getKeys(sentence);
int length = Math.max(cArray.length, keys.size());
for (int i = 0; i < length; i++) {
if (i < cArray.length) {
sbr.append(cArray[i]);
}
if (i < keys.size()) {
sbr.append(getValue(keys.get(i)));
}
}
return sbr.toString();
}
private List<String> getKeys(String condition) {
List<String> keys = new ArrayList<>();
Matcher matcher = REG_PATTERN.matcher(condition);
while (matcher.find()) {
keys.add(matcher.group(ENV_KEY));
}
return keys;
}
private void setKeyValue(String key, Object value) {
String fmtKey = StringUtils.trimToEmpty(key).toUpperCase(Locale.ROOT);
mapEnv.put(fmtKey, value);
}
void setStartDate(String dateStr) {
setKeyValue(START_DATE, dateStr);
}
void setEndDate(String dateStr) {
setKeyValue(END_DATE, dateStr);
}
void printEnv() {
System.out.println(mapEnv);
}
}