Skip to content

Commit 468f27b

Browse files
committed
insert data using CommandLineRunner;
some minor improvements in the code;
1 parent 08a43c3 commit 468f27b

13 files changed

+143
-63
lines changed

build.gradle

+6-4
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,18 @@ repositories {
2222
}
2323

2424
dependencies {
25-
// implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
2625
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
27-
// implementation 'org.springframework.boot:spring-boot-starter-jdbc'
2826
implementation 'org.springframework.boot:spring-boot-starter-web'
29-
compileOnly 'org.projectlombok:lombok'
3027
developmentOnly 'org.springframework.boot:spring-boot-devtools'
28+
//h2
29+
runtimeOnly 'com.h2database:h2'
30+
//lombok
3131
annotationProcessor 'org.projectlombok:lombok'
32+
compileOnly 'org.projectlombok:lombok'
33+
34+
//Test
3235
testImplementation 'org.springframework.boot:spring-boot-starter-test'
3336
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
34-
runtimeOnly 'com.h2database:h2'
3537
}
3638

3739
tasks.named('test') {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.onevizion.test.oneviziontest;
2+
3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.jdbc.core.JdbcTemplate;
5+
import org.springframework.stereotype.Component;
6+
7+
@Component
8+
public class DataBaseSeeder {
9+
10+
@Autowired
11+
private JdbcTemplate jdbcTemplate;
12+
13+
public void insertInitialData() {
14+
jdbcTemplate.execute("""
15+
INSERT INTO BOOK (id, title, author, description)
16+
VALUES (1, 'Crime and Punishment', 'F. Dostoevsky', null);
17+
""");
18+
jdbcTemplate.execute("""
19+
INSERT INTO BOOK (id, title, author, description)
20+
VALUES (2, 'Anna Karenina', 'L. Tolstoy', null);
21+
""");
22+
jdbcTemplate.execute("""
23+
INSERT INTO BOOK (id, title, author, description)
24+
VALUES (3, 'The Brothers Karamazov', 'F. Dostoevsky', null);
25+
""");
26+
jdbcTemplate.execute("""
27+
INSERT INTO BOOK (id, title, author, description)
28+
VALUES (4, 'War and Peace', 'L. Tolstoy', null);
29+
""");
30+
jdbcTemplate.execute("""
31+
INSERT INTO BOOK (id, title, author, description)
32+
VALUES (5, 'Dead Souls', 'N. Gogol', null);
33+
""");
34+
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,34 @@
11
package com.onevizion.test.oneviziontest;
22

3+
import com.onevizion.test.oneviziontest.book.dao.BookDao;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.boot.CommandLineRunner;
38
import org.springframework.boot.SpringApplication;
49
import org.springframework.boot.autoconfigure.SpringBootApplication;
510

611
@SpringBootApplication
7-
public class OneVizionTestApplication {
12+
public class OneVizionTestApplication implements CommandLineRunner {
13+
14+
@Autowired
15+
private DataBaseSeeder databaseSeeder;
16+
@Autowired
17+
private BookDao bookDao;
818

919
public static void main(String[] args) {
1020
SpringApplication.run(OneVizionTestApplication.class, args);
1121
}
1222

23+
@Override
24+
public void run(String... args) throws Exception {
25+
databaseSeeder.insertInitialData();
26+
Logger logger = LoggerFactory.getLogger(this.getClass());
27+
logger.info("Checking initial data being inserted into DB");
28+
bookDao.getAllBooks().forEach(
29+
book -> {
30+
logger.info(book.toString());
31+
}
32+
);
33+
}
1334
}

src/main/java/com/onevizion/test/oneviziontest/book/Book.java

-25
This file was deleted.

src/main/java/com/onevizion/test/oneviziontest/book/BookQueryController.java src/main/java/com/onevizion/test/oneviziontest/book/controller/BookQueryController.java

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1-
package com.onevizion.test.oneviziontest.book;
1+
package com.onevizion.test.oneviziontest.book.controller;
22

3+
import com.onevizion.test.oneviziontest.book.service.BookQueryService;
4+
import com.onevizion.test.oneviziontest.book.model.AuthorBookTitleSymbolCount;
5+
import com.onevizion.test.oneviziontest.book.model.AuthorBooks;
6+
import com.onevizion.test.oneviziontest.book.model.Book;
37
import org.springframework.web.bind.annotation.*;
48

59
import java.util.List;
610

11+
import static com.onevizion.test.oneviziontest.book.model.Book.BOOK_FIELD_AUTHOR;
12+
713
@RestController
814
@RequestMapping("book/v1")
915
public class BookQueryController {
@@ -24,9 +30,11 @@ public List<Book> listOrderedTitleDesc() {
2430

2531
@GetMapping("/list/{groupBy}")
2632
List<AuthorBooks> getBooksGroupedBy(@PathVariable String groupBy) {
27-
if (groupBy.equals("author")) {
33+
if (groupBy.equals(BOOK_FIELD_AUTHOR)) {
2834
return queryService.getBooksGroupedByAuthor();
2935
}
36+
//made it as much as flexible, so we could handle other group-by cases here
37+
3038
return List.of();
3139
}
3240

src/main/java/com/onevizion/test/oneviziontest/book/BookDao.java src/main/java/com/onevizion/test/oneviziontest/book/dao/BookDao.java

+25-10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
package com.onevizion.test.oneviziontest.book;
1+
package com.onevizion.test.oneviziontest.book.dao;
22

3+
import com.onevizion.test.oneviziontest.book.model.AuthorBookTitleSymbolCount;
4+
import com.onevizion.test.oneviziontest.book.model.AuthorBooks;
5+
import com.onevizion.test.oneviziontest.book.model.Book;
36
import org.springframework.jdbc.core.JdbcTemplate;
47
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
58
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
@@ -8,6 +11,8 @@
811
import java.util.Arrays;
912
import java.util.List;
1013

14+
import static com.onevizion.test.oneviziontest.book.model.Book.*;
15+
1116
@Repository
1217
public class BookDao {
1318

@@ -23,10 +28,10 @@ public List<Book> getBooksByTitleDesc() {
2328
String getBookByTitleDescQuery = "SELECT * FROM BOOK ORDER BY title DESC";
2429
return jdbcTemplate.query(getBookByTitleDescQuery,
2530
(result, rowNum) -> new Book(
26-
result.getLong("id"),
27-
result.getString("title"),
28-
result.getString("author"),
29-
result.getString("description")));
31+
result.getLong(BOOK_FIELD_ID),
32+
result.getString(BOOK_FIELD_TITLE),
33+
result.getString(BOOK_FIELD_AUTHOR),
34+
result.getString(BOOK_FIELD_DESCRIPTION)));
3035
}
3136

3237
public List<AuthorBooks> getAuthorBooks() {
@@ -36,7 +41,7 @@ public List<AuthorBooks> getAuthorBooks() {
3641
String books = result.getString("book_list");
3742
List<String> bookList = Arrays.stream(books.split(",")).toList();
3843
return new AuthorBooks(
39-
result.getString("author"),
44+
result.getString(BOOK_FIELD_AUTHOR),
4045
bookList
4146
);
4247
});
@@ -59,9 +64,19 @@ SELECT b.author, SUM(LENGTH(b.title) - LENGTH(REPLACE(b.title, :symbol, ''))) AS
5964
""";
6065
MapSqlParameterSource params = new MapSqlParameterSource();
6166
params.addValue("symbol", s);
62-
return namedParamJdbcTemplate.query(getAuthorBookCountBySymbolOccurrenceQuery, params, (result, rowNumb) -> new AuthorBookTitleSymbolCount(
63-
result.getString("author"),
64-
result.getInt("symbol_count")
65-
));
67+
return namedParamJdbcTemplate.query(getAuthorBookCountBySymbolOccurrenceQuery, params, (result, rowNumb) ->
68+
new AuthorBookTitleSymbolCount(
69+
result.getString(BOOK_FIELD_AUTHOR),
70+
result.getInt("symbol_count")
71+
));
72+
}
73+
74+
public List<Book> getAllBooks() {
75+
String getAllBooksQuery = "SELECT * FROM BOOK";
76+
return jdbcTemplate.query(getAllBooksQuery, (result, rowNum) ->
77+
new Book(result.getLong(BOOK_FIELD_ID),
78+
result.getString(BOOK_FIELD_TITLE),
79+
result.getString(BOOK_FIELD_AUTHOR),
80+
result.getString(BOOK_FIELD_DESCRIPTION)));
6681
}
6782
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.onevizion.test.oneviziontest.book;
1+
package com.onevizion.test.oneviziontest.book.model;
22

33
public record AuthorBookTitleSymbolCount(String author, int occurrenceCount) {
44
}

src/main/java/com/onevizion/test/oneviziontest/book/AuthorBooks.java src/main/java/com/onevizion/test/oneviziontest/book/model/AuthorBooks.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.onevizion.test.oneviziontest.book;
1+
package com.onevizion.test.oneviziontest.book.model;
22

33
import java.util.List;
44

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.onevizion.test.oneviziontest.book.model;
2+
3+
import jakarta.persistence.Entity;
4+
import jakarta.persistence.GeneratedValue;
5+
import jakarta.persistence.Id;
6+
import jakarta.persistence.Table;
7+
import lombok.AllArgsConstructor;
8+
import lombok.Getter;
9+
import lombok.NoArgsConstructor;
10+
11+
@Entity
12+
@Getter
13+
@AllArgsConstructor
14+
@NoArgsConstructor
15+
@Table
16+
public class Book {
17+
@Id
18+
@GeneratedValue
19+
private Long id;
20+
public String title;
21+
public String author;
22+
public String description;
23+
24+
@Override
25+
public String toString() {
26+
return "Book [id=" + id + ", title=" + title + ", author=" + author + ", description=" + description + "]";
27+
}
28+
29+
public static String BOOK_FIELD_ID = "id";
30+
public static String BOOK_FIELD_TITLE = "title";
31+
public static String BOOK_FIELD_AUTHOR = "author";
32+
public static String BOOK_FIELD_DESCRIPTION = "description";
33+
}

src/main/java/com/onevizion/test/oneviziontest/book/BookQueryService.java src/main/java/com/onevizion/test/oneviziontest/book/service/BookQueryService.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
package com.onevizion.test.oneviziontest.book;
1+
package com.onevizion.test.oneviziontest.book.service;
22

3+
import com.onevizion.test.oneviziontest.book.dao.BookDao;
4+
import com.onevizion.test.oneviziontest.book.model.AuthorBookTitleSymbolCount;
5+
import com.onevizion.test.oneviziontest.book.model.AuthorBooks;
6+
import com.onevizion.test.oneviziontest.book.model.Book;
37
import org.springframework.stereotype.Service;
48

59
import java.util.List;

src/main/java/com/onevizion/test/oneviziontest/config/SpringJdbcConfig.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class SpringJdbcConfig {
1515
public DataSource dataSource() {
1616
return new EmbeddedDatabaseBuilder()
1717
.setType(EmbeddedDatabaseType.H2)
18-
.addScript("classpath:data.sql")
18+
// .addScript("classpath:data.sql")
1919
.build();
2020
}
2121

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
spring.application.name=OneVizionTest
22
spring.datasource.url=jdbc:h2:mem:testdb
33
spring.datasource.driverClassName=org.h2.Driver
4-
spring.datasource.username=sa
5-
spring.datasource.password=password
4+
spring.datasource.username=mir
5+
spring.datasource.password=mir
66
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
77
spring.jpa.defer-datasource-initialization=true
88
spring.h2.console.settings.trace=true
99

1010

11-
#why do we need this?
1211
spring.h2.console.enabled=true
13-
spring.h2.console.settings.web-allow-others=true
12+
#spring.h2.console.settings.web-allow-others=true
1413
spring.jpa.show-sql=true

src/main/resources/data.sql

+1-13
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,4 @@ CREATE TABLE IF NOT EXISTS BOOK
55
author VARCHAR(150) NOT NULL,
66
description VARCHAR(150),
77
CONSTRAINT book_pk PRIMARY KEY (id)
8-
);
9-
10-
INSERT INTO BOOK (id, title, author, description)
11-
VALUES (1, 'Crime and Punishment', 'F. Dostoevsky', null);
12-
INSERT INTO BOOK (id, title, author, description)
13-
VALUES (2, 'Anna Karenina', 'L. Tolstoy', null);
14-
INSERT INTO BOOK (id, title, author, description)
15-
VALUES (3, 'The Brothers Karamazov', 'F. Dostoevsky', null);
16-
INSERT INTO BOOK (id, title, author, description)
17-
VALUES (4, 'War and Peace', 'L. Tolstoy', null);
18-
INSERT INTO BOOK (id, title, author, description)
19-
VALUES (5, 'Dead Souls', 'N. Gogol', null);
20-
COMMIT;
8+
);

0 commit comments

Comments
 (0)