package org.cryptocoinpartners.schema; import java.util.UUID; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Index; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedAttributeNode; import javax.persistence.NamedEntityGraph; import javax.persistence.NamedEntityGraphs; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.NamedSubgraph; import javax.persistence.Table; import javax.persistence.Transient; import org.cryptocoinpartners.enumeration.OrderState; import org.cryptocoinpartners.schema.dao.Dao; import org.cryptocoinpartners.schema.dao.OrderUpdateDao; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; /** * When Orders change OrderState, this Event is published * * @author Tim Olson */ @SuppressWarnings("UnusedDeclaration") @Entity //@IdClass(OrderUpdateId.class) //@Table(indexes = { @Index(columnList = "state") }) //@IdClass(OrderUpdateID.class) @Table(indexes = { @Index(columnList = "sequence"), @Index(columnList = "state"), @Index(columnList = "`order`") }) //@NamedQueries({ @NamedQuery(name = "orderUpdate.findTriggerOrders", query = "select ou from OrderUpdate ou where ou.sequence = (select max(ouu.sequence) from OrderUpdate ouu where ouu.order = ou.order) and state=?1") }) // //@NamedEntityGraphs({ //@NamedEntityGraph(name = "orderUpdateWithChildOrders", attributeNodes = { @NamedAttributeNode(value = "order", subgraph = "order") }) ////, subgraphs = { @NamedSubgraph(name = "ordersWithChildOrders", attributeNodes = { @NamedAttributeNode("parentFill") }) }) // @NamedSubgraph(name = "fills", attributeNodes = @NamedAttributeNode(value = "fills", subgraph = "order")) //,@NamedSubgraph(name = "order", attributeNodes = @NamedAttributeNode("order")) //}) @NamedQueries({ @NamedQuery(name = "orderUpdate.findOrders", query = "select ou from OrderUpdate ou where ou.state = (select max(ouu.state) from OrderUpdate ouu where ouu.order = ou.order) and state in (?1)") }) // @NamedEntityGraphs({ // @NamedEntityGraph(name = "orderUpdateWithTransactions", attributeNodes = { @NamedAttributeNode(value = "order", subgraph = "orderWithTransactions") }, subgraphs = { @NamedSubgraph(name = "orderWithTransactions", attributeNodes = { @NamedAttributeNode("transactions") }) }), // @NamedEntityGraph(name = "orderUpdateWithFills", attributeNodes = { @NamedAttributeNode(value = "order", subgraph = "orderWithFills") }, subgraphs = { @NamedSubgraph(name = "orderWithFills", attributeNodes = { @NamedAttributeNode("fills") }) }) //@NamedEntityGraph(name = "orderUpdateWithFills", attributeNodes = { @NamedAttributeNode("order.fills") }) @NamedEntityGraph(name = "orderUpdateWithFills", attributeNodes = { @NamedAttributeNode(value = "order", subgraph = "orderWithFills") }, subgraphs = { @NamedSubgraph(name = "orderWithFills", attributeNodes = { @NamedAttributeNode("fills") }) }) //attributeNodes = @NamedAttributeNode(value = "items", subgraph = "items"), //subgraphs = @NamedSubgraph(name = "items", attributeNodes = @NamedAttributeNode("product"))) // @NamedEntityGraph(name = "orderUpdateWithFills", attributeNodes = { @NamedAttributeNode(value = "order", subgraph = "orderWithFills") }, subgraphs = { @NamedSubgraph(name = "orderWithFills", attributeNodes = { @NamedAttributeNode("fills") }) }) // @NamedSubgraph(name = "fills", attributeNodes = @NamedAttributeNode(value = "fills", subgraph = "order")) //,@NamedSubgraph(name = "order", attributeNodes = @NamedAttributeNode("order")) }) public class OrderUpdate extends Event { // @GeneratedValue(strategy = GenerationType.TABLE, generator = "tab") // @GeneratedValue(strategy = GenerationType.IDENTITY) // @Column(name = "id", unique = true, nullable = false, insertable = false, updatable = false) // @Column(columnDefinition = "integer auto_increment") //@GeneratedValue(strategy = IDENTITY) //@Column(name = "columnName", unique = true, nullable = false, insertable = false, updatable = false) // columnDefinition = "integer auto_increment", //@GeneratedValue(strategy = GenerationType.IDENTITY) // @GeneratedValue(strategy = GenerationType.SEQUENCE) // @Id // @Column(columnDefinition = "integer auto_increment", name = "seq", unique = true, nullable = false, insertable = false, updatable = false) @Id @Column(columnDefinition = "integer auto_increment") // @Transient public Long getSequence() { return sequence; } // @PrePersist private void prePersist() { if (orderUpdateDao != null) { Order parentOrder = null; if (getOrder() != null) { // parentOrder = ; // orderId = (fillDao.queryZeroOne(UUID.class, "select o.id from Order o where o.id=?1", order.getId())); parentOrder = orderUpdateDao.find(getOrder().getClass(), getOrder().getId()); if (parentOrder == null) orderUpdateDao.persist(getOrder()); // order.merge(); } } //detach(); } //@Id //@Override //@ManyToOne // @Override // @Transient // public UUID getId() { // return id; //} // @ManyToOne // @JoinColumn(name = "`order`") // @Transient public @ManyToOne //(cascade = { CascadeType.PERSIST, CascadeType.MERGE }) @JoinColumn(name = "`order`") Order getOrder() { return order; } public OrderState getLastState() { return lastState; } public OrderState getState() { return state; } @AssistedInject public OrderUpdate(@Assisted Order order, @Assisted("orderUpdateLastState") OrderState lastState, @Assisted("orderUpdateState") OrderState state) { this.order = order; this.lastState = lastState; this.state = state; } @Override public EntityBase refresh() { return orderUpdateDao.refresh(this); } @Override public synchronized void persit() { // try { orderUpdateDao.persist(this); //if (duplicate == null || duplicate.isEmpty()) // } catch (Exception | Error ex) { // System.out.println("Unable to perform request in " + this.getClass().getSimpleName() + ":persist, full stack trace follows:" + ex); // ex.printStackTrace(); // } // if (getOrder() != null) // getOrder().persit(); // final Trade duplicate = PersistUtil.queryZeroOne(Trade.class, "select t from Trade t where market=?1 and remoteKey=?2 and time=?3", // trade.getMarket(), trade.getRemoteKey(), trade.getTime()); // List<OrderUpdate> duplicate = orderUpdateDao.queryList(OrderUpdate.class, "select ou from OrderUpdate ou where id=?1 and sequence=?2", this.getId(), // this.getSequence()); // OrderUpdate duplicate = PersistUtil.queryZeroOne(OrderUpdate.class, "select ou from OrderUpdate ou where ou=?1 and sequence=?2", this, // this.getSequence()); //if (duplicate == null || duplicate.isEmpty()) // orderUpdateDao.persist(this); //PersistUtil.insert(this); // else // PersistUtil.merge(this); } // JPA protected OrderUpdate() { } public void setOrder(Order order) { this.order = order; } protected void setSequence(Long sequence) { this.sequence = sequence; } @Override protected void setId(UUID id) { this.id = id; } protected void setLastState(OrderState lastState) { this.lastState = lastState; } protected void setState(OrderState state) { this.state = state; } @Inject protected OrderUpdateDao orderUpdateDao; private Order order; private Long sequence; private OrderState lastState; private OrderState state; @Override public synchronized void detach() { orderUpdateDao.detach(this); // TODO Auto-generated method stub } @Override public synchronized void merge() { orderUpdateDao.merge(this); // TODO Auto-generated method stub } @Override @Transient public Dao getDao() { return orderUpdateDao; } @Override public void delete() { // TODO Auto-generated method stub } }