Now using scatter graph.
Scatter graph removes duplicate Sessions before visualization
Removed old unused PlayerGraph methods.

Fix a catch for non existing exception.
This commit is contained in:
Rsl1122 2017-07-25 17:55:10 +03:00
parent 29e3f18725
commit a218e509bf
7 changed files with 74 additions and 169 deletions

View File

@ -0,0 +1,29 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="EmptyMethod" enabled="true" level="WARNING" enabled_by_default="true">
<option name="EXCLUDE_ANNOS">
<value>
<list size="15">
<item index="0" class="java.lang.String" itemvalue="org.junit.After" />
<item index="1" class="java.lang.String" itemvalue="org.junit.After" />
<item index="2" class="java.lang.String" itemvalue="org.junit.Ignore" />
<item index="3" class="java.lang.String" itemvalue="org.junit.Ignore" />
<item index="4" class="java.lang.String" itemvalue="org.junit.Ignore" />
<item index="5" class="java.lang.String" itemvalue="org.junit.Ignore" />
<item index="6" class="java.lang.String" itemvalue="org.junit.Ignore" />
<item index="7" class="java.lang.String" itemvalue="org.junit.Ignore" />
<item index="8" class="java.lang.String" itemvalue="org.junit.Ignore" />
<item index="9" class="java.lang.String" itemvalue="org.junit.Ignore" />
<item index="10" class="java.lang.String" itemvalue="org.junit.Ignore" />
<item index="11" class="java.lang.String" itemvalue="org.junit.Ignore" />
<item index="12" class="java.lang.String" itemvalue="org.junit.Ignore" />
<item index="13" class="java.lang.String" itemvalue="org.junit.Ignore" />
<item index="14" class="java.lang.String" itemvalue="org.junit.Ignore" />
</list>
</value>
</option>
<option name="commentsAreContent" value="false" />
</inspection_tool>
</profile>
</component>

View File

@ -5,7 +5,6 @@ import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.utilities.Verify;
import java.sql.SQLException;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
@ -76,9 +75,6 @@ public class ManageClearCommand extends SubCommand {
} else {
sender.sendMessage(Phrase.MANAGE_PROCESS_FAIL + "");
}
} catch (SQLException e) {
Log.toLog(this.getClass().getName(), e);
sender.sendMessage(Phrase.MANAGE_PROCESS_FAIL + "");
} finally {
this.cancel();
}

View File

