/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF 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 org.apache.camel.utils.cassandra; import com.datastax.driver.core.ConsistencyLevel; import com.datastax.driver.core.RegularStatement; 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.datastax.driver.core.querybuilder.Truncate; import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker; import static com.datastax.driver.core.querybuilder.QueryBuilder.delete; import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto; import static com.datastax.driver.core.querybuilder.QueryBuilder.select; import static com.datastax.driver.core.querybuilder.QueryBuilder.ttl; public final class CassandraUtils { private CassandraUtils() { } /** * Test if the array is null or empty. */ public static boolean isEmpty(Object[] array) { return array == null || array.length == 0; } /** * Concatenate 2 arrays. */ public static Object[] concat(Object[] array1, Object[] array2) { if (isEmpty(array1)) { return array2; } if (isEmpty(array2)) { return array1; } Object[] array = new Object[array1.length + array2.length]; System.arraycopy(array1, 0, array, 0, array1.length); System.arraycopy(array2, 0, array, array1.length, array2.length); return array; } private static int size(String[] array) { return array == null ? 0 : array.length; } private static boolean isEmpty(String[] array) { return size(array) == 0; } /** * Concatenate 2 arrays. */ public static String[] concat(String[] array1, String[] array2) { if (isEmpty(array1)) { return array2; } if (isEmpty(array2)) { return array1; } String[] array = new String[array1.length + array2.length]; System.arraycopy(array1, 0, array, 0, array1.length); System.arraycopy(array2, 0, array, array1.length, array2.length); return array; } /** * Append values to given array. */ public static Object[] append(Object[] array1, Object... array2) { return concat(array1, array2); } /** * Append values to given array. */ public static String[] append(String[] array1, String... array2) { return concat(array1, array2); } /** * Generate Insert CQL. */ public static Insert generateInsert(String table, String[] columns, boolean ifNotExists, Integer ttl) { Insert insert = insertInto(table); for (String column : columns) { insert = insert.value(column, bindMarker()); } if (ifNotExists) { insert = insert.ifNotExists(); } if (ttl != null) { insert.using(ttl(ttl)); } return insert; } /** * Generate select where columns = ? CQL. */ public static Select generateSelect(String table, String[] selectColumns, String[] whereColumns) { return generateSelect(table, selectColumns, whereColumns, size(whereColumns)); } /** * Generate select where columns = ? CQL. */ public static Select generateSelect(String table, String[] selectColumns, String[] whereColumns, int whereColumnsMaxIndex) { Select select = select(selectColumns).from(table); if (isWhereClause(whereColumns, whereColumnsMaxIndex)) { Select.Where where = select.where(); for (int i = 0; i < whereColumns.length && i < whereColumnsMaxIndex; i++) { where.and(eq(whereColumns[i], bindMarker())); } } return select; } /** * Generate delete where columns = ? CQL. */ public static Delete generateDelete(String table, String[] whereColumns, boolean ifExists) { return generateDelete(table, whereColumns, size(whereColumns), ifExists); } /** * Generate delete where columns = ? CQL. */ public static Delete generateDelete(String table, String[] whereColumns, int whereColumnsMaxIndex, boolean ifExists) { Delete delete = delete().from(table); if (isWhereClause(whereColumns, whereColumnsMaxIndex)) { Delete.Where where = delete.where(); for (int i = 0; i < whereColumns.length && i < whereColumnsMaxIndex; i++) { where.and(eq(whereColumns[i], bindMarker())); } } if (ifExists) { delete = delete.ifExists(); } return delete; } private static boolean isWhereClause(String[] whereColumns, int whereColumnsMaxIndex) { return !isEmpty(whereColumns) && whereColumnsMaxIndex > 0; } /** * Generate delete where columns = ? CQL. */ public static Truncate generateTruncate(String table) { Truncate truncate = QueryBuilder.truncate(table); return truncate; } /** * Apply consistency level if provided, else leave default. */ public static <T extends RegularStatement> T applyConsistencyLevel(T statement, ConsistencyLevel consistencyLevel) { if (consistencyLevel != null) { statement.setConsistencyLevel(consistencyLevel); } return statement; } }