aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulia McCauley <skurvyj@gmail.com>2021-04-20 11:26:22 -0400
committerJulia McCauley <skurvyj@gmail.com>2021-04-20 11:26:22 -0400
commit8535db483bd2a153013976a0ad540d00707405ba (patch)
tree020b330523aeab9068b70717da4b917b8a769408
parente47ab608709dd794f27dbfac9de950307a074e94 (diff)
trying to implement on edge click, same trade pop up, not working yet tho
-rw-r--r--react-frontend/src/components/EdgeInfo.js31
-rw-r--r--react-frontend/src/components/Visualization.js47
-rw-r--r--src/main/java/edu/brown/cs/student/term/Main.java14
-rw-r--r--src/main/java/edu/brown/cs/student/term/hub/LinkMapper.java32
-rw-r--r--src/main/java/edu/brown/cs/student/term/trade/Trade.java22
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) =>
+ <li>{stock}</li>
+ );*/
+
+ const hideSelf = () => {
+ props.setHideInfo(true);
+ }
+
+ return (
+ <div className='edge-info-wrapper'>
+ <p onClick={hideSelf}> X </p>
+ <div className = 'edge-info'>
+ {stockList}
+ </div>
+ </div>);
+}
+
+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;
}
+ /*
+ * <EdgeInfo
+ stockList={stocks}
+ setHideInfo={setHideEdgeInfo}
+ hidden={hideEdgeInfo}>
+ </EdgeInfo>*/
// 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<String> 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<List<Trade>> allTrades = new ArrayList<>();
+ //private List<List<Trade>> allTrades = new ArrayList<>();
private Map<Holder, Set<Holder>> followerToLeaders = new HashMap<>();
+ private static Map<Integer, Set<Trade>> holderIDToTrades = new HashMap<>();
private DatabaseQuerier databaseQuerier;
public LinkMapper(DatabaseQuerier db){
@@ -55,6 +56,25 @@ public class LinkMapper {
return followerToLeaders;
}
+ public static List<String> getCommonTrades(int leaderID, int followerID){
+ Set<Trade> leaderTrades = new HashSet<>(holderIDToTrades.get(leaderID));
+ Set<Trade> followerTrades = new HashSet<>(holderIDToTrades.get(followerID));
+
+ leaderTrades.retainAll(followerTrades);
+ //TODO: Could retain WAY more info in here!
+ List<String> 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<Trade> tradeSet = new HashSet<>();
+ tradeSet.add(trade);
+ holderIDToTrades.put(currentHolder.getId(), tradeSet);
+ } else {
+ holderIDToTrades.get(currentHolder.getId()).add(trade);
+ }
}
//Set<Holder> 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{" +