From 40e6ccc8336aeabf1c27b626ee3760d365e549a6 Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Tue, 10 Feb 2015 12:52:48 -0800 Subject: [PATCH] Tuple2 -> IndexDesc. If you have persistent classes with complex (or ordered) indices, you need to return IndexDesc now instead of Tuple2. --- .../java/com/samskivert/depot/IndexDesc.java | 34 ++++++++++ .../samskivert/depot/impl/BuildVisitor.java | 67 +++++-------------- .../depot/impl/DepotMarshaller.java | 30 ++++----- .../depot/impl/clause/CreateIndexClause.java | 14 ++-- 4 files changed, 68 insertions(+), 77 deletions(-) create mode 100644 src/main/java/com/samskivert/depot/IndexDesc.java diff --git a/src/main/java/com/samskivert/depot/IndexDesc.java b/src/main/java/com/samskivert/depot/IndexDesc.java new file mode 100644 index 0000000..cf8256c --- /dev/null +++ b/src/main/java/com/samskivert/depot/IndexDesc.java @@ -0,0 +1,34 @@ +// +// Depot library - a Java relational persistence library +// https://github.com/threerings/depot/blob/master/LICENSE + +package com.samskivert.depot; + +import com.samskivert.depot.clause.OrderBy; +import com.samskivert.depot.expression.SQLExpression; + +/** + * Describes an index on a persistent class's table. + */ +public class IndexDesc { + + /** The expression that defines this index. */ + public final SQLExpression expr; + + /** The order of the index. */ + public final OrderBy.Order order; + + public IndexDesc (SQLExpression expr, OrderBy.Order order) { + this.expr = expr; + this.order = order; + } + + @Override public int hashCode () { + return expr.hashCode() ^ order.hashCode(); + } + + @Override public boolean equals (Object other) { + return (other instanceof IndexDesc) && expr.equals(((IndexDesc)other).expr) && + order == ((IndexDesc)other).order; + } +} diff --git a/src/main/java/com/samskivert/depot/impl/BuildVisitor.java b/src/main/java/com/samskivert/depot/impl/BuildVisitor.java index f540d88..2684e4e 100644 --- a/src/main/java/com/samskivert/depot/impl/BuildVisitor.java +++ b/src/main/java/com/samskivert/depot/impl/BuildVisitor.java @@ -17,9 +17,11 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import com.samskivert.depot.Exps; +import com.samskivert.depot.IndexDesc; import com.samskivert.depot.Key; import com.samskivert.depot.PersistentRecord; import com.samskivert.depot.annotation.Computed; +import com.samskivert.depot.clause.Distinct; import com.samskivert.depot.clause.FieldDefinition; import com.samskivert.depot.clause.FieldOverride; import com.samskivert.depot.clause.ForUpdate; @@ -39,53 +41,14 @@ import com.samskivert.depot.util.ByteEnum; import com.samskivert.depot.util.Tuple2; import static com.samskivert.depot.Log.log; -import com.samskivert.depot.clause.Distinct; -import com.samskivert.depot.impl.clause.CreateIndexClause; -import com.samskivert.depot.impl.clause.DeleteClause; -import com.samskivert.depot.impl.clause.DropIndexClause; -import com.samskivert.depot.impl.clause.UpdateClause; -import com.samskivert.depot.impl.expression.AggregateFun.Average; -import com.samskivert.depot.impl.expression.AggregateFun.Count; -import com.samskivert.depot.impl.expression.AggregateFun.Every; -import com.samskivert.depot.impl.expression.AggregateFun.Max; -import com.samskivert.depot.impl.expression.AggregateFun.Min; -import com.samskivert.depot.impl.expression.AggregateFun.Sum; -import com.samskivert.depot.impl.expression.AggregateFun; -import com.samskivert.depot.impl.expression.ConditionalFun.Coalesce; -import com.samskivert.depot.impl.expression.ConditionalFun.Greatest; -import com.samskivert.depot.impl.expression.ConditionalFun.Least; -import com.samskivert.depot.impl.expression.DateFun.DatePart; -import com.samskivert.depot.impl.expression.DateFun.DateTruncate; -import com.samskivert.depot.impl.expression.DateFun.Now; -import com.samskivert.depot.impl.expression.IntervalExp; -import com.samskivert.depot.impl.expression.LiteralExp; -import com.samskivert.depot.impl.expression.NumericalFun.Abs; -import com.samskivert.depot.impl.expression.NumericalFun.Ceil; -import com.samskivert.depot.impl.expression.NumericalFun.Exp; -import com.samskivert.depot.impl.expression.NumericalFun.Floor; -import com.samskivert.depot.impl.expression.NumericalFun.Ln; -import com.samskivert.depot.impl.expression.NumericalFun.Log10; -import com.samskivert.depot.impl.expression.NumericalFun.Pi; -import com.samskivert.depot.impl.expression.NumericalFun.Power; -import com.samskivert.depot.impl.expression.NumericalFun.Random; -import com.samskivert.depot.impl.expression.NumericalFun.Round; -import com.samskivert.depot.impl.expression.NumericalFun.Sign; -import com.samskivert.depot.impl.expression.NumericalFun.Sqrt; -import com.samskivert.depot.impl.expression.NumericalFun.Trunc; -import com.samskivert.depot.impl.expression.RandomExp; -import com.samskivert.depot.impl.expression.StringFun.Length; -import com.samskivert.depot.impl.expression.StringFun.Lower; -import com.samskivert.depot.impl.expression.StringFun.Position; -import com.samskivert.depot.impl.expression.StringFun.Substring; -import com.samskivert.depot.impl.expression.StringFun.Trim; -import com.samskivert.depot.impl.expression.StringFun.Upper; -import com.samskivert.depot.impl.expression.ValueExp; -import com.samskivert.depot.impl.operator.BinaryOperator; -import com.samskivert.depot.impl.operator.Exists; -import com.samskivert.depot.impl.operator.In; -import com.samskivert.depot.impl.operator.IsNull; -import com.samskivert.depot.impl.operator.MultiOperator; -import com.samskivert.depot.impl.operator.Not; +import com.samskivert.depot.impl.clause.*; +import com.samskivert.depot.impl.expression.*; +import com.samskivert.depot.impl.expression.AggregateFun.*; +import com.samskivert.depot.impl.expression.ConditionalFun.*; +import com.samskivert.depot.impl.expression.DateFun.*; +import com.samskivert.depot.impl.expression.NumericalFun.*; +import com.samskivert.depot.impl.expression.StringFun.*; +import com.samskivert.depot.impl.operator.*; /** * Implements the base functionality of the SQL-building pass of {@link SQLBuilder}. Dialectal @@ -510,8 +473,8 @@ public abstract class BuildVisitor implements FragmentVisitor public Void visit (CreateIndexClause createIndexClause) { if (!_allowComplexIndices) { - for (Tuple2, Order> field : createIndexClause.getFields()) { - if (!(field.a instanceof ColumnExp)) { + for (IndexDesc desc : createIndexClause.getDescs()) { + if (!(desc.expr instanceof ColumnExp)) { log.warning("This database can't handle complex indexes. Not creating.", "ixName", createIndexClause.getName()); return null; @@ -531,7 +494,7 @@ public abstract class BuildVisitor implements FragmentVisitor // turn off table abbreviations here _defaultType = createIndexClause.getPersistentClass(); boolean comma = false; - for (Tuple2, Order> field : createIndexClause.getFields()) { + for (IndexDesc desc : createIndexClause.getDescs()) { if (comma) { _builder.append(", "); } @@ -543,11 +506,11 @@ public abstract class BuildVisitor implements FragmentVisitor if (_allowComplexIndices) { _builder.append("("); } - field.a.accept(this); + desc.expr.accept(this); if (_allowComplexIndices) { _builder.append(")"); } - if (field.b == Order.DESC) { + if (desc.order == Order.DESC) { // ascending is default, print nothing unless explicitly descending _builder.append(" desc"); } diff --git a/src/main/java/com/samskivert/depot/impl/DepotMarshaller.java b/src/main/java/com/samskivert/depot/impl/DepotMarshaller.java index d1a5915..774808c 100644 --- a/src/main/java/com/samskivert/depot/impl/DepotMarshaller.java +++ b/src/main/java/com/samskivert/depot/impl/DepotMarshaller.java @@ -27,6 +27,7 @@ import com.google.common.collect.Sets; import static com.google.common.base.Preconditions.checkArgument; import com.samskivert.depot.DatabaseException; +import com.samskivert.depot.IndexDesc; import com.samskivert.depot.Key; import com.samskivert.depot.PersistenceContext; import com.samskivert.depot.PersistentRecord; @@ -48,7 +49,6 @@ import com.samskivert.depot.expression.SQLExpression; import com.samskivert.depot.impl.clause.CreateIndexClause; import com.samskivert.depot.impl.jdbc.ColumnDefinition; import com.samskivert.depot.impl.jdbc.DatabaseLiaison; -import com.samskivert.depot.util.Tuple2; import static com.samskivert.depot.Log.log; /** @@ -99,10 +99,8 @@ public class DepotMarshaller implements QueryMarshal // introspect on the class and create marshallers and indices for persistent fields List> fields = Lists.newArrayList(); - ListMultimap, Order>> namedFieldIndices = - ArrayListMultimap.create(); - ListMultimap, Order>> uniqueNamedFieldIndices = - ArrayListMultimap.create(); + ListMultimap namedFieldIndices = ArrayListMultimap.create(); + ListMultimap uniqueNamedFieldIndices = ArrayListMultimap.create(); for (Field field : _pClass.getFields()) { int mods = field.getModifiers(); @@ -182,8 +180,7 @@ public class DepotMarshaller implements QueryMarshal "Unique columns are implicitly indexed and should not be @Index'd."); String name = index.name().equals("") ? field.getName() + "Index" : index.name(); - Tuple2, Order> entry = - new Tuple2, Order>(fieldColumn, Order.ASC); + IndexDesc entry = new IndexDesc(fieldColumn, Order.ASC); if (index.unique()) { checkArgument(!namedFieldIndices.containsKey(index.name()), "All @Index for a particular name must be unique or non-unique"); @@ -930,27 +927,24 @@ public class DepotMarshaller implements QueryMarshal protected CreateIndexClause buildIndex (String name, boolean unique, Object config) { - List, Order>> definition = Lists.newArrayList(); + List definition = Lists.newArrayList(); if (config instanceof ColumnExp) { - definition.add(new Tuple2, Order>((ColumnExp)config, Order.ASC)); + definition.add(new IndexDesc((ColumnExp)config, Order.ASC)); } else if (config instanceof ColumnExp[]) { for (ColumnExp column : (ColumnExp[])config) { - definition.add(new Tuple2, Order>(column, Order.ASC)); + definition.add(new IndexDesc(column, Order.ASC)); } } else if (config instanceof SQLExpression) { - definition.add(new Tuple2, Order>((SQLExpression)config, Order.ASC)); - } else if (config instanceof Tuple2) { - @SuppressWarnings("unchecked") Tuple2, Order> tuple = - (Tuple2, Order>)config; - definition.add(tuple); + definition.add(new IndexDesc((SQLExpression)config, Order.ASC)); + } else if (config instanceof IndexDesc) { + definition.add((IndexDesc)config); } else if (config instanceof List) { - @SuppressWarnings("unchecked") List, Order>> defs = - (List, Order>>)config; + @SuppressWarnings("unchecked") List defs = (List)config; definition.addAll(defs); } else { throw new IllegalArgumentException( "Method '" + name + "' must return ColumnExp[], SQLExpression or " + - "List>"); + "List"); } return new CreateIndexClause(_pClass, getTableName() + "_" + name, unique, definition); } diff --git a/src/main/java/com/samskivert/depot/impl/clause/CreateIndexClause.java b/src/main/java/com/samskivert/depot/impl/clause/CreateIndexClause.java index eddcaf1..cd64453 100644 --- a/src/main/java/com/samskivert/depot/impl/clause/CreateIndexClause.java +++ b/src/main/java/com/samskivert/depot/impl/clause/CreateIndexClause.java @@ -7,13 +7,13 @@ package com.samskivert.depot.impl.clause; import java.util.Collection; import java.util.List; +import com.samskivert.depot.IndexDesc; import com.samskivert.depot.PersistentRecord; import com.samskivert.depot.clause.OrderBy.Order; import com.samskivert.depot.clause.QueryClause; import com.samskivert.depot.expression.SQLExpression; -import com.samskivert.depot.util.Tuple2; - import com.samskivert.depot.impl.FragmentVisitor; +import com.samskivert.depot.util.Tuple2; /** * Represents an CREATE INDEX instruction to the database. @@ -26,12 +26,12 @@ public class CreateIndexClause * database. */ public CreateIndexClause (Class pClass, String name, boolean unique, - List, Order>> fields) + List descs) { _pClass = pClass; _name = name; _unique = unique; - _fields = fields; + _descs = descs; } public Class getPersistentClass () @@ -49,9 +49,9 @@ public class CreateIndexClause return _unique; } - public List,Order>> getFields () + public List getDescs () { - return _fields; + return _descs; } // from SQLFragment @@ -71,5 +71,5 @@ public class CreateIndexClause protected boolean _unique; /** The components of the index, e.g. columns or functions of columns. */ - protected List,Order>> _fields; + protected List _descs; }