diff options
Diffstat (limited to 'src')
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); + } +} |