com.datastax.oss.driver.api.querybuilder.select.OngoingSelection Maven / Gradle / Ivy
/*
* 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 com.datastax.oss.driver.api.querybuilder.select;
import com.datastax.oss.driver.api.core.CqlIdentifier;
import com.datastax.oss.driver.api.core.context.DriverContext;
import com.datastax.oss.driver.api.core.type.DataType;
import com.datastax.oss.driver.api.core.type.DataTypes;
import com.datastax.oss.driver.api.core.type.codec.CodecNotFoundException;
import com.datastax.oss.driver.api.core.type.codec.TypeCodec;
import com.datastax.oss.driver.api.core.type.codec.registry.CodecRegistry;
import com.datastax.oss.driver.api.querybuilder.QueryBuilder;
import com.datastax.oss.driver.api.querybuilder.term.Term;
import com.datastax.oss.driver.shaded.guava.common.collect.Iterables;
import edu.umd.cs.findbugs.annotations.NonNull;
import edu.umd.cs.findbugs.annotations.Nullable;
import java.util.Arrays;
import java.util.Map;
/**
* A SELECT query that accepts additional selectors (that is, elements in the SELECT clause to
* return as columns in the result set, as in: {@code SELECT count(*), sku, price...}).
*/
public interface OngoingSelection {
/**
* Adds a selector.
*
* To create the argument, use one of the factory methods in {@link Selector}, for example
* {@link Selector#column(CqlIdentifier) column}. This type also provides shortcuts to create and
* add the selector in one call, for example {@link #column(CqlIdentifier)} for {@code
* selector(Selector.column(...))}.
*
*
If you add multiple selectors as once, consider {@link #selectors(Iterable)} as a more
* efficient alternative.
*/
@NonNull
Select selector(@NonNull Selector selector);
/**
* Adds multiple selectors at once.
*
*
This is slightly more efficient than adding the selectors one by one (since the underlying
* implementation of this object is immutable).
*
*
To create the arguments, use one of the factory methods in {@link Selector}, for example
* {@link Selector#column(CqlIdentifier) column}.
*
* @throws IllegalArgumentException if one of the selectors is {@link Selector#all()} ({@code *}
* can only be used on its own).
* @see #selector(Selector)
*/
@NonNull
Select selectors(@NonNull Iterable additionalSelectors);
/** Var-arg equivalent of {@link #selectors(Iterable)}. */
@NonNull
default Select selectors(@NonNull Selector... additionalSelectors) {
return selectors(Arrays.asList(additionalSelectors));
}
/**
* Selects all columns, as in {@code SELECT *}.
*
* This will clear any previously configured selector. Similarly, if any other selector is
* added later, it will cancel this one.
*
*
This is a shortcut for {@link #selector(Selector) selector(Selector.all())}.
*
* @see Selector#all()
*/
@NonNull
default Select all() {
return selector(Selector.all());
}
/**
* Selects the count of all returned rows, as in {@code SELECT count(*)}.
*
*
This is a shortcut for {@link #selector(Selector) selector(Selector.countAll())}.
*
* @see Selector#countAll()
*/
@NonNull
default Select countAll() {
return selector(Selector.countAll());
}
/**
* Selects a particular column by its CQL identifier.
*
*
This is a shortcut for {@link #selector(Selector) selector(Selector.column(columnId))}.
*
* @see Selector#column(CqlIdentifier)
*/
@NonNull
default Select column(@NonNull CqlIdentifier columnId) {
return selector(Selector.column(columnId));
}
/** Shortcut for {@link #column(CqlIdentifier) column(CqlIdentifier.fromCql(columnName))} */
@NonNull
default Select column(@NonNull String columnName) {
return column(CqlIdentifier.fromCql(columnName));
}
/**
* Convenience method to select multiple simple columns at once, as in {@code SELECT a,b,c}.
*
*
This is the same as calling {@link #column(CqlIdentifier)} for each element.
*/
@NonNull
default Select columnsIds(@NonNull Iterable columnIds) {
return selectors(Iterables.transform(columnIds, Selector::column));
}
/** Var-arg equivalent of {@link #columnsIds(Iterable)}. */
@NonNull
default Select columns(@NonNull CqlIdentifier... columnIds) {
return columnsIds(Arrays.asList(columnIds));
}
/**
* Convenience method to select multiple simple columns at once, as in {@code SELECT a,b,c}.
*
* This is the same as calling {@link #column(String)} for each element.
*/
@NonNull
default Select columns(@NonNull Iterable columnNames) {
return selectors(Iterables.transform(columnNames, Selector::column));
}
/** Var-arg equivalent of {@link #columns(Iterable)}. */
@NonNull
default Select columns(@NonNull String... columnNames) {
return columns(Arrays.asList(columnNames));
}
/**
* Selects the sum of two arguments, as in {@code SELECT col1 + col2}.
*
* This is available in Cassandra 4 and above.
*
*
This is a shortcut for {@link #selector(Selector) selector(Selector.add(left, right))}.
*
* @see Selector#add(Selector, Selector)
*/
@NonNull
default Select add(@NonNull Selector left, @NonNull Selector right) {
return selector(Selector.add(left, right));
}
/**
* Selects the difference of two terms, as in {@code SELECT col1 - col2}.
*
*
This is available in Cassandra 4 and above.
*
*
This is a shortcut for {@link #selector(Selector) selector(Selector.subtract(left, right))}.
*
* @see Selector#subtract(Selector, Selector)
*/
@NonNull
default Select subtract(@NonNull Selector left, @NonNull Selector right) {
return selector(Selector.subtract(left, right));
}
/**
* Selects the product of two arguments, as in {@code SELECT col1 * col2}.
*
*
This is available in Cassandra 4 and above.
*
*
This is a shortcut for {@link #selector(Selector) selector(Selector.multiply(left, right))}.
*
*
The arguments will be parenthesized if they are instances of {@link Selector#add} or {@link
* Selector#subtract}. If they are raw selectors, you might have to parenthesize them yourself.
*
* @see Selector#multiply(Selector, Selector)
*/
@NonNull
default Select multiply(@NonNull Selector left, @NonNull Selector right) {
return selector(Selector.multiply(left, right));
}
/**
* Selects the quotient of two arguments, as in {@code SELECT col1 / col2}.
*
*
This is available in Cassandra 4 and above.
*
*
This is a shortcut for {@link #selector(Selector) selector(Selector.divide(left, right))}.
*
*
The arguments will be parenthesized if they are instances of {@link Selector#add} or {@link
* Selector#subtract}. If they are raw selectors, you might have to parenthesize them yourself.
*
* @see Selector#divide(Selector, Selector)
*/
@NonNull
default Select divide(@NonNull Selector left, @NonNull Selector right) {
return selector(Selector.divide(left, right));
}
/**
* Selects the remainder of two arguments, as in {@code SELECT col1 % col2}.
*
*
This is available in Cassandra 4 and above.
*
*
This is a shortcut for {@link #selector(Selector) selector(Selector.remainder(left,
* right))}.
*
*
The arguments will be parenthesized if they are instances of {@link Selector#add} or {@link
* Selector#subtract}. If they are raw selectors, you might have to parenthesize them yourself.
*
* @see Selector#remainder(Selector, Selector)
*/
@NonNull
default Select remainder(@NonNull Selector left, @NonNull Selector right) {
return selector(Selector.remainder(left, right));
}
/**
* Selects the opposite of an argument, as in {@code SELECT -col1}.
*
*
This is available in Cassandra 4 and above.
*
*
This is a shortcut for {@link #selector(Selector) selector(Selector.negate(argument))}.
*
*
The argument will be parenthesized if it is an instance of {@link Selector#add} or {@link
* Selector#subtract}. If it is a raw selector, you might have to parenthesize it yourself.
*
* @see Selector#negate(Selector)
*/
@NonNull
default Select negate(@NonNull Selector argument) {
return selector(Selector.negate(argument));
}
/**
* Selects a field inside of a UDT column, as in {@code SELECT user.name}.
*
*
This is a shortcut for {@link #selector(Selector) selector(Selector.field(udt, fieldId))}.
*
* @see Selector#field(Selector, CqlIdentifier)
*/
@NonNull
default Select field(@NonNull Selector udt, @NonNull CqlIdentifier fieldId) {
return selector(Selector.field(udt, fieldId));
}
/**
* Shortcut for {@link #field(Selector, CqlIdentifier) field(udt,
* CqlIdentifier.fromCql(fieldName))}.
*/
@NonNull
default Select field(@NonNull Selector udt, @NonNull String fieldName) {
return field(udt, CqlIdentifier.fromCql(fieldName));
}
/**
* Shortcut to select a UDT field when the UDT is a simple column (as opposed to a more complex
* selection, like a nested UDT).
*
*
In other words, this is a shortcut for {{@link #field(Selector, CqlIdentifier)
* field(QueryBuilder.column(udtColumnId), fieldId)}.
*
* @see Selector#field(CqlIdentifier, CqlIdentifier)
*/
@NonNull
default Select field(@NonNull CqlIdentifier udtColumnId, @NonNull CqlIdentifier fieldId) {
return field(Selector.column(udtColumnId), fieldId);
}
/**
* Shortcut for {@link #field(CqlIdentifier, CqlIdentifier)
* field(CqlIdentifier.fromCql(udtColumnName), CqlIdentifier.fromCql(fieldName))}.
*
* @see Selector#field(String, String)
*/
@NonNull
default Select field(@NonNull String udtColumnName, @NonNull String fieldName) {
return field(CqlIdentifier.fromCql(udtColumnName), CqlIdentifier.fromCql(fieldName));
}
/**
* Selects an element in a collection column, as in {@code SELECT m['key']}.
*
*
As of Cassandra 4, this is only allowed for map and set columns.
*
*
This is a shortcut for {@link #selector(Selector) selector(Selector.element(collection,
* index))}.
*
* @see Selector#element(Selector, Term)
*/
@NonNull
default Select element(@NonNull Selector collection, @NonNull Term index) {
return selector(Selector.element(collection, index));
}
/**
* Shortcut for element selection when the target collection is a simple column.
*
*
In other words, this is the equivalent of {@link #element(Selector, Term)
* element(QueryBuilder.column(collection), index)}.
*
* @see Selector#element(CqlIdentifier, Term)
*/
@NonNull
default Select element(@NonNull CqlIdentifier collectionId, @NonNull Term index) {
return element(Selector.column(collectionId), index);
}
/**
* Shortcut for {@link #element(CqlIdentifier, Term)
* element(CqlIdentifier.fromCql(collectionName), index)}.
*
* @see Selector#element(String, Term)
*/
@NonNull
default Select element(@NonNull String collectionName, @NonNull Term index) {
return element(CqlIdentifier.fromCql(collectionName), index);
}
/**
* Selects a slice in a collection column, as in {@code SELECT s[4..8]}.
*
*
As of Cassandra 4, this is only allowed for set and map columns. Those collections are
* ordered, the elements (or keys in the case of a map), will be compared to the bounds for
* inclusions. Either bound can be unspecified, but not both.
*
*
This is a shortcut for {@link #selector(Selector) selector(Selector.range(collection, left,
* right))}.
*
* @param left the left bound (inclusive). Can be {@code null} to indicate that the slice is only
* right-bound.
* @param right the right bound (inclusive). Can be {@code null} to indicate that the slice is
* only left-bound.
* @see Selector#range(Selector, Term, Term)
*/
@NonNull
default Select range(@NonNull Selector collection, @Nullable Term left, @Nullable Term right) {
return selector(Selector.range(collection, left, right));
}
/**
* Shortcut for slice selection when the target collection is a simple column.
*
*
In other words, this is the equivalent of {@link #range(Selector, Term, Term)}
* range(Selector.column(collectionId), left, right)}.
*
* @see Selector#range(CqlIdentifier, Term, Term)
*/
@NonNull
default Select range(
@NonNull CqlIdentifier collectionId, @Nullable Term left, @Nullable Term right) {
return range(Selector.column(collectionId), left, right);
}
/**
* Shortcut for {@link #range(CqlIdentifier, Term, Term)
* range(CqlIdentifier.fromCql(collectionName), left, right)}.
*
* @see Selector#range(String, Term, Term)
*/
@NonNull
default Select range(@NonNull String collectionName, @Nullable Term left, @Nullable Term right) {
return range(CqlIdentifier.fromCql(collectionName), left, right);
}
/**
* Selects a group of elements as a list, as in {@code SELECT [a,b,c]}.
*
*
None of the selectors should be aliased (the query builder checks this at runtime), and they
* should all produce the same data type (the query builder can't check this, so the query will
* fail at execution time).
*
*
This is a shortcut for {@link #selector(Selector)
* selector(Selector.listOf(elementSelectors))}.
*
* @throws IllegalArgumentException if any of the selectors is aliased.
* @see Selector#listOf(Iterable)
*/
@NonNull
default Select listOf(@NonNull Iterable elementSelectors) {
return selector(Selector.listOf(elementSelectors));
}
/** Var-arg equivalent of {@link #listOf(Iterable)}. */
@NonNull
default Select listOf(@NonNull Selector... elementSelectors) {
return listOf(Arrays.asList(elementSelectors));
}
/**
* Selects a group of elements as a set, as in {@code SELECT {a,b,c}}.
*
* None of the selectors should be aliased (the query builder checks this at runtime), and they
* should all produce the same data type (the query builder can't check this, so the query will
* fail at execution time).
*
*
This is a shortcut for {@link #selector(Selector)
* selector(Selector.setOf(elementSelectors))}.
*
* @throws IllegalArgumentException if any of the selectors is aliased.
* @see Selector#setOf(Iterable)
*/
@NonNull
default Select setOf(@NonNull Iterable elementSelectors) {
return selector(Selector.setOf(elementSelectors));
}
/** Var-arg equivalent of {@link #setOf(Iterable)}. */
@NonNull
default Select setOf(@NonNull Selector... elementSelectors) {
return setOf(Arrays.asList(elementSelectors));
}
/**
* Selects a group of elements as a tuple, as in {@code SELECT (a,b,c)}.
*
* None of the selectors should be aliased (the query builder checks this at runtime).
*
*
This is a shortcut for {@link #selector(Selector)
* selector(Selector.tupleOf(elementSelectors))}.
*
* @throws IllegalArgumentException if any of the selectors is aliased.
* @see Selector#tupleOf(Iterable)
*/
@NonNull
default Select tupleOf(@NonNull Iterable elementSelectors) {
return selector(Selector.tupleOf(elementSelectors));
}
/** Var-arg equivalent of {@link #tupleOf(Iterable)}. */
@NonNull
default Select tupleOf(@NonNull Selector... elementSelectors) {
return tupleOf(Arrays.asList(elementSelectors));
}
/**
* Selects a group of elements as a map, as in {@code SELECT {a:b,c:d}}.
*
* None of the selectors should be aliased (the query builder checks this at runtime). In
* addition, all key selectors should produce the same type, and all value selectors as well (the
* key and value types can be different); the query builder can't check this, so the query will
* fail at execution time if the types are not uniform.
*
*
This is a shortcut for {@link #selector(Selector)
* selector(Selector.mapOf(elementSelectors))}.
*
*
Note that Cassandra often has trouble inferring the exact map type. This will manifest as
* the error message:
*
*
* Cannot infer type for term xxx in selection clause (try using a cast to force a type)
*
*
* If you run into this, consider providing the types explicitly with {@link #mapOf(Map, DataType,
* DataType)}.
*
* @throws IllegalArgumentException if any of the selectors is aliased.
* @see Selector#mapOf(Map)
*/
@NonNull
default Select mapOf(@NonNull Map elementSelectors) {
return selector(Selector.mapOf(elementSelectors));
}
/**
* Selects a group of elements as a map and force the resulting map type, as in {@code SELECT
* (map){a:b,c:d}}.
*
* To create the data types, use the constants and static methods in {@link DataTypes}, or
* {@link QueryBuilder#udt(CqlIdentifier)}.
*
*
This is a shortcut for {@link #selector(Selector) selector(Selector.mapOf(elementSelectors,
* keyType, valueType))}.
*
* @see #mapOf(Map)
* @see Selector#mapOf(Map, DataType, DataType)
*/
@NonNull
default Select mapOf(
@NonNull Map elementSelectors,
@NonNull DataType keyType,
@NonNull DataType valueType) {
return selector(Selector.mapOf(elementSelectors, keyType, valueType));
}
/**
* Provides a type hint for a selector, as in {@code SELECT (double)1/3}.
*
* Use the constants and static methods in {@link DataTypes} to create the data type.
*
*
This is a shortcut for {@link #selector(Selector) selector(Selector.typeHint(selector,
* targetType))}.
*
* @see Selector#typeHint(Selector, DataType)
*/
@NonNull
default Select typeHint(@NonNull Selector selector, @NonNull DataType targetType) {
return selector(Selector.typeHint(selector, targetType));
}
/**
* Selects the result of a function call, as is {@code SELECT f(a,b)}
*
*
None of the arguments should be aliased (the query builder checks this at runtime).
*
*
This is a shortcut for {@link #selector(Selector) selector(Selector.function(functionId,
* arguments))}.
*
* @throws IllegalArgumentException if any of the selectors is aliased.
* @see Selector#function(CqlIdentifier, Iterable)
*/
@NonNull
default Select function(
@NonNull CqlIdentifier functionId, @NonNull Iterable arguments) {
return selector(Selector.function(functionId, arguments));
}
/**
* Var-arg equivalent of {@link #function(CqlIdentifier, Iterable)}.
*
* @see Selector#function(CqlIdentifier, Selector...)
*/
@NonNull
default Select function(@NonNull CqlIdentifier functionId, @NonNull Selector... arguments) {
return function(functionId, Arrays.asList(arguments));
}
/**
* Shortcut for {@link #function(CqlIdentifier, Iterable)
* function(CqlIdentifier.fromCql(functionName), arguments)}.
*
* @see Selector#function(String, Iterable)
*/
@NonNull
default Select function(@NonNull String functionName, @NonNull Iterable arguments) {
return function(CqlIdentifier.fromCql(functionName), arguments);
}
/**
* Var-arg equivalent of {@link #function(String, Iterable)}.
*
* @see Selector#function(String, Selector...)
*/
@NonNull
default Select function(@NonNull String functionName, @NonNull Selector... arguments) {
return function(functionName, Arrays.asList(arguments));
}
/**
* Selects the result of a function call, as is {@code SELECT f(a,b)}
*
* None of the arguments should be aliased (the query builder checks this at runtime).
*
*
This is a shortcut for {@link #selector(Selector) selector(Selector.function(keyspaceId,
* functionId, arguments))}.
*
* @throws IllegalArgumentException if any of the selectors is aliased.
* @see Selector#function(CqlIdentifier, CqlIdentifier, Iterable)
*/
@NonNull
default Select function(
@Nullable CqlIdentifier keyspaceId,
@NonNull CqlIdentifier functionId,
@NonNull Iterable arguments) {
return selector(Selector.function(keyspaceId, functionId, arguments));
}
/**
* Var-arg equivalent of {@link #function(CqlIdentifier,CqlIdentifier, Iterable)}.
*
* @see Selector#function(CqlIdentifier, CqlIdentifier, Selector...)
*/
@NonNull
default Select function(
@Nullable CqlIdentifier keyspaceId,
@NonNull CqlIdentifier functionId,
@NonNull Selector... arguments) {
return function(keyspaceId, functionId, Arrays.asList(arguments));
}
/**
* Shortcut for {@link #function(CqlIdentifier, CqlIdentifier, Iterable)
* function(CqlIdentifier.fromCql(keyspaceName), CqlIdentifier.fromCql(functionName), arguments)}.
*
* @see Selector#function(String, String, Iterable)
*/
@NonNull
default Select function(
@Nullable String keyspaceName,
@NonNull String functionName,
@NonNull Iterable arguments) {
return function(
keyspaceName == null ? null : CqlIdentifier.fromCql(keyspaceName),
CqlIdentifier.fromCql(functionName),
arguments);
}
/**
* Var-arg equivalent of {@link #function(String, String, Iterable)}.
*
* @see Selector#function(String, String, Selector...)
*/
@NonNull
default Select function(
@Nullable String keyspaceName, @NonNull String functionName, @NonNull Selector... arguments) {
return function(keyspaceName, functionName, Arrays.asList(arguments));
}
/**
* Shortcut to select the result of the built-in {@code writetime} function, as in {@code SELECT
* writetime(c)}.
*
* @see Selector#writeTime(CqlIdentifier)
*/
@NonNull
default Select writeTime(@NonNull CqlIdentifier columnId) {
return selector(Selector.writeTime(columnId));
}
/**
* Shortcut for {@link #writeTime(CqlIdentifier) writeTime(CqlIdentifier.fromCql(columnName))}.
*
* @see Selector#writeTime(String)
*/
@NonNull
default Select writeTime(@NonNull String columnName) {
return writeTime(CqlIdentifier.fromCql(columnName));
}
/**
* Shortcut to select the result of the built-in {@code ttl} function, as in {@code SELECT
* ttl(c)}.
*
* @see Selector#ttl(CqlIdentifier)
*/
@NonNull
default Select ttl(@NonNull CqlIdentifier columnId) {
return selector(Selector.ttl(columnId));
}
/**
* Shortcut for {@link #ttl(CqlIdentifier) ttl(CqlIdentifier.fromCql(columnName))}.
*
* @see Selector#ttl(String)
*/
@NonNull
default Select ttl(@NonNull String columnName) {
return ttl(CqlIdentifier.fromCql(columnName));
}
/**
* Casts a selector to a type, as in {@code SELECT CAST(a AS double)}.
*
* To create the data type, use the constants and static methods in {@link DataTypes}, or
* {@link QueryBuilder#udt(CqlIdentifier)}.
*
*
This is a shortcut for {@link #selector(Selector) selector(Selector.function(keyspaceId,
* functionId, arguments))}.
*
* @throws IllegalArgumentException if the selector is aliased.
* @see Selector#cast(Selector, DataType)
*/
@NonNull
default Select cast(@NonNull Selector selector, @NonNull DataType targetType) {
return selector(Selector.cast(selector, targetType));
}
/**
* Shortcut to select the result of the built-in {@code toDate} function.
*
* @see Selector#toDate(CqlIdentifier)
*/
@NonNull
default Select toDate(@NonNull CqlIdentifier columnId) {
return selector(Selector.toDate(columnId));
}
/** Shortcut for {@link #toDate(CqlIdentifier) toDate(CqlIdentifier.fromCql(columnName))}. */
@NonNull
default Select toDate(@NonNull String columnName) {
return toDate(CqlIdentifier.fromCql(columnName));
}
/**
* Shortcut to select the result of the built-in {@code toTimestamp} function.
*
* @see Selector#toTimestamp(CqlIdentifier)
*/
@NonNull
default Select toTimestamp(@NonNull CqlIdentifier columnId) {
return selector(Selector.toTimestamp(columnId));
}
/**
* Shortcut for {@link #toTimestamp(CqlIdentifier)
* toTimestamp(CqlIdentifier.fromCql(columnName))}.
*/
@NonNull
default Select toTimestamp(@NonNull String columnName) {
return toTimestamp(CqlIdentifier.fromCql(columnName));
}
/**
* Shortcut to select the result of the built-in {@code toUnixTimestamp} function.
*
* @see Selector#toUnixTimestamp(CqlIdentifier)
*/
@NonNull
default Select toUnixTimestamp(@NonNull CqlIdentifier columnId) {
return selector(Selector.toUnixTimestamp(columnId));
}
/**
* Shortcut for {@link #toUnixTimestamp(CqlIdentifier)
* toUnixTimestamp(CqlIdentifier.fromCql(columnName))}.
*/
@NonNull
default Select toUnixTimestamp(@NonNull String columnName) {
return toUnixTimestamp(CqlIdentifier.fromCql(columnName));
}
/**
* Selects literal value, as in {@code WHERE k = 1}.
*
*
This method can process any type for which there is a default Java to CQL mapping, namely:
* primitive types ({@code Integer=>int, Long=>bigint, String=>text, etc.}), and collections,
* tuples, and user defined types thereof.
*
*
A null argument will be rendered as {@code NULL}.
*
*
For custom mappings, use {@link #literal(Object, CodecRegistry)} or {@link #literal(Object,
* TypeCodec)}.
*
* @throws CodecNotFoundException if there is no default CQL mapping for the Java type of {@code
* value}.
* @see QueryBuilder#literal(Object)
*/
@NonNull
default Select literal(@Nullable Object value) {
return literal(value, CodecRegistry.DEFAULT);
}
/**
* Selects a literal value, as in {@code WHERE k = 1}.
*
*
This is an alternative to {@link #literal(Object)} for custom type mappings. The provided
* registry should contain a codec that can format the value. Typically, this will be your
* session's registry, which is accessible via {@code session.getContext().getCodecRegistry()}.
*
* @see DriverContext#getCodecRegistry()
* @throws CodecNotFoundException if {@code codecRegistry} does not contain any codec that can
* handle {@code value}.
* @see QueryBuilder#literal(Object, CodecRegistry)
*/
@NonNull
default Select literal(@Nullable Object value, @NonNull CodecRegistry codecRegistry) {
return literal(value, (value == null) ? null : codecRegistry.codecFor(value));
}
/**
* Selects a literal value, as in {@code WHERE k = 1}.
*
*
This is an alternative to {@link #literal(Object)} for custom type mappings. The value will
* be turned into a string with {@link TypeCodec#format(Object)}, and inlined in the query.
*
* @see QueryBuilder#literal(Object, TypeCodec)
*/
@NonNull
default Select literal(@Nullable T value, @Nullable TypeCodec codec) {
return selector(QueryBuilder.literal(value, codec));
}
/**
* Selects an arbitrary expression expressed as a raw string.
*
* The contents will be appended to the query as-is, without any syntax checking or escaping.
* This method should be used with caution, as it's possible to generate invalid CQL that will
* fail at execution time; on the other hand, it can be used as a workaround to handle new CQL
* features that are not yet covered by the query builder.
*
*
This is a shortcut for {@link #selector(Selector)
* selector(QueryBuilder.raw(rawExpression))}.
*/
@NonNull
default Select raw(@NonNull String rawExpression) {
return selector(QueryBuilder.raw(rawExpression));
}
/**
* Aliases the last added selector, as in {@code SELECT count(*) AS total}.
*
*
It is the caller's responsibility to ensure that this method is called at most once after
* each selector, and that this selector can legally be aliased:
*
*
* - if it is called multiple times ({@code countAll().as("total1").as("total2")}), the last
* alias will override the previous ones.
*
- if it is called before any selector was set, or after {@link #all()}, an {@link
* IllegalStateException} is thrown.
*
- if it is called after a {@link #raw(String)} selector that already defines an alias, the
* query will fail at runtime.
*
*/
@NonNull
Select as(@NonNull CqlIdentifier alias);
/** Shortcut for {@link #as(CqlIdentifier) as(CqlIdentifier.fromCql(alias))} */
@NonNull
default Select as(@NonNull String alias) {
return as(CqlIdentifier.fromCql(alias));
}
}