From 8535db483bd2a153013976a0ad540d00707405ba Mon Sep 17 00:00:00 2001 From: Julia McCauley Date: Tue, 20 Apr 2021 11:26:22 -0400 Subject: trying to implement on edge click, same trade pop up, not working yet tho --- react-frontend/src/components/EdgeInfo.js | 31 ++++++++++++++ react-frontend/src/components/Visualization.js | 47 +++++++++++++++++++++- src/main/java/edu/brown/cs/student/term/Main.java | 14 +++++++ .../edu/brown/cs/student/term/hub/LinkMapper.java | 32 ++++++++++++++- .../edu/brown/cs/student/term/trade/Trade.java | 22 ++++++++++ 5 files changed, 142 insertions(+), 4 deletions(-) diff --git a/react-frontend/src/components/EdgeInfo.js b/react-frontend/src/components/EdgeInfo.js index e69de29..60af0e8 100644 --- a/react-frontend/src/components/EdgeInfo.js +++ b/react-frontend/src/components/EdgeInfo.js @@ -0,0 +1,31 @@ + +import '../css/UserCheckin.css'; + +/** + * Componenet for checkins. Has a toggle to show more info. + * @param {Object} props The props of the component. + * @returns {import('react').HtmlHTMLAttributes} A list element holding a checkin's info. + */ +function EdgeInfo(props) { + // State - toggled + + const stockList = props.stockList; + + /* const stockInfo = stockList.map((stock) => +
  • {stock}
  • + );*/ + + const hideSelf = () => { + props.setHideInfo(true); + } + + return ( +
    +

    X

    +
    + {stockList} +
    +
    ); +} + +export default EdgeInfo; \ No newline at end of file diff --git a/react-frontend/src/components/Visualization.js b/react-frontend/src/components/Visualization.js index 9a837a1..33f96c9 100644 --- a/react-frontend/src/components/Visualization.js +++ b/react-frontend/src/components/Visualization.js @@ -5,14 +5,27 @@ import Graph from 'vis-react'; // CSS imports import '../css/Canvas.css'; +import EdgeInfo from "./EdgeInfo"; /** - * This function renders and mantains thhe canvas. + * This function renders and mantains the canvas. * @param {Object} props The props for the canvas. * @returns {import("react").HtmlHTMLAttributes} The canvas to be retured. */ function Visualization(props) { + + /*let stocks = {}; + let hideEdgeInfo = true; + + const setStocks = (newStocks) => { + stocks = newStocks; + } + + const setHideEdgeInfo = (val) => { + hideEdgeInfo = val; + }*/ + const options = { edges: { color: "#ffffff" @@ -26,6 +39,27 @@ function Visualization(props) { nodes: [], edges: [] }); + + /*const getEdgeInfo = (fromID, toID) => { + fetch("http://localhost:4567/edge-data", { + method: "POST", + body: JSON.stringify({ + followerID: fromID, + leaderID: toID, + }), + headers: { + "Content-Type": "application/json", + }, + credentials: "same-origin" + }) + .then(res => res.json()) + .then(data => { + console.log(data); + setStocks(data); + setHideEdgeInfo(false); + }) + .catch(err => console.log(err)); + }*/ const getNodes = () => { let nodes = []; const maxScore = props.data[0].suspicionScore; @@ -79,12 +113,21 @@ function Visualization(props) { color:{ opacity: 0.7, highlight:'#fdca40', - } + }, + /*chosen: { + edge: () => getEdgeInfo(follower.id, hub.id) + }*/ }); }); }); return edges; } + /* + * */ // Hooks to update graph state useEffect(() => setGraphState({nodes: getNodes(), edges: getEdges()}), [JSON.stringify(props.data)]); 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 dd304c5..7b9bf0f 100644 --- a/src/main/java/edu/brown/cs/student/term/Main.java +++ b/src/main/java/edu/brown/cs/student/term/Main.java @@ -2,6 +2,7 @@ package edu.brown.cs.student.term; import com.google.common.collect.ImmutableMap; import edu.brown.cs.student.term.hub.Holder; +import edu.brown.cs.student.term.hub.LinkMapper; import edu.brown.cs.student.term.profit.ProfitCalculation; import edu.brown.cs.student.term.profit.StockHolding; import edu.brown.cs.student.term.hub.SuspicionRanker; @@ -137,6 +138,7 @@ public final class Main { Spark.post("/data", new SuspicionRankHandler()); Spark.post("/profit", new ProfitQueryHandler()); Spark.post("/trade-lookup", new TradeQueryHandler()); + Spark.post("/edge-data", new EdgeDataQueryHandler()); } /** @@ -217,6 +219,18 @@ public final class Main { } } + private static class EdgeDataQueryHandler implements Route { + @Override + public Object handle(Request request, Response response) throws Exception { + JSONObject req = new JSONObject(request.body()); + int leaderID = req.getInt("leaderID"); + int followerID = req.getInt("followerID"); + List commonStocks = LinkMapper.getCommonTrades(leaderID, followerID); + System.out.println(commonStocks); + return GSON.toJson(commonStocks); + } + } + /** * Display an error page when an exception occurs in the server. */ 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 31e2625..e749aff 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 @@ -11,8 +11,9 @@ public class LinkMapper { //TODO: Review what we actually need in here //not strictly necessary but may be nice to maintain - private List> allTrades = new ArrayList<>(); + //private List> allTrades = new ArrayList<>(); private Map> followerToLeaders = new HashMap<>(); + private static Map> holderIDToTrades = new HashMap<>(); private DatabaseQuerier databaseQuerier; public LinkMapper(DatabaseQuerier db){ @@ -55,6 +56,25 @@ public class LinkMapper { return followerToLeaders; } + public static List getCommonTrades(int leaderID, int followerID){ + Set leaderTrades = new HashSet<>(holderIDToTrades.get(leaderID)); + Set followerTrades = new HashSet<>(holderIDToTrades.get(followerID)); + + leaderTrades.retainAll(followerTrades); + //TODO: Could retain WAY more info in here! + List commonTrades = new ArrayList<>(); + for(Trade leaderTrade: leaderTrades){ + String buyType = ""; + if(leaderTrade.isBuy()){ + buyType = "Buy"; + } else{ + buyType = "Sell"; + } + commonTrades.add(buyType + ": " + leaderTrade.getStock()); + } + return commonTrades; + } + /** * Converts a single trade list into entries in the follower to leader map * @param tradeList - a list of trades for a single stock (either buy or sell) @@ -64,7 +84,15 @@ public class LinkMapper { //gets in order list of people for (Trade trade : tradeList) { - holderList.add(trade.getHolder()); + Holder currentHolder = trade.getHolder(); + holderList.add(currentHolder); + if(!holderIDToTrades.containsKey(currentHolder.getId())){ + Set tradeSet = new HashSet<>(); + tradeSet.add(trade); + holderIDToTrades.put(currentHolder.getId(), tradeSet); + } else { + holderIDToTrades.get(currentHolder.getId()).add(trade); + } } //Set followers = new HashSet<>(holderList); 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 353de8d..df52a4f 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 @@ -2,6 +2,8 @@ package edu.brown.cs.student.term.trade; import edu.brown.cs.student.term.hub.Holder; +import java.util.Objects; + public class Trade { private int id; @@ -54,6 +56,26 @@ public class Trade { return price; } + /** + * This equals method differs from what may be expected, + * it considers trades "equal" if they have the same buy value and stock name + * because they are the same type of trade of the same stock in that case + * @param o - object to compare to + * @return true if equal by the considerations above + */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Trade trade = (Trade) o; + return isBuy == trade.isBuy && stock.equals(trade.stock); + } + + @Override + public int hashCode() { + return Objects.hash(stock, isBuy); + } + @Override public String toString() { return "Trade{" + -- cgit v1.2.3-70-g09d2