-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Cassandra Query Editor 초안 * system ui draft page
- Loading branch information
Showing
6 changed files
with
305 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
91 changes: 91 additions & 0 deletions
91
cadio-core/src/main/java/kr/hakdang/cadio/core/domain/cluster/ClusterQueryCommander.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
package kr.hakdang.cadio.core.domain.cluster; | ||
|
||
import com.datastax.oss.driver.api.core.CqlSession; | ||
import com.datastax.oss.driver.api.core.cql.ColumnDefinition; | ||
import com.datastax.oss.driver.api.core.cql.ColumnDefinitions; | ||
import com.datastax.oss.driver.api.core.cql.QueryTrace; | ||
import com.datastax.oss.driver.api.core.cql.ResultSet; | ||
import com.datastax.oss.driver.api.core.cql.Row; | ||
import com.datastax.oss.driver.api.core.cql.SimpleStatement; | ||
import com.datastax.oss.driver.api.core.cql.TraceEvent; | ||
import com.datastax.oss.driver.api.core.type.codec.TypeCodec; | ||
import com.datastax.oss.protocol.internal.util.Bytes; | ||
import io.micrometer.common.util.StringUtils; | ||
import lombok.extern.slf4j.Slf4j; | ||
import org.springframework.stereotype.Service; | ||
|
||
import java.nio.ByteBuffer; | ||
import java.time.Duration; | ||
import java.util.ArrayList; | ||
import java.util.HashMap; | ||
import java.util.Iterator; | ||
import java.util.List; | ||
import java.util.Map; | ||
|
||
/** | ||
* ClusterQueryCommander | ||
* | ||
* @author akageun | ||
* @since 2024-07-03 | ||
*/ | ||
@Slf4j | ||
@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) | ||
.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<>(); | ||
while (0 < resultSet.getAvailableWithoutFetching()) { | ||
rows.add(convertMap(definitions, page1Iter.next())); | ||
} | ||
|
||
ByteBuffer pagingStateAsBytes = resultSet.getExecutionInfo().getPagingState(); | ||
|
||
List<String> columnNames = new ArrayList<>(); | ||
for (ColumnDefinition definition : definitions) { | ||
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); | ||
} | ||
|
||
return ClusterQueryCommanderResult.builder() | ||
.wasApplied(resultSet.wasApplied()) | ||
.columnNames(columnNames) | ||
.rows(rows) | ||
.nextToken(Bytes.toHexString(pagingStateAsBytes)) | ||
.build(); | ||
} | ||
|
||
private Map<String, Object> convertMap(ColumnDefinitions definitions, Row row) { | ||
Map<String, Object> result = new HashMap<>(); | ||
|
||
for (int i = 0; i < definitions.size(); i++) { | ||
ColumnDefinition definition = definitions.get(i); | ||
String name = definition.getName().asCql(true); | ||
TypeCodec<Object> codec = row.codecRegistry().codecFor(definition.getType()); | ||
Object value = codec.decode(row.getBytesUnsafe(i), row.protocolVersion()); | ||
|
||
result.put(name, value); | ||
} | ||
|
||
return result; | ||
} | ||
} |
32 changes: 32 additions & 0 deletions
32
...-core/src/main/java/kr/hakdang/cadio/core/domain/cluster/ClusterQueryCommanderResult.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
package kr.hakdang.cadio.core.domain.cluster; | ||
|
||
import lombok.AccessLevel; | ||
import lombok.Builder; | ||
import lombok.Getter; | ||
import lombok.NoArgsConstructor; | ||
|
||
import java.util.List; | ||
import java.util.Map; | ||
|
||
/** | ||
* ClusterQueryCommanderResult | ||
* | ||
* @author akageun | ||
* @since 2024-07-03 | ||
*/ | ||
@Getter | ||
@NoArgsConstructor(access = AccessLevel.PRIVATE) | ||
public class ClusterQueryCommanderResult { | ||
private boolean wasApplied; | ||
private List<String> columnNames; | ||
private List<Map<String, Object>> rows; | ||
private String nextToken; | ||
|
||
@Builder | ||
public ClusterQueryCommanderResult(boolean wasApplied, List<String> columnNames, List<Map<String, Object>> rows, String nextToken) { | ||
this.wasApplied = wasApplied; | ||
this.columnNames = columnNames; | ||
this.rows = rows; | ||
this.nextToken = nextToken; | ||
} | ||
} |
65 changes: 65 additions & 0 deletions
65
cadio-web/src/main/java/kr/hakdang/cadio/web/route/cluster/ClusterQueryApi.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
package kr.hakdang.cadio.web.route.cluster; | ||
|
||
import com.datastax.oss.driver.api.core.CqlSession; | ||
import kr.hakdang.cadio.core.domain.cluster.ClusterQueryCommander; | ||
import kr.hakdang.cadio.core.domain.cluster.ClusterQueryCommanderResult; | ||
import kr.hakdang.cadio.web.common.dto.response.ApiResponse; | ||
import kr.hakdang.cadio.web.route.BaseSample; | ||
import lombok.AccessLevel; | ||
import lombok.Getter; | ||
import lombok.NoArgsConstructor; | ||
import lombok.extern.slf4j.Slf4j; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.web.bind.annotation.PostMapping; | ||
import org.springframework.web.bind.annotation.RequestBody; | ||
import org.springframework.web.bind.annotation.RequestMapping; | ||
import org.springframework.web.bind.annotation.RestController; | ||
|
||
import java.util.HashMap; | ||
import java.util.Map; | ||
|
||
import static java.util.Collections.emptyMap; | ||
|
||
/** | ||
* ClusterQueryApi | ||
* | ||
* @author akageun | ||
* @since 2024-07-03 | ||
*/ | ||
@Slf4j | ||
@RestController | ||
@RequestMapping("/api/cassandra/cluster") | ||
public class ClusterQueryApi extends BaseSample { | ||
|
||
@Autowired | ||
private ClusterQueryCommander clusterQueryCommander; | ||
|
||
@PostMapping("/query") | ||
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()); | ||
|
||
map.put("wasApplied", result1.isWasApplied()); | ||
map.put("nextToken", result1.getNextToken()); | ||
map.put("rows", result1.getRows()); | ||
map.put("columnNames", result1.getColumnNames()); | ||
} catch (Exception e) { | ||
log.error("error : {}", e.getMessage(), e); | ||
throw e; | ||
} | ||
|
||
|
||
return ApiResponse.ok(map); | ||
} | ||
|
||
@Getter | ||
@NoArgsConstructor(access = AccessLevel.PRIVATE) | ||
public static class ClusterQueryRequest { | ||
private String query; | ||
private String nextToken; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -20,6 +20,7 @@ const QueryHome = () => { | |
</div> | ||
|
||
<QueryEditor/> | ||
|
||
</> | ||
) | ||
} | ||
|
116 changes: 115 additions & 1 deletion
116
cadio-web/src/main/webapp/src/pages/cluster/components/query/query-editor.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters