/*******************************************************************************
 * Copyright (c) 1998, 2012 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *      Oracle - initial impl
 ******************************************************************************/
package example;

import java.math.BigDecimal;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import model.Customer;
import model.Order;
import model.OrderLine;

/**
 * Test the performance of reading an Order object model.
 * @author James Sutherland
 */
public class ReadTest extends PerformanceTest {

    public static void main(String[] args) throws Exception {
        try {
            ReadTest test = new ReadTest();
            test.test();
        } catch (Exception error) {
            error.printStackTrace();
        }
        System.exit(0);
    }
        
    public void test() {
        final EntityManagerFactory factory = Persistence.createEntityManagerFactory("read");
        EntityManager em = factory.createEntityManager();
        em.getTransaction().begin();
        Order order = null;
        for (int index = 0; index < 1000; index++) {
            Customer customer = new Customer();
            customer.setName("Customer-" + index);
            order = new Order();
            order.setDescription("Order-" + index);
            order.setCustomer(customer);
            order.addOrderLine(new OrderLine("line1", new BigDecimal(10)));
            order.addOrderLine(new OrderLine("line2", new BigDecimal(5)));
            order.addOrderLine(new OrderLine("line3", new BigDecimal(99)));
            em.persist(order);
        }
        em.getTransaction().commit();
        final long id = order.getId();
        
        System.out.println("\n\nbegin read test");
        this.executeRun("ReadTest", new Runnable() {
            public void run() {
                EntityManager em = factory.createEntityManager();
                // TODO: Note you may need to comment the named query and use find instead for some JPA providers that don't seem to work with named queries...
                Query query = em.createNamedQuery("findOrderById");
                query.setParameter("id", id);
                Order order = (Order)query.getSingleResult();
                //Order order = em.find(Order.class, id);
                order.getCustomer().toString();
                order.getOrderLines().size();
                em.close();
            }
        });
        System.out.println("\nfinish read test");
    }

}
