Skip to content

Commit 1601ce1

Browse files
committed
task: save parsed image URLs into series_import_parsed_image_urls table instead of the series_import_parsed_data.image_url field
Part of #698
1 parent d6ec408 commit 1601ce1

File tree

8 files changed

+121
-7
lines changed

8 files changed

+121
-7
lines changed

src/main/java/ru/mystamps/web/feature/series/importing/JdbcSeriesImportDao.java

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@
2222
import org.springframework.dao.EmptyResultDataAccessException;
2323
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
2424
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
25+
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
2526
import org.springframework.jdbc.support.GeneratedKeyHolder;
2627
import org.springframework.jdbc.support.KeyHolder;
2728
import ru.mystamps.web.common.JdbcUtils;
2829

30+
import java.util.Arrays;
2931
import java.util.Collections;
3032
import java.util.Date;
3133
import java.util.HashMap;
@@ -44,6 +46,7 @@ public class JdbcSeriesImportDao implements SeriesImportDao {
4446
private final String addRawContentSql;
4547
private final String findRawContentSql;
4648
private final String addParsedDataSql;
49+
private final String addParsedImageUrlSql;
4750
private final String findParsedDataSql;
4851
private final String findRequestInfoSql;
4952
private final String findAllSql;
@@ -58,6 +61,7 @@ public JdbcSeriesImportDao(Environment env, NamedParameterJdbcTemplate jdbcTempl
5861
this.addRawContentSql = env.getRequiredProperty("series_import_requests.add_raw_content");
5962
this.findRawContentSql = env.getRequiredProperty("series_import_requests.find_raw_content_by_request_id");
6063
this.addParsedDataSql = env.getRequiredProperty("series_import_requests.add_series_parsed_data");
64+
this.addParsedImageUrlSql = env.getRequiredProperty("series_import_requests.add_series_parsed_image_url");
6165
this.findParsedDataSql = env.getRequiredProperty("series_import_requests.find_series_parsed_data_by_request_id");
6266
this.findRequestInfoSql = env.getRequiredProperty("series_import_requests.find_request_info_by_series_id");
6367
this.findAllSql = env.getRequiredProperty("series_import_requests.find_all");
@@ -185,9 +189,6 @@ public void addParsedData(Integer requestId, AddSeriesParsedDataDbDto data) {
185189
params.put("request_id", requestId);
186190
params.put("category_id", data.getCategoryId());
187191
params.put("country_id", data.getCountryId());
188-
List<String> imageUrls = data.getImageUrls();
189-
String imageUrl = imageUrls == null || imageUrls.isEmpty() ? null : imageUrls.get(0);
190-
params.put("image_url", imageUrl);
191192
params.put("release_day", data.getReleaseDay());
192193
params.put("release_month", data.getReleaseMonth());
193194
params.put("release_year", data.getReleaseYear());
@@ -205,6 +206,43 @@ public void addParsedData(Integer requestId, AddSeriesParsedDataDbDto data) {
205206
requestId,
206207
affected
207208
);
209+
210+
// for backward compatibility
211+
addParsedImageUrls(requestId, data.getImageUrls());
212+
}
213+
214+
@Override
215+
@SuppressWarnings("checkstyle:linelength")
216+
public void addParsedImageUrls(Integer requestId, List<String> imageUrls) {
217+
if (imageUrls == null || imageUrls.isEmpty()) {
218+
return;
219+
}
220+
221+
// manually construct SqlParameterSource[] instead of using
222+
// SqlParameterSourceUtils.createBatch() in order to reduce a number of temporary objects.
223+
// See also: https://www.baeldung.com/spring-jdbc-jdbctemplate#2-batch-operations-using-namedparameterjdbctemplate
224+
SqlParameterSource[] batchedParams = imageUrls.stream()
225+
.map(imageUrl -> new MapSqlParameterSource("request_id", requestId).addValue("url", imageUrl))
226+
.toArray(size -> new SqlParameterSource[size]);
227+
228+
int[] affected = jdbcTemplate.batchUpdate(addParsedImageUrlSql, batchedParams);
229+
230+
Validate.validState(
231+
affected.length == batchedParams.length,
232+
"Unexpected number of batches after inserting parsed image urls of request #%d: %d (expected: %d)",
233+
requestId,
234+
affected.length,
235+
batchedParams.length
236+
);
237+
238+
long affectedRows = Arrays.stream(affected).sum();
239+
Validate.validState(
240+
affectedRows == imageUrls.size(),
241+
"Unexpected number of affected rows after inserting parsed image urls of request #%d: %d (expected: %d)",
242+
requestId,
243+
affectedRows,
244+
imageUrls.size()
245+
);
208246
}
209247

210248
@Override

src/main/java/ru/mystamps/web/feature/series/importing/SeriesImportDao.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public interface SeriesImportDao {
2828
void addRawContent(Integer requestId, Date createdAt, Date updatedAt, String content);
2929
String findRawContentByRequestId(Integer requestId);
3030
void addParsedData(Integer requestId, AddSeriesParsedDataDbDto data);
31+
void addParsedImageUrls(Integer requestId, List<String> imageUrls);
3132
SeriesParsedDataDto findParsedDataByRequestId(Integer requestId, String lang);
3233
ImportRequestInfo findRequestInfo(Integer seriesId);
3334
List<ImportRequestFullInfo> findAll();

src/main/resources/liquibase/test-data.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
<!-- Depends on: series_import_requests, categories -->
1414
<include file="test-data/series_import_parsed_data.xml" relativeToChangelogFile="true" />
1515

16+
<!-- Depends on: series_import_requests -->
17+
<include file="test-data/series_import_parsed_image_urls.xml" relativeToChangelogFile="true" />
18+
1619
<!-- Depends on: series_import_requests, transaction_participants -->
1720
<include file="test-data/series_sales_import_parsed_data.xml" relativeToChangelogFile="true" />
1821

src/main/resources/liquibase/test-data/series_import_parsed_data.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
<insert tableName="series_import_parsed_data">
1111
<column name="request_id" valueComputed="(SELECT id FROM series_import_requests WHERE url = 'http://example.com/issue/1256')" />
1212
<column name="category_id" valueComputed="(SELECT id FROM categories WHERE slug = 'prehistoric-animals')" />
13-
<column name="image_url" value="http://127.0.0.1:8080/image/1" />
1413
<column name="quantity" valueNumeric="3" />
1514
<column name="created_at" valueComputed="${NOW}" />
1615
<column name="updated_at" valueComputed="${NOW}" />
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<databaseChangeLog
3+
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
6+
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd">
7+
8+
<changeSet id="add-series-parsed-image-urls-for-gh1256" author="php-coder" context="test-data">
9+
10+
<insert tableName="series_import_parsed_image_urls">
11+
<column name="request_id" valueComputed="(SELECT id FROM series_import_requests WHERE url = 'http://example.com/issue/1256')" />
12+
<column name="url" value="http://127.0.0.1:8080/image/1" />
13+
</insert>
14+
15+
</changeSet>
16+
17+
</databaseChangeLog>

src/main/resources/liquibase/version/0.4.7.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
66
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd">
77

8+
<include file="0.4.7/2021-07-18--series_import_parsed_image_urls.xml" relativeToChangelogFile="true" />
89

910
</databaseChangeLog>
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<databaseChangeLog
3+
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
6+
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd">
7+
8+
<changeSet id="create-series_import_parsed_image_urls-table" author="php-coder" context="scheme">
9+
10+
<createTable tableName="series_import_parsed_image_urls">
11+
<column name="request_id" type="INTEGER">
12+
<constraints
13+
nullable="false"
14+
references="series_import_requests(id)"
15+
foreignKeyName="fk_series_import_parsed_image_urls_series_import_requests_id" />
16+
</column>
17+
<column name="url" type="VARCHAR(255)">
18+
<constraints nullable="false" />
19+
</column>
20+
</createTable>
21+
22+
<addUniqueConstraint
23+
tableName="series_import_parsed_image_urls"
24+
columnNames="request_id, url"
25+
constraintName="uc_series_import_parsed_image_urls_request_id_url" />
26+
27+
</changeSet>
28+
29+
<changeSet id="migrate-existing-image-urls" author="php-coder" context="test-data, prod-data">
30+
<comment>Migrates data from series_import_parsed_data.image_url to series_import_parsed_image_urls</comment>
31+
32+
<sql>
33+
INSERT INTO series_import_parsed_image_urls(request_id, url)
34+
SELECT request_id, image_url
35+
FROM series_import_parsed_data
36+
WHERE image_url IS NOT NULL
37+
ORDER BY request_id
38+
</sql>
39+
40+
<rollback>
41+
<sql>
42+
DELETE FROM series_import_parsed_image_urls
43+
</sql>
44+
</rollback>
45+
46+
</changeSet>
47+
48+
<changeSet id="drop-image_url-column-from-series_import_parsed_data-table" author="php-coder" context="scheme">
49+
<dropColumn tableName="series_import_parsed_data" columnName="image_url" />
50+
</changeSet>
51+
52+
</databaseChangeLog>

src/main/resources/sql/series_import_request_dao_queries.properties

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ INSERT \
8686
( request_id \
8787
, category_id \
8888
, country_id \
89-
, image_url \
9089
, release_day \
9190
, release_month \
9291
, release_year \
@@ -100,7 +99,6 @@ VALUES \
10099
( :request_id \
101100
, :category_id \
102101
, :country_id \
103-
, :image_url \
104102
, :release_day \
105103
, :release_month \
106104
, :release_year \
@@ -111,8 +109,13 @@ VALUES \
111109
, :updated_at \
112110
)
113111

112+
series_import_requests.add_series_parsed_image_url = \
113+
INSERT \
114+
INTO series_import_parsed_image_urls(request_id, url) \
115+
VALUES (:request_id, :url)
116+
114117
series_import_requests.find_series_parsed_data_by_request_id = \
115-
SELECT pd.image_url \
118+
SELECT (SELECT pu.url FROM series_import_parsed_image_urls pu WHERE pu.request_id = :request_id LIMIT 1) AS image_url \
116119
, cat.id AS category_id \
117120
, cat.slug AS category_slug \
118121
, CASE WHEN 'ru' = :lang THEN COALESCE(cat.name_ru, cat.name) ELSE cat.name END AS category_name \

0 commit comments

Comments
 (0)