Skip to content

Commit

Permalink
table list menu
Browse files Browse the repository at this point in the history
  • Loading branch information
slorello89 committed Apr 27, 2023
1 parent b7641fc commit f2d5229
Show file tree
Hide file tree
Showing 12 changed files with 744 additions and 136 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -511,7 +511,7 @@ public static final class Builder {
private List<String> queryIds;
private Duration ttl = DEFAULT_TTL;

private Builder() {
public Builder() {
}

public Builder tables(String... tables) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.dataformat.javaprop.JavaPropsMapper;
import com.redis.lettucemod.api.StatefulRedisModulesConnection;
import com.redis.lettucemod.util.RedisModulesUtils;
import com.redis.smartcache.core.Config.RulesetConfig;
import com.redis.smartcache.core.Config.RuleConfig;

import io.lettuce.core.AbstractRedisClient;

Expand All @@ -25,6 +29,13 @@ public RulesetConfig getRuleset(Config config) {
return configManagers.computeIfAbsent(config, this::createConfigManager).get();
}

public void pushUpdatedRules(Config conf){
List<RuleConfig> rules = conf.getRuleset().getRules();
AbstractRedisClient client = clientManager.getClient(conf);
StatefulRedisModulesConnection<String, String> connection = RedisModulesUtils.connection(client);

}

private ConfigManager<RulesetConfig> createConfigManager(Config config) {
AbstractRedisClient client = clientManager.getClient(config);
String key = KeyBuilder.of(config).build(KEY_CONFIG);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@ public void start() throws IOException {
Executors.newSingleThreadExecutor().submit(reader);
}

public void pushUpdatedRules(){

}

@SuppressWarnings("unchecked")
private void update(StreamMessage<String, String> message) {
T newConfig;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Random;
import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package com.redis.smartcache.cli;

import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
SpringApplication app = new SpringApplication(Application.class);
app.setLogStartupInfo(false);
app.setBannerMode(Banner.Mode.OFF);
app.run();
}

}
Original file line number Diff line number Diff line change
@@ -1,29 +1,18 @@
package com.redis.smartcache.cli;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.dataformat.javaprop.JavaPropsMapper;
import com.redis.lettucemod.api.StatefulRedisModulesConnection;
import com.redis.lettucemod.api.sync.RediSearchCommands;
import com.redis.lettucemod.api.sync.RedisTimeSeriesCommands;
import com.redis.lettucemod.search.Document;
import com.redis.lettucemod.search.SearchResults;
import com.redis.lettucemod.timeseries.GetResult;
import com.redis.lettucemod.timeseries.Label;
import com.redis.smartcache.cli.structures.QueryInfo;
import com.redis.smartcache.cli.util.Util;
import com.redis.smartcache.core.ClientManager;
import com.redis.smartcache.core.Config;
import com.redis.smartcache.core.Config.RuleConfig;
import com.redis.smartcache.core.Query;
import com.redis.smartcache.core.RulesetManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import io.airlift.units.Duration;

import java.util.*;
import java.util.concurrent.TimeUnit;

@Service
public class RedisServiceImpl implements RedisService{
Expand All @@ -41,7 +30,7 @@ public String ping(){
return connection.sync().ping();
}

public List<RuleConfig> GetRules(){
public List<RuleConfig> getRules(){
RulesetManager rulesetManager = new RulesetManager(manager);

Config.RulesetConfig ruleSetConfig = rulesetManager.getRuleset(conf);
Expand All @@ -63,7 +52,7 @@ static String IndexName(String applicationName){

public List<QueryInfo> getQueries(String applicationName){
List<QueryInfo> response = new ArrayList<>();
List<RuleConfig> rules = GetRules();
List<RuleConfig> rules = getRules();

RediSearchCommands<String, String> searchCommands = connection.sync();

Expand All @@ -79,4 +68,9 @@ public List<QueryInfo> getQueries(String applicationName){
}
return response;
}

public void commitNewRules(List<RuleConfig> rules){
conf.getRuleset().setRules(rules);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@
import com.redis.smartcache.cli.RedisServiceImpl;
import com.redis.smartcache.cli.components.TableSelector;
import com.redis.smartcache.cli.structures.QueryInfo;
import com.redis.smartcache.core.Config.RuleConfig;
import com.redis.smartcache.core.rules.Rule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.shell.component.StringInput;
import org.springframework.shell.component.support.SelectorItem;
import org.springframework.shell.standard.AbstractShellComponent;
import org.springframework.shell.standard.ShellComponent;
import org.springframework.shell.standard.ShellMethod;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import io.airlift.units.Duration;
import java.util.*;

@ShellComponent
public class Commands extends AbstractShellComponent {
Expand All @@ -26,19 +26,87 @@ String ping(){

@ShellMethod(key = "list-queries", value = "Get the table of queries", group = "Components")
public String queryTable(){
List<RuleConfig> rules = client.getRules();

Map<Duration, RuleConfig> pendingRules = new HashMap<>();

List<SelectorItem<QueryInfo>> queries = new ArrayList<>();

for (QueryInfo q : client.getQueries("smartcache")){
queries.add(SelectorItem.of(q.getQueryId(),q));
}

TableSelector<QueryInfo, SelectorItem<QueryInfo>> component = new TableSelector<>(getTerminal(),
queries, "queries", null, QueryInfo.getHeaderRow((getTerminal().getWidth()-10)/8));
component.setResourceLoader(getResourceLoader());
component.setTemplateExecutor(getTemplateExecutor());
TableSelector.SingleItemSelectorContext<QueryInfo, SelectorItem<QueryInfo>> context = component
.run(TableSelector.SingleItemSelectorContext.empty());
QueryInfo result = context.getResultItem().flatMap(si -> Optional.ofNullable(si.getItem())).get();
return "Got value " + result.toString();
while(true){
TableSelector<QueryInfo, SelectorItem<QueryInfo>> component = new TableSelector<>(getTerminal(),
queries, "queries", null, QueryInfo.getHeaderRow((getTerminal().getWidth()-10)/8), true);
component.setResourceLoader(getResourceLoader());
component.setTemplateExecutor(getTemplateExecutor());
TableSelector.SingleItemSelectorContext<QueryInfo, SelectorItem<QueryInfo>> context = component
.run(TableSelector.SingleItemSelectorContext.empty());

Optional<SelectorItem<QueryInfo>> resOpt = context.getResultItem();

if (component.isConfirmMode()){
Set<String> validResponses = new HashSet<>(Arrays.asList("y","Y","n","N"));
Optional<Boolean> confirmed = Optional.empty();
while(!confirmed.isPresent()){

String prompt = "Confirm pending updates y/n";
StringInput stringInputComponent = new StringInput(getTerminal(), prompt,"n");
stringInputComponent.setResourceLoader(getResourceLoader());
stringInputComponent.setTemplateExecutor(getTemplateExecutor());
StringInput.StringInputContext stringInputContext = stringInputComponent.run(StringInput.StringInputContext.empty());
String confirmationInput = stringInputContext.getResultValue();
if(validResponses.contains(confirmationInput)){
confirmed = Optional.of(confirmationInput.equalsIgnoreCase("y"));
}

if(confirmed.get()){
for(RuleConfig rule : pendingRules.values()){
rules.add(0, rule);
}
}
else{
component.setConfirmMode(false);
}
}
}
else if (resOpt.isPresent()){
QueryInfo result = resOpt.get().getItem();

String info = result.toFormattedString(getTerminal().getWidth());
Optional<Duration> duration = Optional.empty();

String prompt = String.format("%s%nEnter TTL:", info);

while (!duration.isPresent()){
StringInput stringInputComponent = new StringInput(getTerminal(),prompt,"30m");
stringInputComponent.setResourceLoader(getResourceLoader());
stringInputComponent.setTemplateExecutor(getTemplateExecutor());
StringInput.StringInputContext stringInputContext = stringInputComponent.run(StringInput.StringInputContext.empty());
try {
duration = Optional.of(Duration.valueOf(stringInputContext.getResultValue()));
} catch (IllegalArgumentException ex){
prompt = String.format("%s%nPrevious Input was Invalid%nEnter TTL", info);
}
}

RuleConfig rule;
if(pendingRules.containsKey(duration.get())){
pendingRules.get(duration.get()).getQueryIds().add(result.getQueryId());
rule = pendingRules.get(duration.get());
}else{
rule = new RuleConfig.Builder().queryIds(result.getQueryId()).ttl(duration.get()).build();
pendingRules.put(duration.get(),rule);
}
queries.get(context.getCursorRow()).getItem().setPendingRule(rule);
// return String.format("Selected query id: %s index: %d, ttl: %s", result.getQueryId(), context.getCursorRow(), stringInputContext.getResultValue());
}
else{
break;
}
}

return "";
}
}
Loading

0 comments on commit f2d5229

Please sign in to comment.