Skip to content

Commit

Permalink
generators use better naming strategy for VoltDB procedures
Browse files Browse the repository at this point in the history
  • Loading branch information
Stefano Santoro committed Sep 22, 2014
1 parent 50e0993 commit 422eb57
Show file tree
Hide file tree
Showing 3 changed files with 141 additions and 16 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
/**
* Copyright (c) 2009-2014, Data Geekery GmbH (http://www.datageekery.com)
* All rights reserved.
*
* This work is dual-licensed
* - under the Apache Software License 2.0 (the "ASL")
* - under the jOOQ License and Maintenance Agreement (the "jOOQ License")
* =============================================================================
* You may choose which license applies to you:
*
* - If you're using this work with Open Source databases, you may choose
* either ASL or jOOQ License.
* - If you're using this work with at least one commercial database, you must
* choose jOOQ License
*
* For more information, please visit http://www.jooq.org/licenses
*
* Apache Software License 2.0:
* -----------------------------------------------------------------------------
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* jOOQ License and Maintenance Agreement:
* -----------------------------------------------------------------------------
* Data Geekery grants the Customer the non-exclusive, timely limited and
* non-transferable license to install and use the Software under the terms of
* the jOOQ License and Maintenance Agreement.
*
* This library is distributed with a LIMITED WARRANTY. See the jOOQ License
* and Maintenance Agreement for more details: http://www.jooq.org/licensing
*/
package org.jooq.util.example;

import static java.lang.Character.isLowerCase;
import static java.lang.Character.toLowerCase;
import static java.lang.Character.toUpperCase;

import org.jooq.util.DefaultGeneratorStrategy;
import org.jooq.util.Definition;

public class VoltDBGeneratorStrategy extends DefaultGeneratorStrategy {
@Override
public String getJavaClassName(final Definition definition, final Mode mode) {
StringBuilder result = new StringBuilder();

result.append(convertToCamelCase(definition.getOutputName(), true));

if (mode == Mode.RECORD) {
result.append("Record");
}
else if (mode == Mode.DAO) {
result.append("Dao");
}
else if (mode == Mode.INTERFACE) {
result.insert(0, "I");
}

return result.toString();
}

@Override
public String getJavaMethodName(Definition definition, Mode mode) {
return convertToCamelCase(definition.getOutputName(), false);
}

public static String convertToCamelCase(CharSequence input, boolean upperCaseFirst) {
StringBuilder cName = new StringBuilder(input);

boolean upperCaseIt = upperCaseFirst;
boolean hasLowerCase = false;

for (int i = 0; i < cName.length();) {
char chr = cName.charAt(i);

if (chr == '_' || chr == '.' || chr == '$') {

cName.deleteCharAt(i);
upperCaseIt = true;
hasLowerCase = false;

} else {

if (upperCaseIt) {
chr = toUpperCase(chr);
} else if (!(hasLowerCase = hasLowerCase || isLowerCase(chr))) {
chr = toLowerCase(chr);
}
cName.setCharAt(i++, chr);
upperCaseIt = false;

}
}

return cName.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,23 +56,28 @@

public class VoltDBRoutineDefinition extends AbstractRoutineDefinition {

final DataTypeDefinition returnRowType = new DefaultDataTypeDefinition(
getDatabase(),
getSchema(),
"RESULT",
null,
null,
null,
null,
null
);

public VoltDBRoutineDefinition(SchemaDefinition schema, String name, String comment) {
super(schema, null, name, comment, null);
}

static final String parameterNames [] = {
"FIRST","SECOND","THIRD","FOURTH","FIFTH","SIXTH","SEVENTH","EIGHTH","NINTH",
"TENTH","ELEVENTH","TWELVETH","THIRTEENTH","FOURTEENTH","FIFTEENTH","SIXTEENTH"
};

@Override
protected void init0() throws SQLException {
final DataTypeDefinition returnRowType = new DefaultDataTypeDefinition(
getDatabase(),
getSchema(),
"RESULT",
null,
null,
null,
null,
null
);

DatabaseMetaData dbmd = getConnection().getMetaData();

Result<Record> parameters = create().fetch(
Expand Down Expand Up @@ -112,10 +117,20 @@ protected void init0() throws SQLException {
null
);

final int ordinalPosition = parameter.getValue(17, int.class);
final String paramName ;
if (ordinalPosition <= parameterNames.length && ordinalPosition > 0) {
paramName = parameterNames[ordinalPosition-1];
} else if (ordinalPosition > 0) {
paramName = String.format("param%2d", ordinalPosition);;
} else {
paramName = parameter.getValue(3, String.class);
}

ParameterDefinition p = new DefaultParameterDefinition(
this,
parameter.getValue(3, String.class),
parameter.getValue(17, int.class),
paramName,
ordinalPosition,
type
);

Expand Down
11 changes: 8 additions & 3 deletions jOOQ/src/main/java/org/jooq/impl/MetaImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -325,8 +325,9 @@ public final synchronized List<Table<?>> getTables() {
// String catalog = table.getValue(0, String.class);
String schema = table.getValue(1, String.class);
String name = table.getValue(2, String.class);
String type = table.getValue(3, String.class);

result.add(new MetaTable(name, this, getColumns(schema, name)));
result.add(new MetaTable(name, type, this, getColumns(schema, name)));

// TODO: Find a more efficient way to do this
// Result<Record> pkColumns = executor.fetch(meta().getPrimaryKeys(catalog, schema, name))
Expand Down Expand Up @@ -416,9 +417,11 @@ private class MetaTable extends TableImpl<Record> {
*/
private static final long serialVersionUID = 4843841667753000233L;

MetaTable(String name, Schema schema, Result<Record> columns) {
super(name, schema);
private final String type;

MetaTable(String name, String type, Schema schema, Result<Record> columns) {
super(name, schema);
this.type = type;
// Possible scenarios for columns being null:
// - The "table" is in fact a SYNONYM
if (columns != null) {
Expand Down Expand Up @@ -523,6 +526,8 @@ public final UniqueKey<Record> getPrimaryKey() {
@SuppressWarnings("unchecked")
private final UniqueKey<Record> createPrimaryKey(Result<Record> result, int columnName) {
if (result.size() > 0) {
SQLDialect family = configuration.dialect().family();

TableField<Record, ?>[] fields = new TableField[result.size()];
for (int i = 0; i < fields.length; i++) {
fields[i] = (TableField<Record, ?>) field(result.get(i).getValue(columnName, String.class));
Expand Down

0 comments on commit 422eb57

Please sign in to comment.