<!--
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.
-->

## DELETE

To start a DELETE query, use one of the `deleteFrom` methods in [QueryBuilder]. There are several
variants depending on whether your table name is qualified, and whether you use
[identifiers](../../case_sensitivity/README.md) or raw strings:

```java
import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.*;

DeleteSelection delete = deleteFrom("user");
```

Note that, at this stage, the query can't be built yet. You need at least one
[relation](#relations).

### Selectors

A selector is something that appears after the `DELETE` keyword, and will be removed from the
affected row(s).

Selectors are optional; if you don't provide any, the whole row will be deleted.

The easiest way to add a selector is with a fluent API method:

```java
deleteFrom("user").column("v1").column("v2");
// DELETE v1,v2 FROM user...
```

You can also create it manually with one of the factory methods in [Selector], and then pass it to
`selector()`:

```java
deleteFrom("user").selector(Selector.getColumn("v"))
// DELETE v FROM user ...
```

If you have multiple selectors, you can also use `selectors()` to add them all in a single call.
This is a bit more efficient since it creates less temporary objects: 

```java
deleteFrom("user").selectors(getColumn("v1"), getColumn("v2"));
// DELETE v1,v2 FROM user...
```

Only 3 types of selectors can be used in DELETE statements:

* simple columns (as illustrated in the previous examples);
* fields in non-nested UDT columns:

  ```java
  deleteFrom("user").field("address", "street");
  // DELETE address.street FROM user ...
  ```
  
* elements in non-nested collection columns:

  ```java
  deleteFrom("product").element("features", literal("color"));
  // DELETE features['color'] FROM product ...
  ```
  
You can also pass a raw CQL snippet, that will get appended to the query as-is, without any syntax
checking or escaping:

```java
deleteFrom("user").raw("v /*some random comment*/")
// DELETE v /*some random comment*/ FROM user ...
```

This 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.

### Timestamp

The USING TIMESTAMP clause specifies the timestamp at which the mutation will be applied. You can
pass either a literal value:

```java
deleteFrom("user").column("v").usingTimestamp(1234)
// DELETE v FROM user USING TIMESTAMP 1234
```

Or a bind marker:

```java
deleteFrom("user").column("v").usingTimestamp(bindMarker())
// DELETE v FROM user USING TIMESTAMP ?
```

If you call the method multiple times, the last value will be used.

### Relations

Relations get added with the fluent `whereXxx()` methods:

```java
deleteFrom("user").whereColumn("k").isEqualTo(bindMarker());
// DELETE FROM user WHERE k=?
```

Or you can build and add them manually:

```java
deleteFrom("user").where(
    Relation.column("k").isEqualTo(bindMarker()));
// DELETE FROM user WHERE k=?
```

Once there is at least one relation, the statement can be built:

```java
SimpleStatement statement = deleteFrom("user").whereColumn("k").isEqualTo(bindMarker()).build();
```

Relations are a common feature used by many types of statements, so they have a
[dedicated page](../relation/README.md) in this manual.

### Conditions

Conditions get added with the fluent `ifXxx()` methods:

```java
deleteFrom("user")
    .whereColumn("k").isEqualTo(bindMarker())
    .ifColumn("v").isEqualTo(literal(1));
// DELETE FROM user WHERE k=? IF v=1
```

Or you can build and add them manually:

```java
deleteFrom("user")
    .whereColumn("k").isEqualTo(bindMarker())
    .if_(
        Condition.Column("v").isEqualTo(literal(1)));
// DELETE FROM user WHERE k=? IF v=1
```

Conditions are a common feature used by UPDATE and DELETE, so they have a
[dedicated page](../condition/README.md) in this manual.

[QueryBuilder]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/querybuilder/QueryBuilder.html
[Selector]:     https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/querybuilder/select/Selector.html