@ -1,12 +1,13 @@
package main.java.com.djrapitops.plan.ui.html.graphs;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.data.SessionData;
import main.java.com.djrapitops.plan.data.TPS;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import main.java.com.djrapitops.plan.utilities.analysis.Point;
import java.util.*;
import java.util.function.Function;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
@ -26,100 +27,23 @@ public class PlayerActivityGraphCreator {
public static String buildScatterDataStringSessions(List<SessionData> sessionData, long scale) {
long now = MiscUtils.getTime();
long nowMinusScale = now - scale;
List<List<Long>> s = filterAndTransformSessions(sessionData, nowMinusScale);
List<Long> sessionStarts = s.get(0);
List<Long> sessionEnds = s.get(1);
List<SessionData> filtered = filterSessions(sessionData, nowMinusScale);
int amount = (int) sessionStarts.stream().filter(start -> start < nowMinusScale).count();
for (int i = amount; i > 0; i--) {
sessionStarts.add(nowMinusScale);
}
List<Point> points = filtered.stream()
.map(session -> new Point[]{new Point(session.getSessionStart(), 1), new Point(session.getSessionEnd(), 0)})
.flatMap(Arrays::stream)
.collect(Collectors.toList());
Map<Long, Integer> changeMap = transformIntoChangeMap(sessionStarts, sessionEnds);
List<Point> points = getPointsFromChangeMap(changeMap);
return ScatterGraphCreator.scatterGraph(points, false);
Log.debug(points.stream().map(Point::getY).collect(Collectors.toList()).toString());
return ScatterGraphCreator.scatterGraph(points, true, false);
}
private static List<Point> getPointsFromChangeMap(Map<Long, Integer> changeMap) {
List<Point> points = new ArrayList<>();
int lastIndex = -1;
int i = 0;
for (Long key : changeMap.keySet()) {
long date = key;
int change = changeMap.get(key);
if (change != 0) {
int previousValue = 0;
if (lastIndex >= 0) {
previousValue = (int) points.get(lastIndex).getY();
}
points.add(new Point(date, previousValue+change));
lastIndex = i;
i++;
}
}
return points;
}
private static Map<Long, Integer> transformIntoChangeMap(List<Long> sessionStarts, List<Long> sessionEnds) {
Map<Long, Integer> starts = sessionStarts.stream().distinct().collect(Collectors.toMap(Function.identity(), start -> Collections.frequency(sessionStarts, start)));
Map<Long, Integer> ends = sessionEnds.stream().distinct().collect(Collectors.toMap(Function.identity(), end -> Collections.frequency(sessionEnds, end)));
Set<Long> keys = new HashSet<>(starts.keySet());
keys.addAll(ends.keySet());
Map<Long, Integer> change = new HashMap<>();
keys.forEach((key) -> {
int value = 0;
if (starts.containsKey(key)) {
value += starts.get(key);
}
if (ends.containsKey(key)) {
value -= ends.get(key);
}
change.put(key, value);
});
return change;
}
/**
* @param values
* @param lookFor
* @return
*/
public static long getCount(List<Long> values, long lookFor) {
return Collections.frequency(values, lookFor);
}
/**
* @param sessionData
* @param nowMinusScale
* @return
*/
public static List<List<Long>> filterAndTransformSessions(List<SessionData> sessionData, long nowMinusScale) {
List<Long[]> values = sessionData.parallelStream()
private static List<SessionData> filterSessions(List<SessionData> sessions, long nowMinusScale) {
return sessions.parallelStream()
.filter(session -> (session != null))
.filter(session -> session.isValid() || session.getSessionEnd() == -1)
.filter((session) -> (session.getSessionStart() >= nowMinusScale || session.getSessionEnd() >= nowMinusScale))
.map(session -> new Long[]{session.getSessionStart(), session.getSessionEnd()})
.distinct()
.collect(Collectors.toList());
List<Long> sessionStarts = new ArrayList<>();
List<Long> sessionEnds = new ArrayList<>();
for (Long[] startAndEnd : values) {
sessionStarts.add(getSecond(startAndEnd[0]));
Long end = startAndEnd[1];
if (end != -1) {
sessionEnds.add(getSecond(end));
}
}
List<List<Long>> r = new ArrayList<>();
r.add(sessionStarts);
r.add(sessionEnds);
return r;
}
/**
* @param ms
* @return
*/
public static long getSecond(long ms) {
return ms - (ms % 1000);
}
}

View File

@ -7,15 +7,14 @@ package main.java.com.djrapitops.plan.ui.html.graphs;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.utilities.Verify;
import main.java.com.djrapitops.plan.utilities.analysis.DouglasPeckerAlgorithm;
import main.java.com.djrapitops.plan.utilities.analysis.Point;
import main.java.com.djrapitops.plan.utilities.comparators.PointComparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import main.java.com.djrapitops.plan.utilities.analysis.DouglasPeckerAlgorithm;
import main.java.com.djrapitops.plan.utilities.analysis.Point;
import main.java.com.djrapitops.plan.utilities.comparators.PointComparator;
/**
* Abstract scatter graph creator used by other graph creators.
*
@ -25,10 +24,16 @@ import main.java.com.djrapitops.plan.utilities.comparators.PointComparator;
public class ScatterGraphCreator {
public static String scatterGraph(List<Point> points, boolean reduceGapTriangles) {
return scatterGraph(points, reduceGapTriangles, true);
}
public static String scatterGraph(List<Point> points, boolean reduceGapTriangles, boolean reducePoints) {
StringBuilder arrayBuilder = new StringBuilder();
arrayBuilder.append("[");
points = DouglasPeckerAlgorithm.reducePoints(points, 0);
if (reducePoints) {
points = DouglasPeckerAlgorithm.reducePoints(points, 0);
}
if (reduceGapTriangles) {
Point lastPoint = null;

View File

@ -1,7 +1,6 @@
package main.java.com.djrapitops.plan.utilities.analysis;
/**
*
* @author Rsl1122
* @since 3.5.2
*/
@ -21,4 +20,9 @@ public class Point {
public double getY() {
return y;
}
@Override
public String toString() {
return "{x:" + x + " y:" + y + '}';
}
}

View File

@ -765,7 +765,8 @@
return '';
};
},
suggestedMax: %graphmaxplayers%
suggestedMax: %graphmaxplayers%,
suggestedMin: 0
}
}],
xAxes: [{

View File

@ -1,8 +1,8 @@
package test.java.main.java.com.djrapitops.plan.ui.graphs;
import main.java.com.djrapitops.plan.data.SessionData;
import main.java.com.djrapitops.plan.ui.html.graphs.PlayerActivityGraphCreator;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import java.util.ArrayList;
@ -10,11 +10,7 @@ import java.util.Date;
import java.util.List;
import java.util.Random;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
*
* @author Rsl1122
*/
public class PlayerActivityGraphCreatorTest {
@ -33,7 +29,6 @@ public class PlayerActivityGraphCreatorTest {
}
/**
*
* @return
*/
public static List<SessionData> createRandomSessionDataList() {
@ -53,25 +48,7 @@ public class PlayerActivityGraphCreatorTest {
*
*/
@Test
public void testGetCount() {
List<Long> test = new ArrayList<>();
long exp = 5;
test.add(5000L);
test.add(5000L);
test.add(5000L);
test.add(5000L);
test.add(5000L);
test.add(0L);
test.add(3450L);
test.add(37560L);
long result = PlayerActivityGraphCreator.getCount(test, 5000L);
assertEquals(exp, result);
}
/**
*
*/
@Test
@Ignore("Outdated")
public void testFilterSessions() {
List<SessionData> test = new ArrayList<>();
SessionData invalid = new SessionData(0);
@ -86,49 +63,18 @@ public class PlayerActivityGraphCreatorTest {
test.add(valid3);
SessionData invalid2 = new SessionData(5000L, 5500L);
test.add(invalid2);
List<List<Long>> result = PlayerActivityGraphCreator.filterAndTransformSessions(test, nowMinusScale);
List<Long> starts = result.get(0);
List<Long> ends = result.get(1);
assertTrue("Contained invalid session" + starts, !starts.contains(invalid.getSessionStart()));
assertTrue("Contained invalid session" + starts, !starts.contains(invalid2.getSessionStart()));
assertTrue("Contained invalid session" + ends, !ends.contains(invalid2.getSessionEnd()));
assertTrue("Contained invalid session" + ends, !ends.contains(invalid2.getSessionEnd()));
assertTrue("Did not contain valid session" + starts, starts.contains(valid1.getSessionStart()));
assertTrue("Did not contain valid session" + ends, ends.contains(valid1.getSessionEnd()));
assertTrue("Did not contain valid session" + starts, starts.contains(valid2.getSessionStart()));
assertTrue("Did not contain valid session" + ends, ends.contains(valid2.getSessionEnd()));
assertTrue("Did not contain valid session" + starts, starts.contains(valid3.getSessionStart()));
assertTrue("Did not contain valid session" + ends, ends.contains(valid3.getSessionEnd()));
}
/**
*
*/
@Test
public void testGetSecond() {
Date test = new Date();
long exp = test.toInstant().getEpochSecond() * 1000L;
long result = PlayerActivityGraphCreator.getSecond(test.getTime());
assertEquals(exp, result);
}
/**
*
*/
@Test
public void testGetSecond2() {
long exp = 2000L;
long result = PlayerActivityGraphCreator.getSecond(2456L);
assertEquals(exp, result);
}
/**
*
*/
@Test
public void testGetSecond3() {
long exp = 2000L;
long result = PlayerActivityGraphCreator.getSecond(2956L);
assertEquals(exp, result);
// List<List<Long>> result = PlayerActivityGraphCreator.filterAndTransformSessions(test, nowMinusScale);
// List<Long> starts = result.get(0);
// List<Long> ends = result.get(1);
// assertTrue("Contained invalid session" + starts, !starts.contains(invalid.getSessionStart()));
// assertTrue("Contained invalid session" + starts, !starts.contains(invalid2.getSessionStart()));
// assertTrue("Contained invalid session" + ends, !ends.contains(invalid2.getSessionEnd()));
// assertTrue("Contained invalid session" + ends, !ends.contains(invalid2.getSessionEnd()));
// assertTrue("Did not contain valid session" + starts, starts.contains(valid1.getSessionStart()));
// assertTrue("Did not contain valid session" + ends, ends.contains(valid1.getSessionEnd()));
// assertTrue("Did not contain valid session" + starts, starts.contains(valid2.getSessionStart()));
// assertTrue("Did not contain valid session" + ends, ends.contains(valid2.getSessionEnd()));
// assertTrue("Did not contain valid session" + starts, starts.contains(valid3.getSessionStart()));
// assertTrue("Did not contain valid session" + ends, ends.contains(valid3.getSessionEnd()));
}
}