You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2019/12/30 07:11:30 UTC

[cayenne] branch master updated: CAY-2644 Use Property interface instead of BaseProperty

This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/master by this push:
     new e62c319  CAY-2644 Use Property interface instead of BaseProperty
     new ff21bcf  Merge pull request #409 from stariy95/4.2-IMPROVEMENT-property-interface
e62c319 is described below

commit e62c31998403d9d407aa372bcd4ccdbe4430b3cc
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Mon Dec 23 17:02:54 2019 +0300

    CAY-2644 Use Property interface instead of BaseProperty
---
 .../select/CustomColumnSetExtractor.java           | 20 +++++------
 .../translator/select/FluentSelectWrapper.java     |  4 +--
 .../translator/select/QualifierTranslator.java     |  3 +-
 .../translator/select/ResultNodeDescriptor.java    |  8 ++---
 .../translator/select/SelectQueryWrapper.java      |  3 +-
 .../select/TranslatableQueryWrapper.java           |  4 +--
 .../translator/select/TranslatorContext.java       |  6 ++--
 .../main/java/org/apache/cayenne/exp/Property.java |  4 +--
 .../org/apache/cayenne/exp/property/Property.java  |  5 +++
 .../org/apache/cayenne/query/ColumnSelect.java     | 36 +++++++++----------
 .../apache/cayenne/query/ColumnSelectMetadata.java |  8 ++---
 .../org/apache/cayenne/query/FluentSelect.java     |  4 +--
 .../org/apache/cayenne/query/ObjectSelect.java     | 40 +++++++++++-----------
 .../apache/cayenne/query/ObjectSelectMetadata.java |  4 +--
 .../java/org/apache/cayenne/query/SelectQuery.java | 14 ++++----
 .../apache/cayenne/query/SelectQueryMetadata.java  | 10 +++---
 .../select/CustomColumnSetExtractorTest.java       |  3 +-
 .../translator/select/MockQueryWrapperBuilder.java |  7 ++--
 .../org/apache/cayenne/query/ColumnSelectTest.java |  8 ++---
 19 files changed, 100 insertions(+), 91 deletions(-)

diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/CustomColumnSetExtractor.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/CustomColumnSetExtractor.java
index 1519b60..8224c1b 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/CustomColumnSetExtractor.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/CustomColumnSetExtractor.java
@@ -29,7 +29,7 @@ import org.apache.cayenne.access.sqlbuilder.sqltree.Node;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.exp.parser.ASTDbPath;
-import org.apache.cayenne.exp.property.BaseProperty;
+import org.apache.cayenne.exp.property.Property;
 import org.apache.cayenne.map.EmbeddedAttribute;
 import org.apache.cayenne.map.EmbeddedResult;
 import org.apache.cayenne.map.JoinType;
