1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
/*
* Copyright 2007 Amazon Technologies, Inc. or its affiliates.
* Amazon, Amazon.com and Carbonado are trademarks or registered trademarks
* of Amazon Technologies, Inc. or its affiliates. All rights reserved.
*
* 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.
*/
package com.amazon.carbonado;
import java.lang.annotation.*;
/**
* Identifies a {@link Storable} property which is not directly persisted, but
* is instead derived from other property values. A derived property cannot be
* abstract, and a "set" method is optional.
*
* <p>Derived properties can be used just like a normal property in most
* cases. They can be used in query filters, indexes, alternate keys, and they
* can also be used to define a {@link Version} property.
*
* <p>If the derived property depends on {@link Join} properties and is also
* used in an index or alternate key, dependencies must be listed in order for
* the index to be properly updated.
*
* <p>Example:<pre>
* @Indexes(@Index("uppercaseName"))
* public abstract class UserInfo implements Storable<UserInfo> {
* /**
* * Derive an uppercase name for case-insensitive searches.
* */
* <b>@Derived</b>
* public String getUppercaseName() {
* String name = getName();
* return name == null ? null : name.toUpperCase();
* }
*
* ...
* }
* </pre>
*
* @author Brian S O'Neill
* @author Tobias Holgers
* @since 1.2
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Derived {
/**
* List of properties that this property is derived from.
*/
String[] from() default {};
/**
* Returns whether this property should be included when copying a
* storable. Copying of a derived property uses the "get" and "set" methods
* and requires the "set" method to be defined. Default false.
*/
boolean shouldCopy() default false;
}
|