1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.opencastproject.assetmanager.impl.query;
22
23 import org.opencastproject.assetmanager.api.PropertyName;
24 import org.opencastproject.assetmanager.impl.persistence.EntityPaths;
25 import org.opencastproject.assetmanager.impl.persistence.QPropertyDto;
26 import org.opencastproject.assetmanager.impl.persistence.QSnapshotDto;
27 import org.opencastproject.assetmanager.impl.query.DeleteQueryContribution.Where;
28
29 import com.entwinemedia.fn.data.Opt;
30 import com.mysema.query.jpa.JPASubQuery;
31 import com.mysema.query.types.expr.BooleanExpression;
32
33 import java.util.function.Function;
34
35
36
37
38 public final class PropertyPredicates implements EntityPaths {
39 private static final QSnapshotDto Q_SNAPSHOT_ALIAS = new QSnapshotDto("s");
40 private static final QPropertyDto Q_PROPERTY_ALIAS = new QPropertyDto("p");
41
42 public static final Opt NONE = Opt.none();
43 public static final Function<QPropertyDto, Opt<BooleanExpression>> NO_VALUE =
44 new Function<QPropertyDto, Opt<BooleanExpression>>() {
45 @Override public Opt<BooleanExpression> apply(QPropertyDto qPropertyDto) {
46 return NONE;
47 }
48 };
49
50 private PropertyPredicates() {
51 }
52
53
54
55
56
57
58
59
60 public static BooleanExpression mkWhereSelect(
61 PropertyName propertyName,
62 Function<QPropertyDto, Opt<BooleanExpression>> mkValueExpression) {
63 return mkWhereSelect(Opt.some(propertyName.getNamespace()), Opt.some(propertyName.getName()), mkValueExpression);
64 }
65
66
67
68
69
70
71
72
73
74
75
76 public static BooleanExpression mkWhereSelect(
77 Opt<String> namespace,
78 Opt<String> propertyName,
79 Function<QPropertyDto, Opt<BooleanExpression>> mkValueExpression) {
80 return new JPASubQuery().from(Q_PROPERTY_ALIAS)
81 .where(Q_SNAPSHOT.mediaPackageId.eq(Q_PROPERTY_ALIAS.mediaPackageId)
82 .and(namespace.isSome()
83 ? Q_PROPERTY_ALIAS.namespace.eq(namespace.get())
84
85
86 : Q_PROPERTY_ALIAS.namespace.isNotNull())
87 .and(propertyName.isSome()
88 ? Q_PROPERTY_ALIAS.propertyName.eq(propertyName.get())
89 : null)
90 .and(mkValueExpression.apply(Q_PROPERTY_ALIAS).orNull()))
91 .exists();
92 }
93
94 public static Where mkWhereDelete(
95 final PropertyName propertyName,
96 final Function<QPropertyDto, Opt<BooleanExpression>> mkValueExpression) {
97 return mkWhereDelete(Opt.some(propertyName.getNamespace()), Opt.some(propertyName.getName()), mkValueExpression);
98 }
99
100 public static Where mkWhereDelete(
101 final Opt<String> namespace,
102 final Opt<String> propertyName,
103 final Function<QPropertyDto, Opt<BooleanExpression>> mkValueExpression) {
104 final Opt<BooleanExpression> valueExpression = mkValueExpression.apply(Q_PROPERTY);
105 final BooleanExpression propertyPredicate = (namespace.isSome()
106 ? Q_PROPERTY.namespace.eq(namespace.get())
107
108
109 : Q_PROPERTY.namespace.isNotNull())
110 .and(propertyName.isSome() ? Q_PROPERTY.propertyName.eq(propertyName.get()) : null)
111 .and(valueExpression.isSome() ? valueExpression.get() : null);
112
113 return new Where() {
114 @Override public BooleanExpression fromSnapshot(QSnapshotDto e) {
115 return new JPASubQuery()
116 .from(Q_PROPERTY)
117 .where(e.mediaPackageId.eq(Q_PROPERTY.mediaPackageId).and(propertyPredicate))
118 .exists();
119 }
120
121 @Override public BooleanExpression fromProperty(QPropertyDto p) {
122 return p.mediaPackageId.in(
123 new JPASubQuery()
124 .from(p)
125 .where(propertyPredicate)
126 .distinct()
127 .list(p.mediaPackageId));
128 }
129 };
130 }
131 }