package cbe.fetching; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.math.BigDecimal; import java.net.URISyntaxException; import java.sql.SQLException; import org.apache.cayenne.access.DataContext; import org.apache.cayenne.configuration.server.ServerRuntime; import org.apache.cayenne.exp.ExpressionFactory; import org.apache.cayenne.query.SelectQuery; import org.h2.tools.RunScript; import cbe.fetching.model.Book; import cbe.fetching.utilities.AggregateUtils; /** * Cayenne By Example - https://github.com/mrg/cbe * * @author mrg */ public class Aggregates { public static void main(String[] arguments) throws FileNotFoundException, SQLException, URISyntaxException { // Create a Cayenne ServerRuntime with our Cayenne Model. ServerRuntime runtime = new ServerRuntime("cayenne-cbe.xml"); // Create a new DataContext. This will also initialize the Cayenne // Framework. DataContext dataContext = (DataContext) runtime.getContext(); // Populate the database. FileReader data = new FileReader(new File(Aggregates.class.getClassLoader().getResource("data.sql").toURI())); RunScript.execute(runtime.getDataSource("cbe").getConnection(), data); // Create a Query for Book records. SelectQuery query = new SelectQuery(Book.class); // Run the aggregate queries. BigDecimal min = AggregateUtils.min(dataContext, query, Book.PRICE_PROPERTY); BigDecimal max = AggregateUtils.max(dataContext, query, Book.PRICE_PROPERTY); BigDecimal sum = AggregateUtils.sum(dataContext, query, Book.PRICE_PROPERTY); BigDecimal avg = AggregateUtils.avg(dataContext, query, Book.PRICE_PROPERTY); long count = AggregateUtils.count(dataContext, query); // Print the results. System.out.println("Minimum Book Price: " + min); System.out.println("Maximum Book Price: " + max); System.out.println("Sum of Book Prices: " + sum); System.out.println("Average Book Price: " + avg); System.out.println("Number of Books: " + count); // Add a qualifier for Author names starting with "J". query.setQualifier(ExpressionFactory.likeIgnoreCaseExp(Book.AUTHOR_PROPERTY, "J%")); // Run the aggregate queries. min = AggregateUtils.min(dataContext, query, Book.PRICE_PROPERTY); max = AggregateUtils.max(dataContext, query, Book.PRICE_PROPERTY); sum = AggregateUtils.sum(dataContext, query, Book.PRICE_PROPERTY); avg = AggregateUtils.avg(dataContext, query, Book.PRICE_PROPERTY); count = AggregateUtils.count(dataContext, query); // Print the results. System.out.println("Minimum 'J' Author Book Price: " + min); System.out.println("Maximum 'J' Author Book Price: " + max); System.out.println("Sum of 'J' Author Book Prices: " + sum); System.out.println("Average 'J' Author Book Price: " + avg); System.out.println("Number of 'J' Author Books: " + count); // Make the query use DISTINCT and get a distinct count of authors whose // name begins with "J" by counting on the Book's Author property. query.setDistinct(true); count = AggregateUtils.count(dataContext, query, Book.AUTHOR_PROPERTY); System.out.println("Number of 'J' Authors: " + count); } }