From a1d5f7077b0a6593607bbe800b905b00a3829073 Mon Sep 17 00:00:00 2001
From: Russell Sears <sears@yahoo-inc.com>
Date: Fri, 18 Nov 2011 16:57:37 -0800
Subject: [PATCH] refactor core workload to reduce redundant key and field
 generation code

---
 .../yahoo/ycsb/workloads/CoreWorkload.java    | 111 +++++++-----------
 1 file changed, 44 insertions(+), 67 deletions(-)

diff --git a/src/com/yahoo/ycsb/workloads/CoreWorkload.java b/src/com/yahoo/ycsb/workloads/CoreWorkload.java
index 3e75b6fd..ceaeb88e 100644
--- a/src/com/yahoo/ycsb/workloads/CoreWorkload.java
+++ b/src/com/yahoo/ycsb/workloads/CoreWorkload.java
@@ -411,6 +411,33 @@ public class CoreWorkload extends Workload
 		}
 	}
 
+	public String buildKeyName(int keynum) {
+ 		if (!orderedinserts)
+ 		{
+ 			keynum=Utils.hash(keynum);
+ 		}
+		return "user"+keynum;
+	}
+	HashMap<String, ByteIterator> buildValues() {
+ 		HashMap<String,ByteIterator> values=new HashMap<String,ByteIterator>();
+
+ 		for (int i=0; i<fieldcount; i++)
+ 		{
+ 			String fieldkey="field"+i;
+ 			ByteIterator data= new RandomByteIterator(fieldlengthgenerator.nextInt());
+ 			values.put(fieldkey,data);
+ 		}
+		return values;
+	}
+	HashMap<String, ByteIterator> buildUpdate() {
+		//update a random field
+		HashMap<String, ByteIterator> values=new HashMap<String,ByteIterator>();
+		String fieldname="field"+fieldchooser.nextString();
+		ByteIterator data = new RandomByteIterator(fieldlengthgenerator.nextInt());
+		values.put(fieldname,data);
+		return values;
+	}
+
 	/**
 	 * Do one insert operation. Because it will be called concurrently from multiple client threads, this 
 	 * function must be thread safe. However, avoid synchronized, or the threads will block waiting for each 
@@ -420,19 +447,8 @@ public class CoreWorkload extends Workload
 	public boolean doInsert(DB db, Object threadstate)
 	{
 		int keynum=keysequence.nextInt();
-		if (!orderedinserts)
-		{
-			keynum=Utils.hash(keynum);
-		}
-		String dbkey="user"+keynum;
-		HashMap<String,ByteIterator> values=new HashMap<String,ByteIterator>();
-
-		for (int i=0; i<fieldcount; i++)
-		{
-			String fieldkey="field"+i;
-			ByteIterator data= new RandomByteIterator(fieldlengthgenerator.nextInt());
-			values.put(fieldkey,data);
-		}
+		String dbkey = buildKeyName(keynum);
+		HashMap<String, ByteIterator> values = buildValues();
 		if (db.insert(table,dbkey,values) == 0)
 			return true;
 		else
@@ -483,12 +499,8 @@ public class CoreWorkload extends Workload
 		}
 		while (keynum>transactioninsertkeysequence.lastInt());
 		
-		if (!orderedinserts)
-		{
-			keynum=Utils.hash(keynum);
-		}
-		String keyname="user"+keynum;
-
+		String keyname = buildKeyName(keynum);
+		
 		HashSet<String> fields=null;
 
 		if (!readallfields)
@@ -513,11 +525,7 @@ public class CoreWorkload extends Workload
 		}
 		while (keynum>transactioninsertkeysequence.lastInt());
 		
-		if (!orderedinserts)
-		{
-			keynum=Utils.hash(keynum);
-		}
-		String keyname="user"+keynum;
+		String keyname = buildKeyName(keynum);
 
 		HashSet<String> fields=null;
 
@@ -530,24 +538,17 @@ public class CoreWorkload extends Workload
 			fields.add(fieldname);
 		}
 		
-		HashMap<String,ByteIterator> values=new HashMap<String,ByteIterator>();
+		HashMap<String,ByteIterator> values;
 
 		if (writeallfields)
 		{
 		   //new data for all the fields
-		   for (int i=0; i<fieldcount; i++)
-		   {
-		      String fieldname="field"+i;
-		      ByteIterator data = new RandomByteIterator(fieldlengthgenerator.nextInt());
-		      values.put(fieldname,data);
-		   }
+		   values = buildValues();
 		}
 		else
 		{
 		   //update a random field
-		   String fieldname="field"+fieldchooser.nextString();
-		   ByteIterator data = new RandomByteIterator(fieldlengthgenerator.nextInt());
-		   values.put(fieldname,data);
+		   values = buildUpdate();
 		}
 
 		//do the transaction
@@ -573,11 +574,7 @@ public class CoreWorkload extends Workload
 		}
 		while (keynum>transactioninsertkeysequence.lastInt());
 
-		if (!orderedinserts)
-		{
-			keynum=Utils.hash(keynum);
-		}
-		String startkeyname="user"+keynum;
+		String startkeyname = buildKeyName(keynum);
 		
 		//choose a random scan length
 		int len=scanlength.nextInt();
@@ -606,30 +603,19 @@ public class CoreWorkload extends Workload
 		}
 		while (keynum>transactioninsertkeysequence.lastInt());
 
-		if (!orderedinserts)
-		{
-			keynum=Utils.hash(keynum);
-		}
-		String keyname="user"+keynum;
+		String keyname=buildKeyName(keynum);
 
-		HashMap<String,ByteIterator> values=new HashMap<String,ByteIterator>();
+		HashMap<String,ByteIterator> values;
 
 		if (writeallfields)
 		{
 		   //new data for all the fields
-		   for (int i=0; i<fieldcount; i++)
-		   {
-		      String fieldname="field"+i;
-		      ByteIterator data = new RandomByteIterator(fieldlengthgenerator.nextInt());
-		      values.put(fieldname,data);
-		   }
+		   values = buildValues();
 		}
 		else
 		{
 		   //update a random field
-		   String fieldname="field"+fieldchooser.nextString();
-		   ByteIterator data = new RandomByteIterator(fieldlengthgenerator.nextInt());
-		   values.put(fieldname,data);
+		   values = buildUpdate();
 		}
 
 		db.update(table,keyname,values);
@@ -639,19 +625,10 @@ public class CoreWorkload extends Workload
 	{
 		//choose the next key
 		int keynum=transactioninsertkeysequence.nextInt();
-		if (!orderedinserts)
-		{
-			keynum=Utils.hash(keynum);
-		}
-		String dbkey="user"+keynum;
-		
-		HashMap<String,ByteIterator> values=new HashMap<String,ByteIterator>();
-		for (int i=0; i<fieldcount; i++)
-		{
-			String fieldkey="field"+i;
-			ByteIterator data = new RandomByteIterator(fieldlengthgenerator.nextInt());
-			values.put(fieldkey,data);
-		}
+
+		String dbkey = buildKeyName(keynum);
+
+		HashMap<String, ByteIterator> values = buildValues();
 		db.insert(table,dbkey,values);
 	}
 }
-- 
GitLab