/*
* Copyright 2014 Corpuslinguistic working group Humboldt University Berlin.
*
* 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.gui.objects;
import annis.service.objects.FrequencyTableQuery;
import annis.service.objects.OrderType;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
/**
* Helper class to construct new {@link Query} objects (or one of the child classes)
* @author Thomas Krause <krauseto@hu-berlin.de>
* @param <T> The type of the class to generate
* @param <QG> The final type of the generator
*/
public class QueryGenerator<T extends Query, QG extends QueryGenerator<T, QG>>
{
private final T current;
/**
* It's not allowed to construct a query generator on your own.
*/
private QueryGenerator(T current)
{
this.current = current;
}
public static DisplayedResultQueryGenerator displayed()
{
return new DisplayedResultQueryGenerator();
}
public static ExportQueryGenerator export()
{
return new ExportQueryGenerator();
}
public static FrequencyQueryGenerator frequency()
{
return new FrequencyQueryGenerator();
}
public QG query(String aql)
{
current.setQuery(aql);
return (QG) this;
}
public QG corpora(Set<String> corpora)
{
current.setCorpora(new LinkedHashSet<>(corpora));
return (QG) this;
}
protected T getCurrent()
{
return current;
}
public static class ContextQueryGenerator<T extends ContextualizedQuery, QG extends ContextQueryGenerator<T, QG>>
extends QueryGenerator<T, QG>
{
private ContextQueryGenerator(T query)
{
super(query);
}
public QG left(int left)
{
getCurrent().setLeftContext(left);
return (QG) this;
}
public QG right(int right)
{
getCurrent().setRightContext(right);
return (QG) this;
}
public QG segmentation(String segmentation)
{
getCurrent().setSegmentation(segmentation);
return (QG) this;
}
}
public static class PagedQueryGenerator <T extends PagedResultQuery, QG extends PagedQueryGenerator<T, QG>>
extends ContextQueryGenerator<T, QG>
{
private PagedQueryGenerator(T query)
{
super(query);
}
public QG limit(int limit)
{
getCurrent().setLimit(limit);
return (QG) this;
}
public QG offset(long offset)
{
getCurrent().setOffset(offset);
return (QG) this;
}
public QG order(OrderType order)
{
getCurrent().setOrder(order);
return (QG) this;
}
}
public static class DisplayedResultQueryGenerator
extends PagedQueryGenerator<DisplayedResultQuery, DisplayedResultQueryGenerator>
{
private DisplayedResultQueryGenerator()
{
super(new DisplayedResultQuery());
}
public DisplayedResultQueryGenerator selectedMatches(Set<Long> selected)
{
getCurrent().setSelectedMatches(selected == null ? new TreeSet<Long>() : selected);
return (DisplayedResultQueryGenerator) this;
}
public DisplayedResultQueryGenerator baseText(String val)
{
getCurrent().setBaseText(val);
return (DisplayedResultQueryGenerator) this;
}
}
public static class ExportQueryGenerator
extends ContextQueryGenerator<ExportQuery, ExportQueryGenerator>
{
private ExportQueryGenerator()
{
super(new ExportQuery());
}
public ExportQueryGenerator exporter(String name)
{
getCurrent().setExporterName(name);
return this;
}
public ExportQueryGenerator annotations(List<String> annotationKeys)
{
getCurrent().setAnnotationKeys(annotationKeys);
return this;
}
public ExportQueryGenerator param(String parameters)
{
getCurrent().setParameters(parameters);
return this;
}
}
public static class FrequencyQueryGenerator
extends QueryGenerator<FrequencyQuery, FrequencyQueryGenerator>
{
private FrequencyQueryGenerator()
{
super(new FrequencyQuery());
}
public FrequencyQueryGenerator def(FrequencyTableQuery def)
{
getCurrent().setFrequencyDefinition(def);
return this;
}
}
public T build()
{
return current;
}
}