/*
* Copyright (c) 2008-2014 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.dbutils;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Lists;
import com.netflix.astyanax.Keyspace;
import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
import com.netflix.astyanax.model.Column;
import com.netflix.astyanax.model.ColumnFamily;
import com.netflix.astyanax.model.Rows;
import com.netflix.astyanax.serializers.StringSerializer;
import com.emc.storageos.db.client.constraint.ContainmentConstraint;
import com.emc.storageos.db.client.constraint.URIQueryResultList;
import com.emc.storageos.db.client.constraint.impl.ContainmentConstraintImpl;
import com.emc.storageos.db.client.impl.CompositeColumnName;
import com.emc.storageos.db.client.impl.DataObjectType;
import com.emc.storageos.db.client.model.DataObject;
import com.emc.storageos.db.client.upgrade.InternalDbClient;
import com.emc.storageos.db.common.DependencyTracker.Dependency;
import com.emc.storageos.db.exceptions.DatabaseException;
public class InternalDbClientImpl extends InternalDbClient {
private static final Logger log = LoggerFactory.getLogger(InternalDbClientImpl.class);
private List<String> genTimeSeriesKeys(Calendar startTime, Calendar endTime) {
final int KEY_SHARD = 10;// 10 shard for TimeSeries column family
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHH");
List<String> keys = new ArrayList<String>();
Calendar currentTime = startTime;
while (true) {
String timeTemp = dateFormat.format(currentTime.getTime());
for (int i = 0; i < KEY_SHARD; i++) {
keys.add(timeTemp + "-" + i);
}
currentTime.add(Calendar.HOUR, 1);
if (currentTime.compareTo(endTime) > 0) {
break;
}
}
return keys;
}
public int countTimeSeries(String cfName, Calendar startTime, Calendar endTime) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd/HH");
String startTimeStr = dateFormat.format(startTime.getTime());
String endTimeStr = dateFormat.format(endTime.getTime());
int recordCount = 0;
try {
Keyspace keyspace = getLocalKeyspace();
ColumnFamily<String, String> cf = new ColumnFamily<String, String>(
cfName, StringSerializer.get(), StringSerializer.get());
List<String> keys = genTimeSeriesKeys(startTime, endTime);
for (String key : keys) {
recordCount += keyspace.prepareQuery(cf).getKey(key).getCount().execute().getResult();
}
System.out.println(String.format("Column Family %s's record count between %s and %s is: %s",
cfName, startTimeStr, endTimeStr, recordCount));
return recordCount;
} catch (ConnectionException e) {
System.err.println(String.format("Exception=%s", e));
throw DatabaseException.retryables.connectionFailed(e);
}
}
public Column<CompositeColumnName> getLatestModifiedField(DataObjectType type, URI id, Set<String> ignoreList) {
Column<CompositeColumnName> latestField = null;
ColumnFamily<String, CompositeColumnName> cf = type.getCF();
Keyspace ks = this.getKeyspace(type.getDataObjectClass());
Rows<String, CompositeColumnName> rows = this.queryRowsWithAllColumns(ks,
Lists.newArrayList(id), cf);
if (rows.isEmpty()) {
log.warn("Can not find the latest modified field of {}", id);
return latestField;
}
long latestTimeStampe = 0;
for (Column<CompositeColumnName> column : rows.iterator().next().getColumns()) {
if (ignoreList != null && ignoreList.contains(column.getName().getOne())) {
continue;
}
if (column.getTimestamp() > latestTimeStampe) {
latestTimeStampe = column.getTimestamp();
latestField = column;
}
}
return latestField;
}
public List<URI> getReferUris(URI targetUri, Class<? extends DataObject> type, Dependency dependency) {
List<URI> references = new ArrayList<>();
if (targetUri == null) {
return references;
}
ContainmentConstraint constraint =
new ContainmentConstraintImpl(targetUri, dependency.getType(), dependency.getColumnField());
URIQueryResultList result = new URIQueryResultList();
this.queryByConstraint(constraint, result);
Iterator<URI> resultIt = result.iterator();
if(resultIt.hasNext()) {
references.add(resultIt.next());
}
return references;
}
}