Stores and retrieves measurement data in a more efficient way

This commit is contained in:
Patrick McDonagh
2017-04-12 16:08:45 -05:00
parent 80784376e0
commit 9cfbda3c18
4 changed files with 374 additions and 159 deletions

View File

@@ -23,14 +23,13 @@ import com.mongodb.client.MongoCursor;
import static com.mongodb.client.model.Filters.*;
import javax.print.Doc;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.*;
public class Database {
private String pocDatabase = "poc";
private MongoClient mongoClient;
private MongoDatabase database;
private MongoCredential credential = MongoCredential.createCredential("poc_java", pocDatabase, "HenryPump@1903".toCharArray());
private MongoCollection<Document> cardCollection, wellDataCollection, gaugeOffCollection, wellTestCollection,
fluidShotsCollection, runStatusCollection, wellConfigCollection, setpointCollection;
@@ -38,8 +37,8 @@ public class Database {
cardCollection = database.getCollection("cards");
cardCollection.createIndex(Indexes.ascending("timestamp", "strokeNumber"));
wellDataCollection = database.getCollection("wellData");
wellDataCollection.createIndex(Indexes.ascending("timestamp", "tagName"));
wellDataCollection = database.getCollection("measurements");
wellDataCollection.createIndex(Indexes.ascending("dateStored", "tagName"));
gaugeOffCollection = database.getCollection("gaugeOff");
gaugeOffCollection.createIndex(Indexes.ascending("timestamp", "tagName"));
@@ -63,7 +62,9 @@ public class Database {
Database(){
mongoClient = new MongoClient();
ServerAddress server = new ServerAddress("localhost", 27017);
List<MongoCredential> credentials = Arrays.asList(credential);
mongoClient = new MongoClient(server, credentials);
database = mongoClient.getDatabase(pocDatabase);
initCollections();
@@ -72,7 +73,9 @@ public class Database {
}
Database(String dbHostname){
mongoClient = new MongoClient(dbHostname);
ServerAddress server = new ServerAddress(dbHostname, 27017);
List<MongoCredential> credentials = Arrays.asList(credential);
mongoClient = new MongoClient(server, credentials);
database = mongoClient.getDatabase(pocDatabase);
initCollections();
@@ -136,21 +139,31 @@ public class Database {
public long newMeasurement(Measurement inpMeasurement){
Document doc = new Document("tagname", inpMeasurement.getTagName())
.append("currentValue", inpMeasurement.getCurrentValue())
.append("maxDailyValue", inpMeasurement.getDailyMax())
.append("minDailyValue", inpMeasurement.getDailyMin())
.append("dailyAverage", inpMeasurement.getAverage())
.append("dailyTotal", inpMeasurement.getTotal())
ZonedDateTime nowDate = ZonedDateTime.now();
ZonedDateTime todayDate = ZonedDateTime.of(nowDate.getYear(), nowDate.getMonthValue(), nowDate.getDayOfMonth(), 0, 0, 0, 0, nowDate.getZone());
Date storeDate = Date.from(todayDate.toInstant());
Document nowMeasurement = new Document("values." + nowDate.getHour() + "." + nowDate.getMinute(), inpMeasurement.getCurrentValue())
.append("maxValue", inpMeasurement.getDailyMax())
.append("minValue", inpMeasurement.getDailyMin())
.append("averageValue", inpMeasurement.getAverage())
.append("totalValue", inpMeasurement.getTotal())
.append("numMeasurements", inpMeasurement.getNumMeasurements())
.append("timestamp", Date.from(ZonedDateTime.now().toInstant()));
wellDataCollection.insertOne(doc);
.append("units", inpMeasurement.getUnits())
.append("storeDelta", inpMeasurement.getSendDelta())
.append("storeTime", inpMeasurement.getSendTimeDelta())
.append("useTotal", inpMeasurement.isUseTotal())
.append("useAverage", inpMeasurement.isUseAverage())
.append("dateStored", storeDate);
wellDataCollection.updateOne(and(eq("tagname", inpMeasurement.getTagName()), eq("dateStored", storeDate)), new Document("$set", nowMeasurement), (new UpdateOptions()).upsert(true));
// wellDataCollection.updateOne(and(eq("tagname", inpMeasurement.getTagName()), eq("dateStored", todayDate)), new Document("$set", aggregateData), (new UpdateOptions()).upsert(true));
System.out.println("Stored " + inpMeasurement.getCurrentValue() + " for " + inpMeasurement.getTagName());
return wellDataCollection.count();
}
public Document getLastStoredMeasurement(String tagName){
MongoCursor<Document> cursor = wellDataCollection.find(eq("tagname", tagName)).sort(Sorts.descending("timestamp")).limit(1).iterator();
MongoCursor<Document> cursor = wellDataCollection.find(eq("tagname", tagName)).sort(Sorts.descending("dateStored")).limit(1).iterator();
Document lastStoredDoc = new Document();
try {
while (cursor.hasNext()) {

View File

@@ -5,6 +5,7 @@ import org.bson.Document;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;
import java.util.Set;
import static java.lang.Math.abs;
@@ -27,8 +28,11 @@ public class Measurement {
private Database db;
private long lastSentTimestamp;
private long sendTimeDelta;
private String units = null;
private boolean useTotal;
private boolean useAverage;
Measurement(String tagName, Database db, double sendDelta, long sendTimeDelta){
Measurement(String tagName, Database db){
this.tagName = tagName;
average = 0;
total = 0;
@@ -38,24 +42,36 @@ public class Measurement {
// Database code
this.db = db;
this.sendDelta = sendDelta;
this.lastSentValue = 0.0;
this.sendTimeDelta = sendTimeDelta;
Document lastStored = this.db.getLastStoredMeasurement(this.tagName);
try {
Date lastStoredTimestamp = (Date) lastStored.get("timestamp");
Date lastStoredTimestamp = (Date) lastStored.get("dateStored");
ZonedDateTime timestamp = ZonedDateTime.ofInstant(lastStoredTimestamp.toInstant(),
ZoneId.systemDefault());
if (isToday(timestamp)){
this.average = lastStored.getDouble("dailyAverage");
this.total = lastStored.getDouble("dailyTotal");
this.lastSentValue = lastStored.getDouble("currentValue");
this.dailyMax = lastStored.getDouble("maxDailyValue");
this.dailyMin = lastStored.getDouble("minDailyValue");
this.lastSentTimestamp = timestamp.toEpochSecond();
this.average = lastStored.getDouble("averageValue");
this.total = lastStored.getDouble("totalValue");
// this.lastSentValue = lastStored.getDouble("currentValue");
this.dailyMax = lastStored.getDouble("maxValue");
this.dailyMin = lastStored.getDouble("minValue");
this.sendDelta = lastStored.getDouble("storeDelta");
this.sendTimeDelta = lastStored.getLong("storeTime");
this.units = lastStored.getString("units");
// this.lastSentTimestamp = timestamp.toEpochSecond();
Document values = (Document) lastStored.get("values");
Object[] hours = values.keySet().toArray();
String maxHour = (String) hours[hours.length - 1];
Document maxHourDoc = (Document) values.get(maxHour);
Object[] minutes = maxHourDoc.keySet().toArray();
String maxMinute = (String) minutes[minutes.length - 1];
this.lastSentValue = maxHourDoc.getDouble(maxMinute);
this.numMeasurements = lastStored.getLong("numMeasurements");
System.out.println("Using stored value from " + timestamp.toString() + " for " + this.tagName);
System.out.println("Using stored value from " + ZonedDateTime.of(timestamp.getYear(),
timestamp.getMonthValue(), timestamp.getDayOfMonth(), Integer.parseInt(maxHour),
Integer.parseInt(maxMinute), 0, 0, timestamp.getZone()).toString() + " for " + this.tagName);
} else {
System.out.println("Cannot use stored value from " + timestamp.toString() + " for " + this.tagName);
}
@@ -65,17 +81,6 @@ public class Measurement {
}
// Measurement(String tagName, boolean storeInDatabase){
// this.tagName = tagName;
// average = 0;
// total = 0;
// numMeasurements = 0;
// dailyMax = Double.MIN_VALUE;
// dailyMin = Double.MAX_VALUE;
//
// // Database code
// this.storeInDatabase = storeInDatabase;
// }
public double getCurrentValue() {
return currentValue;
@@ -109,6 +114,50 @@ public class Measurement {
return dailyMin;
}
public double getSendDelta() {
return sendDelta;
}
public void setSendDelta(double sendDelta) {
this.sendDelta = sendDelta;
}
public long getSendTimeDelta() {
return sendTimeDelta;
}
public void setSendTimeDelta(long sendTimeDelta) {
this.sendTimeDelta = sendTimeDelta;
}
public String getUnits() {
return units;
}
public void setUnits(String units) {
this.units = units;
}
public boolean isUseTotal() {
return useTotal;
}
public void setUseTotal(boolean useTotal) {
this.useTotal = useTotal;
}
public boolean isUseAverage() {
return useAverage;
}
public void setUseAverage(boolean useAverage) {
this.useAverage = useAverage;
}
private static boolean isToday(ZonedDateTime inpZDT){
ZonedDateTime now = ZonedDateTime.now();
if (now.toLocalDate().equals(inpZDT.toLocalDate())){

View File

@@ -318,26 +318,167 @@ public class Well {
}
private void initializeMeasurements(){
strokeSpeed = new Measurement("Stroke Speed", db, 0.5, 600);
downholeGrossStroke = new Measurement("Downhole Gross Stroke", db, 0.5, 600);
downholeNetStroke = new Measurement("Downhole Net Stroke", db, 0.5, 600);
fluidLevel = new Measurement("Fluid Level", db, 10, 600);
fluidLoad = new Measurement("Fluid Load", db, 20, 600);
inflowRate = new Measurement("Inflow Rate", db, 0.5, 600);
peakPolishedRodLoad = new Measurement("Peak PRL", db, 50, 600);
minPolishedRodLoad = new Measurement("Min PRL", db, 50, 600);
percentRun = new Measurement("Percent Run", db, 1.0, 600);
polishedRodHP = new Measurement("Polished Rod HP", db, 0.25, 600);
pumpHP = new Measurement("Pump HP", db, 0.25, 600);
fluidProduced = new Measurement("Fluid Produced", db, 1.0, 600);
fluidProducedAdjusted = new Measurement("Fluid Produced (adjusted)", db, 1.0, 600);
oilProduced = new Measurement("Oil Produced", db, 1.0, 600);
waterProduced = new Measurement("Water Produced", db, 1.0, 600);
gasProduced = new Measurement("Gas Produced", db, 1.0, 600);
pumpIntakePressure = new Measurement("Pump Intake Pressure", db, 5.0, 600);
surfaceStrokeLength = new Measurement("Surface Stroke", db, 0.5, 1800);
tubingMovement = new Measurement("Tubing Movement", db, 0.5, 600);
pumpFillPercent = new Measurement("Pump Fill Percent", db, 0.5, 600);
strokeSpeed = new Measurement("Stroke Speed", db);
if (strokeSpeed.getUnits() == null) {
strokeSpeed.setUnits("SPM");
strokeSpeed.setSendDelta(0.5);
strokeSpeed.setSendTimeDelta(600);
strokeSpeed.setUseAverage(true);
strokeSpeed.setUseTotal(false);
}
downholeGrossStroke = new Measurement("Downhole Gross Stroke", db);
if (downholeGrossStroke.getUnits() == null) {
downholeGrossStroke.setUnits("in.");
downholeGrossStroke.setSendDelta(0.5);
downholeGrossStroke.setSendTimeDelta(600);
downholeGrossStroke.setUseAverage(true);
downholeGrossStroke.setUseTotal(false);
}
downholeNetStroke = new Measurement("Downhole Net Stroke", db);
if (downholeNetStroke.getUnits() == null) {
downholeNetStroke.setUnits("in.");
downholeNetStroke.setSendDelta(0.5);
downholeNetStroke.setSendTimeDelta(600);
downholeNetStroke.setUseAverage(true);
downholeNetStroke.setUseTotal(false);
}
fluidLevel = new Measurement("Fluid Level", db);
if (fluidLevel.getUnits() == null) {
fluidLevel.setUnits("ft.");
fluidLevel.setSendDelta(10.0);
fluidLevel.setSendTimeDelta(600);
fluidLevel.setUseAverage(true);
fluidLevel.setUseTotal(false);
}
fluidLoad = new Measurement("Fluid Load", db);
if (fluidLoad.getUnits() == null) {
fluidLoad.setUnits("lbs.");
fluidLoad.setSendDelta(20.0);
fluidLoad.setSendTimeDelta(600);
fluidLoad.setUseAverage(true);
fluidLoad.setUseTotal(false);
}
inflowRate = new Measurement("Inflow Rate", db);
if (inflowRate.getUnits() == null) {
inflowRate.setUnits("BBL/day");
inflowRate.setSendDelta(0.5);
inflowRate.setSendTimeDelta(600);
inflowRate.setUseAverage(true);
inflowRate.setUseTotal(false);
}
peakPolishedRodLoad = new Measurement("Peak PRL", db);
if (peakPolishedRodLoad.getUnits() == null) {
peakPolishedRodLoad.setUnits("lbs.");
peakPolishedRodLoad.setSendDelta(50);
peakPolishedRodLoad.setSendTimeDelta(600);
peakPolishedRodLoad.setUseAverage(true);
peakPolishedRodLoad.setUseTotal(false);
}
minPolishedRodLoad = new Measurement("Min PRL", db);
if (minPolishedRodLoad.getUnits() == null) {
minPolishedRodLoad.setUnits("lbs.");
minPolishedRodLoad.setSendDelta(50.0);
minPolishedRodLoad.setSendTimeDelta(600);
minPolishedRodLoad.setUseAverage(true);
minPolishedRodLoad.setUseTotal(false);
}
percentRun = new Measurement("Percent Run", db);
if (percentRun.getUnits() == null) {
percentRun.setUnits("%");
percentRun.setSendDelta(0.5);
percentRun.setSendTimeDelta(600);
percentRun.setUseAverage(false);
percentRun.setUseTotal(false);
}
polishedRodHP = new Measurement("Polished Rod HP", db);
if (polishedRodHP.getUnits() == null) {
polishedRodHP.setUnits("HP");
polishedRodHP.setSendDelta(0.25);
polishedRodHP.setSendTimeDelta(600);
polishedRodHP.setUseAverage(true);
polishedRodHP.setUseTotal(false);
}
pumpHP = new Measurement("Pump HP", db);
if (pumpHP.getUnits() == null) {
pumpHP.setUnits("HP");
pumpHP.setSendDelta(0.25);
pumpHP.setSendTimeDelta(600);
pumpHP.setUseAverage(true);
pumpHP.setUseTotal(false);
}
fluidProduced = new Measurement("Fluid Produced", db);
if (fluidProduced.getUnits() == null) {
fluidProduced.setUnits("BBL");
fluidProduced.setSendDelta(1.0);
fluidProduced.setSendTimeDelta(600);
fluidProduced.setUseAverage(true);
fluidProduced.setUseTotal(true);
}
fluidProducedAdjusted = new Measurement("Fluid Produced (adjusted)", db);
if (fluidProducedAdjusted.getUnits() == null) {
fluidProducedAdjusted.setUnits("BBL");
fluidProducedAdjusted.setSendDelta(1.0);
fluidProducedAdjusted.setSendTimeDelta(600);
fluidProducedAdjusted.setUseAverage(true);
fluidProducedAdjusted.setUseTotal(true);
}
oilProduced = new Measurement("Oil Produced", db);
if (oilProduced.getUnits() == null) {
oilProduced.setUnits("BBL");
oilProduced.setSendDelta(0.5);
oilProduced.setSendTimeDelta(600);
oilProduced.setUseAverage(true);
oilProduced.setUseTotal(true);
}
waterProduced = new Measurement("Water Produced", db);
if (waterProduced.getUnits() == null) {
waterProduced.setUnits("BBL");
waterProduced.setSendDelta(1.0);
waterProduced.setSendTimeDelta(600);
waterProduced.setUseAverage(true);
waterProduced.setUseTotal(true);
}
gasProduced = new Measurement("Gas Produced", db);
if (gasProduced.getUnits() == null) {
gasProduced.setUnits("MCF");
gasProduced.setSendDelta(1.0);
gasProduced.setSendTimeDelta(600);
gasProduced.setUseAverage(true);
gasProduced.setUseTotal(true);
}
pumpIntakePressure = new Measurement("Pump Intake Pressure", db);
if (pumpIntakePressure.getUnits() == null) {
pumpIntakePressure.setUnits("PSI");
pumpIntakePressure.setSendDelta(5.0);
pumpIntakePressure.setSendTimeDelta(600);
pumpIntakePressure.setUseAverage(true);
pumpIntakePressure.setUseTotal(false);
}
surfaceStrokeLength = new Measurement("Surface Stroke", db);
if (surfaceStrokeLength.getUnits() == null) {
surfaceStrokeLength.setUnits("in.");
surfaceStrokeLength.setSendDelta(0.5);
surfaceStrokeLength.setSendTimeDelta(600);
surfaceStrokeLength.setUseAverage(true);
surfaceStrokeLength.setUseTotal(false);
}
tubingMovement = new Measurement("Tubing Movement", db);
if (tubingMovement.getUnits() == null) {
tubingMovement.setUnits("in.");
tubingMovement.setSendDelta(0.5);
tubingMovement.setSendTimeDelta(600);
tubingMovement.setUseAverage(true);
tubingMovement.setUseTotal(false);
}
pumpFillPercent = new Measurement("Pump Fill Percent", db);
if (pumpFillPercent.getUnits() == null) {
pumpFillPercent.setUnits("%");
pumpFillPercent.setSendDelta(1.0);
pumpFillPercent.setSendTimeDelta(600);
pumpFillPercent.setUseAverage(true);
pumpFillPercent.setUseTotal(false);
}
}
public double getDt() {