/*
* Copyright 2009-2011 Collaborative Research Centre SFB 632
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package annis.ql.parser;
import annis.model.QueryAnnotation;
import annis.model.QueryNode;
import com.google.common.base.Joiner;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import org.slf4j.LoggerFactory;
public class QueryData implements Cloneable
{
private static final org.slf4j.Logger log = LoggerFactory.getLogger(
QueryData.class);
private List<List<QueryNode>> alternatives;
private List<Long> corpusList;
private List<Long> documents;
private List<QueryAnnotation> metaData;
private int maxWidth;
private Set<Object> extensions;
private HashMap<Long, Properties> corpusConfiguration;
public QueryData()
{
alternatives = new ArrayList<>();
corpusList = new ArrayList<>();
documents = new ArrayList<>();
metaData = new ArrayList<>();
extensions = new HashSet<>();
}
@Override
public String toString()
{
StringBuilder sb = new StringBuilder();
Iterator<List<QueryNode>> itOr = getAlternatives().iterator();
sb.append("ALTERNATIVES\n");
while (itOr.hasNext())
{
sb.append("\t");
List<QueryNode> nextNodes = itOr.next();
Iterator<QueryNode> itAnd = nextNodes.iterator();
while (itAnd.hasNext())
{
sb.append("{").append(itAnd.next());
sb.append("}");
if (itAnd.hasNext())
{
sb.append(" AND ");
}
}
if (itOr.hasNext())
{
sb.append("\n");
}
}
Iterator<QueryAnnotation> itMeta = getMetaData().iterator();
if (itMeta.hasNext())
{
sb.append("META");
sb.append("\n");
}
while (itMeta.hasNext())
{
sb.append("\t").append(itMeta.next().toString());
sb.append("\n");
}
if (!extensions.isEmpty())
{
sb.append("EXTENSIONS\n");
}
for (Object extension : extensions)
{
String toString = extension.toString();
if (!"".equals(toString))
{
sb.append("\t" + toString + "\n");
}
}
return sb.toString();
}
/**
* Outputs this alternative as an equivalent AQL query.
*
* @param alternative
* @return
*/
public static String toAQL(List<QueryNode> alternative)
{
List<String> fragments = new LinkedList<>();
for(QueryNode n : alternative)
{
String frag = n.toAQLNodeFragment();
if(frag != null && !frag.isEmpty())
{
fragments.add(frag);
}
}
for(QueryNode n : alternative)
{
String frag = n.toAQLEdgeFragment();
if(frag != null && !frag.isEmpty())
{
fragments.add(frag);
}
}
return Joiner.on(" & ").join(fragments);
}
/**
* Outputs this normalized query data as an equivalent AQL query.
*
* @return
*/
public String toAQL()
{
StringBuilder sb = new StringBuilder();
Iterator<List<QueryNode>> itAlternative = alternatives.iterator();
while (itAlternative.hasNext())
{
List<QueryNode> alt = itAlternative.next();
if (alternatives.size() > 1)
{
sb.append("(");
}
sb.append(toAQL(alt));
if (alternatives.size() > 1)
{
sb.append(")");
if (itAlternative.hasNext())
{
sb.append("\n|\n");
}
}
}
// TODO: add metadata
return sb.toString();
}
public List<List<QueryNode>> getAlternatives()
{
return alternatives;
}
public void setAlternatives(List<List<QueryNode>> alternatives)
{
this.alternatives = alternatives;
}
public List<Long> getCorpusList()
{
return corpusList;
}
public void setCorpusList(List<Long> corpusList)
{
this.corpusList = corpusList;
}
public List<QueryAnnotation> getMetaData()
{
return metaData;
}
public void setMetaData(List<QueryAnnotation> metaData)
{
this.metaData = metaData;
}
public int getMaxWidth()
{
return maxWidth;
}
public void setMaxWidth(int maxWidth)
{
this.maxWidth = maxWidth;
}
public boolean addAlternative(List<QueryNode> nodes)
{
return alternatives.add(nodes);
}
public boolean addMetaAnnotations(List<QueryAnnotation> annotations)
{
return metaData.addAll(annotations);
}
// FIXME: warum diese spezielle clone-Funktion?
@Override
public QueryData clone()
{
try
{
return (QueryData) super.clone();
}
catch (CloneNotSupportedException ex)
{
log.error(null, ex);
throw new InternalError("could not clone QueryData");
}
}
public List<Long> getDocuments()
{
return documents;
}
public void setDocuments(List<Long> documents)
{
this.documents = documents;
}
public Set<Object> getExtensions()
{
return extensions;
}
public <T> List<T> getExtensions(Class<T> clazz)
{
List<T> result = new LinkedList<>();
for (Object o : extensions)
{
if (clazz.isInstance(o))
{
result.add((T) o);
}
}
return result;
}
public boolean addExtension(Object extension)
{
return extensions.add(extension);
}
public HashMap<Long, Properties> getCorpusConfiguration()
{
return corpusConfiguration;
}
public void setCorpusConfiguration(
HashMap<Long, Properties> corpusConfiguration)
{
this.corpusConfiguration = corpusConfiguration;
}
}