Skip to content

Commit 3bc5bbb

Browse files
authored
Merge pull request #999 from jeffgbutler/docs
Update docs for extending SqlColumn
2 parents 737049b + c52c52b commit 3bc5bbb

File tree

1 file changed

+29
-17
lines changed

1 file changed

+29
-17
lines changed

src/main/java/org/mybatis/dynamic/sql/SqlColumn.java

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
* the {@link SqlTable} the column is a part of.
3434
*
3535
* <p>The class can be extended if you wish to associate additional attributes with a column for your
36-
* own purposes. Extending the class is a bit more challenging than you might expect because you will need to
36+
* own purposes. Extending the class is a bit more challenging than you might expect because you may need to
3737
* handle the covariant types for many methods in {@code SqlColumn}. Additionally, many methods in {@code SqlColumn}
3838
* create new instances of the class in keeping with the library's primary strategy of immutability. You will also
3939
* need to ensure that these methods create instances of your extended class, rather than the base {@code SqlColumn}
@@ -44,16 +44,18 @@
4444
* <li>Create a class that extends {@link SqlColumn}</li>
4545
* <li>In your extended class, create a static builder class that extends {@link SqlColumn.AbstractBuilder}</li>
4646
* <li>Add your desired attributes to the class and the builder</li>
47-
* <li>In your extended class, override the {@link SqlColumn#copyBuilder()} method and return a new instance of
48-
* your builder with all attributes set. You should call the
47+
* <li>You MUST override the {@link SqlColumn#copyBuilder()} method and return a new instance of
48+
* your builder with all attributes set. In the overridden method you should call the superclass
4949
* {@link SqlColumn#populateBaseBuilder(AbstractBuilder)} method
50-
* to set the attributes from {@code SqlColumn}, then populate your extended attributes.
50+
* to set the attributes from the base {@code SqlColumn}, then populate your extended attributes. During normal
51+
* usage, the library may create additional instances of your class. If you do not override the
52+
* {@link SqlColumn#copyBuilder()} method properly, then your extended attributes will be lost.
5153
* </li>
52-
* <li>You MUST override the following methods. These methods are used with regular operations in the library.
53-
* If you do not override these methods, it is likely that your extended attributes will be lost during
54-
* regular usage. For example, if you do not override the {@code as} method and a user calls the method to
55-
* apply an alias, then the base {@code SqlColumn} class would create a new instance of {@code SqlColumn}, NOT
56-
* your extended class.
54+
* <li>You MAY override the following methods. These methods are used with regular operations in the library and
55+
* create new instances of the class. However, these methods are not typically chained, so losing the specific
56+
* type may not be a problem. If you want to preserve the type, then you can override these methods
57+
* to specify the covariant return type. See below for usage of the {@link SqlColumn#cast(SqlColumn)} method
58+
* to make it easier to override these methods.
5759
* <ul>
5860
* <li>{@link SqlColumn#as(String)}</li>
5961
* <li>{@link SqlColumn#asCamelCase()}</li>
@@ -63,8 +65,10 @@
6365
* </li>
6466
* <li>You SHOULD override the following methods. These methods can be used to add additional attributes to a
6567
* column by creating a new instance with a specified attribute set. These methods are used during the
66-
* construction of columns. If you do not override these methods, and a user calls them, then a new
67-
* {@code SqlColumn} will be created that does not contain your extended attributes.
68+
* construction of columns. If you do not override these methods, and a user calls them, then the specific type
69+
* will be lost. If you want to preserve the type, then you can override these methods
70+
* to specify the covariant return type. See below for usage of the {@link SqlColumn#cast(SqlColumn)} method
71+
* to make it easier to override these methods.
6872
* <ul>
6973
* <li>{@link SqlColumn#withJavaProperty(String)}</li>
7074
* <li>{@link SqlColumn#withRenderingStrategy(RenderingStrategy)}</li>
@@ -88,7 +92,7 @@
8892
* }
8993
* </pre>
9094
*
91-
* <p>The test code for this library contains an example of a proper extension of this class.
95+
* <p>The test code for this library contains an example of a fully executed extension of this class.
9296
*
9397
* @param <T> the Java type associated with the column
9498
*/
@@ -164,7 +168,7 @@ public Optional<String> javaProperty() {
164168
*/
165169
@Override
166170
public SqlColumn<T> descending() {
167-
return cast(copyBuilder().withDescendingPhrase(" DESC").build()); //$NON-NLS-1$
171+
return copyBuilder().withDescendingPhrase(" DESC").build(); //$NON-NLS-1$
168172
}
169173

170174
/**
@@ -177,7 +181,7 @@ public SqlColumn<T> descending() {
177181
*/
178182
@Override
179183
public SqlColumn<T> as(String alias) {
180-
return cast(copyBuilder().withAlias(alias).build());
184+
return copyBuilder().withAlias(alias).build();
181185
}
182186

183187
/**
@@ -188,7 +192,7 @@ public SqlColumn<T> as(String alias) {
188192
* @return a new column that will be rendered with the specified table qualifier
189193
*/
190194
public SqlColumn<T> qualifiedWith(String tableQualifier) {
191-
return cast(copyBuilder().withTableQualifier(tableQualifier).build());
195+
return copyBuilder().withTableQualifier(tableQualifier).build();
192196
}
193197

194198
/**
@@ -203,9 +207,9 @@ public SqlColumn<T> qualifiedWith(String tableQualifier) {
203207
* @return a new column aliased with a camel case version of the column name
204208
*/
205209
public SqlColumn<T> asCamelCase() {
206-
return cast(copyBuilder()
210+
return copyBuilder()
207211
.withAlias("\"" + StringUtilities.toCamelCase(name) + "\"") //$NON-NLS-1$ //$NON-NLS-2$
208-
.build());
212+
.build();
209213
}
210214

211215
@Override
@@ -318,6 +322,14 @@ public <S> SqlColumn<S> withJavaProperty(String javaProperty) {
318322
return cast(copyBuilder().withJavaProperty(javaProperty).build());
319323
}
320324

325+
/**
326+
* Create a new Builder, then populate all attributes in the builder with current values.
327+
*
328+
* <p>This method is used to create copies of the class during normal operations (e.g. when calling the
329+
* {@link SqlColumn#as(String)} method). Any subclass of {@code SqlColumn} MUST override this method.
330+
*
331+
* @return a new Builder instance with all current values populated
332+
*/
321333
protected AbstractBuilder<T, ?, ?> copyBuilder() {
322334
return populateBaseBuilder(new Builder<>());
323335
}

0 commit comments

Comments
 (0)