Skip to content

Commit

Permalink
feat(demo): Added bootstrap config options
Browse files Browse the repository at this point in the history
  • Loading branch information
Julien Ruaux committed Feb 7, 2023
1 parent 0516b4e commit a08f745
Show file tree
Hide file tree
Showing 10 changed files with 166 additions and 145 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,14 @@

import org.springframework.stereotype.Component;

import com.redis.sidecar.demo.Config.Loader;
import com.redis.sidecar.demo.loader.CustomerProvider;
import com.redis.sidecar.demo.loader.OrderDetailsProvider;
import com.redis.sidecar.demo.loader.OrderProvider;
import com.redis.sidecar.demo.loader.ProductProvider;
import com.redis.sidecar.demo.loader.RowProvider;

import io.lettuce.core.RedisClient;
import io.lettuce.core.RedisURI;
import me.tongfei.progressbar.ProgressBar;
import me.tongfei.progressbar.ProgressBarBuilder;

Expand All @@ -40,20 +41,28 @@ public class DataLoader {
private static final String[] ORDERDETAILS_COLUMNS = { "orderNumber", "productCode", "quantityOrdered",
"orderLineNumber", "priceEach" };

private final Loader config;
private final RedisURI redisURI;
private final SidecarDemoConfig config;
private final DataSource dataSource;

public DataLoader(Config config, DataSource dataSource) {
this.config = config.getLoader();
public DataLoader(RedisURI redisURI, SidecarDemoConfig config, DataSource dataSource) {
this.redisURI = redisURI;
this.config = config;
this.dataSource = dataSource;
}

public void execute() throws SQLException {
if (config.getDemo().isFlush()) {
try (RedisClient client = RedisClient.create(redisURI)) {
client.connect().sync().flushall();
}
}
try (Connection connection = dataSource.getConnection()) {
load(connection, CUSTOMERS, CUSTOMER_COLUMNS, new CustomerProvider(), config.getCustomers());
load(connection, PRODUCTS, PRODUCT_COLUMNS, new ProductProvider(), config.getProducts());
load(connection, ORDERS, ORDER_COLUMNS, new OrderProvider(), config.getOrders());
load(connection, ORDERDETAILS, ORDERDETAILS_COLUMNS, new OrderDetailsProvider(), config.getOrderdetails());
load(connection, CUSTOMERS, CUSTOMER_COLUMNS, new CustomerProvider(), config.getDemo().getCustomers());
load(connection, PRODUCTS, PRODUCT_COLUMNS, new ProductProvider(), config.getDemo().getProducts());
load(connection, ORDERS, ORDER_COLUMNS, new OrderProvider(), config.getDemo().getOrders());
load(connection, ORDERDETAILS, ORDERDETAILS_COLUMNS, new OrderDetailsProvider(),
config.getDemo().getOrderdetails());
}
}

Expand All @@ -80,14 +89,14 @@ private void load(Connection connection, String table, String[] columns, RowProv
Stream.of(columns).map(n -> "?").collect(Collectors.joining(",", "(", ")")));
PreparedStatement preparedStatement = connection.prepareStatement(insertSQL);
for (int index = start; index < end; index++) {
rowProvider.set(preparedStatement, config, index);
rowProvider.set(preparedStatement, config.getDemo(), index);
preparedStatement.addBatch();
if (index > 0 && index % config.getBatch() == 0) {
if (index > 0 && index % config.getDemo().getBatchSize() == 0) {
preparedStatement.executeBatch();
connection.commit();
preparedStatement.close();
preparedStatement = preparedStatement.getConnection().prepareStatement(insertSQL);
progressBar.stepBy(config.getBatch());
progressBar.stepBy(config.getDemo().getBatchSize());
}
}
preparedStatement.executeBatch();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.redis.sidecar.demo;

import java.io.IOException;
import java.sql.Connection;
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.concurrent.Callable;
import java.util.concurrent.ExecutionException;
Expand All @@ -19,11 +21,11 @@
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;

import com.redis.sidecar.PropertiesMapper;
import com.redis.sidecar.SidecarDriver;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import io.lettuce.core.RedisClient;
import io.lettuce.core.RedisURI;
import me.tongfei.progressbar.ProgressBar;
import me.tongfei.progressbar.ProgressBarBuilder;
Expand All @@ -37,45 +39,43 @@ public class QueryExecutor implements AutoCloseable {

private final RedisURI redisURI;
private final DataSourceProperties dataSourceProperties;
private final Config config;
private final SidecarDemoConfig config;
private final List<QueryTask> tasks = new ArrayList<>();
private final PropertiesMapper propsMapper = new PropertiesMapper();

private ProgressBar progressBar;

public QueryExecutor(RedisURI redisURI, DataSourceProperties dataSourceProperties, Config config) {
public QueryExecutor(RedisURI redisURI, DataSourceProperties dataSourceProperties, SidecarDemoConfig config) {
this.redisURI = redisURI;
this.dataSourceProperties = dataSourceProperties;
this.config = config;
}

public void execute() throws InterruptedException, ExecutionException {
if (config.isFlush()) {
try (RedisClient client = RedisClient.create(redisURI)) {
client.connect().sync().flushall();
}
}
public void execute() throws InterruptedException, ExecutionException, IOException {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setJdbcUrl("jdbc:" + redisURI.toString());
hikariConfig.setDriverClassName(SidecarDriver.class.getName());
hikariConfig.addDataSourceProperty("sidecar.driver.url", dataSourceProperties.determineUrl());
hikariConfig.addDataSourceProperty("sidecar.driver.class-name",
dataSourceProperties.determineDriverClassName());
hikariConfig.addDataSourceProperty("sidecar.metrics.step", "5");
config.getSidecar().getDriver().setUrl(dataSourceProperties.determineUrl());
config.getSidecar().getDriver().setClassName(dataSourceProperties.determineDriverClassName());
Properties props = propsMapper.write(config.getSidecar());
for (String propertyName : props.stringPropertyNames()) {
hikariConfig.addDataSourceProperty(propertyName, props.getProperty(propertyName));
}
hikariConfig.setUsername(dataSourceProperties.determineUsername());
hikariConfig.setPassword(dataSourceProperties.determinePassword());
try (HikariDataSource dataSource = new HikariDataSource(hikariConfig)) {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(config.getQueryThreads());
executor.setMaxPoolSize(config.getQueryThreads());
executor.setCorePoolSize(config.getDemo().getQueryThreads());
executor.setMaxPoolSize(config.getDemo().getQueryThreads());
executor.setThreadNamePrefix("query-task");
executor.initialize();
ProgressBarBuilder progressBarBuilder = new ProgressBarBuilder();
progressBarBuilder.setTaskName("Querying");
progressBarBuilder.showSpeed();
progressBar = progressBarBuilder.build();
List<Future<Integer>> futures = new ArrayList<>();
for (int index = 0; index < config.getQueryThreads(); index++) {
QueryTask task = new QueryTask(dataSource, config.getLoader().getOrders(), progressBar);
for (int index = 0; index < config.getDemo().getQueryThreads(); index++) {
QueryTask task = new QueryTask(dataSource, config.getDemo().getOrders(), progressBar);
tasks.add(task);
futures.add(executor.submit(task));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package com.redis.sidecar.demo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import com.redis.sidecar.BootstrapConfig;

@Configuration
@ConfigurationProperties(prefix = "")
public class SidecarDemoConfig {

private BootstrapConfig sidecar = new BootstrapConfig();
private DemoConfig demo = new DemoConfig();

public BootstrapConfig getSidecar() {
return sidecar;
}

public void setSidecar(BootstrapConfig sidecar) {
this.sidecar = sidecar;
}

public DemoConfig getDemo() {
return demo;
}

public void setDemo(DemoConfig demo) {
this.demo = demo;
}

public static class DemoConfig {

private boolean flush;
private int queryThreads;
private int batchSize;
private int customers;
private int products;
private int orders;
private int orderdetails;

public int getCustomers() {
return customers;
}

public void setCustomers(int customers) {
this.customers = customers;
}

public int getProducts() {
return products;
}

public void setProducts(int products) {
this.products = products;
}

public int getOrders() {
return orders;
}

public void setOrders(int orders) {
this.orders = orders;
}

public int getOrderdetails() {
return orderdetails;
}

public void setOrderdetails(int orderdetails) {
this.orderdetails = orderdetails;
}

public int getBatchSize() {
return batchSize;
}

public void setBatchSize(int batchSize) {
this.batchSize = batchSize;
}

public int getQueryThreads() {
return queryThreads;
}

public void setQueryThreads(int queryThreads) {
this.queryThreads = queryThreads;
}

public boolean isFlush() {
return flush;
}

public void setFlush(boolean flush) {
this.flush = flush;
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@
import java.sql.SQLException;

import com.github.javafaker.Faker;
import com.redis.sidecar.demo.Config.Loader;
import com.redis.sidecar.demo.SidecarDemoConfig.DemoConfig;

public class CustomerProvider implements RowProvider {

private final Faker faker = new Faker();

@Override
public void set(PreparedStatement statement, Loader config, int index) throws SQLException {
public void set(PreparedStatement statement, DemoConfig config, int index) throws SQLException {
int columnIndex = 1;
statement.setInt(columnIndex++, index + 1);
statement.setString(columnIndex++, faker.company().name());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@
import java.sql.SQLException;

import com.github.javafaker.Faker;
import com.redis.sidecar.demo.Config.Loader;
import com.redis.sidecar.demo.SidecarDemoConfig.DemoConfig;

public class OrderDetailsProvider implements RowProvider {

private final Faker faker = new Faker();

@Override
public void set(PreparedStatement statement, Loader config, int index) throws SQLException {
public void set(PreparedStatement statement, DemoConfig config, int index) throws SQLException {
int itemsPerOrder = config.getOrderdetails() / config.getOrders();
int orderNumber = index / itemsPerOrder + 1;
int productCode = index % itemsPerOrder + 1;
Expand Down
Loading

0 comments on commit a08f745

Please sign in to comment.