예제 #1
0
  /**
   * Method persistCandleSeries.
   *
   * @param candleSeries CandleSeries
   * @throws Exception
   */
  public synchronized void persistCandleSeries(CandleSeries candleSeries) throws Exception {
    Candle transientInstance = null;
    try {
      if (candleSeries.isEmpty()) return;

      EntityManager entityManager = EntityManagerHelper.getEntityManager();
      entityManager.getTransaction().begin();
      Tradingday tradingday = null;
      Contract contract = findContractById(candleSeries.getContract().getIdContract());
      for (int i = 0; i < candleSeries.getItemCount(); i++) {

        CandleItem candleItem = (CandleItem) candleSeries.getDataItem(i);
        if (null != candleItem.getCandle().getIdCandle()) {
          Candle instance = entityManager.find(Candle.class, candleItem.getCandle().getIdCandle());
          if (instance.equals(candleItem.getCandle())) {
            continue;
          } else {
            // This should never happen.
            throw new Exception(
                "Count: "
                    + i
                    + " Symbol: "
                    + candleSeries.getSymbol()
                    + "candleid: "
                    + candleItem.getCandle().getIdCandle()
                    + " open: "
                    + candleItem.getCandle().getStartPeriod());
          }
        }

        if (!candleItem.getCandle().getTradingday().equals(tradingday)) {

          if (null == candleItem.getCandle().getTradingday().getIdTradingDay()) {
            tradingday =
                findTradingdayByDate(
                    candleItem.getCandle().getTradingday().getOpen(),
                    candleItem.getCandle().getTradingday().getClose());
          } else {
            tradingday =
                findTradingdayById(candleItem.getCandle().getTradingday().getIdTradingDay());
          }

          if (null == tradingday) {
            entityManager.persist(candleItem.getCandle().getTradingday());
            entityManager.getTransaction().commit();
            entityManager.getTransaction().begin();
            tradingday = candleItem.getCandle().getTradingday();
          } else {
            Integer idTradingday = tradingday.getIdTradingDay();
            Integer idContract = contract.getIdContract();
            Integer barSize = candleSeries.getBarSize();
            String hqlDelete =
                "delete Candle where idContract = :idContract and idTradingday = :idTradingday and barSize = :barSize";
            entityManager
                .createQuery(hqlDelete)
                .setParameter("idContract", idContract)
                .setParameter("idTradingday", idTradingday)
                .setParameter("barSize", barSize)
                .executeUpdate();
            entityManager.getTransaction().commit();
            entityManager.getTransaction().begin();
          }
        }

        transientInstance = candleItem.getCandle();
        transientInstance.setTradingday(tradingday);
        transientInstance.setContract(contract);
        entityManager.persist(transientInstance);

        // Commit every 50 rows
        if ((Math.floor(i / 50d) == (i / 50d)) && (i > 0)) {
          entityManager.getTransaction().commit();
          entityManager.getTransaction().begin();
        }
      }
      entityManager.getTransaction().commit();
    } catch (RuntimeException re) {
      EntityManagerHelper.logError("Error persistCandleSeries failed :" + re.getMessage(), re);
      EntityManagerHelper.rollback();
      throw re;
    } finally {
      EntityManagerHelper.close();
    }
  }