/*
* Licensed to STRATIO (C) under one or more contributor license agreements.
* See the NOTICE file distributed with this work for additional information
* regarding copyright ownership. The STRATIO (C) licenses this file
* to you 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 com.stratio.connector.commons.engine.query;
import com.stratio.crossdata.common.exceptions.ConnectorException;
import com.stratio.crossdata.common.exceptions.ExecutionException;
import com.stratio.crossdata.common.logicalplan.*;
import com.stratio.crossdata.common.statements.structures.FunctionSelector;
import com.stratio.crossdata.common.statements.structures.Operator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
/**
* This class is a representation of a query.
* <p/>
* <p/>
* Created by jmgomez on 15/09/14.
*/
public class ProjectParsed {
/**
* The Log.
*/
private final Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* The project.
*/
private Project project = null;
/**
* The filters.
*/
private Collection<Filter> filterList = Collections.emptyList();
/**
* The matchList.
*/
private Collection<Filter> matchList = Collections.emptyList();
/**
* The functionFilters.
*/
private Collection<FunctionFilter> functionFilters = new ArrayList<>();
/**
* The select.
*/
private Select select;
/**
* The limit.
*/
private Limit limit;
/**
* The groupBy.
*/
private GroupBy groupBy;
/**
* The window.
*/
private Window window;
/**
* The orderBy.
*/
private OrderBy orderBy;
/**
* Constructor.
*
* @param project the project.
* @param projectValidator the validator for the projecto.
* @throws ConnectorException if the logical step is not supported.
*/
public ProjectParsed(Project project, ProjectValidator projectValidator) throws ConnectorException {
this.project = project;
LogicalStep lStep = project;
while ((lStep = lStep.getNextStep()) != null) {
addLogicalStep(lStep);
}
projectValidator.validate(this);
}
/**
* Get the project.
*
* @return the project,
*/
public Project getProject() {
return project;
}
/**
* Get the filter.
*
* @return the filter.
*/
public Collection<Filter> getFilter() {
return new ArrayList(filterList);
}
/**
* Return The matchList.
*
* @return the matchList
*/
public Collection<Filter> getMatchList() {
return new ArrayList(matchList);
}
/**
* Return The functionFilters.
*
* @return the functionFilters
*/
public Collection<FunctionFilter> getFunctionFilters() {
return new ArrayList(functionFilters);
}
/**
* return the select.
*
* @return the select.
*/
public Select getSelect() {
return select;
}
/**
* Return the limit.
*
* @return the limit.
*/
public Window getWindow() {
return window;
}
/**
* Return the GroupBy.
*
* @return the groupBy.
*/
public GroupBy getGroupBy() {
return groupBy;
}
/**
* Return the OrderBy.
*
* @return the orderBy.
*/
public OrderBy getOrderBy() {
return orderBy;
}
/**
* Return the limit.
*
* @return the limit.
*/
public Limit getLimit() {
return limit;
}
/**
* This method add the correct logical step.
*
* @param lStep logical step.
* @throws ExecutionException if the logical step is not supported.
*/
private void addLogicalStep(LogicalStep lStep) throws ExecutionException {
if (lStep instanceof Project) {
project = (Project) lStep;
} else if (lStep instanceof Filter) {
decideTypeFilterToAdd((Filter) lStep);
} else if (lStep instanceof FunctionFilter){
functionFilters.add((FunctionFilter) lStep);
}else if (lStep instanceof Select) {
select = (Select) lStep;
} else if (lStep instanceof Limit) {
limit = (Limit) lStep;
} else if (lStep instanceof GroupBy) {
groupBy = (GroupBy) lStep;
} else if (lStep instanceof Window) {
window = (Window) lStep;
} else if (lStep instanceof OrderBy) {
orderBy = (OrderBy) lStep;
} else {
String message = "LogicalStep [" + lStep.getClass().getCanonicalName() + " not supported";
logger.error(message);
throw new ExecutionException(message);
}
}
/**
* Add filter in the correct list.
*
* @param filter the filter.
*/
private void decideTypeFilterToAdd(Filter filter) {
Filter step = filter;
if (Operator.MATCH == step.getRelation().getOperator() ||
step.getRelation().getRightTerm() instanceof FunctionSelector) {
if (matchList.isEmpty()) {
matchList = new ArrayList<>();
}
matchList.add(filter);
} else {
if (filterList.isEmpty()) {
filterList = new ArrayList<>();
}
filterList.add(filter);
}
}
}