Stores and retrieves measurement data in a more efficient way
This commit is contained in:
@@ -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()) {
|
||||
|
||||
@@ -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())){
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user