Skip to content

Commit

Permalink
Query Editor Draft 2 (#20)
Browse files Browse the repository at this point in the history
  • Loading branch information
akageun committed Jul 3, 2024
1 parent 326ab43 commit 2dcbe28
Show file tree
Hide file tree
Showing 7 changed files with 248 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,20 +32,19 @@
@Service
public class ClusterQueryCommander {

public ClusterQueryCommanderResult execute(CqlSession session, String query, String nextTokenParam) {
SimpleStatement statement = SimpleStatement.builder(query)
.setPageSize(2) // 10 per pages
.setTimeout(Duration.ofSeconds(3)) // 3s timeout
.setPagingState(StringUtils.isNotBlank(nextTokenParam) ? Bytes.fromHexString(nextTokenParam) : null)
.setTracing(false)
public ClusterQueryCommanderResult execute(CqlSession session, ClusterQueryCommanderArgs args) {
SimpleStatement statement = SimpleStatement.builder(args.getQuery())
.setPageSize(args.getPageSize()) // 10 per pages
.setTimeout(Duration.ofSeconds(args.getTimeoutSeconds())) // 3s timeout
.setPagingState(StringUtils.isNotBlank(args.getCursor()) ? Bytes.fromHexString(args.getCursor()) : null)
.setTracing(args.isTrace())
.build();
//.setConsistencyLevel(ConsistencyLevel.ONE);

ResultSet resultSet = session.execute(statement);

ColumnDefinitions definitions = resultSet.getColumnDefinitions();

//log.info("+ Page 1 has {} items", resultSet.getAvailableWithoutFetching());
Iterator<Row> page1Iter = resultSet.iterator();

List<Map<String, Object>> rows = new ArrayList<>();
Expand All @@ -57,20 +56,24 @@ public ClusterQueryCommanderResult execute(CqlSession session, String query, Str

List<String> columnNames = new ArrayList<>();
for (ColumnDefinition definition : definitions) {
//TODO : 컬럼 정보 이름 외에도 추가하기
columnNames.add(definition.getName().asCql(true));
}

QueryTrace queryTrace = resultSet.getExecutionInfo().getQueryTrace();
log.info("query Trace : {}", queryTrace.getTracingId());
for (TraceEvent event : queryTrace.getEvents()) {
log.info("event : {}", event);
if (args.isTrace()) {
QueryTrace queryTrace = resultSet.getExecutionInfo().getQueryTrace();
log.info("query Trace : {}", queryTrace.getTracingId());
for (TraceEvent event : queryTrace.getEvents()) {
log.info("event : {}", event);
//TODO : 추적값 담기
}
}

return ClusterQueryCommanderResult.builder()
.wasApplied(resultSet.wasApplied())
.columnNames(columnNames)
.rows(rows)
.nextToken(Bytes.toHexString(pagingStateAsBytes))
.nextCursor(pagingStateAsBytes != null ? Bytes.toHexString(pagingStateAsBytes) : null)
.build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package kr.hakdang.cadio.core.domain.cluster;

import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

/**
* ClusterQueryCommanderArgs
*
* @author akageun
* @since 2024-07-03
*/
@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ClusterQueryCommanderArgs {
private String query;
private String cursor;
private int pageSize;
private int timeoutSeconds;
private boolean trace = false;

@Builder
public ClusterQueryCommanderArgs(String query, String cursor, Integer pageSize, Integer timeoutSeconds, boolean trace) {
if (pageSize == null || pageSize <= 0) {
pageSize = 50;
}

if (pageSize > 500) {
throw new RuntimeException("pageSize 500 over");
}

if (timeoutSeconds == null || timeoutSeconds <= 0) {
timeoutSeconds = 3; //default 3
}

if (timeoutSeconds > 60) {
throw new RuntimeException("timeout 60 over");
}

this.query = query;
this.cursor = cursor;
this.pageSize = pageSize;
this.timeoutSeconds = timeoutSeconds;
this.trace = trace;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,15 @@ public class ClusterQueryCommanderResult {
private boolean wasApplied;
private List<String> columnNames;
private List<Map<String, Object>> rows;
private String nextToken;
private String previousCursor;
private String nextCursor;

@Builder
public ClusterQueryCommanderResult(boolean wasApplied, List<String> columnNames, List<Map<String, Object>> rows, String nextToken) {
public ClusterQueryCommanderResult(boolean wasApplied, List<String> columnNames, List<Map<String, Object>> rows, String previousCursor, String nextCursor) {
this.wasApplied = wasApplied;
this.columnNames = columnNames;
this.rows = rows;
this.nextToken = nextToken;
this.previousCursor = previousCursor;
this.nextCursor = nextCursor;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package kr.hakdang.cadio.web.route.cluster;
package kr.hakdang.cadio.web.route.cluster.query;

import com.datastax.oss.driver.api.core.CqlSession;
import kr.hakdang.cadio.core.domain.cluster.ClusterQueryCommander;
Expand All @@ -18,8 +18,6 @@
import java.util.HashMap;
import java.util.Map;

import static java.util.Collections.emptyMap;

/**
* ClusterQueryApi
*
Expand All @@ -38,13 +36,12 @@ public class ClusterQueryApi extends BaseSample {
public ApiResponse<Map<String, Object>> clusterQueryCommand(
@RequestBody ClusterQueryRequest request
) {

Map<String, Object> map = new HashMap<>();
try (CqlSession session = makeSession()) { //TODO : interface 작업할 때 facade layer 로 변경 예정
ClusterQueryCommanderResult result1 = clusterQueryCommander.execute(session, request.getQuery(), request.getNextToken());
ClusterQueryCommanderResult result1 = clusterQueryCommander.execute(session, request.makeArgs());

map.put("wasApplied", result1.isWasApplied());
map.put("nextToken", result1.getNextToken());
map.put("nextCursor", result1.getNextCursor());
map.put("rows", result1.getRows());
map.put("columnNames", result1.getColumnNames());
} catch (Exception e) {
Expand All @@ -55,11 +52,4 @@ public ApiResponse<Map<String, Object>> clusterQueryCommand(

return ApiResponse.ok(map);
}

@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public static class ClusterQueryRequest {
private String query;
private String nextToken;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package kr.hakdang.cadio.web.route.cluster.query;

import kr.hakdang.cadio.core.domain.cluster.ClusterQueryCommanderArgs;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

/**
* ClusterQueryRequest
*
* @author akageun
* @since 2024-07-03
*/
@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ClusterQueryRequest {
private String query;
private String cursor;
private int pageSize;
private int timeoutSeconds;
private boolean trace = false;

@Builder
public ClusterQueryRequest(String query, String cursor, int pageSize, int timeoutSeconds, boolean trace) {
this.query = query;
this.cursor = cursor;
this.pageSize = pageSize;
this.timeoutSeconds = timeoutSeconds;
this.trace = trace;
}

public ClusterQueryCommanderArgs makeArgs() {
return ClusterQueryCommanderArgs.builder()
.query(query)
.cursor(cursor)
.pageSize(pageSize)
.timeoutSeconds(timeoutSeconds)
.trace(trace)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package kr.hakdang.cadio.web.route.cluster.query;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Map;

/**
* ClusterQueryResponse
*
* @author akageun
* @since 2024-07-03
*/
@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ClusterQueryResponse {
private boolean wasApplied;
private List<String> columnNames;
private List<Map<String, Object>> rows;
private String nextToken;


}
Loading

0 comments on commit 2dcbe28

Please sign in to comment.