Package com.impetus.client.oraclenosql.query

Source Code of com.impetus.client.oraclenosql.query.OracleNoSQLQuery

/**
* Copyright 2013 Impetus Infotech.
*
* 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 com.impetus.client.oraclenosql.query;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Queue;
import java.util.Set;

import javax.persistence.Query;
import javax.persistence.metamodel.SingularAttribute;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.impetus.client.oraclenosql.OracleNoSQLClient;
import com.impetus.client.oraclenosql.OracleNoSQLEntityReader;
import com.impetus.client.oraclenosql.index.OracleNoSQLInvertedIndexer;
import com.impetus.kundera.client.Client;
import com.impetus.kundera.client.ClientBase;
import com.impetus.kundera.metadata.MetadataUtils;
import com.impetus.kundera.metadata.model.ClientMetadata;
import com.impetus.kundera.metadata.model.EntityMetadata;
import com.impetus.kundera.metadata.model.attributes.AbstractAttribute;
import com.impetus.kundera.persistence.EntityManagerFactoryImpl.KunderaMetadata;
import com.impetus.kundera.persistence.EntityReader;
import com.impetus.kundera.persistence.PersistenceDelegator;
import com.impetus.kundera.property.PropertyAccessorHelper;
import com.impetus.kundera.query.KunderaQuery;
import com.impetus.kundera.query.KunderaQuery.FilterClause;
import com.impetus.kundera.query.QueryImpl;

/**
* Implementation of {@link Query} for Oracle NoSQL database
*
* @author amresh.singh
*/
public class OracleNoSQLQuery extends QueryImpl
{
    private static Logger log = LoggerFactory.getLogger(OracleNoSQLQuery.class);

    public OracleNoSQLQuery(KunderaQuery kunderaQuery, PersistenceDelegator persistenceDelegator,
            final KunderaMetadata kunderaMetadata)
    {
        super(kunderaQuery, persistenceDelegator, kunderaMetadata);
    }

    @Override
    protected List<Object> populateEntities(EntityMetadata m, Client client)
    {
        if (log.isDebugEnabled())
        {
            log.debug("Populating entities for JPA query on OracleNOSQL");
        }

        Set<Object> results = new HashSet<Object>();

        OracleNoSQLQueryInterpreter interpreter = translateQuery(getKunderaQuery().getFilterClauseQueue(), m);

        ClientMetadata clientMetadata = ((ClientBase) client).getClientMetadata();

        if (!MetadataUtils.useSecondryIndex(clientMetadata)
                && !(clientMetadata.getIndexImplementor() != null && clientMetadata.getIndexImplementor().equals(
                        OracleNoSQLInvertedIndexer.class.getName())))
        {
            results.addAll(populateUsingLucene(m, client, null, interpreter.getSelectColumns()));
        }
        else
        {
            results.addAll((List<Object>) ((OracleNoSQLClient) client).executeQuery(m.getEntityClazz(), interpreter,
                    null));
        }

        List<Object> output = new ArrayList<Object>();
        output.addAll(results);

        return output;
    }

    @Override
    protected List<Object> recursivelyPopulateEntities(EntityMetadata m, Client client)
    {
        List<Object> ls = new ArrayList<Object>();
        ls = populateEntities(m, client);

        return setRelationEntities(ls, client, m);
    }

    @Override
    protected EntityReader getReader()
    {
        return new OracleNoSQLEntityReader(kunderaQuery, kunderaMetadata);
    }

    @Override
    protected int onExecuteUpdate()
    {
        return onUpdateDeleteEvent();
    }

    private OracleNoSQLQueryInterpreter translateQuery(Queue clauseQueue, EntityMetadata entityMetadata)
    {
        OracleNoSQLQueryInterpreter interpreter = new OracleNoSQLQueryInterpreter(getColumns(getKunderaQuery()
                .getResult(), entityMetadata));
        interpreter.setClauseQueue(clauseQueue);

        String operatorWithIdClause = null;
        boolean idClauseFound = false;
        for (Object clause : clauseQueue)
        {
            if (clause.getClass().isAssignableFrom(FilterClause.class) && !idClauseFound)
            {
                String columnName = ((FilterClause) clause).getProperty();
                SingularAttribute idAttribute = entityMetadata.getIdAttribute();
                if (columnName.equals(((AbstractAttribute) idAttribute).getJPAColumnName()))
                {
                    interpreter.setFindById(true);
                    // To convert rowkey string to object.
                    // With 2.11 onwards Filter clause values has been changed
                    // to collection of values. other than IN or sub query
                    // doing get(0) here.
                    Object keyObj = PropertyAccessorHelper.fromSourceToTargetClass(((AbstractAttribute) idAttribute)
                            .getBindableJavaType(), (((FilterClause) clause).getValue().get(0)).getClass(),
                            ((FilterClause) clause).getValue().get(0));

                    interpreter.setRowKey(keyObj);
                    idClauseFound = true;
                }
            }
            else if (clause instanceof String)
            {
                operatorWithIdClause = clause.toString().trim();
            }

            if (idClauseFound && operatorWithIdClause != null)
            {
                break;
            }
        }

        interpreter.setOperatorWithRowKey(operatorWithIdClause);

        return interpreter;
    }

    @Override
    public void close()
    {
        // TODO Auto-generated method stub

    }

    @Override
    public Iterator iterate()
    {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    protected List findUsingLucene(EntityMetadata m, Client client)
    {
        OracleNoSQLQueryInterpreter interpreter = translateQuery(getKunderaQuery().getFilterClauseQueue(), m);
        return ((OracleNoSQLClient) client).executeQuery(m.getEntityClazz(), interpreter, null);
    }

}
TOP

Related Classes of com.impetus.client.oraclenosql.query.OracleNoSQLQuery

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.