Skip to content
Snippets Groups Projects
Commit fde69e0d authored by Sven Kästle's avatar Sven Kästle
Browse files

refactor: Change database representation of submission part

Id was replaced by a composite primary key
parent 3aa2136f
No related branches found
No related tags found
No related merge requests found
package unipotsdam.gf.interfaces;
import unipotsdam.gf.modules.peer2peerfeedback.Category;
import unipotsdam.gf.modules.submission.model.FullSubmission;
import unipotsdam.gf.modules.submission.model.FullSubmissionPostRequest;
import unipotsdam.gf.modules.submission.model.SubmissionPart;
......@@ -48,10 +49,11 @@ public interface ISubmission {
/**
* Get the entire submission part from database
*
* @param submissionPartId The id of the submission part
* @return The new submission part
* @param fullSubmissionId The id of the full submission
* @param category The category of the submission
* @return The returned submission part
*/
SubmissionPart getSubmissionPart(String submissionPartId);
SubmissionPart getSubmissionPart(String fullSubmissionId, Category category);
/**
* Get all submission parts based on an id
......@@ -62,11 +64,12 @@ public interface ISubmission {
ArrayList<SubmissionPart> getAllSubmissionParts(String fullSubmissionId);
/**
* Checks if a submission part id already exists in the database
* Checks if a submission part already exists in the database
*
* @param submissionPartId The id of the submission part
* @return Returns true if the id exists
* @param fullSubmissionId The id of the full submission
* @param category The category of the submission
* @return Returns true if the submission part exists
*/
boolean existsSubmissionPartId(String submissionPartId);
boolean existsSubmissionPart(String fullSubmissionId, Category category);
}
......@@ -108,28 +108,22 @@ public class SubmissionController implements ISubmission {
@Override
public SubmissionPart addSubmissionPart(SubmissionPartPostRequest submissionPartPostRequest) {
// create a new id if we found no id.
String uuid = UUID.randomUUID().toString();
while (existsSubmissionPartId(uuid)) {
uuid = UUID.randomUUID().toString();
}
// establish connection
MysqlConnect connection = new MysqlConnect();
connection.connect();
// build and execute request
String request = "INSERT INTO submissionparts (`id`, `userId`, `fullSubmissionId`, `category`) VALUES (?,?,?,?);";
connection.issueInsertOrDeleteStatement(request, uuid, submissionPartPostRequest.getUserId(), submissionPartPostRequest.getFullSubmissionId(), submissionPartPostRequest.getCategory().toString());
String request = "INSERT IGNORE INTO submissionparts (`userId`, `fullSubmissionId`, `category`) VALUES (?,?,?);";
connection.issueInsertOrDeleteStatement(request, submissionPartPostRequest.getUserId(), submissionPartPostRequest.getFullSubmissionId(), submissionPartPostRequest.getCategory().toString().toUpperCase());
// build and execute body requests
String requestElement = "INSERT INTO submissionpartbodyelements (`submissionPartId`, `text`, `startCharacter`, `endCharacter`) VALUES (?,?,?,?)";
String requestElement = "INSERT IGNORE INTO submissionpartbodyelements (`fullSubmissionId`, `category`, `text`, `startCharacter`, `endCharacter`) VALUES (?,?,?,?,?)";
for (SubmissionPartBodyElement element : submissionPartPostRequest.getBody()) {
connection.issueInsertOrDeleteStatement(requestElement, uuid, element.getText(), element.getStartCharacter(), element.getEndCharacter());
connection.issueInsertOrDeleteStatement(requestElement, submissionPartPostRequest.getFullSubmissionId(), submissionPartPostRequest.getCategory().toString().toUpperCase(), element.getText(), element.getStartCharacter(), element.getEndCharacter());
}
// get the new submission from database
SubmissionPart submissionPart = getSubmissionPart(uuid);
SubmissionPart submissionPart = getSubmissionPart(submissionPartPostRequest.getFullSubmissionId(), submissionPartPostRequest.getCategory());
// close connection
connection.close();
......@@ -139,15 +133,20 @@ public class SubmissionController implements ISubmission {
}
@Override
public SubmissionPart getSubmissionPart(String submissionPartId) {
public SubmissionPart getSubmissionPart(String fullSubmissionId, Category category) {
// establish connection
MysqlConnect connection = new MysqlConnect();
connection.connect();
// build and execute request
String request = "SELECT * FROM submissionparts LEFT JOIN submissionpartbodyelements ON id = submissionPartId WHERE id = ?;";
VereinfachtesResultSet rs = connection.issueSelectStatement(request, submissionPartId);
String request = "SELECT * FROM submissionparts s " +
"LEFT JOIN submissionpartbodyelements b " +
"ON s.fullSubmissionId = b.fullSubmissionId " +
"AND s.category = b.category " +
"WHERE s.fullSubmissionId = ? " +
"AND s.category = ?;";
VereinfachtesResultSet rs = connection.issueSelectStatement(request, fullSubmissionId, category);
if (rs.next()) {
// save submission
......@@ -176,11 +175,12 @@ public class SubmissionController implements ISubmission {
// build and execute request
String request = "SELECT * " +
"FROM submissionparts " +
"LEFT JOIN submissionpartbodyelements " +
"ON id = submissionPartId " +
"WHERE fullSubmissionId = ? " +
"ORDER BY id;";
"FROM submissionparts sp " +
"LEFT JOIN submissionpartbodyelements spbe " +
"ON sp.fullSubmissionId = spbe.fullSubmissionId " +
"AND sp.category = spbe.category " +
"WHERE sp.fullSubmissionId = ? " +
"ORDER BY sp.timestamp;";
VereinfachtesResultSet rs = connection.issueSelectStatement(request, fullSubmissionId);
ArrayList<SubmissionPart> submissionParts = new ArrayList<>();
......@@ -198,15 +198,15 @@ public class SubmissionController implements ISubmission {
}
@Override
public boolean existsSubmissionPartId(String submissionPartId) {
public boolean existsSubmissionPart(String fullSubmissionId, Category category) {
// establish connection
MysqlConnect connection = new MysqlConnect();
connection.connect();
// build and execute request
String request = "SELECT COUNT(*) > 0 AS `exists` FROM submissionparts WHERE id = ?;";
VereinfachtesResultSet rs = connection.issueSelectStatement(request, submissionPartId);
String request = "SELECT COUNT(*) > 0 AS `exists` FROM submissionparts WHERE fullSubmissionId = ? AND category = ?;";
VereinfachtesResultSet rs = connection.issueSelectStatement(request, fullSubmissionId, category);
if (rs.next()) {
// save the response
......@@ -238,7 +238,7 @@ public class SubmissionController implements ISubmission {
private FullSubmission getFullSubmissionFromResultSet(VereinfachtesResultSet rs) {
String id = rs.getString("id");
long timestamp = rs.getTimestamp(2).getTime();
long timestamp = rs.getTimestamp("timestamp").getTime();
String user = rs.getString("user");
String text = rs.getString("text");
......@@ -254,7 +254,6 @@ public class SubmissionController implements ISubmission {
*/
private SubmissionPart getSubmissionPartFromResultSet(VereinfachtesResultSet rs) {
String id = rs.getString("id");
long timestamp = rs.getTimestamp("timestamp").getTime();
String userId = rs.getString("userId");
String fullSubmissionId = rs.getString("fullSubmissionId");
......@@ -265,7 +264,7 @@ public class SubmissionController implements ISubmission {
do {
// only add it if the element is not empty
if (!Strings.isNullOrEmpty(rs.getString("submissionPartId"))) {
if (!Strings.isNullOrEmpty(rs.getString("text"))) {
SubmissionPartBodyElement element = new SubmissionPartBodyElement(
rs.getString("text"),
rs.getInt("startCharacter"),
......@@ -275,9 +274,15 @@ public class SubmissionController implements ISubmission {
}
} while (rs.next());
return new SubmissionPart(id, timestamp, userId, fullSubmissionId, category, body);
return new SubmissionPart(timestamp, userId, fullSubmissionId, category, body);
}
/**
* Build an array of submission part objects from a given result set
*
* @param rs The result set from the database query, holding different submission parts
* @return An array of submission parts
*/
private ArrayList<SubmissionPart> getAllSubmissionPartsFromResultSet(VereinfachtesResultSet rs) {
ArrayList<SubmissionPart> submissionParts = new ArrayList<>();
......@@ -300,7 +305,6 @@ public class SubmissionController implements ISubmission {
// build submission part with empty body
tmpPart = new SubmissionPart(
rs.getString("id"),
rs.getTimestamp("timestamp").getTime(),
rs.getString("userId"),
rs.getString("fullSubmissionId"),
......@@ -322,7 +326,6 @@ public class SubmissionController implements ISubmission {
// add last part
submissionParts.add(tmpPart);
System.out.println(submissionParts.toString());
return submissionParts;
}
......
......@@ -11,7 +11,6 @@ import java.util.ArrayList;
public class SubmissionPart {
// variables
private String id;
private long timestamp;
private String userId;
private String fullSubmissionId;
......@@ -19,8 +18,7 @@ public class SubmissionPart {
private ArrayList<SubmissionPartBodyElement> body;
// constructor
public SubmissionPart(String id, long timestamp, String userId, String fullSubmissionId, Category category, ArrayList<SubmissionPartBodyElement> body) {
this.id = id;
public SubmissionPart(long timestamp, String userId, String fullSubmissionId, Category category, ArrayList<SubmissionPartBodyElement> body) {
this.timestamp = timestamp;
this.userId = userId;
this.fullSubmissionId = fullSubmissionId;
......@@ -31,14 +29,6 @@ public class SubmissionPart {
public SubmissionPart(){}
// methods
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public long getTimestamp() {
return timestamp;
}
......@@ -82,8 +72,7 @@ public class SubmissionPart {
@Override
public String toString() {
return "SubmissionPart{" +
"id='" + id + '\'' +
", timestamp=" + timestamp +
"timestamp=" + timestamp +
", userId='" + userId + '\'' +
", fullSubmissionId='" + fullSubmissionId + '\'' +
", category=" + category +
......
package unipotsdam.gf.modules.submission.view;
import unipotsdam.gf.modules.peer2peerfeedback.Category;
import unipotsdam.gf.modules.submission.controller.SubmissionController;
import unipotsdam.gf.modules.submission.model.*;
......@@ -60,11 +61,11 @@ public class SubmissionService {
}
@GET
@Path("/part/{id}")
public Response getSubmissionPart(@PathParam("id") String submissionPartId) {
@Path("/full/{id}/category/{category}")
public Response getSubmissionPart(@PathParam("id") String fullSubmissionId, @PathParam("category") String category) {
// get submission part from database based by id
SubmissionController controller = new SubmissionController();
SubmissionPart submissionPart = controller.getSubmissionPart(submissionPartId);
SubmissionPart submissionPart = controller.getSubmissionPart(fullSubmissionId, Category.valueOf(category.toUpperCase()));
if (submissionPart != null) {
return Response.ok(submissionPart).build();
......@@ -72,7 +73,7 @@ public class SubmissionService {
else {
// declare response
SubmissionResponse response = new SubmissionResponse();
response.setMessage("Submission part with the id '" + submissionPartId + "' can't be found");
response.setMessage("Submission part with the full submission id '" + fullSubmissionId + "' and the category '" + category.toUpperCase() + "' can't be found");
return Response.status(Response.Status.NOT_FOUND).entity(response).build();
}
......
......@@ -130,20 +130,20 @@ CREATE TABLE if not exists `fullsubmissions` (
) ENGINE = InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE if not exists `submissionparts` (
`id` VARCHAR(120) NOT NULL,
`timestamp` TIMESTAMP on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`userId` VARCHAR(120) NOT NULL,
`fullSubmissionId` VARCHAR(120) NOT NULL,
`category` VARCHAR(30) NOT NULL,
PRIMARY KEY (`id`)
PRIMARY KEY (`fullSubmissionId`, `category`)
) ENGINE = InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE if not exists `submissionpartbodyelements` (
`submissionPartId` VARCHAR(120) NOT NULL,
`fullSubmissionId` VARCHAR(120) NOT NULL,
`category` VARCHAR(30) NOT NULL,
`text` MEDIUMTEXT NOT NULL,
`startCharacter` int(11) NOT NULL,
`endCharacter` int(11) NOT NULL,
PRIMARY KEY (`submissionPartId`, `startCharacter`, `endCharacter`)
PRIMARY KEY (`fullSubmissionId`, `category`, `startCharacter`, `endCharacter`)
) ENGINE = InnoDB DEFAULT CHARSET=utf8;
alter table users
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment