/**
* <p>Copyright: Copyright (c) 2013</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.atom.compiler.mysql.macro.handlers;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.hundsun.ares.studio.atom.AtomFunction;
import com.hundsun.ares.studio.atom.compiler.mysql.constant.IAtomEngineContextConstantMySQL;
import com.hundsun.ares.studio.atom.compiler.mysql.exception.MacroNotInProcBlockException;
import com.hundsun.ares.studio.atom.compiler.mysql.macro.MacroConstant;
import com.hundsun.ares.studio.atom.compiler.mysql.skeleton.util.AtomFunctionCompilerUtil;
import com.hundsun.ares.studio.atom.compiler.mysql.skeleton.util.TableResourceUtil;
import com.hundsun.ares.studio.atom.compiler.mysql.token.SelectInsertTableInProcBlockToken;
import com.hundsun.ares.studio.core.IARESProject;
import com.hundsun.ares.studio.engin.constant.IEngineContextConstant;
import com.hundsun.ares.studio.engin.constant.ITokenConstant;
import com.hundsun.ares.studio.engin.macrohandler.IMacroTokenHandler;
import com.hundsun.ares.studio.engin.parser.PseudoCodeParser;
import com.hundsun.ares.studio.engin.skeleton.ISkeletonAttributeHelper;
import com.hundsun.ares.studio.engin.token.DefaultTokenEvent;
import com.hundsun.ares.studio.engin.token.ICodeToken;
import com.hundsun.ares.studio.engin.token.IDomainHandler;
import com.hundsun.ares.studio.engin.token.ITokenDomain;
import com.hundsun.ares.studio.engin.token.ITokenListenerManager;
import com.hundsun.ares.studio.engin.token.macro.IMacroToken;
import com.hundsun.ares.studio.jres.model.database.TableColumn;
import com.hundsun.ares.studio.jres.model.metadata.StandardField;
import com.hundsun.ares.studio.jres.model.metadata.util.MetadataServiceProvider;
/**
* @author zhuyf
*
*/
public class SelectInsertTableInProcBlockMacroHandler implements
IMacroTokenHandler {
private AtomFunction atomFunction;//ԭ�Ӻ���ģ��
/* (non-Javadoc)
* @see com.hundsun.ares.studio.engin.macrohandler.IMacroTokenHandler#getKey()
*/
@Override
public String getKey() {
return MacroConstant.SELECT_INSERT_TABLE_INPROCBLOCK_MACRONAME;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.engin.macrohandler.IMacroTokenHandler#handle(com.hundsun.ares.studio.engin.token.macro.IMacroToken, java.util.Map)
*/
@Override
public Iterator<ICodeToken> handle(IMacroToken token,
Map<Object, Object> context) throws Exception {
/*
* ����������
[SELECT������¼][Ŀ���][Դ��][Ĭ��ֵ]
�������̣�
��α����༭��������[select������¼][Ŀ���][Դ��][Ĭ��ֵ]���������Ԥ��tabҳ���鿴��Ӧ����ʵ���롣
1.�ھ���Ĵ�������У�����ȡ��Ŀ����Դ��ı����������һ�����ڣ����׳��쳣��������¼,�����ڡ����ٸ���Ŀ������õ�Ŀ������е��ֶ�����������ֶ��ڱ��ֶ����Ҳ��������׳��쳣�����ֶβ����ڡ�����ÿ���ֶ�ֵ��������ֵ��ȡֵ�������£�
�����ж���[Ĭ��ֵ]���Ƿ��и��ֶε�Ĭ��ֵ���������ȡ����Ĭ��ֵ�����û�оʹ�Դ�����ң����Դ���д��ں��ֶ���ͬ�ı��ֶ���ȡ��Դ����SELECTȡ�ø��ֶε�ֵ��Ϊ����ֵ�����û�оʹ���������������ڲ�������Ѱ�ң�������ں��ֶ�ͬ���ı����ñ�����ֵ��Ϊ����ֵ�������û��������ֶ����ӱ��ֶ��б���ȡ�ĸ��ֶε���ʵĬ��ֵ��Ϊ����ֵ��
2.�ú�һ������ڹ��̻�����PROC�����С�
3.���δ��PROC������ʹ�ã����׳��쳣��
4.Ŀ�����Դ��֧�ֿ��û�������¼����[SELECT������¼][hs_data.rl_stockholderjour][hs_asset.cl_stockholderjour]
5.Դ��֧��SQL����[SELECT������¼][clientjour][select a.*,b.full_name from client a,clientinfo b where a.client_id=b.client_id]
6.֧�ֿ��û���������[SELECT������¼][his_clientjour][select a.*,b.full_name from client a,clientinfo b where a.client_id=b.client_id][clientjour]
[SELECT������¼][fil_clientjour][select a.*,b.full_name from client a,clientinfo b where a.client_id=b.client_id][clientjour]
[SELECT������¼][r_clientjour][select a.*,b.full_name from client a,clientinfo b where a.client_id=b.client_id][clientjour]
[SELECT������¼][rl_clientjour][select a.*,b.full_name from client a,clientinfo b where a.client_id=b.client_id][clientjour]
7.�������������
[SELECT������¼][hs_his.his_demoinfojour][select a.*,
nvl( (select * from sysdictionary b
where b.dict_entry = < CNST_DICT_USER_TYPE >
and b.subentry = a.user_type) ,' ') as user_type_name
from hs_user.demoinfojour a][demoinfojour]
*/
this.atomFunction = (AtomFunction) context.get(IAtomEngineContextConstantMySQL.ResourceModel);
this.addMacroNameToMacroList(token, context);
List<ICodeToken> codes = new ArrayList<ICodeToken>();
if (token.getParameters().length >=2) {
if (!isInProcBlock(context)) {//�ж��Ƿ���ProcBlock����
throw new MacroNotInProcBlockException("[SELECT������¼]");
}else {
Map<String, String> defaultValueMap = new HashMap<String, String>();
if(token.getParameters().length> 2){
defaultValueMap = PseudoCodeParser.parserKeyValueWithAt(token.getParameters()[2]);//���� Ĭ��ֵ�б�
}
addFieldToProc(token,context,defaultValueMap);
addPVarList(defaultValueMap,context);//��Ĭ��ֵ�б��еı����ӵ������б���
codes.add(new SelectInsertTableInProcBlockToken(token, context,defaultValueMap));
}
} else {
fireEventLessParameter(context);// ����ȱ�ٲ����¼�
}
return codes.iterator();
}
/**
* ����ȱ�ٲ����¼�
*/
private void fireEventLessParameter(Map<Object, Object> context){
ITokenListenerManager manager =(ITokenListenerManager) context.get(IEngineContextConstant.TOKEN_LISTENER_MANAGER);
String message = String.format("��[%s]ȱ�ٲ����������б���������", MacroConstant.SELECT_INSERT_TABLE_INPROCBLOCK_MACRONAME);
manager.fireEvent(new DefaultTokenEvent(ITokenConstant.EVENT_ENGINE_WARNNING,message));
}
/**
* ���ֶι���ӵ������б���ȥ
*
* @param procVarList
* @param tableColumns
*/
private void addPVarList(Map<String, String> defaultValueMap,
Map<Object, Object> context) {
ISkeletonAttributeHelper helper = (ISkeletonAttributeHelper)context.get(IAtomEngineContextConstantMySQL.SKELETON_ATTRIBUTE_HELPER);
List<String> popVarList = (List<String>)context.get(IEngineContextConstant.PSEUDO_CODE_PARA_LIST);
IARESProject project = (IARESProject) context.get(IAtomEngineContextConstantMySQL.Aresproject);
for(String paramKey: defaultValueMap.keySet()){
String valueVarName =defaultValueMap.get(paramKey);
if (valueVarName.indexOf("@") >= 0 && !AtomFunctionCompilerUtil.isParameterINAtomFunctionParameterByName(getAtomFunction(), valueVarName.substring(valueVarName.indexOf("@") + 1),project)) {// ���Ĭ�ϲ���ֵΪ����
String procVarName = valueVarName.substring(valueVarName.indexOf("@") + 1);
((ISkeletonAttributeHelper)context.get(IAtomEngineContextConstantMySQL.SKELETON_ATTRIBUTE_HELPER)).addAttribute(IAtomEngineContextConstantMySQL.ATTR_PROC_VARIABLE_LIST,procVarName);
helper.addAttribute(IAtomEngineContextConstantMySQL.ATTR_PROC_VARIABLE_LIST,procVarName);
popVarList.add(procVarName);
}
}
}
/**
* ��һЩ�����ֶ����ӵ�proc�б���ȥ
* @param macroToken
* @param context
* @param defaultValueMap
* @throws Exception
*/
private void addFieldToProc(IMacroToken macroToken,Map<Object, Object> context,Map<String, String> defaultValueMap) throws Exception{
ISkeletonAttributeHelper helper = (ISkeletonAttributeHelper)context.get(IAtomEngineContextConstantMySQL.SKELETON_ATTRIBUTE_HELPER);
List<String> popVarList = (List<String>)context.get(IEngineContextConstant.PSEUDO_CODE_PARA_LIST);
Set<String> procList = (Set<String>)helper.getAttribute(IAtomEngineContextConstantMySQL.ATTR_PROC_VARIABLE_LIST);
IARESProject project = (IARESProject) context.get(IAtomEngineContextConstantMySQL.Aresproject);
String targerTableName = macroToken.getParameters()[0];//Ŀ�����
String sourceTableName = macroToken.getParameters()[1];//Դ����
List<TableColumn> targetColumns = TableResourceUtil.getFieldsWithoutFlag("H",targerTableName,project);//��ȡĿ���������
for (int i = 0; i < targetColumns.size(); i++) {
TableColumn targerTableColumn = targetColumns.get(i);
StandardField tableFieldSTD = MetadataServiceProvider.getStandardFieldByName((IARESProject)context.get(IAtomEngineContextConstantMySQL.Aresproject), targerTableColumn.getFieldName());
if (tableFieldSTD != null) {
if (defaultValueMap.get(tableFieldSTD.getName()) == null) {//��������ֶ���Ĭ��ֵ�б���
TableColumn sourceTableColumn = null;
// ����������Դ���в�����
for (TableColumn f : TableResourceUtil.getFieldsWithoutFlag("H", sourceTableName,project)) {
if (f.getFieldName().equals(targerTableColumn.getFieldName())) {
sourceTableColumn = f;
break;
}
}
if (sourceTableColumn == null)//
{//���Դ���в�����
//�����α�������,proc��������,���,�ڲ������д���
if (popVarList.contains(tableFieldSTD.getName())|| procList.contains(tableFieldSTD.getName())||AtomFunctionCompilerUtil.isParameterINAtomFunctionParameterByName(getAtomFunction(), tableFieldSTD.getName(),project)) {
if(AtomFunctionCompilerUtil.isParameterINAtomFunctionParameterByName(getAtomFunction(), tableFieldSTD.getName(),project)){
procList.add(tableFieldSTD.getName());
}
}
}
}
}
}
}
/**
* ����Ƿ���proc�������
* @return
*/
private boolean isInProcBlock(Map<Object, Object> context){
IDomainHandler handler = (IDomainHandler) context.get(IEngineContextConstant.DOMAIN_HANDLER);
ITokenDomain procBlockBeginDomain =handler.getDomain(MacroConstant.PROC_BLOCK_BEGIN_MACRONAME);
//���ǰ����PRO*C���鿪ʼ��procBlockBeginDomain��Ϊnull
return procBlockBeginDomain!=null;
}
/**
* ����ԭ�Ӻ���ģ��
* @return
*/
private AtomFunction getAtomFunction(){
return this.atomFunction;
}
/**
* �Ѻ������뵽���б���
*/
private void addMacroNameToMacroList(IMacroToken token,Map<Object, Object> context){
ISkeletonAttributeHelper helper = (ISkeletonAttributeHelper)context.get(IAtomEngineContextConstantMySQL.SKELETON_ATTRIBUTE_HELPER);
helper.addAttribute(IAtomEngineContextConstantMySQL.ATTR_DATABASE_MACRO,token.getKeyword());//��ӵ����ݿ��б���
helper.addAttribute(IAtomEngineContextConstantMySQL.ATTR_PROC_MACRO,token.getKeyword());//��ӵ�proc���б���
}
}