aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.idea/term-project-cohwille-jmccaul3-mfoiani-rhunt2.iml33
-rw-r--r--data/mock_tradeClarks.sqlite3bin0 -> 45056 bytes
-rw-r--r--src/main/java/edu/brown/cs/student/term/Main.java26
-rw-r--r--src/main/java/edu/brown/cs/student/term/ProfitCalculation.java121
4 files changed, 172 insertions, 8 deletions
diff --git a/.idea/term-project-cohwille-jmccaul3-mfoiani-rhunt2.iml b/.idea/term-project-cohwille-jmccaul3-mfoiani-rhunt2.iml
index e5e71fc..ec06211 100644
--- a/.idea/term-project-cohwille-jmccaul3-mfoiani-rhunt2.iml
+++ b/.idea/term-project-cohwille-jmccaul3-mfoiani-rhunt2.iml
@@ -48,5 +48,38 @@
<orderEntry type="library" name="Maven: com.sparkjava:spark-template-freemarker:2.7.1" level="project" />
<orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.26-incubating" level="project" />
<orderEntry type="library" name="Maven: org.xerial:sqlite-jdbc:3.30.1" level="project" />
+ <orderEntry type="library" name="Maven: net.sf.jopt-simple:jopt-simple:6.0-alpha-3" level="project" />
+ <orderEntry type="library" name="Maven: junit:junit:4.13" level="project" />
+ <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
+ <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-all:1.3" level="project" />
+ <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:2.0.0-alpha1" level="project" />
+ <orderEntry type="library" name="Maven: org.slf4j:slf4j-jdk14:2.0.0-alpha1" level="project" />
+ <orderEntry type="library" name="Maven: com.google.guava:guava:28.2-jre" level="project" />
+ <orderEntry type="library" name="Maven: com.google.guava:failureaccess:1.0.1" level="project" />
+ <orderEntry type="library" name="Maven: com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava" level="project" />
+ <orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:3.0.2" level="project" />
+ <orderEntry type="library" name="Maven: org.checkerframework:checker-qual:2.10.0" level="project" />
+ <orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.3.4" level="project" />
+ <orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.3" level="project" />
+ <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.6" level="project" />
+ <orderEntry type="library" name="Maven: com.sparkjava:spark-core:2.9.1" level="project" />
+ <orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-server:9.4.18.v20190429" level="project" />
+ <orderEntry type="library" name="Maven: javax.servlet:javax.servlet-api:3.1.0" level="project" />
+ <orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-http:9.4.18.v20190429" level="project" />
+ <orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-util:9.4.18.v20190429" level="project" />
+ <orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-io:9.4.18.v20190429" level="project" />
+ <orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-webapp:9.4.18.v20190429" level="project" />
+ <orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-xml:9.4.18.v20190429" level="project" />
+ <orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-servlet:9.4.18.v20190429" level="project" />
+ <orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-security:9.4.18.v20190429" level="project" />
+ <orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-server:9.4.18.v20190429" level="project" />
+ <orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-common:9.4.18.v20190429" level="project" />
+ <orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-client:9.4.18.v20190429" level="project" />
+ <orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-client:9.4.18.v20190429" level="project" />
+ <orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-servlet:9.4.18.v20190429" level="project" />
+ <orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-api:9.4.18.v20190429" level="project" />
+ <orderEntry type="library" name="Maven: com.sparkjava:spark-template-freemarker:2.7.1" level="project" />
+ <orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.26-incubating" level="project" />
+ <orderEntry type="library" name="Maven: org.xerial:sqlite-jdbc:3.30.1" level="project" />
</component>
</module> \ No newline at end of file
diff --git a/data/mock_tradeClarks.sqlite3 b/data/mock_tradeClarks.sqlite3
new file mode 100644
index 0000000..7b5f3d1
--- /dev/null
+++ b/data/mock_tradeClarks.sqlite3
Binary files differ
diff --git a/src/main/java/edu/brown/cs/student/term/Main.java b/src/main/java/edu/brown/cs/student/term/Main.java
index c436b2e..e6584f1 100644
--- a/src/main/java/edu/brown/cs/student/term/Main.java
+++ b/src/main/java/edu/brown/cs/student/term/Main.java
@@ -5,11 +5,15 @@ import edu.brown.cs.student.term.repl.REPL;
import joptsimple.OptionParser;
import joptsimple.OptionSet;
+import java.sql.Connection;
+import java.sql.Date;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.sql.Statement;
import java.util.HashMap;
/**
* The Main class of our project. This is where execution begins.
- *
*/
public final class Main {
@@ -18,8 +22,7 @@ public final class Main {
/**
* The initial method called when execution begins.
*
- * @param args
- * An array of command line arguments
+ * @param args An array of command line arguments
*/
public static void main(String[] args) {
new Main(args).run();
@@ -36,7 +39,7 @@ public final class Main {
OptionParser parser = new OptionParser();
parser.accepts("gui");
parser.accepts("port").withRequiredArg().ofType(Integer.class)
- .defaultsTo(DEFAULT_PORT);
+ .defaultsTo(DEFAULT_PORT);
OptionSet options = parser.parse(args);
if (options.has("gui")) {
@@ -44,11 +47,18 @@ public final class Main {
//runSparkServer((int) options.valueOf("port"));
}
- HashMap<String, Command> commandHashMap = new HashMap<>();
- /** add commands to map here! */
- REPL repl = new REPL(commandHashMap);
- repl.runREPL();
+
+ ProfitCalculation person = new ProfitCalculation(null, "Vincent", new Date(1615629591000L), new Date(1615507898000L));
+ person.setConnection("./data/mock_tradeClarks.sqlite3");
+ person.calculateGains();
+
+// HashMap<String, Command> commandHashMap = new HashMap<>();
+// /** add commands to map here! */
+// REPL repl = new REPL(commandHashMap);
+// repl.runREPL();
// TODO: Process commands in a REPL
}
+
+
} \ No newline at end of file
diff --git a/src/main/java/edu/brown/cs/student/term/ProfitCalculation.java b/src/main/java/edu/brown/cs/student/term/ProfitCalculation.java
new file mode 100644
index 0000000..7c275d2
--- /dev/null
+++ b/src/main/java/edu/brown/cs/student/term/ProfitCalculation.java
@@ -0,0 +1,121 @@
+package edu.brown.cs.student.term;
+
+import java.sql.Connection;
+import java.sql.Date;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.HashMap;
+
+public class ProfitCalculation {
+ private Connection conn;
+ private String person;
+ Date startTime;
+ Date endTime;
+
+ /**
+ * constructor for ProfitCalculation.
+ *
+ * @param conn - database connection, with trade data.
+ * @param person - person of interest to calculate profit for.
+ * @param startTime - start of period to look at.
+ * @param endTime - end of period to look at.
+ */
+ public ProfitCalculation(Connection conn, String person, Date startTime, Date endTime) {
+ this.conn = conn;
+ this.person = person;
+ this.startTime = startTime;
+ this.endTime = endTime;
+ }
+
+ /**
+ * calculate the gains for a given person in a specified time.
+ *
+ * @return
+ */
+ public double calculateGains() {
+ HashMap<String, LinkedList<BuyTuple>> buyHistory = new HashMap<String, LinkedList<BuyTuple>>();
+ HashMap<String, Double> perStockGain = new HashMap<String, Double>();
+ double totalGain = 0;
+ //query for List<Trades> per person
+
+ try {
+ PreparedStatement prep;
+ prep = conn.prepareStatement("SELECT * FROM \'users\' WHERE user_id= ?;");
+ //prep.setString(1, id);
+ ResultSet rs = prep.executeQuery();
+ while (rs.next()) {
+ boolean buy = true;
+ String ticker = "STOCK";
+ //for buy orders, build up buy history
+ if (buy) {
+ int sharesBought = 99;
+ double cost = 420.0;
+
+ //add a buy to the end of a history for a given stock
+ if (buyHistory.containsKey(ticker)) {
+ buyHistory.get(ticker).addLast(new BuyTuple(sharesBought, cost));
+ } else {
+ LinkedList<BuyTuple> tickerHistory = new LinkedList<>();
+ tickerHistory.add(new BuyTuple(sharesBought, cost));
+ buyHistory.put(ticker, tickerHistory);
+ }
+ //for sell orders, calculate realized gains
+ } else {
+// int sharesSold = 99;
+// if (buyHistory.containsKey(ticker)) {
+// LinkedList<BuyTuple> =
+// }
+
+ }
+
+ }
+ prep.close();
+ } catch (SQLException e) {
+ System.out.println("ERROR: sql error getting trades");
+ }
+
+
+ //FOR EACH RESULT in ResultsSet...
+ //if buy: add to hashmap tuple entry (shares, cost) to hashmap
+ // - get cost of stock at time of purchase
+ //if sell: check if we hold this stock. If so use FIFO to sell
+
+ return totalGain;
+ }
+
+ private class BuyTuple {
+ private int shares;
+ private double cost;
+
+ private BuyTuple(int shares, double cost) {
+ this.shares = shares;
+ this.cost = cost;
+ }
+
+ public double getCost() {
+ return cost;
+ }
+
+ public int getShares() {
+ return shares;
+ }
+ }
+
+ public void setConnection(String filename) throws SQLException, ClassNotFoundException {
+
+ // Initialize the database connection, turn foreign keys on
+ Class.forName("org.sqlite.JDBC");
+ String urlToDB = "jdbc:sqlite:" + filename;
+ conn = DriverManager.getConnection(urlToDB);
+
+ Statement stat = conn.createStatement();
+ stat.executeUpdate("PRAGMA foreign_keys=ON;");
+ }
+
+
+}