/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* QueryPlaner.java
*
* Created on 31. Oktober 2006, 14:26
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package Sirius.server.search;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* ordnet die SuchOptionen nach Ls und deren classIds.
*
* @author schlob
* @version $Revision$, $Date$
*/
public class QueryPlaner {
//~ Static fields/initializers ---------------------------------------------
private static final transient org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(
QueryPlaner.class);
//~ Instance fields --------------------------------------------------------
HashMap<String, ArrayList<QueryConfiguration>> queryPlansPerDomain =
new HashMap<String, ArrayList<QueryConfiguration>>();
//~ Constructors -----------------------------------------------------------
/**
* Creates a new instance of QueryPlaner.
*
* @param classIds DOCUMENT ME!
* @param searchOptions DOCUMENT ME!
*/
public QueryPlaner(final String[] classIds, final SearchOption[] searchOptions) {
final HashSet<String> domainList = extractAllDomains(convertSearchOptions(searchOptions));
setSubqueryParameters(convertSearchOptions(searchOptions));
if (logger.isDebugEnabled()) {
logger.debug("List of the Query domains created" + domainList); // NOI18N
}
final String[] domains = (String[])domainList.toArray(new String[domainList.size()]);
// query
for (int i = 0; i < domains.length; i++) {
if (logger.isDebugEnabled()) {
logger.debug("construct queryplan for domain " + domains[i] + "of # of domains :" + domains.length); // NOI18N
}
final String[] cIds = filterClassIdsForDomain(domains[i], classIds);
if (logger.isDebugEnabled()) {
logger.debug("classids for domain" + domains[i] + " ids:" + cIds); // NOI18N
}
final ArrayList<Query> qs = extractQueriesForDomain(domains[i], convertSearchOptions(searchOptions));
final Iterator<Query> iter = qs.iterator();
final ArrayList<QueryConfiguration> qcList = new ArrayList<QueryConfiguration>(qs.size());
while (iter.hasNext()) {
qcList.add(new QueryConfiguration(iter.next(), cIds));
}
queryPlansPerDomain.put(domains[i], qcList);
}
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param classId DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private static String extractDomainFromClassId(final String classId) {
if (!checkClassId(classId)) {
logger.error("improper classid has to be of the form: digit@domain"); // NOI18N
return null;
}
return classId.split("@")[1]; // NOI18N
}
/**
* DOCUMENT ME!
*
* @param qId DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private static String extractDomainFromQueryId(final String qId) {
if (!checkQueryId(qId)) {
logger.error("improper classid has to be of the form: query@domain"); // NOI18N
return null;
}
return qId.split("@")[1]; // NOI18N
}
/**
* DOCUMENT ME!
*
* @param classId DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private static int extractClassId(final String classId) {
if (!checkClassId(classId)) {
logger.error("improper classid has to be of the form: digit@domain"); // NOI18N
return -1;
}
return new Integer(classId.split("@")[0]).intValue(); // NOI18N
}
/**
* DOCUMENT ME!
*
* @param qId DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private static int extractQueryId(final String qId) {
if (!checkQueryId(qId)) {
logger.error("improper queryid has to be of the form: quid@domain"); // NOI18N
return -1;
}
return new Integer(qId.split("@")[0]).intValue(); // NOI18N
}
/**
* DOCUMENT ME!
*
* @param classId DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private static boolean checkClassId(final String classId) {
// classid@domain
final String regex = "[0-9]+[@][^@]+"; // digit of arbitray length + @ +arbitrary not @ //NOI18N
final Pattern p = Pattern.compile(regex);
final Matcher m = p.matcher(classId);
return m.matches();
}
/**
* DOCUMENT ME!
*
* @param qId DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private static boolean checkQueryId(final String qId) {
// classid@domain
final String regex = "[^@]+[@][^@]+"; // non at of arbitray length + @ +arbitrary not @ //NOI18N
final Pattern p = Pattern.compile(regex);
final Matcher m = p.matcher(qId);
return m.matches();
}
/**
* DOCUMENT ME!
*
* @param domain DOCUMENT ME!
* @param classIds DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
String[] filterClassIdsForDomain(final String domain, final String[] classIds) {
final ArrayList v = new ArrayList(classIds.length);
for (int i = 0; i < classIds.length; i++) {
final String cdomain = extractDomainFromClassId(classIds[i]);
if (logger.isDebugEnabled()) {
logger.debug("domain aus class id " + classIds[i] + " extrahiert" + cdomain); // NOI18N
}
if (domain.equals(cdomain)) {
v.add(classIds[i]);
if (logger.isDebugEnabled()) {
logger.debug(classIds[i] + " added to the class ids of the domain" + domain); // NOI18N
}
} else if (logger.isDebugEnabled()) {
logger.debug(cdomain + "of classId:: " + classIds[i] + " ::does not match domain " + domain); // NOI18N
}
}
if (logger.isDebugEnabled()) {
logger.debug(" classids for domain" + domain + " are" + v); // NOI18N
}
return (String[])v.toArray(new String[v.size()]);
}
/**
* DOCUMENT ME!
*
* @param qs DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
HashSet<String> extractAllDomains(final Query[] qs) {
final HashSet<String> domains = new HashSet<String>(qs.length);
for (int i = 0; i < qs.length; i++) {
domains.add(qs[i].getQueryIdentifier().getDomain());
final Query[] subs = qs[i].getSubQueries();
if (subs != null) {
domains.addAll(extractAllDomains(subs));
}
}
return domains;
}
/**
* DOCUMENT ME!
*
* @param domain DOCUMENT ME!
* @param queries DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
ArrayList<Query> extractQueriesForDomain(final String domain, final Query[] queries) {
final ArrayList<Query> queryList = new ArrayList<Query>(queries.length + 5);
for (int i = 0; i < queries.length; i++) {
if (queries[i].getQueryIdentifier().getDomain().equals(domain)) {
final Query q = queries[i];
queryList.add(q);
}
if (queries[i].isUnionQuery()) {
queryList.addAll(extractQueriesForDomain(domain, queries[i].getSubQueries()));
}
}
return queryList;
}
/**
* DOCUMENT ME!
*
* @param so DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private Query searchOption2Query(final SearchOption so) {
return so.getQuery();
}
/**
* DOCUMENT ME!
*
* @param sos DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private Query[] convertSearchOptions(final SearchOption[] sos) {
final ArrayList<Query> qs = new ArrayList<Query>(sos.length + 5);
for (int i = 0; i < sos.length; i++) {
qs.add(sos[i].getQuery());
}
return (Query[])qs.toArray(new Query[qs.size()]);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Collection<ArrayList<QueryConfiguration>> getQueryPlans() {
return queryPlansPerDomain.values();
}
/**
* DOCUMENT ME!
*
* @param qs DOCUMENT ME!
*/
public void setSubqueryParameters(final Query[] qs) {
for (int i = 0; i < qs.length; i++) {
final Query[] subs = qs[i].getSubQueries();
if (subs != null) {
for (int j = 0; j < subs.length; j++) {
subs[j].setParameters(qs[i].getParameters());
}
setSubqueryParameters(subs);
}
}
}
/**
* DOCUMENT ME!
*
* @param args DOCUMENT ME!
*/
public static void main(final String[] args) {
final String t = "444444444444444444@oppp"; // NOI18N
System.out.println(extractDomainFromClassId(t));
}
}