package foundation.data.meta.field;
|
|
import java.util.ArrayList;
|
import java.util.Iterator;
|
import java.util.List;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import foundation.data.entity.Entity;
|
import foundation.data.entity.EntitySet;
|
import foundation.data.entity.SummaryFields;
|
import foundation.data.object.DataJoin;
|
import foundation.data.object.DataObject;
|
import foundation.util.MapList;
|
import foundation.util.Util;
|
import foundation.value.ITranslator;
|
import foundation.value.Translator;
|
import foundation.value.ValueType;
|
|
public class FieldRuntimeCreator {
|
|
public static FieldsRuntime create(IFieldReader fieldReader) throws Exception {
|
FieldsRuntime runtime = new FieldsRuntime();
|
MapList<String, Field> fieldList = runtime.fieldList;
|
|
String fieldName; Field field;
|
|
while (fieldReader.next()) {
|
fieldName = fieldReader.getFieldName();
|
|
if (fieldName == null) {
|
continue;
|
}
|
|
if (fieldList.contains(fieldName)) {
|
fieldName = fieldName + "1";
|
}
|
|
field = new Field(fieldName);
|
field.load(fieldReader);
|
field.setIndexNo(fieldList.size());
|
|
fieldList.add(fieldName, field);
|
}
|
|
//2. names 字段总数量
|
int fieldCount = fieldList.size();
|
String[] names = runtime.names = new String[fieldCount];
|
String[] lowerNames = runtime.lowerNames = new String[fieldCount];
|
|
String name;
|
for (int i = 0; i < fieldCount; i++) {
|
field = fieldList.get(i);
|
name = field.getName();
|
names[i] = name;
|
|
name = name.toLowerCase();
|
lowerNames[i] = name;
|
}
|
|
//3. translators
|
ITranslator[] valueTranslators = runtime.valueTranslators = new ITranslator[fieldCount];
|
|
for (int i = 0; i < fieldCount; i++) {
|
field = fieldList.get(i);
|
ValueType valueType = field.getType();
|
|
if (BooleanPrefix.contains(field.getName())) {
|
valueType = ValueType.Boolean;
|
}
|
|
ITranslator translator = Translator.getInstance(valueType);
|
|
valueTranslators[i] = translator;
|
field.setTranslator(translator);
|
}
|
|
//4. return
|
return runtime;
|
}
|
|
public static FieldsRuntime create(FieldsRuntime referFields, SummaryFields sumFields, SummaryFields cntFields, List<String> measureFieldList, String groupFields) throws Exception {
|
String[] groupFieldList = groupFields.split(",");
|
|
FieldsRuntime runtime = new FieldsRuntime();
|
MapList<String, Field> fieldList = runtime.fieldList;
|
int fieldCount = sumFields.getSize() + cntFields.getSize() + measureFieldList.size() + groupFieldList.length;
|
|
String[] names = runtime.names = new String[fieldCount];
|
String[] lowerNames = runtime.lowerNames = new String[fieldCount];
|
|
// 分组字段
|
int indexNo = -1;
|
for (String fieldName : groupFieldList) {
|
fieldName = fieldName.trim();
|
Field referField = referFields.get(fieldName);
|
Field sumField = new Field(fieldName);
|
|
if (referField != null) {
|
ValueType referType = referField.getType();
|
sumField.setType(referType);
|
}
|
else {
|
sumField.setType(ValueType.String);
|
}
|
|
indexNo ++;
|
sumField.setIndexNo(indexNo);
|
names[indexNo] = fieldName;
|
lowerNames[indexNo] = fieldName.toLowerCase();
|
fieldList.add(fieldName, sumField);
|
}
|
|
// 聚合字段
|
String[] sumFieldList = sumFields.getFieldNames();
|
for (String fieldName : sumFieldList) {
|
Field referField = referFields.get(fieldName);
|
fieldName = Util.stringJoin(fieldName, "_", sumFields.getTypeAlias());
|
Field sumField = new Field(fieldName);
|
if (referField != null) {
|
ValueType referType = referField.getType();
|
sumField.setType(referType);
|
}
|
else {
|
sumField.setType(ValueType.Decimal);
|
}
|
|
indexNo ++;
|
sumField.setIndexNo(indexNo);
|
names[indexNo] = fieldName;
|
lowerNames[indexNo] = fieldName.toLowerCase();
|
fieldList.add(fieldName, sumField);
|
}
|
|
// 计数字段
|
String[] cntFieldList = cntFields.getFieldNames();
|
for (String fieldName : cntFieldList) {
|
Field referField = referFields.get(fieldName);
|
fieldName = Util.stringJoin(fieldName, "_", cntFields.getTypeAlias());
|
Field sumField = new Field(fieldName);
|
sumField.setType(ValueType.Int);
|
|
indexNo ++;
|
sumField.setIndexNo(indexNo);
|
names[indexNo] = fieldName;
|
lowerNames[indexNo] = fieldName.toLowerCase();
|
fieldList.add(fieldName, sumField);
|
}
|
|
// 排名字段
|
for (String fieldName : measureFieldList) {
|
// 上级排名
|
Field rankField = new Field(fieldName + "_rank");
|
rankField.setType(ValueType.Int);
|
|
indexNo = indexNo + 1;
|
rankField.setIndexNo(indexNo);
|
names[indexNo] = rankField.getName();
|
lowerNames[indexNo] = rankField.getName().toLowerCase();
|
fieldList.add(rankField.getName(), rankField);
|
|
// 全局排名
|
Field allRankField = new Field(fieldName + "_all_rank");
|
allRankField.setType(ValueType.Int);
|
|
indexNo = indexNo + 1;
|
allRankField.setIndexNo(indexNo);
|
names[indexNo] = allRankField.getName();
|
lowerNames[indexNo] = allRankField.getName().toLowerCase();
|
fieldList.add(allRankField.getName(), allRankField);
|
}
|
|
//3. translators
|
ITranslator[] valueTranslators = runtime.valueTranslators = new ITranslator[fieldCount];
|
|
for (int i = 0; i < fieldCount; i++) {
|
Field field = fieldList.get(i);
|
ValueType valueType = field.getType();
|
|
if (BooleanPrefix.contains(field.getName())) {
|
valueType = ValueType.Boolean;
|
}
|
|
ITranslator translator = Translator.getInstance(valueType);
|
|
valueTranslators[i] = translator;
|
field.setTranslator(translator);
|
}
|
|
return runtime;
|
}
|
|
public static FieldsRuntime create(JSONObject jsonObject) throws Exception {
|
FieldsRuntime runtime = new FieldsRuntime();
|
MapList<String, Field> fieldList = runtime.fieldList;
|
Field field;
|
for (String fieldName : jsonObject.keySet()) {
|
Object object = jsonObject.get(fieldName);
|
if (fieldList.contains(fieldName)) {
|
fieldName = fieldName + "1";
|
}
|
|
field = new Field(fieldName);
|
field.load(object);
|
field.setIndexNo(fieldList.size());
|
fieldList.add(fieldName, field);
|
}
|
|
//2. names 字段总数量
|
int fieldCount = fieldList.size();
|
String[] names = runtime.names = new String[fieldCount];
|
String[] lowerNames = runtime.lowerNames = new String[fieldCount];
|
|
String name;
|
for (int i = 0; i < fieldCount; i++) {
|
field = fieldList.get(i);
|
name = field.getName();
|
names[i] = name;
|
|
name = name.toLowerCase();
|
lowerNames[i] = name;
|
}
|
|
//3. translators
|
ITranslator[] valueTranslators = runtime.valueTranslators = new ITranslator[fieldCount];
|
|
for (int i = 0; i < fieldCount; i++) {
|
field = fieldList.get(i);
|
ValueType valueType = field.getType();
|
|
if (BooleanPrefix.contains(field.getName())) {
|
valueType = ValueType.Boolean;
|
}
|
|
ITranslator translator = Translator.getInstance(valueType);
|
|
valueTranslators[i] = translator;
|
field.setTranslator(translator);
|
}
|
|
//4. return
|
return runtime;
|
}
|
|
public static void buildExtension(FieldsRuntime tableFieldMetas, EntitySet entitySet) {
|
if (entitySet == null || entitySet.isEmpty()) {
|
return;
|
}
|
|
FieldExtension extension; Field field;
|
|
for (Entity entity: entitySet) {
|
extension = new FieldExtension();
|
extension.load(entity);
|
|
field = tableFieldMetas.get(extension.getName());
|
|
if (field == null) {
|
continue;
|
}
|
|
field.setExtension(extension);
|
}
|
}
|
|
public static void buildExtension(FieldsRuntime target, FieldsRuntime anothers) {
|
if (anothers == null || anothers.isEmpty()) {
|
return;
|
}
|
|
Field field;
|
|
for (Field another: anothers) {
|
field = target.get(another.getName());
|
|
if (field == null) {
|
continue;
|
}
|
|
field.setExtension(another.getExtention());
|
}
|
}
|
|
public static void buildJoinedExtension(FieldsRuntime fieldMetas) throws Exception {
|
//1. 选获取需要关联的表
|
TableExtensionBucket extensionBucket = new TableExtensionBucket();
|
|
for (Field field: fieldMetas) {
|
extensionBucket.loadOne(field);
|
}
|
|
//2. 依次Build
|
for (TableExtension tableExtension: extensionBucket) {
|
String tableName = tableExtension.tableName;
|
DataObject dataObject = DataObject.getInstance(tableName);
|
|
if (dataObject == null) {
|
continue;
|
}
|
|
FieldsRuntime fields = dataObject.getTableFieldMetas();
|
Field field;
|
|
for (Field target: tableExtension) {
|
field = fields.get(target.getOriginalName());
|
|
if (field == null) {
|
continue;
|
}
|
|
target.setExtension(field.getExtention());
|
}
|
}
|
}
|
|
private static class TableExtensionBucket implements Iterable<TableExtension> {
|
|
private MapList<String, TableExtension> items;
|
private TableExtension cachedTable;
|
private String cachedName;
|
|
|
public TableExtensionBucket() {
|
items = new MapList<String, FieldRuntimeCreator.TableExtension>();
|
}
|
|
public void loadOne(Field field) {
|
String fieldName = field.getName();
|
int pos = fieldName.indexOf(DataJoin.TableJoinConnector);
|
|
//1. 如果是主表(非关联表)字段,从主表定义中获取
|
if (pos < 0) {
|
return;
|
}
|
|
//2. 如果是关联表字段,从关联表定义中获取
|
String tableName = fieldName.substring(0, pos);
|
|
String originalFieldName = fieldName.substring(pos + 2);
|
field.setOriginalName(originalFieldName);
|
|
if (tableName.equals(cachedName)) {
|
cachedTable.fields.add(field);
|
return;
|
}
|
|
cachedTable = items.get(tableName);
|
|
if (cachedTable == null) {
|
cachedName = tableName;
|
cachedTable = new TableExtension(tableName);
|
items.add(cachedName, cachedTable);
|
}
|
|
cachedTable.fields.add(field);
|
}
|
|
@Override
|
public Iterator<TableExtension> iterator() {
|
return items.iterator();
|
}
|
}
|
|
private static class TableExtension implements Iterable<Field> {
|
|
private String tableName;
|
private List<Field> fields;
|
|
public TableExtension(String tableName) {
|
this.tableName = tableName;
|
this.fields = new ArrayList<Field>();
|
}
|
|
@Override
|
public Iterator<Field> iterator() {
|
return fields.iterator();
|
}
|
}
|
|
}
|