Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions db/migration/V0082__Change_questionNumber_to_bigint.SQL
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
ALTER TABLE "Question"
ALTER COLUMN "questionNumber" TYPE BIGINT;

ALTER TABLE "QuestionBank"
ALTER COLUMN "questionNumber" TYPE BIGINT;
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public class Question {

private QuestionDifficulty questionDifficulty;

private int questionNumber;
private long questionNumber;

private String questionLink;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public class QuestionBank {

private String questionTitle;

private int questionNumber;
private long questionNumber;

private String questionLink;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.sql.Array;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.time.OffsetDateTime;
Expand Down Expand Up @@ -41,79 +42,40 @@
this.jdbcClient = jdbcClient;
this.questionTopicRepository = questionTopicRepository;
this.questionTopicService = questionTopicService;
this.questionRowMapper = (rs, rowNum) -> {
var questionId = rs.getString("id");
var userId = rs.getString("userId");
var questionSlug = rs.getString("questionSlug");
var questionDifficulty = QuestionDifficulty.valueOf(rs.getString("questionDifficulty"));
var questionNumber = rs.getInt("questionNumber");
var questionLink = rs.getString("questionLink");
int points = rs.getInt("pointsAwarded");
Optional<Integer> pointsAwarded = rs.wasNull() ? Optional.empty() : Optional.of(points);
var questionTitle = rs.getString("questionTitle");
var acceptanceRate = rs.getFloat("acceptanceRate");
var createdAt = rs.getTimestamp("createdAt").toLocalDateTime();
var submittedAt = rs.getTimestamp("submittedAt").toLocalDateTime();

return Question.builder()
.id(questionId)
.userId(userId)
.questionSlug(questionSlug)
.questionDifficulty(questionDifficulty)
.questionNumber(questionNumber)
.questionLink(questionLink)
.pointsAwarded(pointsAwarded)
.questionTitle(questionTitle)
.description(Optional.ofNullable(rs.getString("description")))
.acceptanceRate(acceptanceRate)
.createdAt(createdAt)
.submittedAt(submittedAt)
.runtime(Optional.ofNullable(rs.getString("runtime")))
.memory(Optional.ofNullable(rs.getString("memory")))
.code(Optional.ofNullable(rs.getString("code")))
.language(Optional.ofNullable(rs.getString("language")))
.submissionId(Optional.ofNullable(rs.getString("submissionId")))
.topics(questionTopicRepository.findQuestionTopicsByQuestionId(questionId))
.build();
};
this.questionWithUserRowMapper = (rs, rowNum) -> {
var questionId = rs.getString("id");
var userId = rs.getString("userId");
var questionSlug = rs.getString("questionSlug");
var questionDifficulty = QuestionDifficulty.valueOf(rs.getString("questionDifficulty"));
var questionNumber = rs.getInt("questionNumber");
var questionLink = rs.getString("questionLink");
int points = rs.getInt("pointsAwarded");
Optional<Integer> pointsAwarded = rs.wasNull() ? Optional.empty() : Optional.of(points);
var questionTitle = rs.getString("questionTitle");
var acceptanceRate = rs.getFloat("acceptanceRate");
var createdAt = rs.getTimestamp("createdAt").toLocalDateTime();
var submittedAt = rs.getTimestamp("submittedAt").toLocalDateTime();

return QuestionWithUser.builder()
.id(questionId)
.userId(userId)
.questionSlug(questionSlug)
.questionDifficulty(questionDifficulty)
.questionNumber(questionNumber)
.questionLink(questionLink)
.pointsAwarded(pointsAwarded)
.questionTitle(questionTitle)
.description(Optional.ofNullable(rs.getString("description")))
.acceptanceRate(acceptanceRate)
.createdAt(createdAt)
.submittedAt(submittedAt)
.runtime(Optional.ofNullable(rs.getString("runtime")))
.memory(Optional.ofNullable(rs.getString("memory")))
.code(Optional.ofNullable(rs.getString("code")))
.language(Optional.ofNullable(rs.getString("language")))
.submissionId(Optional.ofNullable(rs.getString("submissionId")))
.discordName(Optional.ofNullable(rs.getString("discordName")))
.leetcodeUsername(Optional.ofNullable(rs.getString("leetcodeUsername")))
.nickname(Optional.ofNullable(rs.getString("nickname")))
.topics(questionTopicRepository.findQuestionTopicsByQuestionId(questionId))
.build();
};
this.questionRowMapper =
(rs, rowNum) -> mapQuestionColumns(Question.builder(), rs).build();
this.questionWithUserRowMapper = (rs, rowNum) -> mapQuestionColumns(QuestionWithUser.builder(), rs)
.discordName(Optional.ofNullable(rs.getString("discordName")))
.leetcodeUsername(Optional.ofNullable(rs.getString("leetcodeUsername")))
.nickname(Optional.ofNullable(rs.getString("nickname")))
.build();
}

private <B extends Question.QuestionBuilder<?, ?>> B mapQuestionColumns(final B builder, final ResultSet rs)
throws SQLException {
var questionId = rs.getString("id");
int points = rs.getInt("pointsAwarded");
Optional<Integer> pointsAwarded = rs.wasNull() ? Optional.empty() : Optional.of(points);

builder.id(questionId)
.userId(rs.getString("userId"))

Check failure on line 61 in src/main/java/org/patinanetwork/codebloom/common/db/repos/question/QuestionSqlRepository.java

View check run for this annotation

SonarQubeCloud / [codebloom_backend] SonarCloud Code Analysis

Define a constant instead of duplicating this literal "userId" 3 times.

See more on https://sonarcloud.io/project/issues?id=Patina-Network_codebloom_backend&issues=AaESJ8yXTC6BsEiLA0zH&open=AaESJ8yXTC6BsEiLA0zH&pullRequest=992
.questionSlug(rs.getString("questionSlug"))
.questionDifficulty(QuestionDifficulty.valueOf(rs.getString("questionDifficulty")))
.questionNumber(rs.getLong("questionNumber"))
.questionLink(rs.getString("questionLink"))
.pointsAwarded(pointsAwarded)
.questionTitle(rs.getString("questionTitle"))
.description(Optional.ofNullable(rs.getString("description")))
.acceptanceRate(rs.getFloat("acceptanceRate"))
.createdAt(rs.getTimestamp("createdAt").toLocalDateTime())
.submittedAt(rs.getTimestamp("submittedAt").toLocalDateTime())
.runtime(Optional.ofNullable(rs.getString("runtime")))
.memory(Optional.ofNullable(rs.getString("memory")))
.code(Optional.ofNullable(rs.getString("code")))
.language(Optional.ofNullable(rs.getString("language")))
.submissionId(Optional.ofNullable(rs.getString("submissionId")))
.topics(questionTopicRepository.findQuestionTopicsByQuestionId(questionId));
return builder;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public QuestionBankSqlRepository(
var questionBankId = rs.getString("id");
var questionSlug = rs.getString("questionSlug");
var questionDifficulty = QuestionDifficulty.valueOf(rs.getString("questionDifficulty"));
var questionNumber = rs.getInt("questionNumber");
var questionNumber = rs.getLong("questionNumber");
var questionLink = rs.getString("questionLink");
var questionTitle = rs.getString("questionTitle");
var description = rs.getString("description");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public class QuestionBankDto {
private String questionTitle;

@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
private int questionNumber;
private long questionNumber;

@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
private String questionLink;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public class QuestionDto {
private QuestionDifficulty questionDifficulty;

@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
private int questionNumber;
private long questionNumber;

@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
private String questionLink;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public class QuestionWithUserDto {
private QuestionDifficulty questionDifficulty;

@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
private int questionNumber;
private long questionNumber;

@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
private String questionLink;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public interface LeetcodeClient {
List<LeetcodeSubmission> findSubmissionsByUsername(String username, int limit);

/** @implNote requires authentication */
LeetcodeDetailedQuestion findSubmissionDetailBySubmissionId(int submissionId);
LeetcodeDetailedQuestion findSubmissionDetailBySubmissionId(long submissionId);

POTD getPotd();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,8 @@ public LeetcodeQuestion findQuestionBySlug(final String slug) {
throw new LeetcodeClientException("LeetCode returned no question data");
}

int questionId =
node.path("data").path("question").path("questionId").asInt();
long questionId =
node.path("data").path("question").path("questionId").asLong();
String questionTitle =
node.path("data").path("question").path("title").asText();
String titleSlug =
Expand Down Expand Up @@ -258,7 +258,7 @@ public ArrayList<LeetcodeSubmission> findSubmissionsByUsername(final String user
}

for (JsonNode submission : submissionsNode) {
int id = submission.path("id").asInt();
long id = submission.path("id").asLong();
String title = submission.path("title").asText();
String titleSlug = submission.path("titleSlug").asText();
String timestampString = submission.path("timestamp").asText();
Expand All @@ -285,7 +285,7 @@ public ArrayList<LeetcodeSubmission> findSubmissionsByUsername(final String user
@Override
@Retry(name = "leetcodeClient")
@CircuitBreaker(name = "leetcodeClient")
public LeetcodeDetailedQuestion findSubmissionDetailBySubmissionId(final int submissionId) {
public LeetcodeDetailedQuestion findSubmissionDetailBySubmissionId(final long submissionId) {
String requestBody;
try {
requestBody = GetSubmissionDetails.body(submissionId);
Expand All @@ -312,10 +312,10 @@ public LeetcodeDetailedQuestion findSubmissionDetailBySubmissionId(final int sub
JsonNode node = mapper.readTree(body);
JsonNode baseNode = node.path("data").path("submissionDetails");

int runtime = baseNode.path("runtime").asInt();
long runtime = baseNode.path("runtime").asLong();
String runtimeDisplay = baseNode.path("runtimeDisplay").asText();
float runtimePercentile = (float) baseNode.path("runtimePercentile").asDouble();
int memory = baseNode.path("memory").asInt();
long memory = baseNode.path("memory").asLong();
String memoryDisplay = baseNode.path("memoryDisplay").asText();
float memoryPercentile = (float) baseNode.path("memoryPercentile").asDouble();
String code = baseNode.path("code").asText();
Expand Down Expand Up @@ -531,7 +531,7 @@ public List<LeetcodeQuestion> getAllProblems() {
result.add(LeetcodeQuestion.builder()
.link("https://leetcode.com/problems/"
+ question.get("titleSlug").asText())
.questionId(question.get("questionFrontendId").asInt())
.questionId(question.get("questionFrontendId").asLong())
.questionTitle(question.get("title").asText())
.titleSlug(question.get("titleSlug").asText())
.difficulty(question.get("difficulty").asText())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,20 @@

public class LeetcodeDetailedQuestion {

private int runtime;
private long runtime;
private String runtimeDisplay;
private float runtimePercentile;
private int memory;
private long memory;
private String memoryDisplay;
private float memoryPercentile;
private String code;
private Lang lang;

public LeetcodeDetailedQuestion(
final int runtime,
final long runtime,
final String runtimeDisplay,
final float runtimePercentile,
final int memory,
final long memory,
final String memoryDisplay,
final float memoryPercentile,
final String code,
Expand All @@ -30,11 +30,11 @@ public LeetcodeDetailedQuestion(
this.lang = lang;
}

public int getRuntime() {
public long getRuntime() {
return runtime;
}

public void setRuntime(final int runtime) {
public void setRuntime(final long runtime) {
this.runtime = runtime;
}

Expand All @@ -54,11 +54,11 @@ public void setRuntimePercentile(final float runtimePercentile) {
this.runtimePercentile = runtimePercentile;
}

public int getMemory() {
public long getMemory() {
return memory;
}

public void setMemory(final int memory) {
public void setMemory(final long memory) {
this.memory = memory;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
public class LeetcodeQuestion {

private String link;
private int questionId;
private long questionId;
private String questionTitle;
private String titleSlug;
private String difficulty;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@

public class LeetcodeSubmission {

private int id;
private long id;

private String title;
private String titleSlug;
private LocalDateTime timestamp;
private String statusDisplay;

public LeetcodeSubmission(
final int id,
final long id,
final String title,
final String titleSlug,
final LocalDateTime timestamp,
Expand All @@ -24,11 +24,11 @@ public LeetcodeSubmission(
this.statusDisplay = statusDisplay;
}

public int getId() {
public long getId() {
return id;
}

public void setId(final int id) {
public void setId(final long id) {
this.id = id;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,13 @@ query submissionDetails($submissionId: Int!) {
}
""";

public static String body(final int submissionId) throws JsonProcessingException {
public static String body(final long submissionId) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();

Map<String, Object> requestBodyMap = new HashMap<>();
requestBodyMap.put("query", QUERY);

Map<String, Integer> variables = new HashMap<>();
Map<String, Long> variables = new HashMap<>();
variables.put("submissionId", submissionId);
requestBodyMap.put("variables", variables);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public interface ThrottledLeetcodeClient extends LeetcodeClient {
List<LeetcodeSubmission> findSubmissionsByUsernameFast(String username, int limit);

/** @implNote requires authentication */
LeetcodeDetailedQuestion findSubmissionDetailBySubmissionIdFast(int submissionId);
LeetcodeDetailedQuestion findSubmissionDetailBySubmissionIdFast(long submissionId);

POTD getPotdFast();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public List<LeetcodeSubmission> findSubmissionsByUsernameFast(final String usern
}

@Override
public LeetcodeDetailedQuestion findSubmissionDetailBySubmissionIdFast(final int submissionId) {
public LeetcodeDetailedQuestion findSubmissionDetailBySubmissionIdFast(final long submissionId) {
waitForToken(true);
return leetcodeClient.findSubmissionDetailBySubmissionId(submissionId);
}
Expand Down Expand Up @@ -119,7 +119,7 @@ public List<LeetcodeSubmission> findSubmissionsByUsername(String username, int l
}

@Override
public LeetcodeDetailedQuestion findSubmissionDetailBySubmissionId(int submissionId) {
public LeetcodeDetailedQuestion findSubmissionDetailBySubmissionId(long submissionId) {
waitForToken(false);
return leetcodeClient.findSubmissionDetailBySubmissionId(submissionId);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,8 +214,8 @@ private void fetchAndUpdate(final Job job) {
&& question.getSubmissionId().isPresent()
&& !question.getSubmissionId().get().isEmpty()) {
try {
int submissionId =
Integer.parseInt(question.getSubmissionId().get());
long submissionId =
Long.parseLong(question.getSubmissionId().get());
log.info("Fetching submission details from Leetcode for submission ID: {}", submissionId);

var detailedSubmission = leetcodeClient.findSubmissionDetailBySubmissionId(submissionId);
Expand Down
Loading
Loading