@@ -43,16 +43,16 @@ import org.apache.cayenne.util.Util;
 class CustomColumnSetExtractor implements ColumnExtractor {
 
     private final TranslatorContext context;
-    private final Collection<BaseProperty<?>> columns;
+    private final Collection<Property<?>> columns;
 
-    CustomColumnSetExtractor(TranslatorContext context, Collection<BaseProperty<?>> columns) {
+    CustomColumnSetExtractor(TranslatorContext context, Collection<Property<?>> columns) {
         this.context = context;
         this.columns = columns;
     }
 
     @Override
     public void extract(String prefix) {
-        for (BaseProperty<?> property : columns) {
+        for (Property<?> property : columns) {
             if (isFullObjectProp(property)) {
                 extractFullObject(prefix, property);
             } else if(isEmbeddedProp(property)) {
@@ -63,14 +63,14 @@ class CustomColumnSetExtractor implements ColumnExtractor {
         }
     }
 
-    private void extractSimpleProperty(BaseProperty<?> property) {
+    private void extractSimpleProperty(Property<?> property) {
         Node sqlNode = context.getQualifierTranslator().translate(property);
         context.addResultNode(sqlNode, true, property, property.getAlias());
         String name = property.getName() == null ? property.getExpression().expName() : property.getName();
         context.getSqlResult().addColumnResult(name);
     }
 
-    private boolean isFullObjectProp(BaseProperty<?> property) {
+    private boolean isFullObjectProp(Property<?> property) {
         int expressionType = property.getExpression().getType();
 
         // forbid direct selection of toMany relationships columns
@@ -88,11 +88,11 @@ class CustomColumnSetExtractor implements ColumnExtractor {
                     && Persistent.class.isAssignableFrom(property.getType()));
     }
 
-    private boolean isEmbeddedProp(BaseProperty<?> property) {
+    private boolean isEmbeddedProp(Property<?> property) {
         return EmbeddableObject.class.isAssignableFrom(property.getType());
     }
 
-    private void extractEmbeddedObject(String prefix, BaseProperty<?> property) {
+    private void extractEmbeddedObject(String prefix, Property<?> property) {
         Object o = property.getExpression().evaluate(context.getMetadata().getObjEntity());
         if(!(o instanceof EmbeddedAttribute)) {
             throw new CayenneRuntimeException("EmbeddedAttribute expected, %s found", o);
@@ -107,7 +107,7 @@ class CustomColumnSetExtractor implements ColumnExtractor {
         context.getSqlResult().addEmbeddedResult(result);
     }
 
-    private void extractFullObject(String prefix, BaseProperty<?> property) {
+    private void extractFullObject(String prefix, Property<?> property) {
         prefix = calculatePrefix(prefix, property);
         ensureJoin(prefix);
 
@@ -137,7 +137,7 @@ class CustomColumnSetExtractor implements ColumnExtractor {
      * Extracts prefix for this extractor from property.
      * This will be just a db path for this property, if any exists.
      */
-    private String calculatePrefix(String prefix, BaseProperty<?> property) {
+    private String calculatePrefix(String prefix, Property<?> property) {
         Expression exp = property.getExpression();
         int expressionType = exp.getType();
         if(expressionType == Expression.FULL_OBJECT && exp.getOperandCount() > 0) {
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/FluentSelectWrapper.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/FluentSelectWrapper.java
index 45c8e8b..3c4bed7 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/FluentSelectWrapper.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/FluentSelectWrapper.java
@@ -23,7 +23,7 @@ import java.util.Collection;
 import java.util.Objects;
 
 import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.property.BaseProperty;
+import org.apache.cayenne.exp.property.Property;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.Ordering;
@@ -61,7 +61,7 @@ public class FluentSelectWrapper implements TranslatableQueryWrapper {
     }
 
     @Override
-    public Collection<BaseProperty<?>> getColumns() {
+    public Collection<Property<?>> getColumns() {
         return select.getColumns();
     }
 
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslator.java
index 1308091..64ae657 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslator.java
@@ -56,6 +56,7 @@ import org.apache.cayenne.exp.parser.ASTSubquery;
 import org.apache.cayenne.exp.parser.PatternMatchNode;
 import org.apache.cayenne.exp.parser.SimpleNode;
 import org.apache.cayenne.exp.property.BaseProperty;
+import org.apache.cayenne.exp.property.Property;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
@@ -86,7 +87,7 @@ class QualifierTranslator implements TraversalHandler {
         this.nodeStack = new ArrayDeque<>();
     }
 
-    Node translate(BaseProperty<?> property) {
+    Node translate(Property<?> property) {
         if(property == null) {
             return null;
         }
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/ResultNodeDescriptor.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/ResultNodeDescriptor.java
index acb0ca5..4eb03d7 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/ResultNodeDescriptor.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/ResultNodeDescriptor.java
@@ -25,7 +25,7 @@ import org.apache.cayenne.access.sqlbuilder.sqltree.NodeType;
 import org.apache.cayenne.access.sqlbuilder.sqltree.SimpleNodeTreeVisitor;
 import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.exp.parser.ASTAggregateFunctionCall;
-import org.apache.cayenne.exp.property.BaseProperty;
+import org.apache.cayenne.exp.property.Property;
 import org.apache.cayenne.map.DbAttribute;
 
 /**
@@ -35,13 +35,13 @@ class ResultNodeDescriptor {
     private final Node node;
     private final boolean inDataRow;
     private final boolean isAggregate;
-    private final BaseProperty<?> property;
+    private final Property<?> property;
 
     private String dataRowKey;
     private DbAttribute dbAttribute;
     private String javaType;
 
-    ResultNodeDescriptor(Node node, boolean inDataRow, BaseProperty<?> property, String dataRowKey) {
+    ResultNodeDescriptor(Node node, boolean inDataRow, Property<?> property, String dataRowKey) {
         this.node = node;
         this.inDataRow = inDataRow;
         this.property = property;
@@ -58,7 +58,7 @@ class ResultNodeDescriptor {
         return inDataRow;
     }
 
-    public BaseProperty<?> getProperty() {
+    public Property<?> getProperty() {
         return property;
     }
 
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectQueryWrapper.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectQueryWrapper.java
index dfc8183..5c95718 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectQueryWrapper.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectQueryWrapper.java
@@ -24,6 +24,7 @@ import java.util.Objects;
 
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.property.BaseProperty;
+import org.apache.cayenne.exp.property.Property;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.Ordering;
 import org.apache.cayenne.query.QueryMetadata;
@@ -61,7 +62,7 @@ public class SelectQueryWrapper implements TranslatableQueryWrapper {
     }
 
     @Override
-    public Collection<BaseProperty<?>> getColumns() {
+    public Collection<Property<?>> getColumns() {
         return selectQuery.getColumns();
     }
 
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/TranslatableQueryWrapper.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/TranslatableQueryWrapper.java
index fae21d7..2c96978 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/TranslatableQueryWrapper.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/TranslatableQueryWrapper.java
@@ -22,7 +22,7 @@ package org.apache.cayenne.access.translator.select;
 import java.util.Collection;
 
 import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.property.BaseProperty;
+import org.apache.cayenne.exp.property.Property;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.Ordering;
 import org.apache.cayenne.query.QueryMetadata;
@@ -44,7 +44,7 @@ public interface TranslatableQueryWrapper {
 
     Collection<Ordering> getOrderings();
 
-    Collection<BaseProperty<?>> getColumns();
+    Collection<Property<?>> getColumns();
 
     Expression getHavingQualifier();
 
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/TranslatorContext.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/TranslatorContext.java
index 388f1ee..2928257 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/TranslatorContext.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/TranslatorContext.java
@@ -32,7 +32,7 @@ import org.apache.cayenne.access.sqlbuilder.sqltree.Node;
 import org.apache.cayenne.access.translator.DbAttributeBinding;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
-import org.apache.cayenne.exp.property.BaseProperty;
+import org.apache.cayenne.exp.property.Property;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.EntityResult;
@@ -128,7 +128,7 @@ public class TranslatorContext implements SQLGenerationContext {
     /**
      * Mark start of a new class descriptor, to be able to process result columns properly.
      * @param type of a descriptor
-     * @see #addResultNode(Node, boolean, BaseProperty, String)
+     * @see #addResultNode(Node, boolean, Property, String)
      */
     void markDescriptorStart(DescriptorType type) {
         if(type == DescriptorType.PREFETCH) {
@@ -224,7 +224,7 @@ public class TranslatorContext implements SQLGenerationContext {
         return addResultNode(node, true, null, dataRowKey);
     }
 
-    ResultNodeDescriptor addResultNode(Node node, boolean inDataRow, BaseProperty<?> property, String dataRowKey) {
+    ResultNodeDescriptor addResultNode(Node node, boolean inDataRow, Property<?> property, String dataRowKey) {
         ResultNodeDescriptor resultNode = new ResultNodeDescriptor(node, inDataRow, property, dataRowKey);
         if(appendResultToRoot) {
             resultNodeList.add(rootSegmentEnd + 1, resultNode);
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/Property.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/Property.java
index 47ced76..f214a07 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/exp/Property.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/Property.java
@@ -266,8 +266,8 @@ public class Property<E> extends BaseProperty<E> implements ComparableProperty<E
         int i = 0;
         exp[i++] = path();
         for(Object arg : args) {
-            if(arg instanceof BaseProperty) {
-                exp[i++] = ((BaseProperty) arg).getExpression();
+            if(arg instanceof org.apache.cayenne.exp.property.Property) {
+                exp[i++] = ((org.apache.cayenne.exp.property.Property<?>) arg).getExpression();
             } else if(arg instanceof Expression) {
                 exp[i++] = (Expression) arg;
             } else if(arg != null) {
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/property/Property.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/property/Property.java
index c7ba636..f92dacb 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/exp/property/Property.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/property/Property.java
@@ -33,6 +33,11 @@ public interface Property<E> {
     String getName();
 
     /**
+     * @return alias of this property, can be null
+     */
+    String getAlias();
+
+    /**
      * @return expression that defines this property, not null
      */
     Expression getExpression();
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelect.java b/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelect.java
index 5521700..4a0e040 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelect.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelect.java
@@ -32,7 +32,7 @@ import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.exp.property.ComparableProperty;
 import org.apache.cayenne.exp.property.NumericProperty;
-import org.apache.cayenne.exp.Property;
+import org.apache.cayenne.exp.property.Property;
 import org.apache.cayenne.exp.property.PropertyFactory;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.EntityResolver;
@@ -61,13 +61,13 @@ import org.apache.cayenne.map.ObjEntity;
  * </pre>
  * </p>
  * <p><b>Note: this class can't be instantiated directly. Use {@link ObjectSelect}.</b></p>
- * @see ObjectSelect#columnQuery(Class, BaseProperty)
+ * @see ObjectSelect#columnQuery(Class, Property)
  *
  * @since 4.0
  */
 public class ColumnSelect<T> extends FluentSelect<T> {
 
-    private Collection<BaseProperty<?>> columns;
+    private Collection<Property<?>> columns;
     // package private for tests
     boolean singleColumn = true;
     boolean distinct;
@@ -386,11 +386,11 @@ public class ColumnSelect<T> extends FluentSelect<T> {
      * </pre>
      *
      * @param properties array of properties to select
-     * @see ColumnSelect#column(BaseProperty)
+     * @see ColumnSelect#column(Property)
      * @see ColumnSelect#columns(Collection)
      */
     @SuppressWarnings("unchecked")
-    public ColumnSelect<Object[]> columns(BaseProperty<?>... properties) {
+    public ColumnSelect<Object[]> columns(Property<?>... properties) {
         if (properties.length == 0) {
             throw new IllegalArgumentException("properties must contain at least one element");
         }
@@ -408,10 +408,10 @@ public class ColumnSelect<T> extends FluentSelect<T> {
      * (root entity properties, function call expressions, properties of relationships, etc).</p>
      * <p>
      * @param properties collection of properties, <b>must</b> contain at least one element
-     * @see ColumnSelect#columns(BaseProperty[])
+     * @see ColumnSelect#columns(Property[])
      */
     @SuppressWarnings("unchecked")
-    public ColumnSelect<Object[]> columns(Collection<BaseProperty<?>> properties) {
+    public ColumnSelect<Object[]> columns(Collection<Property<?>> properties) {
         if (properties == null){
             throw new NullPointerException("properties is null");
         }
@@ -429,7 +429,7 @@ public class ColumnSelect<T> extends FluentSelect<T> {
     }
 
     @SuppressWarnings("unchecked")
-    protected  <E> ColumnSelect<E> column(BaseProperty<E> property) {
+    protected  <E> ColumnSelect<E> column(Property<E> property) {
         if (this.columns == null) {
             this.columns = new ArrayList<>(1);
         } else {
@@ -440,7 +440,7 @@ public class ColumnSelect<T> extends FluentSelect<T> {
     }
 
     /**
-     * <p>Shortcut for {@link #columns(BaseProperty[])} columns}(Property.COUNT)</p>
+     * <p>Shortcut for {@link #columns(Property[])} columns}(Property.COUNT)</p>
      */
     public ColumnSelect<Object[]> count() {
         return columns(PropertyFactory.COUNT);
@@ -457,7 +457,7 @@ public class ColumnSelect<T> extends FluentSelect<T> {
 
     /**
      * <p>Select minimum value of property</p>
-     * @see ColumnSelect#columns(BaseProperty[])
+     * @see ColumnSelect#columns(Property[])
      */
     public ColumnSelect<Object[]> min(ComparableProperty<?> property) {
         return columns(property.min());
@@ -465,7 +465,7 @@ public class ColumnSelect<T> extends FluentSelect<T> {
 
     /**
      * <p>Select maximum value of property</p>
-     * @see ColumnSelect#columns(BaseProperty[])
+     * @see ColumnSelect#columns(Property[])
      */
     public ColumnSelect<Object[]> max(ComparableProperty<?> property) {
         return columns(property.max());
@@ -473,17 +473,17 @@ public class ColumnSelect<T> extends FluentSelect<T> {
 
     /**
      * <p>Select average value of property</p>
-     * @see ColumnSelect#columns(BaseProperty[])
+     * @see ColumnSelect#columns(Property[])
      * @deprecated since 4.2 use {@link #avg(NumericProperty)}
      */
     @Deprecated
-    public ColumnSelect<Object[]> avg(Property<?> property) {
+    public ColumnSelect<Object[]> avg(org.apache.cayenne.exp.Property<?> property) {
         return columns(property.avg());
     }
 
     /**
      * <p>Select average value of property</p>
-     * @see ColumnSelect#columns(BaseProperty[])
+     * @see ColumnSelect#columns(Property[])
      */
     public ColumnSelect<Object[]> avg(NumericProperty<?> property) {
         return columns(property.avg());
@@ -491,17 +491,17 @@ public class ColumnSelect<T> extends FluentSelect<T> {
 
     /**
      * <p>Select sum of values</p>
-     * @see ColumnSelect#columns(BaseProperty[])
+     * @see ColumnSelect#columns(Property[])
      * @deprecated since 4.2 use {@link #sum(NumericProperty)}
      */
     @Deprecated
-    public <E extends Number> ColumnSelect<Object[]> sum(Property<E> property) {
+    public <E extends Number> ColumnSelect<Object[]> sum(org.apache.cayenne.exp.Property<E> property) {
         return columns(property.sum());
     }
 
     /**
      * <p>Select sum of values</p>
-     * @see ColumnSelect#columns(BaseProperty[])
+     * @see ColumnSelect#columns(Property[])
      */
     public <E extends Number> ColumnSelect<Object[]> sum(NumericProperty<E> property) {
         return columns(property.sum());
@@ -600,7 +600,7 @@ public class ColumnSelect<T> extends FluentSelect<T> {
     }
 
     @Override
-    public Collection<BaseProperty<?>> getColumns() {
+    public Collection<Property<?>> getColumns() {
         return columns;
     }
 
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelectMetadata.java b/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelectMetadata.java
index 1222346..365853d 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelectMetadata.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelectMetadata.java
@@ -25,7 +25,7 @@ import java.util.Map;
 import java.util.function.Function;
 
 import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.property.BaseProperty;
+import org.apache.cayenne.exp.property.Property;
 import org.apache.cayenne.map.DefaultEntityResultSegment;
 import org.apache.cayenne.map.DefaultScalarResultSegment;
 import org.apache.cayenne.map.EntityResolver;
@@ -71,9 +71,9 @@ class ColumnSelectMetadata extends ObjectSelectMetadata {
 	}
 
 	protected void resolveColumnsAliases(FluentSelect<?> query) {
-        Collection<BaseProperty<?>> columns = query.getColumns();
+        Collection<Property<?>> columns = query.getColumns();
         if(columns != null) {
-            for(BaseProperty<?> property : columns) {
+            for(Property<?> property : columns) {
                 Expression propertyExpression = property.getExpression();
                 if(propertyExpression != null) {
                     resolveAutoAliases(propertyExpression);
@@ -101,7 +101,7 @@ class ColumnSelectMetadata extends ObjectSelectMetadata {
 		}
 
 		resultSetMapping = new ArrayList<>(query.getColumns().size());
-		for(BaseProperty<?> column : query.getColumns()) {
+		for(Property<?> column : query.getColumns()) {
 			// for each column we need only to know if it's entity or scalar
 			Expression exp = column.getExpression();
 			boolean fullObject = false;
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelect.java b/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelect.java
index 42a055b..d11c491 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelect.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelect.java
@@ -28,7 +28,7 @@ import org.apache.cayenne.ResultBatchIterator;
 import org.apache.cayenne.ResultIterator;
 import org.apache.cayenne.ResultIteratorCallback;
 import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.property.BaseProperty;
+import org.apache.cayenne.exp.property.Property;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.ObjEntity;
@@ -204,7 +204,7 @@ public abstract class FluentSelect<T> extends AbstractQuery implements Select<T>
     /**
      * @since 4.2
      */
-    public Collection<BaseProperty<?>> getColumns() {
+    public Collection<Property<?>> getColumns() {
         return null;
     }
 
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java b/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java
index 6638d9a..d20b5d8 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java
@@ -29,10 +29,10 @@ import org.apache.cayenne.DataRow;
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.exp.Property;
 import org.apache.cayenne.exp.property.BaseProperty;
 import org.apache.cayenne.exp.property.ComparableProperty;
 import org.apache.cayenne.exp.property.NumericProperty;
+import org.apache.cayenne.exp.property.Property;
 import org.apache.cayenne.exp.property.PropertyFactory;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.EntityResolver;
@@ -135,7 +135,7 @@ public class ObjectSelect<T> extends FluentSelect<T> {
      * @param entityType base persistent class that will be used as a root for this query
      * @param column single column to select
      */
-    public static <E> ColumnSelect<E> columnQuery(Class<?> entityType, BaseProperty<E> column) {
+    public static <E> ColumnSelect<E> columnQuery(Class<?> entityType, Property<E> column) {
         return new ColumnSelect<>().entityType(entityType).column(column);
     }
 
@@ -145,7 +145,7 @@ public class ObjectSelect<T> extends FluentSelect<T> {
      * @param entityType base persistent class that will be used as a root for this query
      * @param columns columns to select
      */
-    public static ColumnSelect<Object[]> columnQuery(Class<?> entityType, BaseProperty<?>... columns) {
+    public static ColumnSelect<Object[]> columnQuery(Class<?> entityType, Property<?>... columns) {
         return new ColumnSelect<Object[]>().entityType(entityType).columns(columns);
     }
 
@@ -540,9 +540,9 @@ public class ObjectSelect<T> extends FluentSelect<T> {
      * </pre>
      *
      * @param properties array of properties to select
-     * @see ObjectSelect#column(BaseProperty)
+     * @see ObjectSelect#column(Property)
      */
-    public ColumnSelect<Object[]> columns(BaseProperty<?>... properties) {
+    public ColumnSelect<Object[]> columns(Property<?>... properties) {
         return new ColumnSelect<>(this).columns(properties);
     }
 
@@ -550,7 +550,7 @@ public class ObjectSelect<T> extends FluentSelect<T> {
      * <p>Select one specific property.</p>
      * <p>Can be any property that can be resolved against root entity type
      * (root entity's property, function call expression, property of relationships, etc)</p>
-     * <p>If you need several columns use {@link ObjectSelect#columns(BaseProperty[])} method.</p>
+     * <p>If you need several columns use {@link ObjectSelect#columns(Property[])} method.</p>
      * <p>
      * <pre>
      * {@code
@@ -561,15 +561,15 @@ public class ObjectSelect<T> extends FluentSelect<T> {
      * </pre>
      * </p>
      * @param property single property to select
-     * @see ObjectSelect#columns(BaseProperty[])
+     * @see ObjectSelect#columns(Property[])
      */
-    public <E> ColumnSelect<E> column(BaseProperty<E> property) {
+    public <E> ColumnSelect<E> column(Property<E> property) {
         return new ColumnSelect<>(this).column(property);
     }
 
     /**
      * Select COUNT(*)
-     * @see ObjectSelect#column(BaseProperty)
+     * @see ObjectSelect#column(Property)
      */
     public ColumnSelect<Long> count() {
         return column(PropertyFactory.COUNT);
@@ -579,7 +579,7 @@ public class ObjectSelect<T> extends FluentSelect<T> {
      * <p>Select COUNT(property)</p>
      * <p>Can return different result than COUNT(*) as it will count only non null values</p>
      * @see ObjectSelect#count()
-     * @see ObjectSelect#column(BaseProperty)
+     * @see ObjectSelect#column(Property)
      */
     public ColumnSelect<Long> count(BaseProperty<?> property) {
         return column(property.count());
@@ -587,7 +587,7 @@ public class ObjectSelect<T> extends FluentSelect<T> {
 
     /**
      * <p>Select minimum value of property</p>
-     * @see ObjectSelect#column(BaseProperty)
+     * @see ObjectSelect#column(Property)
      */
     public <E> ColumnSelect<E> min(ComparableProperty<E> property) {
         return column(property.min());
@@ -595,7 +595,7 @@ public class ObjectSelect<T> extends FluentSelect<T> {
 
     /**
      * <p>Select minimum value of property</p>
-     * @see ObjectSelect#column(BaseProperty)
+     * @see ObjectSelect#column(Property)
      */
     public <E extends Number> ColumnSelect<E> min(NumericProperty<E> property) {
         return column(property.min());
@@ -603,7 +603,7 @@ public class ObjectSelect<T> extends FluentSelect<T> {
 
     /**
      * <p>Select maximum value of property</p>
-     * @see ObjectSelect#column(BaseProperty)
+     * @see ObjectSelect#column(Property)
      */
     public <E> ColumnSelect<E> max(ComparableProperty<E> property) {
         return column(property.max());
@@ -611,7 +611,7 @@ public class ObjectSelect<T> extends FluentSelect<T> {
 
     /**
      * <p>Select maximum value of property</p>
-     * @see ObjectSelect#column(BaseProperty)
+     * @see ObjectSelect#column(Property)
      */
     public <E extends Number> ColumnSelect<E> max(NumericProperty<E> property) {
         return column(property.max());
@@ -619,17 +619,17 @@ public class ObjectSelect<T> extends FluentSelect<T> {
 
     /**
      * <p>Select average value of property</p>
-     * @see ObjectSelect#column(BaseProperty)
+     * @see ObjectSelect#column(Property)
      * @deprecated since 4.2 use {@link #avg(NumericProperty)}
      */
     @Deprecated
-    public <E> ColumnSelect<E> avg(Property<E> property) {
+    public <E> ColumnSelect<E> avg(org.apache.cayenne.exp.Property<E> property) {
         return column(property.avg());
     }
 
     /**
      * <p>Select average value of property</p>
-     * @see ObjectSelect#column(BaseProperty)
+     * @see ObjectSelect#column(Property)
      */
     public <E extends Number> ColumnSelect<E> avg(NumericProperty<E> property) {
         return column(property.avg());
@@ -637,17 +637,17 @@ public class ObjectSelect<T> extends FluentSelect<T> {
 
     /**
      * <p>Select sum of values</p>
-     * @see ObjectSelect#column(BaseProperty)
+     * @see ObjectSelect#column(Property)
      * @deprecated since 4.2 use {@link #sum(NumericProperty)}
      */
     @Deprecated
-    public <E extends Number> ColumnSelect<E> sum(Property<E> property) {
+    public <E extends Number> ColumnSelect<E> sum(org.apache.cayenne.exp.Property<E> property) {
         return column(property.sum());
     }
 
     /**
      * <p>Select sum of values</p>
-     * @see ObjectSelect#column(BaseProperty)
+     * @see ObjectSelect#column(Property)
      */
     public <E extends Number> ColumnSelect<E> sum(NumericProperty<E> property) {
         return column(property.sum());
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelectMetadata.java b/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelectMetadata.java
index fd1fc67..164a7af 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelectMetadata.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelectMetadata.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.query;
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.TraversalHandler;
-import org.apache.cayenne.exp.property.BaseProperty;
+import org.apache.cayenne.exp.property.Property;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.ObjEntity;
 
@@ -77,7 +77,7 @@ class ObjectSelectMetadata extends BaseQueryMetadata {
 
 		if (query.getColumns() != null && !query.getColumns().isEmpty()) {
 			traversalHandler = new ToCacheKeyTraversalHandler(resolver.getValueObjectTypeRegistry(), key);
-			for (BaseProperty<?> property : query.getColumns()) {
+			for (Property<?> property : query.getColumns()) {
 				key.append("/c:");
 				property.getExpression().traverse(traversalHandler);
 			}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQuery.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQuery.java
index ea2eeea..189cb30 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQuery.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQuery.java
@@ -33,7 +33,7 @@ import org.apache.cayenne.ResultIterator;
 import org.apache.cayenne.ResultIteratorCallback;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.exp.property.BaseProperty;
+import org.apache.cayenne.exp.property.Property;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.ObjEntity;
@@ -43,8 +43,8 @@ import org.apache.cayenne.map.ObjEntity;
  * DataRows). Supports expression qualifier, multiple orderings and a number of
  * other parameters that serve as runtime hints to Cayenne on how to optimize
  * the fetch and result processing.
- * @deprecated since 4.2
- * use {@link org.apache.cayenne.query.ObjectSelect}
+ *
+ * @deprecated since 4.2, use {@link org.apache.cayenne.query.ObjectSelect}
  */
 @Deprecated
 public class SelectQuery<T> extends AbstractQuery implements ParameterizedQuery, Select<T> {
@@ -61,7 +61,7 @@ public class SelectQuery<T> extends AbstractQuery implements ParameterizedQuery,
 	/**
 	 * @since 4.0
 	 */
-	protected Collection<BaseProperty<?>> columns;
+	protected Collection<Property<?>> columns;
 
 	/**
 	 * @since 4.0
@@ -758,14 +758,14 @@ public class SelectQuery<T> extends AbstractQuery implements ParameterizedQuery,
 	 * @since 4.0
 	 * @see SelectQuery#setCanReturnScalarValue(boolean)
 	 */
-	public void setColumns(Collection<BaseProperty<?>> columns) {
+	public void setColumns(Collection<Property<?>> columns) {
 		this.columns = columns;
 	}
 
 	/**
 	 * @since 4.0
 	 */
-	public void setColumns(BaseProperty<?>... columns) {
+	public void setColumns(Property<?>... columns) {
 		if(columns == null || columns.length == 0) {
 			return;
 		}
@@ -795,7 +795,7 @@ public class SelectQuery<T> extends AbstractQuery implements ParameterizedQuery,
 	/**
 	 * @since 4.0
 	 */
-	public Collection<BaseProperty<?>> getColumns() {
+	public Collection<Property<?>> getColumns() {
 		return columns;
 	}
 
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java
index d78e681..30b135e 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.query;
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.TraversalHandler;
-import org.apache.cayenne.exp.property.BaseProperty;
+import org.apache.cayenne.exp.property.Property;
 import org.apache.cayenne.map.DefaultEntityResultSegment;
 import org.apache.cayenne.map.DefaultScalarResultSegment;
 import org.apache.cayenne.map.EntityResolver;
@@ -94,7 +94,7 @@ class SelectQueryMetadata extends BaseQueryMetadata {
 
 		if(query.getColumns() != null && !query.getColumns().isEmpty()) {
 			traversalHandler = new ToCacheKeyTraversalHandler(resolver.getValueObjectTypeRegistry(), key);
-			for(BaseProperty<?> property : query.getColumns()) {
+			for(Property<?> property : query.getColumns()) {
 				key.append("/c:");
 				property.getExpression().traverse(traversalHandler);
 			}
@@ -163,9 +163,9 @@ class SelectQueryMetadata extends BaseQueryMetadata {
 	}
 
 	private void resolveColumnsAliases(SelectQuery<?> query) {
-        Collection<BaseProperty<?>> columns = query.getColumns();
+        Collection<Property<?>> columns = query.getColumns();
         if(columns != null) {
-            for(BaseProperty<?> property : columns) {
+            for(Property<?> property : columns) {
                 Expression propertyExpression = property.getExpression();
                 if(propertyExpression != null) {
                     resolveAutoAliases(propertyExpression);
@@ -259,7 +259,7 @@ class SelectQueryMetadata extends BaseQueryMetadata {
 		}
 
 		resultSetMapping = new ArrayList<>(query.getColumns().size());
-		for(BaseProperty<?> column : query.getColumns()) {
+		for(Property<?> column : query.getColumns()) {
 			// for each column we need only to know if it's entity or scalar
 			Expression exp = column.getExpression();
 			boolean fullObject = false;
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/CustomColumnSetExtractorTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/CustomColumnSetExtractorTest.java
index e5697bd..13c5f8e 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/CustomColumnSetExtractorTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/CustomColumnSetExtractorTest.java
@@ -26,6 +26,7 @@ import java.util.Collections;
 import org.apache.cayenne.access.sqlbuilder.sqltree.ColumnNode;
 import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.exp.property.BaseProperty;
+import org.apache.cayenne.exp.property.Property;
 import org.apache.cayenne.exp.property.PropertyFactory;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
@@ -73,7 +74,7 @@ public class CustomColumnSetExtractorTest extends BaseColumnExtractorTest {
         resolver.addDataMap(dataMap);
 
         BaseProperty<?> property0 = PropertyFactory.createBase(ExpressionFactory.dbPathExp("name"), String.class);
-        Collection<BaseProperty<?>> properties = Collections.singleton(property0);
+        Collection<Property<?>> properties = Collections.singleton(property0);
 
         CustomColumnSetExtractor extractor = new CustomColumnSetExtractor(context, properties);
         extractor.extract();
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/MockQueryWrapperBuilder.java b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/MockQueryWrapperBuilder.java
index 62c8603..2752265 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/MockQueryWrapperBuilder.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/MockQueryWrapperBuilder.java
@@ -23,6 +23,7 @@ import java.util.Collection;
 
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.property.BaseProperty;
+import org.apache.cayenne.exp.property.Property;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.MockQueryMetadata;
 import org.apache.cayenne.query.Ordering;
@@ -45,7 +46,7 @@ class MockQueryWrapperBuilder {
 
     private Collection<Ordering> orderings;
 
-    private Collection<BaseProperty<?>> columns;
+    private Collection<Property<?>> columns;
 
     private Expression havingQualifier;
 
@@ -77,7 +78,7 @@ class MockQueryWrapperBuilder {
         return this;
     }
 
-    MockQueryWrapperBuilder withColumns(Collection<BaseProperty<?>> columns) {
+    MockQueryWrapperBuilder withColumns(Collection<Property<?>> columns) {
         this.columns = columns;
         return this;
     }
@@ -120,7 +121,7 @@ class MockQueryWrapperBuilder {
             }
 
             @Override
-            public Collection<BaseProperty<?>> getColumns() {
+            public Collection<Property<?>> getColumns() {
                 return columns;
             }
 
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/ColumnSelectTest.java b/cayenne-server/src/test/java/org/apache/cayenne/query/ColumnSelectTest.java
index bd2061a..21872a3 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/ColumnSelectTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/query/ColumnSelectTest.java
@@ -24,9 +24,9 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 
-import org.apache.cayenne.exp.property.BaseProperty;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionFactory;
+import org.apache.cayenne.exp.property.Property;
 import org.apache.cayenne.exp.property.PropertyFactory;
 import org.apache.cayenne.testdo.testmap.Artist;
 import org.apache.cayenne.testdo.testmap.Painting;
@@ -205,7 +205,7 @@ public class ColumnSelectTest {
         q.columns(Artist.DATE_OF_BIRTH);
         q.columns(Artist.PAINTING_ARRAY);
 
-        Collection<BaseProperty<?>> properties = Arrays.asList(Artist.ARTIST_NAME, Artist.DATE_OF_BIRTH, Artist.PAINTING_ARRAY);
+        Collection<Property<?>> properties = Arrays.asList(Artist.ARTIST_NAME, Artist.DATE_OF_BIRTH, Artist.PAINTING_ARRAY);
         assertEquals(properties, q.getColumns());
     }
 
@@ -218,7 +218,7 @@ public class ColumnSelectTest {
         q.columns(Artist.ARTIST_NAME, Artist.DATE_OF_BIRTH, Artist.PAINTING_ARRAY);
         q.columns(Artist.ARTIST_NAME, Artist.DATE_OF_BIRTH, Artist.PAINTING_ARRAY);
 
-        Collection<BaseProperty<?>> properties = Arrays.asList(
+        Collection<Property<?>> properties = Arrays.asList(
                 Artist.ARTIST_NAME, Artist.DATE_OF_BIRTH, Artist.PAINTING_ARRAY,
                 Artist.ARTIST_NAME, Artist.DATE_OF_BIRTH, Artist.PAINTING_ARRAY); // should it be Set instead of List?
         assertEquals(properties, q.getColumns());
@@ -234,7 +234,7 @@ public class ColumnSelectTest {
         q.column(Artist.DATE_OF_BIRTH);
         q.column(Artist.PAINTING_ARRAY);
 
-        Collection<BaseProperty<?>> properties = Collections.singletonList(Artist.PAINTING_ARRAY);
+        Collection<Property<?>> properties = Collections.singletonList(Artist.PAINTING_ARRAY);
         assertEquals(properties, q.getColumns());
     }