info.archinnov.achilles.internal.statement.SliceQueryStatementGenerator.java Source code

Java tutorial

Introduction

Here is the source code for info.archinnov.achilles.internal.statement.SliceQueryStatementGenerator.java

Source

/*
 * Copyright (C) 2012-2014 DuyHai DOAN
 *
 *  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 info.archinnov.achilles.internal.statement;

import static com.datastax.driver.core.querybuilder.QueryBuilder.*;
import static info.archinnov.achilles.type.OrderingMode.*;
import info.archinnov.achilles.query.slice.CQLSliceQuery;
import info.archinnov.achilles.internal.statement.wrapper.RegularStatementWrapper;
import info.archinnov.achilles.type.OrderingMode;

import java.util.List;

import org.apache.commons.lang.ArrayUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.datastax.driver.core.querybuilder.Delete;
import com.datastax.driver.core.querybuilder.Select;
import com.datastax.driver.core.querybuilder.Select.Where;

public class SliceQueryStatementGenerator {

    private static final Logger log = LoggerFactory.getLogger(SliceQueryStatementGenerator.class);

    public RegularStatementWrapper generateWhereClauseForSelectSliceQuery(CQLSliceQuery<?> sliceQuery,
            Select select) {
        Where where = select.where();
        List<Object> fixedComponents = sliceQuery.getFixedComponents();
        List<String> componentNames = sliceQuery.getComponentNames();
        String varyingComponentName = sliceQuery.getVaryingComponentName();
        OrderingMode ordering = sliceQuery.getOrdering();

        Object lastStartComp = sliceQuery.getLastStartComponent();
        Object lastEndComp = sliceQuery.getLastEndComponent();
        Object[] boundValues = new Object[fixedComponents.size()];

        for (int i = 0; i < fixedComponents.size(); i++) {
            where.and(eq(componentNames.get(i), fixedComponents.get(i)));
            boundValues[i] = fixedComponents.get(i);
        }

        if (lastStartComp != null)
            boundValues = ArrayUtils.add(boundValues, lastStartComp);
        if (lastEndComp != null)
            boundValues = ArrayUtils.add(boundValues, lastEndComp);

        if (ordering == ASCENDING) {

            switch (sliceQuery.getBounding()) {
            case INCLUSIVE_BOUNDS:
                if (lastStartComp != null)
                    where.and(gte(varyingComponentName, lastStartComp));
                if (lastEndComp != null)
                    where.and(lte(varyingComponentName, lastEndComp));
                break;
            case EXCLUSIVE_BOUNDS:
                if (lastStartComp != null)
                    where.and(gt(varyingComponentName, lastStartComp));
                if (lastEndComp != null)
                    where.and(lt(varyingComponentName, lastEndComp));
                break;
            case INCLUSIVE_START_BOUND_ONLY:
                if (lastStartComp != null)
                    where.and(gte(varyingComponentName, lastStartComp));
                if (lastEndComp != null)
                    where.and(lt(varyingComponentName, lastEndComp));
                break;
            case INCLUSIVE_END_BOUND_ONLY:
                if (lastStartComp != null)
                    where.and(gt(varyingComponentName, lastStartComp));
                if (lastEndComp != null)
                    where.and(lte(varyingComponentName, lastEndComp));
                break;
            }
        } else // ordering == DESCENDING
        {
            switch (sliceQuery.getBounding()) {
            case INCLUSIVE_BOUNDS:
                if (lastStartComp != null)
                    where.and(lte(varyingComponentName, lastStartComp));
                if (lastEndComp != null)
                    where.and(gte(varyingComponentName, lastEndComp));
                break;
            case EXCLUSIVE_BOUNDS:
                if (lastStartComp != null)
                    where.and(lt(varyingComponentName, lastStartComp));
                if (lastEndComp != null)
                    where.and(gt(varyingComponentName, lastEndComp));
                break;
            case INCLUSIVE_START_BOUND_ONLY:
                if (lastStartComp != null)
                    where.and(lte(varyingComponentName, lastStartComp));
                if (lastEndComp != null)
                    where.and(gt(varyingComponentName, lastEndComp));
                break;
            case INCLUSIVE_END_BOUND_ONLY:
                if (lastStartComp != null)
                    where.and(lt(varyingComponentName, lastStartComp));
                if (lastEndComp != null)
                    where.and(gte(varyingComponentName, lastEndComp));
                break;
            }
        }
        where.setFetchSize(sliceQuery.getBatchSize());
        log.trace("Generated WHERE clause for slice query : {}", where.getQueryString());
        return new RegularStatementWrapper(where, boundValues, sliceQuery.getConsistencyLevel());
    }

    public RegularStatementWrapper generateWhereClauseForDeleteSliceQuery(CQLSliceQuery<?> sliceQuery,
            Delete delete) {
        List<Object> fixedComponents = sliceQuery.getFixedComponents();
        List<String> componentNames = sliceQuery.getComponentNames();

        com.datastax.driver.core.querybuilder.Delete.Where where = delete.where();
        Object[] boundValues = new Object[fixedComponents.size()];

        for (int i = 0; i < fixedComponents.size(); i++) {
            where.and(eq(componentNames.get(i), fixedComponents.get(i)));
            boundValues[i] = fixedComponents.get(i);
        }
        log.trace("Generated WHERE clause for slice delete query : {}", where.getQueryString());
        return new RegularStatementWrapper(where, boundValues, sliceQuery.getConsistencyLevel());
    }

}