
com.github.mengxianun.core.AbstractDataContext Maven / Gradle / Ivy
package com.github.mengxianun.core;
import java.io.ByteArrayOutputStream;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.github.mengxianun.core.config.AssociationType;
import com.github.mengxianun.core.config.ResultAttributes;
import com.github.mengxianun.core.data.Row;
import com.github.mengxianun.core.data.Summary;
import com.github.mengxianun.core.data.summary.FileSummary;
import com.github.mengxianun.core.data.summary.InsertSummary;
import com.github.mengxianun.core.data.summary.MultiSummary;
import com.github.mengxianun.core.data.summary.QuerySummary;
import com.github.mengxianun.core.data.summary.UpdateSummary;
import com.github.mengxianun.core.exception.DataException;
import com.github.mengxianun.core.item.ValuesItem;
import com.github.mengxianun.core.render.FileRenderer;
import com.github.mengxianun.core.render.JsonRenderer;
import com.github.mengxianun.core.schema.Column;
import com.github.mengxianun.core.schema.Schema;
import com.github.mengxianun.core.schema.Table;
import com.github.mengxianun.core.schema.relationship.Relationship;
import com.github.mengxianun.core.schema.relationship.RelationshipGraph;
import com.github.mengxianun.core.schema.relationship.RelationshipPath;
import com.google.common.collect.Iterables;
import com.google.gson.JsonArray;
import com.google.gson.reflect.TypeToken;
public abstract class AbstractDataContext implements DataContext {
private static final Logger logger = LoggerFactory.getLogger(AbstractDataContext.class);
protected Schema schema;
protected Dialect dialect;
protected SQLBuilder sqlBuilder;
private final RelationshipGraph graph = new RelationshipGraph();
protected abstract void initMetadata();
@Override
public Summary execute(NewAction action) {
Summary summary = null;
if (action instanceof Action) {
summary = executeCRUD((Action) action);
} else {
summary = action.execute();
}
return summary;
}
@Override
public MultiSummary execute(NewAction... actions) {
List summaries = new ArrayList<>();
trans(new Atom() {
@Override
public void run() {
for (NewAction action : actions) {
if (action instanceof Action) {
Action curdAction = (Action) action;
boolean parsed = parsePlaceholder(curdAction, summaries);
if (parsed) {
curdAction.reBuild();
}
summaries.add(curdAction.execute());
} else {
summaries.add(action.execute());
}
}
}
});
return new MultiSummary(summaries);
}
protected abstract void trans(Atom... atoms);
private boolean parsePlaceholder(Action action, List summaries) {
boolean parsed = false;
List extends ValuesItem> valuesItems = Stream
.of(action.getFilterItems(),
action.getInsertValueItems().stream().flatMap(List::stream).collect(Collectors.toList()),
action.getUpdateValueItem())
.flatMap(List::stream).collect(Collectors.toList());
for (ValuesItem valuesItem : valuesItems) {
Object value = valuesItem.getValue();
if (!(value instanceof String) || value.toString().equals("")) {
continue;
}
String valueString = value.toString();
// $n.column
String patternString = "^[$]\\d+\\..+";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(valueString);
if (matcher.matches()) {
parsed = true;
String[] numAndColumn = matcher.group().split("\\.");
int num = Integer.parseInt(numAndColumn[0].substring(1)) - 1;
String columnName = numAndColumn[1];
Summary preSummary = summaries.get(num);
Object parseValue = parsePlaceholder(preSummary, columnName);
valuesItem.setValue(parseValue);
}
}
return parsed;
}
private Object parsePlaceholder(Summary summary, String columnName) {
boolean parsed = false;
Object parseValue = null;
if (summary instanceof QuerySummary) {
QuerySummary querySummary = (QuerySummary) summary;
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy