Add dialect-agnostic auto-migration of full text indexes.
This commit is contained in:
@@ -31,6 +31,7 @@ import java.sql.SQLException;
|
|||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -51,7 +52,6 @@ import com.samskivert.jdbc.depot.annotation.UniqueConstraint;
|
|||||||
|
|
||||||
import com.samskivert.jdbc.DatabaseLiaison;
|
import com.samskivert.jdbc.DatabaseLiaison;
|
||||||
import com.samskivert.util.ArrayUtil;
|
import com.samskivert.util.ArrayUtil;
|
||||||
import com.samskivert.util.StringUtil;
|
|
||||||
|
|
||||||
import static com.samskivert.jdbc.depot.Log.log;
|
import static com.samskivert.jdbc.depot.Log.log;
|
||||||
|
|
||||||
@@ -746,6 +746,27 @@ public class DepotMarshaller<T extends PersistentRecord>
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// next we create any full text search indexes that exist on the record but not in the
|
||||||
|
// table, first step being to do a dialect-sensitive enumeration of existing indexes
|
||||||
|
Set<String> tableFts = new HashSet<String>(Arrays.asList(
|
||||||
|
builder.getFtsIndexes(metaData.tableColumns, metaData.indexColumns.keySet())));
|
||||||
|
|
||||||
|
// then iterate over what should be there
|
||||||
|
for (final FullTextIndex recordFts : _fullTextIndexes.values()) {
|
||||||
|
if (tableFts.contains(recordFts.name())) {
|
||||||
|
// the table already contains this one
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// but not this one, so let's create it
|
||||||
|
ctx.invoke(new Modifier() {
|
||||||
|
public int invoke (Connection conn, DatabaseLiaison liaison) throws SQLException {
|
||||||
|
builder.addFullTextSearch(conn, DepotMarshaller.this, recordFts);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// we do not auto-remove columns but rather require that EntityMigration.Drop records be
|
// we do not auto-remove columns but rather require that EntityMigration.Drop records be
|
||||||
// registered by hand to avoid accidentally causing the loss of data
|
// registered by hand to avoid accidentally causing the loss of data
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ import java.sql.SQLException;
|
|||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
import java.sql.Time;
|
import java.sql.Time;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import com.samskivert.Log;
|
import com.samskivert.Log;
|
||||||
import com.samskivert.jdbc.JDBCUtil;
|
import com.samskivert.jdbc.JDBCUtil;
|
||||||
@@ -134,6 +136,18 @@ public class MySQLBuilder
|
|||||||
super(types);
|
super(types);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] getFtsIndexes (Iterable<String> columns, Iterable<String> indexes)
|
||||||
|
{
|
||||||
|
List<String> result = new ArrayList<String>();
|
||||||
|
for (String index : indexes) {
|
||||||
|
if (index.startsWith("ftsIx_")) {
|
||||||
|
result.add(index.substring("ftsIx_".length()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toArray(new String[0]);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T extends PersistentRecord> boolean addFullTextSearch (
|
public <T extends PersistentRecord> boolean addFullTextSearch (
|
||||||
Connection conn, DepotMarshaller<T> marshaller, FullTextIndex fts)
|
Connection conn, DepotMarshaller<T> marshaller, FullTextIndex fts)
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ import java.sql.SQLException;
|
|||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
import java.sql.Time;
|
import java.sql.Time;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import com.samskivert.jdbc.DatabaseLiaison;
|
import com.samskivert.jdbc.DatabaseLiaison;
|
||||||
import com.samskivert.jdbc.JDBCUtil;
|
import com.samskivert.jdbc.JDBCUtil;
|
||||||
@@ -108,6 +110,18 @@ public class PostgreSQLBuilder
|
|||||||
super(types);
|
super(types);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] getFtsIndexes (Iterable<String> columns, Iterable<String> indexes)
|
||||||
|
{
|
||||||
|
List<String> result = new ArrayList<String>();
|
||||||
|
for (String column : columns) {
|
||||||
|
if (column.startsWith("ftsCol_")) {
|
||||||
|
result.add(column.substring("ftsCol_".length()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toArray(new String[0]);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T extends PersistentRecord> boolean addFullTextSearch (
|
public <T extends PersistentRecord> boolean addFullTextSearch (
|
||||||
Connection conn, DepotMarshaller<T> marshaller, FullTextIndex fts)
|
Connection conn, DepotMarshaller<T> marshaller, FullTextIndex fts)
|
||||||
|
|||||||
@@ -25,11 +25,11 @@ import java.sql.Connection;
|
|||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
import com.samskivert.jdbc.depot.DepotMarshaller.TableMetaData;
|
||||||
import com.samskivert.jdbc.depot.annotation.Column;
|
import com.samskivert.jdbc.depot.annotation.Column;
|
||||||
import com.samskivert.jdbc.depot.annotation.FullTextIndex;
|
import com.samskivert.jdbc.depot.annotation.FullTextIndex;
|
||||||
import com.samskivert.jdbc.depot.annotation.GeneratedValue;
|
import com.samskivert.jdbc.depot.annotation.GeneratedValue;
|
||||||
import com.samskivert.jdbc.depot.clause.QueryClause;
|
import com.samskivert.jdbc.depot.clause.QueryClause;
|
||||||
import com.samskivert.jdbc.depot.operator.Conditionals;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* At the heart of Depot's SQL generation, this object constructs two {@link ExpressionVisitor}
|
* At the heart of Depot's SQL generation, this object constructs two {@link ExpressionVisitor}
|
||||||
@@ -186,6 +186,13 @@ public abstract class SQLBuilder
|
|||||||
*/
|
*/
|
||||||
public abstract boolean isPrivateColumn (String column);
|
public abstract boolean isPrivateColumn (String column);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Figure out what full text search indexes already exist on this table and return the names
|
||||||
|
* of those indexes as an array.
|
||||||
|
*/
|
||||||
|
public abstract String[] getFtsIndexes (
|
||||||
|
Iterable<String> columns, Iterable<String> indexes);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Overridden by subclasses to create a dialect-specific {@link BuildVisitor}.
|
* Overridden by subclasses to create a dialect-specific {@link BuildVisitor}.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user