SuperX-Kernmodul
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

217 lines
7.1 KiB

package de.memtext.db;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Enumeration;
import java.util.Random;
import java.util.Vector;
/**
* Randomizes values in a database.
* Reads all values of a given table column (select distinct x from..) and
* multiplies all occurences of a single value (e.g. 150) with a factor between
* minFactor and maxFactor (e.g. 150*1.1 -> all entries with 150 become 165)
*
* if boolean printOutOnly is true the update sql statements are only logged
* to console, not performed
* */
public class ValueRandomizer {
//private static String driver = "org.hsqldb.jdbcDriver";
private static String driver = "org.postgresql.Driver";
//private static String dbUrl = "jdbc:hsqldb:hsql://localhost:9999";
private static String dbUrl = "jdbc:postgresql://localhost:5432/superx";
private static String username = "superx"; //"joolap";
private static String password = ""; //"loopja3000";
private static String tablename = "cob_busa";
private static String colname = "betrag"; //"value";
private static String datenart = "DOUBLE"; //or "INTEGER";
private static double minFactor = 0.6;
private static double maxFactor = 1.8;
private static boolean printOutOnly = false;
private static Statement stat;
private static Random r = new Random();
public static void main(String args[]) {
try {
Class.forName(driver);
Connection conn;
System.out.println("establishing connection to " + dbUrl);
conn = DriverManager.getConnection(dbUrl, username, password);
stat = conn.createStatement();
System.out.println("done.");
out();
stat.close();
conn.close();
System.exit(-1);
//alle werte einlesen
Vector werte = readDistinctValues();
if (datenart.toUpperCase().equalsIgnoreCase("DOUBLE")) {
//massiveRandomizeDouble(werte);
randomize(werte);
} else //integer
{
massiveRandomizeInteger(werte);
}
System.out.println("Randomizierung erfolgreich beendet");
} catch (Exception e) {
System.out.println(e.toString());
System.exit(0);
}
}
/**
* randomizes in categories of values
* only for double
* @param werte
*/
private static void randomize(Vector werte) {
int categories = 15;
int valuesPerCategory = (int) werte.size() / categories;
StringBuffer updates = new StringBuffer();
float limit = 0, limit2;
for (int i = 1; i < categories; i++) {
limit = (float) ((Double) werte.get(i * valuesPerCategory)).doubleValue();
updates.append("update " + tablename + " set " + colname + "=" + colname + "*" + getRndFactor() + " where " + colname + ">" + limit);
if (i > 1) {
limit2 = (float) ((Double) werte.get((i - 1) * valuesPerCategory)).doubleValue();
updates.append(" and " + colname + "<" + limit2);
}
updates.append(";\n");
}
limit = (float) ((Double) werte.get((categories - 1) * valuesPerCategory)).doubleValue();
updates.append("update " + tablename + " set " + colname + "=" + colname + "*" + getRndFactor() + " where " + colname + "<" + limit + ";");
System.out.println(updates);
}
/**
* * multiplies all occurences of a single value (e.g. 150) with a factor between
* minFactor and maxFactor (e.g. 150*1.1 -> all entries with 150 become 165)
* @param werte
* @throws SQLException
*/
private static void massiveRandomizeInteger(Vector werte) throws SQLException {
Integer einWert;
String upd = null;
for (Enumeration en = werte.elements(); en.hasMoreElements();) {
einWert = (Integer) en.nextElement();
int neuerwert = (int) (einWert.intValue() * getRndFactor());
upd = "update " + tablename + " set " + colname + "=" + neuerwert + " where " + colname + "=" + einWert.toString() + ";";
if (printOutOnly)
System.out.println(upd);
else
stat.executeUpdate(upd);
}
}
/**
* * multiplies all occurences of a single value (e.g. 150) with a factor between
* minFactor and maxFactor (e.g. 150*1.1 -> all entries with 150 become 165)
* @param werte
* @throws SQLException
*/
private static void massiveRandomizeDouble(Vector werte) throws SQLException {
Double einWert;
double zufallswert;
String upd;
int i = 0;
int count = werte.size();
for (Enumeration en = werte.elements(); en.hasMoreElements();) {
einWert = (Double) en.nextElement();
i++;
zufallswert = einWert.doubleValue() * getRndFactor();
upd = "update " + tablename + " set " + colname + "=" + zufallswert + " where " + colname + "=" + einWert + ";";
if (printOutOnly)
System.out.println(upd);
else {
stat.executeUpdate(upd);
if (i % 20 == 0) System.out.println("Done " + i + " updates of " + count);
}
}
}
private static float getRndFactor() {
double rnd = Math.abs(r.nextDouble());
while (rnd < minFactor)
rnd += minFactor;
while (rnd > maxFactor)
rnd -= 0.05;
return (float) rnd;
}
private static Vector readDistinctValues() throws SQLException {
Vector werte = new Vector();
ResultSet rs = null;
Object item;
System.out.println("Alle werte einlesen:" + "select distinct " + colname + " from " + tablename + " order by 1 DESC");
rs = stat.executeQuery("select distinct " + colname + " from " + tablename + " order by " + colname + " DESC");
while (rs.next()) {
item = rs.getObject(1);
werte.add(item);
}
rs.close();
return werte;
}
private static void out() {
try {
FileWriter fw = new FileWriter("c:\\cygwin\\home\\superx\\cob_busa.unl");
BufferedWriter bw = new BufferedWriter(fw);
StringBuffer buf = new StringBuffer();
ResultSet rs = stat.executeQuery("select * from cob_busa");
int cols = 20;
String s;
Object o;
while (rs.next()) {
for (int i = 1; i <= cols; i++) {
o = rs.getObject(i);
if (o == null)
s = "";
else
s = o.toString();
buf.append(s.trim() + "^");
}
buf.append("^\n");
}
rs.close();
bw.write(buf.toString());
bw.close();
fw.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("done");
}
}