All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.savoirtech.hecate.pojo.binding.def.DefaultPojoBinding Maven / Gradle / Ivy

/*
 * Copyright (c) 2012-2016 Savoir Technologies, Inc.
 *
 * 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.savoirtech.hecate.pojo.binding.def;

import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Predicate;

import com.datastax.driver.core.BoundStatement;
import com.datastax.driver.core.KeyspaceMetadata;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.TableMetadata;
import com.datastax.driver.core.querybuilder.Delete;
import com.datastax.driver.core.querybuilder.Insert;
import com.datastax.driver.core.querybuilder.QueryBuilder;
import com.datastax.driver.core.querybuilder.Select;
import com.savoirtech.hecate.core.schema.Schema;
import com.savoirtech.hecate.core.schema.Table;
import com.savoirtech.hecate.core.util.CqlUtils;
import com.savoirtech.hecate.pojo.binding.ColumnBinding;
import com.savoirtech.hecate.pojo.binding.KeyBinding;
import com.savoirtech.hecate.pojo.binding.ParameterBinding;
import com.savoirtech.hecate.pojo.binding.PojoBinding;
import com.savoirtech.hecate.pojo.binding.PojoVisitor;
import com.savoirtech.hecate.pojo.exception.SchemaVerificationException;
import com.savoirtech.hecate.pojo.facet.Facet;
import com.savoirtech.hecate.pojo.query.PojoQueryContext;
import com.savoirtech.hecate.pojo.reflect.ReflectionUtils;

import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker;

public class DefaultPojoBinding

implements PojoBinding

{ //---------------------------------------------------------------------------------------------------------------------- // Fields //---------------------------------------------------------------------------------------------------------------------- private final Class

pojoType; private KeyBinding keyBinding; private List facetBindings = new LinkedList<>(); //---------------------------------------------------------------------------------------------------------------------- // Constructors //---------------------------------------------------------------------------------------------------------------------- public DefaultPojoBinding(Class

pojoType) { this.pojoType = pojoType; } //---------------------------------------------------------------------------------------------------------------------- // PojoBinding Implementation //---------------------------------------------------------------------------------------------------------------------- @Override public BoundStatement bindInsert(PreparedStatement statement, P pojo, int ttl) { List parameters = new LinkedList<>(); keyBinding.collectParameters(pojo, parameters); facetBindings.forEach(facetBinding -> facetBinding.collectParameters(pojo, parameters)); parameters.add(ttl); return bind(statement, parameters); } @Override public BoundStatement bindWhereIdEquals(PreparedStatement statement, List keys) { return bind(statement, keyBinding.getKeyParameters(keys)); } @Override public P createPojo() { return ReflectionUtils.newInstance(pojoType); } @Override public Delete.Where deleteFrom(String tableName) { Delete.Where delete = QueryBuilder.delete().from(tableName).where(); keyBinding.delete(delete); return delete; } @Override public void describe(Table table, Schema schema) { keyBinding.describe(table, schema); facetBindings.forEach(binding -> binding.describe(table, schema)); } @Override public KeyBinding getKeyBinding() { return keyBinding; } @Override public Map getParameterBindings() { Map parameterBindings = new HashMap<>(); Consumer collector = parameterBinding -> parameterBindings.put(parameterBinding.getFacetName(), parameterBinding); keyBinding.getParameterBindings().forEach(collector); facetBindings.stream().flatMap(facetBinding -> facetBinding.getParameterBindings().stream()).forEach(collector); return parameterBindings; } @Override public Class

getPojoType() { return pojoType; } @Override public void injectValues(P pojo, Row row, PojoQueryContext context) { Iterator columnValues = CqlUtils.toList(row).iterator(); keyBinding.injectValues(pojo, columnValues, context); facetBindings.forEach(facetBinding -> facetBinding.injectValues(pojo, columnValues, context)); } @Override public Insert insertInto(String tableName) { Insert insert = QueryBuilder.insertInto(tableName); keyBinding.insert(insert); facetBindings.forEach(binding -> binding.insert(insert)); insert.using(QueryBuilder.ttl(bindMarker())); return insert; } @Override public Select.Where selectFrom(String tableName) { Select.Selection select = QueryBuilder.select(); keyBinding.select(select); facetBindings.forEach(binding -> binding.select(select)); return select.from(tableName).where(); } @Override public Select.Where selectFromByKey(String tableName) { Select.Where select = selectFrom(tableName); keyBinding.selectWhere(select); return select; } @Override public void verifySchema(KeyspaceMetadata keyspaceMetadata, String tableName) { TableMetadata tableMetadata = keyspaceMetadata.getTable(tableName); if(tableMetadata == null) { throw new SchemaVerificationException("Table \"%s\" not found in keyspace \"%s\".", tableName, keyspaceMetadata.getName()); } keyBinding.verifySchema(keyspaceMetadata, tableMetadata); facetBindings.forEach(facetBinding -> facetBinding.verifySchema(keyspaceMetadata, tableMetadata)); } @Override public void visitChildren(P pojo, Predicate predicate, PojoVisitor visitor) { keyBinding.visitChildren(pojo, predicate, visitor); facetBindings.stream().forEach(facetBinding -> facetBinding.visitChildren(pojo, predicate, visitor)); } //---------------------------------------------------------------------------------------------------------------------- // Getter/Setter Methods //---------------------------------------------------------------------------------------------------------------------- public void setKeyBinding(KeyBinding keyBinding) { this.keyBinding = keyBinding; } //---------------------------------------------------------------------------------------------------------------------- // Canonical Methods //---------------------------------------------------------------------------------------------------------------------- @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; DefaultPojoBinding that = (DefaultPojoBinding) o; return pojoType.equals(that.pojoType); } @Override public int hashCode() { return pojoType.hashCode(); } //---------------------------------------------------------------------------------------------------------------------- // Other Methods //---------------------------------------------------------------------------------------------------------------------- public void addFacetBinding(ColumnBinding facetBinding) { facetBindings.add(facetBinding); } protected BoundStatement bind(PreparedStatement statement, List parameters) { return CqlUtils.bind(statement, parameters.toArray(new Object[parameters.size()])); } }