/** * Alipay.com Inc. * Copyright (c) 2004-2012 All Rights Reserved. */ package com.alipay.zdal.client.controller; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import com.alipay.zdal.client.dispatcher.Matcher; import com.alipay.zdal.common.exception.checked.ZdalCheckedExcption; import com.alipay.zdal.common.sqljep.function.Comparative; import com.alipay.zdal.parser.sqlobjecttree.ComparativeMapChoicer; import com.alipay.zdal.rule.LogicTableRule; import com.alipay.zdal.rule.ruleengine.entities.abstractentities.RuleChain; import com.alipay.zdal.rule.ruleengine.entities.inputvalue.CalculationContextInternal; import com.alipay.zdal.rule.ruleengine.entities.retvalue.TargetDB; public class SpringBasedRuleMatcherImpl implements Matcher { public MatcherResult match(ComparativeMapChoicer comparativeMapChoicer, List<Object> args, LogicTableRule rule) throws ZdalCheckedExcption { //�����������ϣ������˹��������й����� Set<RuleChain> ruleChainSet = rule.getRuleChainSet(); //����Ҫ������ݿ�ֿ��ֶκͶ�Ӧ��ֵ������ж����ô�������һ�� Map<String, Comparative> comparativeMapDatabase = new HashMap<String, Comparative>(2); //����Ҫ���talbe�ֱ��ֶκͶ�Ӧ��ֵ������ж����ô�������һ�� Map<String, Comparative> comparativeTable = new HashMap<String, Comparative>(2); Map<RuleChain, CalculationContextInternal/*������Ľ��*/> resultMap = new HashMap<RuleChain, CalculationContextInternal>( ruleChainSet.size()); for (RuleChain ruleChain : ruleChainSet) { // ���ÿһ�������� List<Set<String>/*ÿһ��������Ҫ�IJ���*/> requiredArgumentSortByLevel = ruleChain .getRequiredArgumentSortByLevel(); /* * ��ΪruleChain����ĸ�����һ���ģ�������getRequiredArgumentSortByLevel list��sizeһ���࣬��˲���Խ�� */ int index = 0; for (Set<String> oneLevelArgument : requiredArgumentSortByLevel) { // ���ÿһ���������е�һ�����𣬼����Ǵӵ͵��ߵ����Ȳ鿴�Ƿ��������Ҫ������������������ /*��ǰ����Ҫ�������*/ Map<String, Comparative> sqlArgs = comparativeMapChoicer.getColumnsMap(args, oneLevelArgument); if (sqlArgs.size() == oneLevelArgument.size()) { // ��ʾƥ��,��������Ϊkey,valueΪ��� resultMap.put(ruleChain, new CalculationContextInternal(ruleChain, index, sqlArgs)); if (ruleChain.isDatabaseRuleChain()) { comparativeMapDatabase.putAll(sqlArgs); } else { // isTableRuleChain comparativeTable.putAll(sqlArgs); } break; } else { index++; } } /*���һ����������sql�ж�û�б�ƥ�䵽����ô����������Ͳ��������resultMap�У�������һ��һ�Զ�ڵ� * �Ĺ�����sql��û�����м����ʱ�򣬻��õ�һ���յ�List index.��ʱ��ͻ�ʹ��Ĭ�Ϲ����null������������㡣 */ } //not null.ȷ����ÿ�ι����������� List<TargetDB> calc = rule.calculate(resultMap); return buildMatcherResult(comparativeMapDatabase, comparativeTable, calc); } public MatcherResult buildMatcherResult(Map<String, Comparative> comparativeMapDatabase, Map<String, Comparative> comparativeTable, List<TargetDB> targetDB) { MatcherResultImp result = new MatcherResultImp(); result.setCalculationResult(targetDB); result.setDatabaseComparativeMap(comparativeMapDatabase); result.setTableComparativeMap(comparativeTable); return result; } }