mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
* feat: Add includeLabelInSql configuration option to include query label as inline comment in generated sql select The generated select queries can look like: select /* MyInnerTest.insert_and_find */ t0.id, ... Using either query.setLabel() or profile location (which all query beans get by default). This means that tooling looking at sql in the database can more easily relate that sql back to application code. * More tests for labels with includeLabelInSql=true * Remove trim when using profileLocation label
1176 lines
30 KiB
Java
1176 lines
30 KiB
Java
package org.querytest;
|
|
|
|
import io.ebean.*;
|
|
import io.ebean.annotation.Transactional;
|
|
import io.ebean.test.LoggedSql;
|
|
import io.ebean.types.Inet;
|
|
import org.example.domain.Address;
|
|
import org.example.domain.Country;
|
|
import org.example.domain.Customer;
|
|
import org.example.domain.otherpackage.PhoneNumber;
|
|
import org.example.domain.otherpackage.ValidEmail;
|
|
import org.example.domain.query.QContact;
|
|
import org.example.domain.query.QCustomer;
|
|
import org.junit.jupiter.api.Disabled;
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
import javax.sql.DataSource;
|
|
import java.sql.Connection;
|
|
import java.sql.SQLException;
|
|
import java.sql.Timestamp;
|
|
import java.time.LocalDate;
|
|
import java.util.*;
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
import java.util.stream.Stream;
|
|
|
|
import static io.ebean.StdOperators.*;
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
import static org.example.domain.query.QAddress.Alias.country;
|
|
import static org.example.domain.query.QAddress.Alias.line1;
|
|
import static org.example.domain.query.QContact.Alias.firstName;
|
|
import static org.example.domain.query.QContact.Alias.lastName;
|
|
import static org.example.domain.query.QCustomer.Alias.*;
|
|
import static org.example.domain.query.QCustomer.Alias.billingAddress;
|
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
|
|
|
public class QCustomerTest {
|
|
|
|
@Test
|
|
public void findWithTransaction() {
|
|
|
|
final Database database = DB.getDefault();
|
|
|
|
try (Transaction txn = database.createTransaction()) {
|
|
Customer customer = new Customer();
|
|
customer.setName("explicitTransaction");
|
|
|
|
database.save(customer, txn);
|
|
|
|
final Customer found = new QCustomer(txn)
|
|
.name.eq("explicitTransaction")
|
|
.findOne();
|
|
assertThat(found).isNotNull();
|
|
|
|
// not found using other transaction
|
|
final Customer foundNot = new QCustomer()
|
|
.name.eq("explicitTransaction")
|
|
.withLock(Query.LockType.SHARE)
|
|
.findOne();
|
|
assertThat(foundNot).isNull();
|
|
|
|
txn.commit();
|
|
}
|
|
|
|
}
|
|
|
|
@Test
|
|
public void copy() {
|
|
var origin = new QCustomer()
|
|
.setDistinct(true)
|
|
.status.equalTo(Customer.Status.BAD);
|
|
|
|
var copy1 = origin.copy().name.isNotNull();
|
|
var q1 = copy1.query();
|
|
copy1.findList();
|
|
|
|
assertThat(q1.getGeneratedSql()).contains("from be_customer t0 where t0.status = ? and t0.name is not null");
|
|
|
|
var copy2 = origin.copy().version.ge(1L);
|
|
var q2 = copy2.query();
|
|
copy2.findList();
|
|
|
|
assertThat(q2.getGeneratedSql()).contains("from be_customer t0 where t0.status = ? and t0.version >= ?");
|
|
}
|
|
|
|
@Test
|
|
public void findSingleAttribute() {
|
|
|
|
List<String> names = new QCustomer()
|
|
.setDistinct(true)
|
|
.select(QCustomer.alias().name)
|
|
.status.equalTo(Customer.Status.BAD)
|
|
.findSingleAttributeList();
|
|
|
|
assertThat(names).isNotNull();
|
|
}
|
|
|
|
@Test
|
|
public void findEachBatch() {
|
|
|
|
for (int i = 0; i < 22; i++) {
|
|
Customer customer = new Customer();
|
|
customer.setStatus(Customer.Status.MIDDLING);
|
|
customer.setName("findEachBatch_a_" + i);
|
|
customer.save();
|
|
}
|
|
|
|
final List<Integer> batchSizes = new ArrayList<>();
|
|
|
|
final AtomicInteger counter = new AtomicInteger();
|
|
new QCustomer()
|
|
.status.eq(Customer.Status.MIDDLING)
|
|
.name.startsWith("findEachBatch_a_")
|
|
.findEach(10, customers -> {
|
|
batchSizes.add(customers.size());
|
|
System.out.println("Batch " + counter.incrementAndGet() + " size:" + customers.size());
|
|
});
|
|
|
|
assertThat(batchSizes).hasSize(3);
|
|
assertThat(batchSizes.get(0)).isEqualTo(10);
|
|
assertThat(batchSizes.get(1)).isEqualTo(10);
|
|
assertThat(batchSizes.get(2)).isEqualTo(2);
|
|
}
|
|
|
|
@Test
|
|
public void findEachBatch_when_lastBatchEmpty() {
|
|
|
|
for (int i = 0; i < 18; i++) {
|
|
Customer customer = new Customer();
|
|
customer.setStatus(Customer.Status.MIDDLING);
|
|
customer.setName("findEachBatch_b_" + i);
|
|
customer.save();
|
|
}
|
|
|
|
final List<Integer> batchSizes = new ArrayList<>();
|
|
|
|
final AtomicInteger counter = new AtomicInteger();
|
|
new QCustomer()
|
|
.status.eq(Customer.Status.MIDDLING)
|
|
.name.startsWith("findEachBatch_b_")
|
|
.findEach(9, customers -> {
|
|
batchSizes.add(customers.size());
|
|
System.out.println("Batch " + counter.incrementAndGet() + " size:" + customers.size());
|
|
});
|
|
|
|
assertThat(batchSizes).hasSize(2);
|
|
assertThat(batchSizes.get(0)).isEqualTo(9);
|
|
assertThat(batchSizes.get(1)).isEqualTo(9);
|
|
}
|
|
|
|
@Test
|
|
public void findIterate() {
|
|
|
|
Customer cust = new Customer();
|
|
cust.setName("foo");
|
|
cust.setStatus(Customer.Status.GOOD);
|
|
cust.save();
|
|
|
|
List<Long> ids = new QCustomer()
|
|
.status.equalTo(Customer.Status.GOOD)
|
|
.findIds();
|
|
|
|
assertThat(ids).isNotEmpty();
|
|
|
|
|
|
Map<Long, Customer> map = new QCustomer()
|
|
.status.equalTo(Customer.Status.GOOD)
|
|
.findMap();
|
|
|
|
assertThat(map.size()).isEqualTo(ids.size());
|
|
|
|
try (QueryIterator<Customer> iterate =
|
|
new QCustomer()
|
|
.status.equalTo(Customer.Status.GOOD)
|
|
.findIterate()) {
|
|
|
|
while (iterate.hasNext()) {
|
|
Customer customer = iterate.next();
|
|
assertThat(customer.getName()).isNotNull();
|
|
}
|
|
}
|
|
}
|
|
|
|
@Test
|
|
void equalTo_byProperty() {
|
|
Query<Customer> query = new QCustomer()
|
|
.select(id)
|
|
.billingAddress.city.eq(shippingAddress.city)
|
|
.query();
|
|
|
|
query.findList();
|
|
String generatedSql = query.getGeneratedSql();
|
|
|
|
// select t0.id from be_customer t0
|
|
// left join o_address t2 on t2.id = t0.shipping_address_id
|
|
// left join o_address t1 on t1.id = t0.billing_address_id
|
|
// where t1.city = t2.city
|
|
assertThat(generatedSql).contains("where t1.city = t2.city");
|
|
}
|
|
|
|
@Test
|
|
void notEqual_byProperty() {
|
|
Query<Customer> query = new QCustomer()
|
|
.select(id)
|
|
.billingAddress.city.ne(shippingAddress.city)
|
|
.query();
|
|
|
|
query.findList();
|
|
String generatedSql = query.getGeneratedSql();
|
|
|
|
// select t0.id from be_customer t0
|
|
// left join o_address t2 on t2.id = t0.shipping_address_id
|
|
// left join o_address t1 on t1.id = t0.billing_address_id
|
|
// where t1.city <> t2.city
|
|
assertThat(generatedSql).contains("where t1.city <> t2.city");
|
|
}
|
|
|
|
@Test
|
|
public void isEmpty() {
|
|
|
|
new QCustomer()
|
|
.contacts.isEmpty()
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.contacts.isNotEmpty()
|
|
.findList();
|
|
}
|
|
|
|
@Transactional
|
|
@Test
|
|
public void forUpdate() {
|
|
|
|
new QCustomer()
|
|
.id.eq(42)
|
|
.forUpdate()
|
|
.findOne();
|
|
|
|
new QCustomer()
|
|
.id.eq(42)
|
|
.forUpdateNoWait()
|
|
.findOne();
|
|
|
|
new QCustomer()
|
|
.id.eq(42)
|
|
.forUpdateSkipLocked()
|
|
.findOne();
|
|
}
|
|
|
|
@Disabled
|
|
@Test
|
|
public void arrayContains() {
|
|
|
|
new QContact()
|
|
.phoneNumbers.contains("4312")
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.contacts.phoneNumbers.contains("4312")
|
|
.findList();
|
|
}
|
|
|
|
@Test
|
|
public void setIncludeSoftDeletes() {
|
|
|
|
new QCustomer()
|
|
.setIdIn(42L)
|
|
.setIncludeSoftDeletes()
|
|
.findList();
|
|
}
|
|
|
|
static final FetchGroup<Customer> FGCustomerContacts = QCustomer.forFetchGroup()
|
|
.select(name)
|
|
.contacts.fetch(firstName, lastName)
|
|
.buildFetchGroup();
|
|
|
|
@Test
|
|
void filterMany() {
|
|
|
|
var q = new QCustomer()
|
|
.select(FGCustomerContacts)
|
|
.contacts.filterMany(contacts -> contacts
|
|
.firstName.startsWith("r")
|
|
.email.isNotNull())
|
|
.query();
|
|
|
|
q.findList();
|
|
assertThat(q.getGeneratedSql()).isEqualTo("select /* QCustomerTest.filterMany */ t0.id, t0.name, t1.id, t1.first_name, t1.last_name from be_customer t0 left join be_contact t1 on t1.customer_id = t0.id where t1.first_name like ? escape'|' and t1.email is not null order by t0.id");
|
|
}
|
|
|
|
@Test
|
|
void filterManySingle() {
|
|
|
|
var q = new QCustomer()
|
|
.select(FGCustomerContacts)
|
|
.contacts.filterMany(c -> c.firstName.startsWith("r"))
|
|
.query();
|
|
|
|
q.findList();
|
|
assertThat(q.getGeneratedSql()).isEqualTo("select /* QCustomerTest.filterManySingle */ t0.id, t0.name, t1.id, t1.first_name, t1.last_name from be_customer t0 left join be_contact t1 on t1.customer_id = t0.id where t1.first_name like ? escape'|' order by t0.id");
|
|
}
|
|
|
|
@Test
|
|
void filterManySeparateQuery() {
|
|
Customer cust = new Customer();
|
|
cust.setName("filterManySeparateQuery");
|
|
cust.setStatus(Customer.Status.GOOD);
|
|
cust.save();
|
|
|
|
var q = new QCustomer()
|
|
.select(FGCustomerContacts)
|
|
.contacts.filterManyRaw("firstName like ?", "R%")
|
|
.contacts.filterMany(c -> c.firstName.startsWith("R")) // same as filterManyRaw() expression
|
|
.setMaxRows(10) // force the ToMany path to be in a separate secondary query
|
|
.query();
|
|
|
|
q.findList();
|
|
assertThat(q.getGeneratedSql()).isEqualTo("select t0.id, t0.name from be_customer t0 limit 10");
|
|
}
|
|
|
|
@Test
|
|
void filterManySingleQuery() {
|
|
Customer cust = new Customer();
|
|
cust.setName("filterManySingleQuery");
|
|
cust.setStatus(Customer.Status.GOOD);
|
|
cust.save();
|
|
|
|
var q = new QCustomer()
|
|
.select(FGCustomerContacts)
|
|
.contacts.filterManyRaw("firstName like ?", "R%")
|
|
.contacts.filterMany(c -> c.firstName.startsWith("R")) // same as filterManyRaw() expression
|
|
.query();
|
|
|
|
q.findList();
|
|
assertThat(q.getGeneratedSql()).contains(" from be_customer t0 left join be_contact t1 on t1.customer_id = t0.id where t1.first_name like ? and t1.first_name like ");
|
|
}
|
|
|
|
@Test
|
|
public void testIdIn() {
|
|
|
|
List<Integer> ids = new ArrayList<>();
|
|
ids.add(1);
|
|
ids.add(2);
|
|
|
|
new QCustomer()
|
|
.setIdIn(ids) // collection argument
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.setIdIn("1", "2") // varargs argument
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.id.in(1L, 2L, 3L)
|
|
.findList();
|
|
}
|
|
|
|
@Test
|
|
public void testIn() {
|
|
new QCustomer()
|
|
.id.in(34L, 33L)
|
|
.name.in("asd", "foo", "bar")
|
|
.registered.in(new Date())
|
|
.findList();
|
|
}
|
|
|
|
@Test
|
|
public void usingMaster() {
|
|
new QCustomer()
|
|
.registered.isNull()
|
|
.usingMaster()
|
|
.findList();
|
|
}
|
|
|
|
@Test
|
|
public void usingTransaction() {
|
|
try (Transaction transaction = DB.getDefault().createTransaction()) {
|
|
|
|
new QCustomer()
|
|
.registered.isNull()
|
|
.usingTransaction(transaction)
|
|
.findList();
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void usingConnection() throws SQLException {
|
|
|
|
Customer cust = new Customer();
|
|
cust.setName("usingConnection");
|
|
cust.setStatus(Customer.Status.GOOD);
|
|
cust.save();
|
|
|
|
DataSource dataSource = DB.getDefault().dataSource();
|
|
|
|
try (Connection connection = dataSource.getConnection()) {
|
|
|
|
List<Customer> foo = new QCustomer()
|
|
.name.eq("usingConnection")
|
|
.usingConnection(connection)
|
|
.findList();
|
|
|
|
assertThat(foo).hasSize(1);
|
|
}
|
|
|
|
Customer customer = DB.find(Customer.class, cust.getId());
|
|
assert customer != null;
|
|
String customerToString = customer.toString();
|
|
assertThat(customerToString).contains("Customer@0(id:");
|
|
assertThat(customerToString).contains(", status:GOOD, inactive:false, name:usingConnection, version:1, whenCreated:");
|
|
}
|
|
|
|
@Test
|
|
public void testAssocOne() {
|
|
DB.getDefault();
|
|
Address address = new Address();
|
|
address.setId(41L);
|
|
|
|
LoggedSql.start();
|
|
new QCustomer()
|
|
.billingAddress.eq(address)
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.billingAddress.equalTo(address)
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.billingAddress.ne(address)
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.billingAddress.notEqualTo(address)
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.billingAddress.eqIfPresent(address)
|
|
.name.isNull()
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.billingAddress.eqIfPresent(null)
|
|
.name.isNull()
|
|
.findList();
|
|
|
|
|
|
List<String> sql = LoggedSql.stop();
|
|
|
|
assertThat(sql).hasSize(6);
|
|
assertThat(sql.get(0)).contains("where t0.billing_address_id = ?");
|
|
assertThat(sql.get(1)).contains("where t0.billing_address_id = ?");
|
|
assertThat(sql.get(2)).contains("where t0.billing_address_id <> ?");
|
|
assertThat(sql.get(3)).contains("where t0.billing_address_id <> ?");
|
|
assertThat(sql.get(4)).contains("where t0.billing_address_id = ? and t0.name is null");
|
|
assertThat(sql.get(5)).contains("where t0.name is null");
|
|
}
|
|
|
|
@Test
|
|
public void testAssocOne_in() {
|
|
DB.getDefault();
|
|
Address address = new Address();
|
|
address.setId(41L);
|
|
Address address2 = new Address();
|
|
address2.setId(41L);
|
|
|
|
LoggedSql.start();
|
|
new QCustomer()
|
|
.billingAddress.in(address, address2)
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.billingAddress.in(List.of(address, address2))
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.billingAddress.inOrEmpty(List.of(address, address2))
|
|
.name.isNull()
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.billingAddress.inOrEmpty(List.of())
|
|
.name.isNull()
|
|
.findList();
|
|
|
|
List<String> sql = LoggedSql.stop();
|
|
assertThat(sql).hasSize(4);
|
|
assertThat(sql.get(0)).contains("where t0.billing_address_id in (?,?)");
|
|
assertThat(sql.get(1)).contains("where t0.billing_address_id in (?,?)");
|
|
assertThat(sql.get(2)).contains("where t0.billing_address_id in (?,?) and t0.name is null");
|
|
assertThat(sql.get(3)).contains("where t0.name is null");
|
|
}
|
|
|
|
@Test
|
|
public void testAssocOne_notIn() {
|
|
DB.getDefault();
|
|
Address address = new Address();
|
|
address.setId(41L);
|
|
Address address2 = new Address();
|
|
address2.setId(41L);
|
|
|
|
LoggedSql.start();
|
|
new QCustomer()
|
|
.billingAddress.notIn(address, address2)
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.billingAddress.notIn(List.of(address, address2))
|
|
.findList();
|
|
|
|
List<String> sql = LoggedSql.stop();
|
|
assertThat(sql).hasSize(2);
|
|
assertThat(sql.get(0)).contains("where t0.billing_address_id not in (?,?)");
|
|
assertThat(sql.get(1)).contains("where t0.billing_address_id not in (?,?)");
|
|
}
|
|
|
|
@Test
|
|
public void testInOrEmpty() {
|
|
|
|
List<String> names = Arrays.asList("asd", "foo", "bar");
|
|
|
|
new QCustomer()
|
|
.registered.before(new Date())
|
|
.name.inOrEmpty(names)
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.registered.before(new Date())
|
|
.name.inOrEmpty(null)
|
|
.findList();
|
|
|
|
names = Collections.emptyList();
|
|
|
|
new QCustomer()
|
|
.registered.before(new Date())
|
|
.name.inOrEmpty(names)
|
|
.findList();
|
|
}
|
|
|
|
@Test
|
|
public void testNotIn() {
|
|
new QCustomer()
|
|
.id.isIn(34L, 33L)
|
|
.name.notIn("asd", "foo", "bar")
|
|
.registered.in(new Date())
|
|
.findList();
|
|
}
|
|
|
|
@Test
|
|
public void testTwoDiffQueryTypes_expect_NoLineNumbers() {
|
|
new QCustomer()
|
|
.id.isIn(34L)
|
|
.findList();
|
|
|
|
new QContact()
|
|
.email.isNull()
|
|
.findList();
|
|
}
|
|
|
|
@Test
|
|
public void testQueryBoolean() {
|
|
|
|
new QCustomer()
|
|
.name.contains("rob")
|
|
//.setUseDocStore(true)
|
|
.setMaxRows(10)
|
|
.findPagedList();
|
|
|
|
new QCustomer()
|
|
.inactive.isFalse()
|
|
.findList();
|
|
}
|
|
|
|
@Test
|
|
public void testFindOne() {
|
|
|
|
new QCustomer()
|
|
.name.isIn("rob", "foo")
|
|
//.setUseDocStore(true)
|
|
.setMaxRows(1)
|
|
.findOne();
|
|
|
|
Optional<Customer> maybe = new QCustomer()
|
|
.name.contains("rob")
|
|
//.setUseDocStore(true)
|
|
.setMaxRows(1)
|
|
.findOneOrEmpty();
|
|
|
|
maybe.isPresent();
|
|
|
|
new QCustomer()
|
|
.inactive.isFalse()
|
|
.findList();
|
|
}
|
|
|
|
private void insertCustomer(String name) {
|
|
Customer cust = new Customer();
|
|
cust.setName(name);
|
|
cust.setStatus(Customer.Status.GOOD);
|
|
cust.save();
|
|
}
|
|
|
|
@Test
|
|
public void testFindStream() {
|
|
insertCustomer("stream1");
|
|
insertCustomer("stream2");
|
|
|
|
StringJoiner sb = new StringJoiner("|");
|
|
try (Stream<Customer> stream = new QCustomer()
|
|
.name.startsWith("stream")
|
|
.id.asc()
|
|
.findStream()) {
|
|
|
|
stream.forEach(it -> sb.add(it.getName()));
|
|
}
|
|
|
|
assertThat(sb.toString()).isEqualTo("stream1|stream2");
|
|
}
|
|
|
|
@Test
|
|
public void testFilterMany() {
|
|
|
|
Customer cust = new Customer();
|
|
cust.setName("Postgres Foo");
|
|
cust.setStatus(Customer.Status.GOOD);
|
|
cust.save();
|
|
|
|
new QCustomer()
|
|
.name.startsWith("Postgres")
|
|
.contacts.filterMany("firstName istartsWith ?", "Rob")
|
|
.findList();
|
|
|
|
final LocalDate startDate = LocalDate.now().minusDays(7);
|
|
final LocalDate endDate = LocalDate.now();
|
|
|
|
new QCustomer()
|
|
.name.startsWith("Postgres")
|
|
.contacts.filterMany("whenCreated inRange ? to ?", startDate, endDate)
|
|
.findList();
|
|
}
|
|
|
|
@Test
|
|
public void testDate_lessThan() {
|
|
|
|
assertContains(new QCustomer().registered.lt(new Date()).query(), " where t0.registered < ?");
|
|
assertContains(new QCustomer().registered.before(new Date()).query(), " where t0.registered < ?");
|
|
assertContains(new QCustomer().registered.lessThan(new Date()).query(), " where t0.registered < ?");
|
|
assertContains(new QCustomer().whenCreated.lt(whenUpdated).query(), " where t0.when_created < t0.when_updated");
|
|
}
|
|
|
|
@Test
|
|
public void testDate_lessOrEqualTo() {
|
|
|
|
assertContains(new QCustomer().registered.le(new Date()).query(), " where t0.registered <= ?");
|
|
assertContains(new QCustomer().registered.lessOrEqualTo(new Date()).query(), " where t0.registered <= ?");
|
|
assertContains(new QCustomer().whenCreated.le(whenUpdated).query(), " where t0.when_created <= t0.when_updated");
|
|
}
|
|
|
|
@Test
|
|
public void testDate_greaterThan() {
|
|
|
|
assertContains(new QCustomer().registered.after(new Date()).query(), " where t0.registered > ?");
|
|
assertContains(new QCustomer().registered.gt(new Date()).query(), " where t0.registered > ?");
|
|
assertContains(new QCustomer().whenCreated.gt(whenUpdated).query(), " where t0.when_created > t0.when_updated");
|
|
assertContains(new QCustomer().registered.greaterThan(new Date()).query(), " where t0.registered > ?");
|
|
}
|
|
|
|
|
|
@Test
|
|
public void testDate_greaterOrEqualTo() {
|
|
|
|
assertContains(new QCustomer().registered.ge(new Date()).query(), " where t0.registered >= ?");
|
|
assertContains(new QCustomer().registered.greaterOrEqualTo(new Date()).query(), " where t0.registered >= ?");
|
|
assertContains(new QCustomer().whenCreated.ge(whenUpdated).query(), " where t0.when_created >= t0.when_updated");
|
|
}
|
|
|
|
private void assertContains(Query<Customer> query, String match) {
|
|
query.findList();
|
|
assertThat(query.getGeneratedSql()).contains(match);
|
|
}
|
|
|
|
@Test
|
|
public void query_setAllowLoadErrors() {
|
|
|
|
new QCustomer()
|
|
.status.in(Customer.Status.GOOD)
|
|
.setAllowLoadErrors()
|
|
.findList();
|
|
}
|
|
|
|
@Test
|
|
public void select_assocManyToOne() {
|
|
|
|
Country nz = new Country("NZ", "New Zealand");
|
|
DB.merge(nz);
|
|
|
|
Address address = new Address();
|
|
address.setLine1("42 below");
|
|
address.setCountry(nz);
|
|
|
|
Customer customer0 = new Customer();
|
|
customer0.setName("asdBilling0");
|
|
customer0.setBillingAddress(address);
|
|
customer0.save();
|
|
|
|
Customer customer1 = new Customer();
|
|
customer1.setName("asdBilling1");
|
|
customer1.setBillingAddress(new Address());
|
|
customer1.save();
|
|
|
|
List<Long> billingAddressIds
|
|
= new QCustomer()
|
|
.select(billingAddress)
|
|
.name.startsWith("asdBilling")
|
|
.findSingleAttributeList();
|
|
|
|
assertThat(billingAddressIds).hasSize(2);
|
|
|
|
|
|
Map<Long, Customer> map
|
|
= new QCustomer()
|
|
.billingAddress.id.asMapKey()
|
|
.name.startsWith("asdBilling")
|
|
.findMap();
|
|
|
|
assertThat(map).hasSize(2);
|
|
|
|
|
|
List<Customer> customers = new QCustomer()
|
|
.billingAddress.fetch(line1, country)
|
|
.findList();
|
|
|
|
assertThat(customers).isNotEmpty();
|
|
|
|
}
|
|
|
|
@Test
|
|
public void query_fetchString() {
|
|
|
|
Customer cust = new Customer();
|
|
cust.setName("baz");
|
|
cust.setCurrentInet(new Inet("129.1.1.4"));
|
|
cust.setStatus(Customer.Status.GOOD);
|
|
cust.save();
|
|
|
|
new QCustomer()
|
|
.currentInet.eq(Inet.of("129.1.1.4"))
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.currentInet.in(Inet.setOf("129.1.1.4", "129.1.1.5"))
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.contacts.fetch("email")
|
|
.orderBy()
|
|
.name.asc()
|
|
.contacts.email.asc()
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.contacts.fetchQuery("email")
|
|
.orderBy()
|
|
.name.asc()
|
|
.contacts.email.asc()
|
|
.findList();
|
|
}
|
|
|
|
@Test
|
|
public void query_setBaseTable() {
|
|
|
|
new QCustomer()
|
|
.setBaseTable("BE_CUSTOMER")
|
|
.findList();
|
|
}
|
|
|
|
@Test
|
|
public void query_rawOrEmpty() {
|
|
|
|
List<String> names = Arrays.asList("A", "B");
|
|
|
|
new QCustomer()
|
|
.rawOrEmpty("name in (?1)", names)
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.rawOrEmpty("name in (?1)", null)
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.rawOrEmpty("name in (?1)", new ArrayList<Long>())
|
|
.findList();
|
|
}
|
|
|
|
@Test
|
|
public void query_orNull() {
|
|
|
|
new QCustomer()
|
|
.name.equalToOrNull("A")
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.name.eqOrNull("A")
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.name.greaterThanOrNull("B")
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.name.lessThanOrNull("C")
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.name.gtOrNull("GT1")
|
|
.name.geOrNull("GE1")
|
|
.name.ltOrNull("LT1")
|
|
.name.leOrNull("LE1")
|
|
.findList();
|
|
}
|
|
|
|
@Test
|
|
public void query_inRange() {
|
|
|
|
new QCustomer()
|
|
.name.inRange("A", "B")
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.name.greaterOrEqualTo("A")
|
|
.name.lessThan("B")
|
|
.findList();
|
|
|
|
new QContact()
|
|
.firstName.inRangeWith(lastName, "B")
|
|
.findList();
|
|
|
|
new QContact()
|
|
.firstName.between("A", "B")
|
|
.findList();
|
|
}
|
|
|
|
@Test
|
|
void betweenProperties() {
|
|
var query = new QContact()
|
|
.firstName.betweenProperties(lastName, "B");
|
|
|
|
query.findList();
|
|
assertThat(query.getGeneratedSql()).contains(" where ? between t0.first_name and t0.last_name");
|
|
}
|
|
|
|
@Test
|
|
void betweenProperties_notFirstPredicate() {
|
|
var query = new QContact()
|
|
.lastName.isNotNull()
|
|
.firstName.betweenProperties(lastName, "B")
|
|
.email.isNotNull();
|
|
|
|
query.findList();
|
|
assertThat(query.getGeneratedSql()).contains(" where t0.last_name is not null and ? between t0.first_name and t0.last_name and t0.email is not null");
|
|
}
|
|
|
|
@Test
|
|
void query_inRangeWithOtherProperties() {
|
|
var c = QCustomer.alias();
|
|
|
|
Query<Customer> query = new QCustomer()
|
|
.select(c.id)
|
|
.name.inRangeWith(c.contacts.firstName, c.contacts.lastName)
|
|
.query();
|
|
|
|
// select distinct t0.id from be_customer t0
|
|
// left join be_contact t1 on t1.customer_id = t0.id
|
|
// where t1.first_name <= t0.name and (t0.name < t1.last_name or t1.last_name is null)
|
|
query.findList();
|
|
assertThat(query.getGeneratedSql()).contains(" where t1.first_name <= t0.name and (t0.name < t1.last_name or t1.last_name is null)");
|
|
}
|
|
|
|
@Test
|
|
public void query_exists() {
|
|
|
|
boolean customerExists =
|
|
new QCustomer()
|
|
.name.equalTo("DoesNotExistReally")
|
|
.exists();
|
|
|
|
assertThat(customerExists).isFalse();
|
|
}
|
|
|
|
@Test
|
|
void checkingPropertyTypesToEQOperator() {
|
|
|
|
QCustomer c = QCustomer.alias();
|
|
|
|
new QCustomer()
|
|
.select(c.version, count(c.id))
|
|
.version.gt(0)
|
|
.having()
|
|
.add(gt(count(c.id), 1))
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
.add(in(name, List.of("foo", "bar")))
|
|
.add(eq(currentInet, Inet.of("127.0.0.1")))
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
//.add(gt(sum(QCustomer.Alias.version), 45))
|
|
.add(eq(version, 45L))
|
|
.add(eq(name, "junk"))
|
|
.add(eq(registered, new Date()))
|
|
.add(eq(whenUpdated, new Timestamp(System.currentTimeMillis())))
|
|
.findList();
|
|
}
|
|
|
|
@Test
|
|
public void testQuery() {
|
|
|
|
QContact contact = QContact.alias();
|
|
QCustomer cust = QCustomer.alias();
|
|
|
|
new QCustomer()
|
|
// tune query
|
|
.select(cust.name)
|
|
.status.isIn(Customer.Status.BAD, Customer.Status.BAD)
|
|
.contacts.fetch()
|
|
// predicates
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
// tune query
|
|
.select(cust.name)
|
|
.contacts.fetch()
|
|
// predicates
|
|
.findList();
|
|
|
|
new QCustomer()
|
|
// tune query
|
|
.select(cust.id, cust.name)
|
|
.contacts.fetch(contact.firstName, contact.lastName, contact.email)
|
|
// predicates
|
|
.id.greaterThan(1)
|
|
.findList();
|
|
|
|
PagedList<Customer> pagedList = new QCustomer()
|
|
// tune query
|
|
.select(cust.id, cust.name)
|
|
.contacts.fetch(contact.firstName, contact.lastName, contact.email)
|
|
// predicates
|
|
.id.greaterThan(1)
|
|
.setFirstRow(20)
|
|
.setMaxRows(10)
|
|
.findPagedList();
|
|
|
|
pagedList.getList();
|
|
pagedList.getList();
|
|
|
|
// new QCustomer()
|
|
// .asDraft()
|
|
// .findList();
|
|
//
|
|
// new QCustomer()
|
|
// .includeSoftDeletes()
|
|
// .findList();
|
|
|
|
// List<Contact> contacts
|
|
// = new QContact()
|
|
// .email.like("asd")
|
|
// .notes.title.like("asd")
|
|
// .orderBy()
|
|
// .id.desc()
|
|
// .findList();
|
|
//
|
|
|
|
// List<Customer> customers = new QCustomer()
|
|
// .id.eq(1234)
|
|
// .status.equalTo(Customer.Status.BAD)
|
|
// .status.in(Customer.Status.GOOD, Customer.Status.MIDDLING)
|
|
// //.status.eq(Order.Status.APPROVED)
|
|
// .name.like("asd")
|
|
// .name.istartsWith("ASdf")
|
|
// .registered.after(new Date())
|
|
// .contacts.email.endsWith("@foo.com")
|
|
// .contacts.notes.id.greaterThan(123L)
|
|
// .orderBy().id.asc()
|
|
// .findList();
|
|
|
|
// //Customer customer3 =
|
|
// new QCustomer()
|
|
// .id.gt(12)
|
|
// .or()
|
|
// .id.lt(1234)
|
|
// .and()
|
|
// .name.like("one")
|
|
// .name.like("two")
|
|
// .endAnd()
|
|
// .endOr()
|
|
// .orderBy().id.asc()
|
|
// .findList();
|
|
//
|
|
// //where t0.id > ? and (t0.id < ? or (t0.name like ? and t0.name like ? ) ) order by t0.id; --bind(12,1234,one,two)
|
|
//
|
|
//// List<Customer> customers
|
|
//// = new QCustomer()
|
|
//// .name.like("asd")
|
|
//// .findList();
|
|
//
|
|
// Customer.find.where()
|
|
// .gt("id", 1234)
|
|
// .disjunction().eq("id", 1234).like("name", "asd")
|
|
// .endJunction().findList();
|
|
|
|
// QCustomer cust = QCustomer.I;
|
|
// ExpressionList<Customer> expr = new QCustomer().expr();
|
|
// expr.eq(cust.contacts.email, 123);
|
|
}
|
|
|
|
@Test
|
|
public void testFindSet() {
|
|
|
|
Set<Customer> customerSet = new QCustomer().findSet();
|
|
assertNotNull(customerSet);
|
|
}
|
|
|
|
@Test
|
|
public void testFindMap() {
|
|
|
|
Customer cust = new Customer();
|
|
cust.setName("banana");
|
|
cust.setStatus(Customer.Status.GOOD);
|
|
cust.save();
|
|
|
|
Map<String, Customer> map = new QCustomer()
|
|
.id.greaterOrEqualTo(1L)
|
|
.name.asMapKey()
|
|
.findMap();
|
|
|
|
assertThat(map.get("banana")).isNotNull();
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testAsUpdate() {
|
|
|
|
int rows = new QContact()
|
|
.notes.note.startsWith("Make Inactive")
|
|
.email.endsWith("@foo.com")
|
|
.asUpdate()
|
|
.setRaw("email = lower(email)")
|
|
//.set("inactive", true)
|
|
.update();
|
|
|
|
assertThat(rows).isEqualTo(0);
|
|
|
|
}
|
|
|
|
|
|
@Test
|
|
public void testSelectFormula() {
|
|
|
|
Customer cust = new Customer();
|
|
cust.setName("junk junk");
|
|
cust.setStatus(Customer.Status.GOOD);
|
|
cust.setRegistered(new Date());
|
|
cust.save();
|
|
|
|
java.util.Date maxDate = new QCustomer()
|
|
.select("max(registered)")
|
|
.findSingleAttribute();
|
|
|
|
assertThat(maxDate).isNotNull();
|
|
}
|
|
|
|
@Test
|
|
public void findSingleAttributeOrEmpty() {
|
|
|
|
Customer cust = new Customer();
|
|
cust.setName("MaybeIExist yeah");
|
|
cust.setStatus(Customer.Status.GOOD);
|
|
cust.setRegistered(new Date());
|
|
cust.save();
|
|
|
|
Optional<String> customerName = new QCustomer()
|
|
.select(name)
|
|
.status.eq(Customer.Status.GOOD)
|
|
.name.startsWith("MaybeIExist")
|
|
.findSingleAttributeOrEmpty();
|
|
|
|
assertThat(customerName).isPresent();
|
|
|
|
Optional<String> customerName2 = new QCustomer()
|
|
.select(name)
|
|
.status.eq(Customer.Status.GOOD)
|
|
.name.eq("NahIDoNotExist")
|
|
.findSingleAttributeOrEmpty();
|
|
|
|
assertThat(customerName2).isEmpty();
|
|
}
|
|
|
|
|
|
@Test
|
|
public void testFetchByScalarValue() {
|
|
Customer cust = new Customer();
|
|
cust.setName("testFetchByScalarValue");
|
|
cust.setPhoneNumber(new PhoneNumber("+18005555555"));
|
|
cust.save();
|
|
|
|
var customer = new QCustomer()
|
|
.name.eq("testFetchByScalarValue")
|
|
.phoneNumber.eq(new PhoneNumber("+18005555555"))
|
|
.findOne();
|
|
|
|
assertThat(customer).isNotNull();
|
|
|
|
var customers = new QCustomer()
|
|
.name.eq("testFetchByScalarValue")
|
|
.phoneNumber.eq(new PhoneNumber("+18005555555"))
|
|
.findList();
|
|
|
|
assertThat(customers).hasSize(1);
|
|
}
|
|
|
|
|
|
@Test
|
|
public void testFetchByComparableScalarValue() {
|
|
Customer cust = new Customer();
|
|
cust.setName("testFetchByComparableScalarValue");
|
|
cust.setEmail(new ValidEmail("foo2@example.org"));
|
|
cust.save();
|
|
assertThat(new QCustomer()
|
|
.name.eq("testFetchByComparableScalarValue")
|
|
.email.eq(new ValidEmail("foo2@example.org"))
|
|
.findOne()).isNotNull();
|
|
assertThat(new QCustomer()
|
|
.name.eq("testFetchByComparableScalarValue")
|
|
.email.gt(new ValidEmail("foo2@example.org"))
|
|
.findOne()).isNull();
|
|
assertThat(new QCustomer()
|
|
.name.eq("testFetchByComparableScalarValue")
|
|
.email.gt(new ValidEmail("foo1@example.org"))
|
|
.findOne()).isNotNull();
|
|
assertThat(new QCustomer()
|
|
.name.eq("testFetchByComparableScalarValue")
|
|
.email.greaterOrEqualTo(new ValidEmail("foo2@example.org"))
|
|
.findOne()).isNotNull();
|
|
}
|
|
|
|
|
|
@Test
|
|
public void testFetchFormula() {
|
|
|
|
Customer cust = new Customer();
|
|
cust.setName("junk junk");
|
|
cust.setStatus(Customer.Status.GOOD);
|
|
cust.setRegistered(new Date());
|
|
cust.save();
|
|
|
|
List<C1dto> dtos = new QCustomer()
|
|
.select("id, name")
|
|
.asDto(C1dto.class)
|
|
.findList();
|
|
|
|
assertThat(dtos).isNotEmpty();
|
|
}
|
|
|
|
public static class C1dto {
|
|
|
|
final long id;
|
|
final String name;
|
|
|
|
public C1dto(long id, String name) {
|
|
this.id = id;
|
|
this.name = name;
|
|
}
|
|
}
|
|
|
|
}
|