1 package fr.ifremer.quadrige3.synchro.intercept.referential;
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 import com.google.common.eventbus.Subscribe;
27 import fr.ifremer.common.synchro.meta.event.CreateQueryEvent;
28 import fr.ifremer.common.synchro.query.SynchroQueryBuilder;
29 import fr.ifremer.common.synchro.query.SynchroQueryOperator;
30 import fr.ifremer.quadrige3.core.config.QuadrigeConfiguration;
31 import fr.ifremer.quadrige3.core.dao.technical.Beans;
32 import fr.ifremer.quadrige3.core.dao.technical.Daos;
33 import fr.ifremer.quadrige3.synchro.meta.DatabaseColumns;
34 import fr.ifremer.quadrige3.synchro.meta.referential.ReferentialSynchroTables;
35 import fr.ifremer.quadrige3.synchro.service.SynchroDirection;
36 import org.apache.commons.lang3.StringUtils;
37
38 import java.util.ArrayList;
39 import java.util.List;
40
41
42
43
44 public class TranscribingItemInterceptor extends AbstractReferentialInterceptor {
45
46
47
48
49
50
51 public TranscribingItemInterceptor() {
52 super(ReferentialSynchroTables.TRANSCRIBING_ITEM.name(),
53 SynchroDirection.IMPORT_SERVER2TEMP);
54 }
55
56
57
58
59
60
61
62
63 @Subscribe
64 public void handleCreateQuery(CreateQueryEvent e) {
65
66 String transcribingTypeLbIncludes = QuadrigeConfiguration.getInstance().getImportTranscribingItemTypeLbIncludes();
67 List<String> protectedLabels = new ArrayList<>();
68 List<String> unprotectedLabels = new ArrayList<>();
69 if (StringUtils.isNotBlank(transcribingTypeLbIncludes)) {
70
71
72 List<String> labels = Beans.split(transcribingTypeLbIncludes, ",");
73 labels.forEach(label -> {
74 if (label.contains("%"))
75 unprotectedLabels.add(label);
76 else
77 protectedLabels.add(label);
78 });
79
80 }
81
82 switch (e.queryName) {
83 case count:
84 case countFromUpdateDate:
85 case select:
86 case selectFromUpdateDate:
87
88
89 if (!protectedLabels.isEmpty() || !unprotectedLabels.isEmpty()) {
90 SynchroQueryBuilder queryBuilder = SynchroQueryBuilder.newBuilder(e.sql)
91 .addJoin(String.format("INNER JOIN %s tit ON t.%s = tit.%s",
92 ReferentialSynchroTables.TRANSCRIBING_ITEM_TYPE,
93 DatabaseColumns.TRANSC_ITEM_TYPE_ID,
94 DatabaseColumns.TRANSC_ITEM_TYPE_ID));
95 StringBuilder whereClauseBuilder = new StringBuilder("1=2");
96 if (!protectedLabels.isEmpty()) {
97 whereClauseBuilder.append(
98 String.format(" OR tit.%s IN (%s)", DatabaseColumns.TRANSC_ITEM_TYPE_LB, Daos.getInStatementFromStringCollection(protectedLabels))
99 );
100 }
101 if (!unprotectedLabels.isEmpty()) {
102 unprotectedLabels.forEach(s -> whereClauseBuilder.append(
103 String.format(" OR tit.%s LIKE '%s'", DatabaseColumns.TRANSC_ITEM_TYPE_LB, s)
104 )
105 );
106 }
107 queryBuilder.addWhere(SynchroQueryOperator.AND, String.format("(%s)", whereClauseBuilder));
108 e.sql = queryBuilder.build();
109 }
110 break;
111
112 case selectMaxUpdateDate:
113
114
115
116
117 if (!protectedLabels.isEmpty() || !unprotectedLabels.isEmpty()) {
118
119
120 StringBuilder query = new StringBuilder();
121 query.append("SELECT MIN(COALESCE(UPDATE_DT, TO_TIMESTAMP('1970-01-01', 'YYYY-MM-DD'))) FROM (");
122 query.append(" SELECT TIT.TRANSC_ITEM_TYPE_ID, MAX(TI.UPDATE_DT) AS UPDATE_DT FROM TRANSCRIBING_ITEM_TYPE TIT");
123 query.append(" LEFT OUTER JOIN TRANSCRIBING_ITEM TI ON TI.TRANSC_ITEM_TYPE_ID=TIT.TRANSC_ITEM_TYPE_ID");
124 query.append(" WHERE 1=2");
125 if (!protectedLabels.isEmpty()) {
126 query.append(" OR TIT.TRANSC_ITEM_TYPE_LB IN (").append(Daos.getInStatementFromStringCollection(protectedLabels)).append(")");
127 }
128 if (!unprotectedLabels.isEmpty()) {
129 unprotectedLabels.forEach(s -> query.append(" OR TIT.TRANSC_ITEM_TYPE_LB LIKE '").append(s).append("'"));
130 }
131 query.append(" GROUP BY TIT.TRANSC_ITEM_TYPE_ID");
132 query.append(")");
133 e.sql = query.toString();
134 }
135 break;
136
137 default:
138 break;
139 }
140 }
141 }