All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.scudata.dw.pseudo.PseudoDefination Maven / Gradle / Ivy
Go to download
SPL(Structured Process Language) A programming language specially for structured data computing.
package com.scudata.dw.pseudo;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.scudata.common.ICloneable;
import com.scudata.common.MessageManager;
import com.scudata.common.RQException;
import com.scudata.dm.BFileReader;
import com.scudata.dm.BaseRecord;
import com.scudata.dm.Context;
import com.scudata.dm.DataStruct;
import com.scudata.dm.Env;
import com.scudata.dm.FileObject;
import com.scudata.dm.Record;
import com.scudata.dm.Sequence;
import com.scudata.dm.cursor.MemoryCursor;
import com.scudata.dw.ComTable;
import com.scudata.dw.IPhyTable;
import com.scudata.dw.PhyTable;
import com.scudata.dw.PhyTableGroup;
import com.scudata.expression.Expression;
import com.scudata.resources.EngineMessage;
//???ڶ????????????
public class PseudoDefination implements Cloneable, ICloneable {
public static final String PD_FILE = "file";
public static final String PD_ZONE = "zone";
public static final String PD_DATE = "date";
public static final String PD_USER = "user";
public static final String PD_COLUMN = "column";
public static final String PD_VAR = "var";
public static final String PD_UPDATE = "update";
private Object file;//?ļ????????ļ?????????
private Sequence zone;//??????????б?
private String date;//?????ֶ?
private String user;//?ʻ??ֶ?
private String var;//???/?ڱ?/??Ⱥ?ڱ???????
private List columns;//?????????ֶζ???
private List tables;//???????ļ???table????
private PhyTableGroup tableGroup;//???ļ???????
private List maxValues;//??ÿ??table?????ֵ
private List minValues;//??ÿ??table????Сֵ
private Sequence memoryTable;//?ڴ?????????????
private FileObject fileObject;//???ļ?????
private DataStruct ds;//???ļ??ṹ
private boolean isBFile = false;
private String[] sortedFields;//?????ֶ?
private Expression updateExp;
public PseudoDefination() {
}
public PseudoDefination(BaseRecord pd, Context ctx) {
file = getFieldValue(pd, PD_FILE);
zone = (Sequence) getFieldValue(pd, PD_ZONE);
date = (String) getFieldValue(pd, PD_DATE);
user = (String) getFieldValue(pd, PD_USER);
var = (String) getFieldValue(pd, PD_VAR);
updateExp = (Expression) getFieldValue(pd, PD_UPDATE);
Sequence seq = (Sequence) getFieldValue(pd, PD_COLUMN);
if (seq != null) {
columns = new ArrayList();
int size = seq.length();
for (int i = 1; i <= size; i++) {
Record rec = (Record) seq.get(i);
columns.add(new PseudoColumn(rec));
}
}
if (file == null && var == null) {
MessageManager mm = EngineMessage.get();
throw new RQException(mm.getMessage("file.fileNotExist", "NULL"));
}
if (file != null) {
if (!checkBFile(ctx)) {
parseFileToTable(ctx);
}
sortedFields = getAllSortedColNames();
}
//???????date???????max??min
if (date != null) {
}
if (var != null) {
memoryTable = (Sequence) new Expression(var).calculate(ctx);
}
if (tables != null && tables.size() > 0) {
doUpdate(ctx);
}
}
public PseudoDefination(PseudoDefination pd) {
this.file = pd.file;
this.zone = pd.zone;
this.date = pd.date;
this.user = pd.user;
this.var = pd.var;
this.tables = pd.tables;
this.maxValues = pd.maxValues;
this.minValues = pd.minValues;
this.memoryTable = pd.memoryTable;
this.fileObject = pd.fileObject;
this.isBFile = pd.isBFile;
this.sortedFields = pd.sortedFields;
this.ds = pd.ds;
this.updateExp = pd.updateExp;
this.tableGroup = pd.tableGroup;
if (pd.columns != null) {
this.columns = new ArrayList();
this.columns.addAll(pd.columns);
}
}
public Object getFile() {
return file;
}
public void setFile(Object file) {
this.file = file;
}
public Sequence getZone() {
return zone;
}
public void setZone(Sequence zone) {
this.zone = zone;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
public List getColumns() {
return columns;
}
public void setColumns(List columns) {
this.columns = columns;
}
public List getTables() {
return tables;
}
public void setTables(List tables) {
this.tables = tables;
}
public Sequence getMemoryTable() {
return memoryTable;
}
public void setMemoryTable(Sequence memoryTable) {
this.memoryTable = memoryTable;
}
public static void setFieldValue(BaseRecord pd, String name, Object value) {
int index = pd.getFieldIndex(name);
if (index != -1) {
pd.setNormalFieldValue(index, value);
}
}
public static Object getFieldValue(BaseRecord pd, String name) {
int index = pd.getFieldIndex(name);
if (index != -1) {
return pd.getFieldValue(index);
} else {
return null;
}
}
/**
* ?????ֶ???????α??
* @param pname ?ֶ???
* @return
*/
public PseudoColumn findColumnByName(String name) {
if (name == null || columns == null || columns.size() == 0) {
return null;
} else {
for (PseudoColumn col : columns) {
if (col.getName() != null && name.equals(col.getName())) {
return col;
}
}
}
return null;
}
/**
* ????α?ֶ???????α??
* @param pname α?ֶ?????Ҳ?????Ƕ?ֵbits??????ֶ???
* @return
*/
public PseudoColumn findColumnByPseudoName(String pname) {
if (pname == null || columns == null || columns.size() == 0) {
return null;
} else {
for (PseudoColumn col : columns) {
if (col.getName() != null && col.getExp() != null && pname.equals(col.getName())) {
return col;
}
if (col.getName() != null && col.getDim() != null && col.getFkey() != null && pname.equals(col.getName())) {
return col;
}
if (col.getPseudo() != null && pname.equals(col.getPseudo())) {
return col;
}
if (col.getBits() != null && col.getBits().firstIndexOf(pname) != 0) {
return col;
}
}
}
return null;
}
/**
* ?õ??ļ?fn?????????
* @param fn
* @param partitions
* @param ctx
*/
private void parseFileToTable(String fn, int partitions[], Context ctx) {
if (partitions == null) {
FileObject fo = new FileObject(fn, null, null, ctx);
File f = fo.getLocalFile().file();
PhyTable t = ComTable.openBaseTable(f, ctx);
tables.add(t);
ctx.removeResource(t.getGroupTable());
} else {
int pcount = partitions.length;
for (int i = 0; i < pcount; ++i) {
File file = Env.getPartitionFile(partitions[i], fn);
PhyTable table = ComTable.openBaseTable(file, ctx);
table.getGroupTable().setPartition(partitions[i]);
tables.add(table);
}
if (pcount > 1) {
IPhyTable []tbls = new IPhyTable[pcount];
for (int i = 0; i < pcount; ++i) {
tbls[i] = tables.get(i);
}
tableGroup = new PhyTableGroup(fn, tbls, partitions, null, ctx);
}
}
}
/**
* ?õ??ļ????ļ???????????
* @param ctx
*/
private void parseFileToTable(Context ctx) {
Object file = this.file;
int partitions[] = null;
Sequence zone = getZone();
if (zone != null) {
partitions = zone.toIntArray();
}
tables = new ArrayList();
if (file instanceof String) {
parseFileToTable((String) file, partitions, ctx);
} else {
MessageManager mm = EngineMessage.get();
throw new RQException(mm.getMessage("function.invalidParam"));
}
if (date != null) {
String dateName = date;
//????????????α?ֶ?
// PseudoColumn dateCol = findColumnByPseudoName(date);
// if (dateCol != null && dateCol.getExp() != null) {
// dateName = dateCol.getName();
// }
maxValues = new ArrayList();
minValues = new ArrayList();
for (IPhyTable t : tables) {
try {
Object[] values = ((PhyTable)t).getMaxMinValue(dateName);
if (values != null) {
maxValues.add(values[0]);
minValues.add(values[1]);
}
} catch (IOException e) {
throw new RQException(e.getMessage());
}
}
}
}
/**
* ???????ļ??????????ھͷ???null
* @return
*/
public PhyTableGroup getTableMetaDataGroup() {
return tableGroup;
}
public String getUgrp() {
String[] names = getAllColNames();
if (names == null) return null;
return names[0];
}
public String[] getAllColNames() {
if (isBFile) {
return ds.getFieldNames();
} else if (var == null) {
return tables.get(0).getAllColNames();
} else {
return memoryTable.dataStruct().getFieldNames();
}
}
public String[] getAllSortedColNames() {
if (isBFile) {
return ds.getPrimary();
} else if (var == null) {
return tables.get(0).getAllKeyColNames();
} else {
return memoryTable.dataStruct().getPrimary();
}
}
public void addPseudoColumn(PseudoColumn column) {
if (columns == null) {
columns = new ArrayList();
}
columns.add(column);
}
public String getDistribute() {
if (isBFile) {
return null;
} else if (var == null) {
return tables.get(0).getDistribute();
} else {
return null;
}
}
public Integer getPartition() {
if (isBFile) {
return null;
} else if (var == null && tables.get(0) instanceof PhyTable) {
return ((PhyTable) tables.get(0)).getGroupTable().getPartition();
} else {
return null;
}
}
/**
* ?ж?fields?Ƿ?????????????ֶ?
* @param fields
* @return
*/
public boolean isSortedFields(String[] fields) {
if (sortedFields == null || fields == null) {
return false;
}
int len = fields.length;
if (len > sortedFields.length || len == 0) {
return false;
}
for (int i = 0; i < len; i++) {
if (fields[i] == null) {
return false;
}
if (!fields[i].equals(sortedFields[i])) {
return false;
}
}
return true;
}
/**
* ????Ƿ??Ǽ??ļ?
* @return
*/
private boolean checkBFile(Context ctx) {
if (!(file instanceof String)) {
return false;
}
FileObject fo = new FileObject((String)file, null, null, ctx);;
BFileReader reader = new BFileReader(fo);
try {
reader.open();
ds = reader.getFileDataStruct();
reader.close();
setFileObject(fo);
isBFile = true;
return true;
} catch (Exception e) {
return false;
}
}
public boolean isBFile() {
return isBFile;
}
public FileObject getFileObject() {
return fileObject;
}
public void setFileObject(FileObject fileObject) {
this.fileObject = fileObject;
}
public List getMaxValues() {
return maxValues;
}
public List getMinValues() {
return minValues;
}
public Object deepClone() {
return new PseudoDefination(this);
}
private void doUpdate(Context ctx) {
Sequence append = null;
Sequence update = null;
Sequence delete = null;
Expression exp = updateExp;
if (exp == null) return;
Object obj = exp.calculate(ctx);
if (obj instanceof Sequence) {
Sequence seq = (Sequence) obj;
if (seq.length() == 3) {
obj = seq.get(1);
if (obj != null && obj instanceof Sequence) {
append = (Sequence) obj;
}
obj = seq.get(2);
if (obj != null && obj instanceof Sequence) {
update = (Sequence) obj;
}
obj = seq.get(3);
if (obj != null && obj instanceof Sequence) {
delete = (Sequence) obj;
}
try {
if (append != null) {
tables.get(tables.size() - 1).append(new MemoryCursor(append), "y");
}
if (update != null) {
for (IPhyTable table : tables) {
table.update(update, "y");
}
}
if (delete != null) {
for (IPhyTable table : tables) {
table.delete(delete, "y");
}
}
} catch (IOException e) {
throw new RQException(e);
}
return;
}
}
MessageManager mm = EngineMessage.get();
throw new RQException(mm.getMessage("function.invalidParam"));
}
}