package avrobase.hs;
import avrobase.AvroBase;
import avrobase.AvroFormat;
import avrobase.Row;
import avrobase.mysql.BytesKeyStrategy;
import avrobase.mysql.MysqlAB;
import bagcheck.User;
import com.google.code.hs4j.HSClientBuilder;
import com.google.code.hs4j.impl.HSClientBuilderImpl;
import com.jolbox.bonecp.BoneCPConfig;
import com.jolbox.bonecp.BoneCPDataSource;
import org.apache.avro.util.Utf8;
import org.junit.Test;
import javax.sql.DataSource;
import java.io.Console;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.security.SecureRandom;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import static junit.framework.Assert.assertEquals;
/**
* TODO: Edit this
* <p/>
* User: sam
* Date: 12/20/10
* Time: 12:32 PM
*/
public class HSABTest {
@Test
public void putGet() throws IOException, SQLException {
AvroBase<User, byte[]> userHSAB = getHSAB();
User user = getUser();
userHSAB.put($("test"), user);
Row<User, byte[]> test = userHSAB.get($("test"));
assertEquals(user, test.value);
}
@Test
public void waitforit() throws InterruptedException {
Thread.sleep(30000);
}
@Test
public void getSpeedTestHS() throws IOException, SQLException, InterruptedException {
Random r = new SecureRandom();
AvroBase<User, byte[]> userHSAB = getHSAB();
User user = getUser();
if (userHSAB.get($("0")) == null) {
for (int i = 0; i < 100000; i++) {
user.firstName = new Utf8("user" + i);
userHSAB.put($(String.valueOf(i)), user);
}
}
System.out.println("Starting");
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
int u = r.nextInt(100000);
Row<User, byte[]> test = userHSAB.get($(String.valueOf(u)));
assertEquals(new Utf8("user" + u), test.value.firstName);
}
System.out.println(System.currentTimeMillis() - start);
}
@Test
public void getSpeedTestMySQL() throws IOException, SQLException {
Random r = new SecureRandom();
AvroBase<User, byte[]> userHSAB = getMysqlAB();
User user = getUser();
userHSAB.put($("test"), user);
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
int u = r.nextInt(100000);
Row<User, byte[]> test = userHSAB.get($(String.valueOf(u)));
assertEquals(new Utf8("user" + u), test.value.firstName);
}
System.out.println(System.currentTimeMillis() - start);
}
private User getUser() {
User user = new User();
user.email = u("spullara@yahoo.com");
user.firstName = u("Sam");
user.lastName = u("Pullara");
user.image = u("");
user.password = ByteBuffer.allocate(0);
return user;
}
private Utf8 u(String s) {
return new Utf8(s);
}
byte[] $(String s) {
return s.getBytes();
}
private HSAB<User, byte[]> getHSAB() throws IOException, SQLException {
DataSource ds = getDS();
HSClientBuilder hsb = new HSClientBuilderImpl();
hsb.setServerAddress("localhost", 9998);
hsb.setConnectionPoolSize(100);
return new HSAB<User, byte[]>(
Executors.newCachedThreadPool(),
ds,
hsb.build(),
"user",
"profile",
"avro_schemas",
User.SCHEMA$,
AvroFormat.JSON,
new BytesKeyStrategy(new SecureRandom(), 128)
);
}
private MysqlAB<User, byte[]> getMysqlAB() throws IOException, SQLException {
DataSource ds = getDS();
return new MysqlAB<User, byte[]>(
Executors.newCachedThreadPool(),
ds,
"user",
"profile",
"avro_schemas",
User.SCHEMA$,
AvroFormat.JSON,
new BytesKeyStrategy(new SecureRandom(), 128)
);
}
private DataSource getDS() {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new AssertionError("Could not find JDBC driver: " + e);
}
final BoneCPConfig config = new BoneCPConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3406/hstest");
config.setMaxConnectionsPerPartition(50);
config.setPartitionCount(4);
config.setLazyInit(true);
config.setUsername("test");
config.setPassword("");
return new BoneCPDataSource(config);
}
}