Skip to content

Commit 0e3ca78

Browse files
Implement reverse operator
Functionality: reverse the edges from the input design space. Details: Upon selecting reverse operator a. Delete input option b. Display some guidance Close #14
1 parent bc4f342 commit 0e3ca78

File tree

6 files changed

+113
-10
lines changed

6 files changed

+113
-10
lines changed

src/main/java/knox/spring/data/neo4j/controller/KnoxController.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@
44
import java.io.InputStream;
55
import java.util.*;
66

7-
import knox.spring.data.neo4j.domain.DesignSpace;
87
import knox.spring.data.neo4j.exception.*;
98
import knox.spring.data.neo4j.sample.DesignSampler.EnumerateType;
10-
import knox.spring.data.neo4j.sbol.SBOLConversion;
119
import knox.spring.data.neo4j.services.DesignSpaceService;
1210

1311
import org.sbolstandard.core2.SBOLConversionException;
@@ -522,6 +520,38 @@ public ResponseEntity<String> mergeDesignSpaces(@RequestParam(value = "inputSpac
522520
}
523521
}
524522

523+
/**
524+
* @api {post} /designSpace/reverse Reverse
525+
* @apiName reverseDesignSpace
526+
* @apiGroup DesignSpace
527+
*
528+
* @apiParam {String} inputSpaceID ID for the input design space to be reversed.
529+
* @apiParam {String} outputSpaceID ID for the output design space resulting from reverse. If omitted, then the result is
530+
* stored in the input design space.
531+
*
532+
* @apiDescription Reverse the edges from the input design space.
533+
*/
534+
@RequestMapping(value = "/designSpace/reverse", method = RequestMethod.POST)
535+
public ResponseEntity<String> reverseDesignSpace(@RequestParam(value = "inputSpaceID", required = true) String inputSpaceID,
536+
@RequestParam(value = "outputSpaceID", required = false) String outputSpaceID) {
537+
try {
538+
long startTime = System.nanoTime();
539+
540+
if (outputSpaceID == null) {
541+
designSpaceService.reverseDesignSpace(inputSpaceID);
542+
} else {
543+
designSpaceService.reverseDesignSpace(inputSpaceID, outputSpaceID);
544+
}
545+
546+
return new ResponseEntity<String>("{\"message\": \"Design space was successfully reversed after " +
547+
(System.nanoTime() - startTime) + " ns.\"}", HttpStatus.NO_CONTENT);
548+
} catch (ParameterEmptyException | DesignSpaceNotFoundException |
549+
DesignSpaceConflictException | DesignSpaceBranchesConflictException ex) {
550+
return new ResponseEntity<String>("{\"message\": \"" + ex.getMessage() + "\"}",
551+
HttpStatus.BAD_REQUEST);
552+
}
553+
}
554+
525555
/**
526556
* @api {post} /designSpace/or OR
527557
* @apiName orDesignSpaces

src/main/java/knox/spring/data/neo4j/domain/Edge.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,6 @@ public boolean hasOrientation() {
555555
return isInline() || isReverseComplement();
556556
}
557557

558-
559558
public boolean hasOrientation(Orientation orientation) {
560559
return hasOrientation() && this.orientation.equals(orientation);
561560
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package knox.spring.data.neo4j.operations;
2+
3+
import knox.spring.data.neo4j.domain.Edge;
4+
import knox.spring.data.neo4j.domain.NodeSpace;
5+
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
import java.util.Set;
9+
10+
public class ReverseOperator {
11+
public static void apply(NodeSpace inputSpace, NodeSpace outputSpace) {
12+
//copy input space to a new output space
13+
outputSpace.copyNodeSpace(inputSpace);
14+
15+
Set<Edge> allEdges = outputSpace.getEdges();
16+
17+
//traverse all edges of input space and flip the orientation attribute
18+
for(Edge edge: allEdges){
19+
edge.reverseOrientation();
20+
}
21+
}
22+
}

src/main/java/knox/spring/data/neo4j/services/DesignSpaceService.java

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,11 @@
99
import knox.spring.data.neo4j.domain.Snapshot;
1010
import knox.spring.data.neo4j.exception.*;
1111
import knox.spring.data.neo4j.operations.ANDOperator;
12-
import knox.spring.data.neo4j.operations.Concatenation;
1312
import knox.spring.data.neo4j.operations.JoinOperator;
1413
import knox.spring.data.neo4j.operations.MergeOperator;
1514
import knox.spring.data.neo4j.operations.OROperator;
16-
import knox.spring.data.neo4j.operations.Product;
15+
import knox.spring.data.neo4j.operations.ReverseOperator;
1716
import knox.spring.data.neo4j.operations.RepeatOperator;
18-
import knox.spring.data.neo4j.operations.Star;
19-
import knox.spring.data.neo4j.operations.Union;
2017
import knox.spring.data.neo4j.repositories.BranchRepository;
2118
import knox.spring.data.neo4j.repositories.CommitRepository;
2219
import knox.spring.data.neo4j.repositories.DesignSpaceRepository;
@@ -325,7 +322,31 @@ public void mergeBranches(String targetSpaceID, List<String> inputBranchIDs,
325322

326323
saveDesignSpace(targetSpace);
327324
}
328-
325+
326+
public void reverseDesignSpace(String inputSpaceID) {
327+
reverseDesignSpace(inputSpaceID, inputSpaceID);
328+
}
329+
330+
public void reverseDesignSpace(String inputSpaceID, String outputSpaceID) {
331+
List<String> inputSpaceIDs = new ArrayList<>();
332+
inputSpaceIDs.add(inputSpaceID);
333+
List<NodeSpace> inputSpaces = new ArrayList<NodeSpace>(inputSpaceIDs.size());
334+
335+
DesignSpace outputSpace = loadIOSpaces(inputSpaceIDs, outputSpaceID, inputSpaces);
336+
337+
ReverseOperator.apply(inputSpaces.get(0), outputSpace);
338+
339+
340+
List<NodeSpace> inputSnaps = new ArrayList<NodeSpace>(inputSpaces.size());
341+
342+
NodeSpace outputSnap = mergeVersionHistories(castNodeSpacesToDesignSpaces(inputSpaces),
343+
outputSpace, inputSnaps);
344+
345+
ReverseOperator.apply(inputSnaps.get(0), outputSnap);
346+
347+
saveDesignSpace(outputSpace);
348+
}
349+
329350
private DesignSpace loadIOSpaces(List<String> inputSpaceIDs, String outputSpaceID,
330351
List<NodeSpace> inputSpaces) {
331352
for (String inputSpaceID : inputSpaceIDs) {
@@ -863,7 +884,8 @@ private DesignSpace findDesignSpace(String targetSpaceID) {
863884
}
864885

865886
private DesignSpace loadDesignSpace(String targetSpaceID) {
866-
DesignSpace targetSpace = designSpaceRepository.findOne(getDesignSpaceGraphID(targetSpaceID), 3);
887+
Long keyID = getDesignSpaceGraphID(targetSpaceID);
888+
DesignSpace targetSpace = designSpaceRepository.findOne(keyID, 3);
867889

868890
for (Commit commit : targetSpace.getCommits()) {
869891
commit.setSnapshot(reloadSnapshot(commit.getSnapshot()));

src/main/resources/static/js/endpoints.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ export const operators = {
3030
OR: 'or',
3131
AND: 'and',
3232
MERGE: 'merge',
33-
REPEAT: 'repeat'
33+
REPEAT: 'repeat',
34+
REVERSE: 'reverse'
3435
};
3536

3637

@@ -288,4 +289,19 @@ export function designSpaceMerge(inputSpaces, outputSpace, tolerance){
288289
} else {
289290
swalError(request.response);
290291
}
292+
}
293+
294+
export function designSpaceReverse(inputSpace, outputSpace){
295+
let query = "?";
296+
query += encodeQueryParameter("inputSpaceID", inputSpace, query);
297+
query += encodeQueryParameter("outputSpaceID", outputSpace, query);
298+
299+
let request = new XMLHttpRequest();
300+
request.open("POST", endpoints.DESIGN + "/" + operators.REVERSE + query, false);
301+
request.send(null);
302+
if (request.status >= 200 && request.status < 300) {
303+
swalSuccess();
304+
} else {
305+
swalError(request.response);
306+
}
291307
}

src/main/resources/static/js/knox.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,15 @@ $('#apply-operators-tooltip').click(() => {
517517
}
518518
div.appendChild(tolDiv);
519519
}
520+
if(this.value === endpoint.operators.REVERSE){
521+
if(div.contains(inputDiv)){
522+
div.removeChild(inputDiv);
523+
}
524+
const guidance = document.createElement("P");
525+
const text = document.createTextNode("The current designSpace will be reversed.");
526+
guidance.appendChild(text);
527+
div.appendChild(guidance);
528+
}
520529
});
521530

522531
swal({
@@ -557,6 +566,11 @@ $('#apply-operators-tooltip').click(() => {
557566
case endpoint.operators.MERGE:
558567
endpoint.designSpaceMerge(inputSpaces, outputSpace, tolerance);
559568
break;
569+
570+
case endpoint.operators.REVERSE:
571+
// the reverse operator would only reverse one inputSpace
572+
endpoint.designSpaceReverse(inputSpaces[0], outputSpace);
573+
break;
560574
}
561575
}
562576
});

0 commit comments

Comments
 (0)