/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.sa.model.dao;
import java.net.URI;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.Map;
import java.util.HashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.commons.lang.StringUtils;
import com.emc.storageos.db.client.model.uimodels.Order;
import com.emc.storageos.db.client.model.uimodels.OrderStatus;
import com.emc.sa.model.util.TenantUtils;
import com.emc.storageos.db.client.constraint.NamedElementQueryResultList.NamedElement;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
public class OrderFinder extends TenantModelFinder<Order> {
private static final Logger log = LoggerFactory.getLogger(OrderFinder.class);
public OrderFinder(DBClientWrapper client) {
super(Order.class, client);
}
public List<Order> findScheduledByExecutionWindow(String executionWindowId) {
List<Order> results = Lists.newArrayList();
if (StringUtils.isBlank(executionWindowId)) {
return results;
}
Set<URI> orderIds = Sets.newHashSet();
List<NamedElement> scheduledOrderElems = client.findByAlternateId(Order.class, Order.ORDER_STATUS, OrderStatus.SCHEDULED.name());
for (NamedElement scheduledOrderElem : scheduledOrderElems) {
Order scheduledOrder = client.findById(Order.class, scheduledOrderElem.getId());
if (scheduledOrder.getExecutionWindowId() != null && scheduledOrder.getExecutionWindowId().getURI() != null
&& executionWindowId.equalsIgnoreCase(scheduledOrder.getExecutionWindowId().getURI().toString())) {
results.add(scheduledOrder);
}
}
results.addAll(findByIds(Lists.newArrayList(orderIds)));
return results;
}
public List<Order> findByOrderStatus(String tenant, OrderStatus orderStatus) {
if (StringUtils.isBlank(tenant)) {
return Lists.newArrayList();
}
return TenantUtils.filter(findByOrderStatus(orderStatus), tenant);
}
/**
* Finds orders by status. This method is intended for use by the scheduler only, in general use
* {@link #findByOrderStatus(String, OrderStatus)}.
*
* @param orderStatus
* the order status.
* @return the list of orders with the given status.
*
* @see #findByOrderStatus(String, OrderStatus)
*/
public List<Order> findByOrderStatus(OrderStatus orderStatus) {
List<NamedElement> orderIds = client.findByAlternateId(Order.class, Order.ORDER_STATUS, orderStatus.name());
return findByIds(toURIs(orderIds));
}
public List<Order> findOrdersByUserId(String userId, long startTime, long endTime, int maxCount) {
List<NamedElement> orderIds = findOrderIdsByUserId(userId, startTime, endTime, maxCount);
return findByIds(toURIs(orderIds));
}
public List<NamedElement> findOrderIdsByUserId(String userId, long startTime, long endTime, int maxCount) {
if (StringUtils.isBlank(userId)) {
return Lists.newArrayList();
}
List<NamedElement> orderIds = client.findOrdersByAlternateId(Order.SUBMITTED_BY_USER_ID, userId, startTime,
endTime, maxCount);
return orderIds;
}
public long getOrdersCount(String userId, long startTime, long endTime) {
if (StringUtils.isBlank(userId)) {
return 0;
}
long count = client.getOrderCount(userId, Order.SUBMITTED_BY_USER_ID, startTime, endTime);
return count;
}
public Map<String, Long> getOrdersCount(List<URI> tids, long startTime, long endTime) {
Map<String, Long> counts = new HashMap<String, Long>();
if (tids.isEmpty()) {
return counts;
}
return client.getOrderCount(tids, Order.SUBMITTED, startTime, endTime);
}
public List<Order> findByTimeRange(URI tenantId, Date startTime, Date endTime, int maxCount) {
if (tenantId == null) {
return Lists.newArrayList();
}
List<NamedElement> orderIds =
client.findAllOrdersByTimeRange(tenantId, Order.SUBMITTED, startTime, endTime, maxCount);
return findByIds(toURIs(orderIds));
}
}