aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJulia McCauley <skurvyj@gmail.com>2021-04-04 21:02:43 -0400
committerJulia McCauley <skurvyj@gmail.com>2021-04-04 21:02:43 -0400
commitcb79a2b3c94ef0fbfc7c1f9208b6f3027d08b4f9 (patch)
tree8a67cc60129f02d5e52f0e5c2aaa73fb6b8504cb /src
parentf8262d2aad3d50ea7a861af235d758b70d556055 (diff)
Link mapper up and running, making map that hub search will run on
Diffstat (limited to 'src')
-rw-r--r--src/main/java/edu/brown/cs/student/term/DatabaseQuerier.java5
-rw-r--r--src/main/java/edu/brown/cs/student/term/hub/Holder.java42
-rw-r--r--src/main/java/edu/brown/cs/student/term/hub/HubSearch.java41
-rw-r--r--src/main/java/edu/brown/cs/student/term/hub/LinkMapper.java73
-rw-r--r--src/main/java/edu/brown/cs/student/term/hub/Person.java12
-rw-r--r--src/main/java/edu/brown/cs/student/term/trade/Trade.java13
-rw-r--r--src/test/java/edu/brown/cs/student/LinkMapperTest.java48
7 files changed, 202 insertions, 32 deletions
diff --git a/src/main/java/edu/brown/cs/student/term/DatabaseQuerier.java b/src/main/java/edu/brown/cs/student/term/DatabaseQuerier.java
index 79e8e15..1bb49c7 100644
--- a/src/main/java/edu/brown/cs/student/term/DatabaseQuerier.java
+++ b/src/main/java/edu/brown/cs/student/term/DatabaseQuerier.java
@@ -1,4 +1,5 @@
package edu.brown.cs.student.term;
+import edu.brown.cs.student.term.hub.Holder;
import edu.brown.cs.student.term.trade.Trade;
import java.sql.*;
@@ -78,8 +79,8 @@ public class DatabaseQuerier{
while(rs.next()){
trades.add(new Trade(rs.getInt(1), rs.getString(2),
- rs.getString(3), rs.getLong(4), rs.getInt(5),
- rs.getInt(6), rs.getInt(7)));
+ rs.getLong(4), rs.getInt(5),
+ rs.getInt(6), new Holder(rs.getInt(7), rs.getString(3))));
}
return trades;
diff --git a/src/main/java/edu/brown/cs/student/term/hub/Holder.java b/src/main/java/edu/brown/cs/student/term/hub/Holder.java
new file mode 100644
index 0000000..21c0aea
--- /dev/null
+++ b/src/main/java/edu/brown/cs/student/term/hub/Holder.java
@@ -0,0 +1,42 @@
+package edu.brown.cs.student.term.hub;
+
+import java.util.Objects;
+
+public class Holder {
+ private int id;
+ private String name;
+
+ public Holder(int id, String name){
+ this.id = id;
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String toString() {
+ return "Holder{" +
+ "id=" + id +
+ ", name='" + name + '\'' +
+ '}';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Holder holder = (Holder) o;
+ return id == holder.id && Objects.equals(name, holder.name);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, name);
+ }
+}
diff --git a/src/main/java/edu/brown/cs/student/term/hub/HubSearch.java b/src/main/java/edu/brown/cs/student/term/hub/HubSearch.java
index 87e723b..4c382ec 100644
--- a/src/main/java/edu/brown/cs/student/term/hub/HubSearch.java
+++ b/src/main/java/edu/brown/cs/student/term/hub/HubSearch.java
@@ -1,4 +1,45 @@
package edu.brown.cs.student.term.hub;
public class HubSearch {
+
+ /*
+ def pageRank(pList: List[Page]): mutable.HashMap[Int, Double] = {
+ val n = pList.length
+ val weights = new Array[Double](n)
+ val r = new Array[Double](n)
+ val rPrime = Array.fill[Double](n)(1.0 / n)
+
+ while (!distance(r, rPrime)) {
+ Array.copy(rPrime, 0, r, 0, n)
+ for (j <- 0 to n - 1) {
+ rPrime(j) = 0
+ for (k <- 0 to n - 1) {
+ val wjk = getWeight(pList(j), pList(k), n)
+ rPrime(j) = (rPrime(j) + (wjk * r(k)))
+ }
+ }
+ }
+
+ val pageRank = new mutable.HashMap[Int, Double]()
+
+ for (i <- 0 to rPrime.length - 1) {
+ pageRank.put(pList(i).getID, rPrime(i))
+ }
+ pageRank
+ }
+
+ def getWeight(j: Page, k: Page, n: Int): Double = {
+
+ val links = k.getLinks
+ val nk = links.size
+
+ if (links.contains(j.getTitle.toLowerCase)) {
+ ((0.15 / n) + ((1 - 0.15) * (1.0 / nk)))
+ } else if (nk == 0) {
+ ((0.15 / n) + ((1 - 0.15) * (1.0 / n)))
+ } else {
+ (0.15 / n)
+ }
+ }
+ */
}
diff --git a/src/main/java/edu/brown/cs/student/term/hub/LinkMapper.java b/src/main/java/edu/brown/cs/student/term/hub/LinkMapper.java
index 0360bda..f4ec0a7 100644
--- a/src/main/java/edu/brown/cs/student/term/hub/LinkMapper.java
+++ b/src/main/java/edu/brown/cs/student/term/hub/LinkMapper.java
@@ -1,26 +1,30 @@
package edu.brown.cs.student.term.hub;
+import edu.brown.cs.student.term.DatabaseQuerier;
+import edu.brown.cs.student.term.repl.commands.SetupCommand;
import edu.brown.cs.student.term.trade.Trade;
+import java.sql.SQLException;
import java.time.Instant;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
public class LinkMapper {
//not strictly necessary but may be nice to maintain
- private Map<String, List<Trade>> personToTradesMap = new HashMap<>();
- private Map<String, Set<String>> personToFollowers = new HashMap<>();
+ private List<List<Trade>> allTrades = new ArrayList<>();
+ private Map<Holder, List<Trade>> personToTradesMap = new HashMap<>();
+ private Map<Holder, List<Holder>> personToFollowers = new HashMap<>();
+ private DatabaseQuerier databaseQuerier;
- public LinkMapper(){}
+ public LinkMapper(DatabaseQuerier db){
+ this.databaseQuerier = db;
+ }
/**
* Returns the person => trades map as is, does not update it
* @return person to trades map
*/
- public Map<String, List<Trade>> getPersonToTradesMap() {
+ public Map<Holder, List<Trade>> getPersonToTradesMap() {
return personToTradesMap;
}
@@ -28,7 +32,7 @@ public class LinkMapper {
* Returns the person => follower map as is, does not update it
* @return person to follower map
*/
- public Map<String, Set<String>> getPersonToFollowers() {
+ public Map<Holder, List<Holder>> getPersonToFollowers() {
return personToFollowers;
}
@@ -37,7 +41,54 @@ public class LinkMapper {
* in the same time period
* @return the newly updated link map
*/
- public Map<String, Set<String>> makeFollowerLinks(Instant start, Instant end){
- return null;
+ public Map<Holder, List<Holder>> makeFollowerLinks(Instant start, Instant end){
+ if(databaseQuerier != null){
+ try{
+ List<List<Trade>> allTrades = databaseQuerier.getAllTradesByStock(start, end);
+ //reset the map to be blank
+ personToFollowers = new HashMap<>();
+
+ for(List<Trade> tradeList : allTrades){
+ convertTradeListToFollowerMap(tradeList);
+ }
+
+ //System.out.println(personToFollowers.toString());
+ System.out.println("num people in map: " + personToFollowers.size());
+
+ } catch(SQLException e) {
+ System.out.println("ERROR: SQL Error while retrieving trade list");
+ }
+ } else {
+ System.out.println("ERROR: No database loaded in yet");
+ }
+
+ return personToFollowers;
+ }
+
+ private void convertTradeListToFollowerMap(List<Trade> tradeList){
+ List<Holder> holderList = new ArrayList<>();
+
+ //gets in order list of people
+ for (Trade trade : tradeList) {
+ holderList.add(trade.getHolder());
+ }
+
+ Set<Holder> followers = new HashSet<>(holderList);
+ Set<Holder> encountered = new HashSet<>();
+
+ for(Holder current: holderList){
+ //want to check if we've already gotten followers for this trade for this holder
+ if(!encountered.contains(current)){
+ encountered.add(current);
+ followers.remove(current);
+ if(personToFollowers.containsKey(current)){
+ //TODO: this probably makes it O(n^2), might want to optimize later
+ personToFollowers.get(current).addAll(followers);
+ } else {
+ List<Holder> currentFollowers = new ArrayList<>(followers);
+ personToFollowers.put(current, currentFollowers);
+ }
+ }
+ }
}
}
diff --git a/src/main/java/edu/brown/cs/student/term/hub/Person.java b/src/main/java/edu/brown/cs/student/term/hub/Person.java
deleted file mode 100644
index c3d5cb3..0000000
--- a/src/main/java/edu/brown/cs/student/term/hub/Person.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package edu.brown.cs.student.term.hub;
-
-public class Person {
- private int id;
- private String name;
-
- public Person(int id, String name){
- this.id = id;
- this.name = name;
- }
-
-}
diff --git a/src/main/java/edu/brown/cs/student/term/trade/Trade.java b/src/main/java/edu/brown/cs/student/term/trade/Trade.java
index 8619ab1..13f7ae1 100644
--- a/src/main/java/edu/brown/cs/student/term/trade/Trade.java
+++ b/src/main/java/edu/brown/cs/student/term/trade/Trade.java
@@ -1,23 +1,23 @@
package edu.brown.cs.student.term.trade;
+import edu.brown.cs.student.term.hub.Holder;
+
public class Trade {
private int id;
private String stock;
private int isBuy;
private double timestamp;
- private String holder;
+ private Holder holder;
private int numShares;
- private int holderID;
- public Trade(int id, String stockName, String holderName, double ts, int buy, int shares, int holderID){
+ public Trade(int id, String stockName, double ts, int buy, int shares, Holder holder){
this.id = id;
this.stock = stockName;
this.isBuy = buy;
this.timestamp = ts;
- this.holder = holderName;
+ this.holder = holder;
this.numShares = shares;
- this.holderID = holderID;
}
public int getId() {
@@ -40,7 +40,7 @@ public class Trade {
return stock;
}
- public String getHolder() {
+ public Holder getHolder() {
return holder;
}
@@ -53,7 +53,6 @@ public class Trade {
", timestamp=" + timestamp +
", holder='" + holder + '\'' +
", numShares=" + numShares +
- ", holderID=" + holderID +
'}';
}
}
diff --git a/src/test/java/edu/brown/cs/student/LinkMapperTest.java b/src/test/java/edu/brown/cs/student/LinkMapperTest.java
new file mode 100644
index 0000000..9b46d5e
--- /dev/null
+++ b/src/test/java/edu/brown/cs/student/LinkMapperTest.java
@@ -0,0 +1,48 @@
+package edu.brown.cs.student;
+
+import edu.brown.cs.student.term.DatabaseQuerier;
+import edu.brown.cs.student.term.hub.LinkMapper;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.time.Instant;
+
+public class LinkMapperTest {
+
+ /** these should span the entire mock dataset */
+ //12 am on 3/11 in UTC
+ private Instant start = Instant.parse("2021-03-11T05:00:00.00Z");
+ //12 am on 3/28 in UTC
+ private Instant end = Instant.parse("2021-03-28T05:00:00.00Z");
+
+ private DatabaseQuerier db;
+
+ @Before
+ public void setUp() {
+ try{
+ db = new DatabaseQuerier("data/mock_trades.sqlite3");
+ } catch(Exception e){
+ System.out.println("DBQuerier Test, couldn't connect to db???");
+ }
+ }
+
+ /*
+ * try{
+
+ } catch(Exception e) {
+ System.out.println("Error in test");
+ }*/
+
+ @After
+ public void tearDown() {
+ db = null;
+ }
+
+ @Test
+ public void testMapper(){
+ setUp();
+ LinkMapper lm = new LinkMapper(db);
+ lm.makeFollowerLinks(start, end);
+ }
+}