From f0199a81a91a30964d76df2c02c1a3b1c10991fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D0=B8=D1=89=D1=83=D0=BA=20=D0=90=D0=BB?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20=D0=9C=D0=B8=D1=85?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=D0=B8=D1=87?= Date: Tue, 28 Jul 2020 15:37:03 +0300 Subject: [PATCH 1/6] Added polishchuk/Application.java --- .../courses/polishchuk/Application.java | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/ru/milandr/courses/polishchuk/Application.java diff --git a/src/ru/milandr/courses/polishchuk/Application.java b/src/ru/milandr/courses/polishchuk/Application.java new file mode 100644 index 0000000..051f0d3 --- /dev/null +++ b/src/ru/milandr/courses/polishchuk/Application.java @@ -0,0 +1,83 @@ +package ru.milandr.courses.polishchuk; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.sql.*; +import java.util.ArrayList; + +class SQLDemo { + private Connection connection; + + public SQLDemo(Connection connection) { + this.connection = connection; + } + + public Connection getConnection() { + return connection; + } + + private void printUser(ResultSet user) throws SQLException { + System.out.println("id: " + user.getBigDecimal("id") + '\n' + + "first_name: " + user.getString("first_name") + '\n' + + "last_name: " + user.getString("last_name") + '\n' + + "phone_number: " + user.getString("phone_number")); + } + + private void printUsers(ResultSet users) throws SQLException { + while (users.next()) { + printUser(users); + } + } + + private void printUserWithIdJava(BigDecimal id) { + try (PreparedStatement stmtSelectUsersIds = connection.prepareStatement("select * from users where id = ?")) { + stmtSelectUsersIds.setBigDecimal(1, id); + + ResultSet user = stmtSelectUsersIds.executeQuery(); + if (!user.next()) + throw new SQLException("Zero users found!"); + if (!user.isLast()) + throw new SQLException("Duplicate user id found!"); + printUser(user); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public void printUserWithMaxIdJava() { + try (PreparedStatement stmtSelectUsersIds = connection.prepareStatement("select * from users")) { + BigDecimal maxId = new BigDecimal(-1); + ResultSet userIds = stmtSelectUsersIds.executeQuery(); + + while (userIds.next()) { + BigDecimal id = userIds.getBigDecimal("id"); + if (maxId.compareTo(id) < 0) { + maxId = new BigDecimal(String.valueOf(id)); + } + } + printUserWithIdJava(maxId); + } catch (SQLException e) { + e.printStackTrace(); + } + } +} + +public class Application { + public static void main(String[] args) throws ClassNotFoundException { + try { + Class.forName("org.postgresql.Driver"); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + return; + } + try (Connection dbConn = DriverManager.getConnection( + "jdbc:postgresql://localhost:5432/users_database", + "postgres", "postgres")) { + SQLDemo demo = new SQLDemo(dbConn); + + demo.printUserWithMaxIdJava(); + } catch (SQLException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file From 0461ce005a72db99e670c9e84998ffa00493ad9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D0=B8=D1=89=D1=83=D0=BA=20=D0=90=D0=BB?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20=D0=9C=D0=B8=D1=85?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=D0=B8=D1=87?= Date: Tue, 28 Jul 2020 17:37:34 +0300 Subject: [PATCH 2/6] part 1 done --- .../courses/polishchuk/Application.java | 204 ++++++++++++++++-- 1 file changed, 192 insertions(+), 12 deletions(-) diff --git a/src/ru/milandr/courses/polishchuk/Application.java b/src/ru/milandr/courses/polishchuk/Application.java index 051f0d3..0ebdb0a 100644 --- a/src/ru/milandr/courses/polishchuk/Application.java +++ b/src/ru/milandr/courses/polishchuk/Application.java @@ -1,13 +1,86 @@ package ru.milandr.courses.polishchuk; +import com.sun.org.apache.bcel.internal.generic.ARETURN; + +import javax.jws.soap.SOAPBinding; import java.math.BigDecimal; import java.math.BigInteger; import java.sql.*; import java.util.ArrayList; +import java.util.Comparator; class SQLDemo { private Connection connection; + private class User { + BigDecimal id; + String first_name; + String last_name; + String phone_number; + + User(BigDecimal id, String first_name, String last_name, String phone_number) { + this.id = id; + this.first_name = first_name; + this.last_name = last_name; + this.phone_number = phone_number; + } + + User(User user) { + this.id = user.id; + this.last_name = user.last_name; + this.first_name = user.first_name; + this.phone_number = user.phone_number; + } + + void printUser() { + System.out.print("user id: " + this.id + '\n' + + "first_name: " + this.first_name + '\n' + + "last_name: " + this.last_name + '\n' + + "phone_number: " + this.phone_number + '\n'); + } + } + + private class Address { + BigDecimal id; + String address; + String city; + String postal_code; + + Address(BigDecimal id, String address, String city, String postal_code) { + this.id = id; + this.address = address; + this.city = city; + this.postal_code = postal_code; + } + + void printAddress() { + System.out.print("address id: " + this.id + '\n' + + "address: " + this.address + '\n' + + "city: " + this.city + '\n' + + "postal_code: " + this.postal_code + '\n'); + } + } + + private class AddressedUser extends User { + Address address; + + AddressedUser(User user, Address address) { + super(user); + this.address = address; + } + + AddressedUser(BigDecimal id, String first_name, String last_name, String phone_number, Address address) { + super(id, first_name, last_name, phone_number); + this.address = address; + } + + @Override + void printUser() { + super.printUser(); + this.address.printAddress(); + } + } + public SQLDemo(Connection connection) { this.connection = connection; } @@ -16,21 +89,44 @@ public Connection getConnection() { return connection; } - private void printUser(ResultSet user) throws SQLException { - System.out.println("id: " + user.getBigDecimal("id") + '\n' + - "first_name: " + user.getString("first_name") + '\n' + - "last_name: " + user.getString("last_name") + '\n' + - "phone_number: " + user.getString("phone_number")); + private void printUsers(ArrayList users) { + for (User user : users) { + user.printUser(); + } } - private void printUsers(ResultSet users) throws SQLException { - while (users.next()) { - printUser(users); - } + private User initUserFromResultSet(ResultSet user) throws SQLException { + return new User( + user.getBigDecimal("id"), + user.getString("first_name"), + user.getString("last_name"), + user.getString("phone_number") + ); + } + + private Address initAddressFromResultSet(ResultSet address) throws SQLException { + return new Address( + address.getBigDecimal("address_id"), + address.getString("address"), + address.getString("city"), + address.getString("postal_code") + ); + } + + private AddressedUser initAddressedUserFromResultSet(ResultSet user) throws SQLException { + return new AddressedUser( + initUserFromResultSet(user), + initAddressFromResultSet(user) + ); } private void printUserWithIdJava(BigDecimal id) { - try (PreparedStatement stmtSelectUsersIds = connection.prepareStatement("select * from users where id = ?")) { + try (PreparedStatement stmtSelectUsersIds = connection.prepareStatement( + "select users.*, addresses.id as addr_id, address, city, postal_code " + + "from users " + + "join addresses on users.address_id = addresses.id " + + "where users.id = ?" + )) { stmtSelectUsersIds.setBigDecimal(1, id); ResultSet user = stmtSelectUsersIds.executeQuery(); @@ -38,14 +134,15 @@ private void printUserWithIdJava(BigDecimal id) { throw new SQLException("Zero users found!"); if (!user.isLast()) throw new SQLException("Duplicate user id found!"); - printUser(user); + AddressedUser userWithId = initAddressedUserFromResultSet(user); + userWithId.printUser(); } catch (SQLException e) { e.printStackTrace(); } } public void printUserWithMaxIdJava() { - try (PreparedStatement stmtSelectUsersIds = connection.prepareStatement("select * from users")) { + try (PreparedStatement stmtSelectUsersIds = connection.prepareStatement("select id from users")) { BigDecimal maxId = new BigDecimal(-1); ResultSet userIds = stmtSelectUsersIds.executeQuery(); @@ -60,6 +157,78 @@ public void printUserWithMaxIdJava() { e.printStackTrace(); } } + + public void printUsersFromAddress(String address) { + try (PreparedStatement stmtSelectUsersFromAddress = connection.prepareStatement( + "select users.*, a.id as address_id, address, city, postal_code " + + "from users join addresses a on users.address_id = a.id " + + "where address = ?" + )) { + stmtSelectUsersFromAddress.setString(1, address); + ResultSet resultSet = stmtSelectUsersFromAddress.executeQuery(); + + while (resultSet.next()) { + AddressedUser addressedUser = initAddressedUserFromResultSet(resultSet); + addressedUser.printUser(); + System.out.println(); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public void printUsersSortedByLastName() { + try (PreparedStatement stmtSelectUsers = connection.prepareStatement("select * from users")) { + ResultSet resultSet = stmtSelectUsers.executeQuery(); + + ArrayList usersArrayList = new ArrayList<>(); + while (resultSet.next()) { + User user = initUserFromResultSet(resultSet); + usersArrayList.add(user); + } + usersArrayList.sort((o1, o2) -> o1.last_name.compareTo(o2.last_name)); + usersArrayList.forEach(u -> System.out.println(u.last_name + ' ' + u.first_name)); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public double calcAvgPostalCode() { + double sum = 0; + int cnt = 0; + + try (PreparedStatement stmtSelectPostalCodes = connection.prepareStatement( + "select postal_code from addresses" + )) { + ResultSet resultSet = stmtSelectPostalCodes.executeQuery(); + + while (resultSet.next()) { + String code = resultSet.getString("postal_code"); + if (code.matches("^[0-9]+$")) { + sum += Integer.parseInt(code); + cnt++; + } + } + } catch (SQLException e) { + e.printStackTrace(); + } + if (cnt == 0) + return 0.; + return sum / cnt; + } + + public void findUnusedAddr() { + try (PreparedStatement stmt = connection.prepareStatement( + "select address from addresses left join users on users.address_id = addresses.id where users.id is null" + )) { + ResultSet resultSet = stmt.executeQuery(); + if (resultSet.next()){ + System.out.println(resultSet.getString(1)); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } } public class Application { @@ -76,6 +245,17 @@ public static void main(String[] args) throws ClassNotFoundException { SQLDemo demo = new SQLDemo(dbConn); demo.printUserWithMaxIdJava(); + System.out.println(); + + demo.printUsersFromAddress("P.O. Box 677, 8665 Ante Road"); + System.out.println(); + + demo.printUsersSortedByLastName(); + System.out.println(); + + System.out.println(demo.calcAvgPostalCode()); + + demo.findUnusedAddr(); } catch (SQLException e) { e.printStackTrace(); } From f4f8f95bc4bb903539928715e81a42067234357a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D0=B8=D1=89=D1=83=D0=BA=20=D0=90=D0=BB?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20=D0=9C=D0=B8=D1=85?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=D0=B8=D1=87?= Date: Tue, 28 Jul 2020 17:46:52 +0300 Subject: [PATCH 3/6] TablesEqualityTester initial commit --- .../milandr/courses/polishchuk/TablesEqualityTester.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/ru/milandr/courses/polishchuk/TablesEqualityTester.java diff --git a/src/ru/milandr/courses/polishchuk/TablesEqualityTester.java b/src/ru/milandr/courses/polishchuk/TablesEqualityTester.java new file mode 100644 index 0000000..4f3f254 --- /dev/null +++ b/src/ru/milandr/courses/polishchuk/TablesEqualityTester.java @@ -0,0 +1,7 @@ +package ru.milandr.courses.polishchuk; + +public class TablesEqualityTester { + public TablesEqualityTester() { + + } +} \ No newline at end of file From 9456ef8746545ff57ccafb2c82c1f82511935d0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D0=B8=D1=89=D1=83=D0=BA=20=D0=90=D0=BB?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20=D0=9C=D0=B8=D1=85?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=D0=B8=D1=87?= Date: Tue, 28 Jul 2020 18:13:10 +0300 Subject: [PATCH 4/6] poshel domoi --- .../polishchuk/TablesEqualityTester.java | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/ru/milandr/courses/polishchuk/TablesEqualityTester.java b/src/ru/milandr/courses/polishchuk/TablesEqualityTester.java index 4f3f254..0fd275d 100644 --- a/src/ru/milandr/courses/polishchuk/TablesEqualityTester.java +++ b/src/ru/milandr/courses/polishchuk/TablesEqualityTester.java @@ -1,7 +1,37 @@ package ru.milandr.courses.polishchuk; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; + public class TablesEqualityTester { - public TablesEqualityTester() { - + private Connection db1Connection; + private Connection db2Connection; + private String table1Name; + private String table2Name; + private ArrayList columnNames; + + public TablesEqualityTester(Connection db1Connection, Connection db2Connection, + String table1Name, String table2Name, + String columns) { + this.db1Connection = db1Connection; + this.db2Connection = db2Connection; + this.table1Name = table1Name; + this.table2Name = table2Name; + this.columnNames = new ArrayList(); + Arrays.stream(columns.split(",")).forEach(col -> columnNames.add(col)); + } + + public boolean equalityTest() throws SQLException { + String request = "select " + + columnNames.stream().reduce("", (s1, s2)-> s1 + "," + s2).toString() + + "from ?"; + PreparedStatement stmtDB1 = null; + PreparedStatement stmtDB2 = db1Connection.prepareStatement( + "select " + + columnNames.stream().reduce("", (s1, s2)-> s1 + "," + s2).toString() + + ""); } } \ No newline at end of file From d2ab0a273c8a375510a015d42f46c6a36cdc51d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D0=B8=D1=89=D1=83=D0=BA=20=D0=90=D0=BB?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20=D0=9C=D0=B8=D1=85?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=D0=B8=D1=87?= Date: Wed, 29 Jul 2020 11:32:01 +0300 Subject: [PATCH 5/6] TablesEquality done --- .../polishchuk/TablesEqualityMain.java | 38 ++++++++ .../polishchuk/TablesEqualityTester.java | 90 ++++++++++++++++--- 2 files changed, 114 insertions(+), 14 deletions(-) create mode 100644 src/ru/milandr/courses/polishchuk/TablesEqualityMain.java diff --git a/src/ru/milandr/courses/polishchuk/TablesEqualityMain.java b/src/ru/milandr/courses/polishchuk/TablesEqualityMain.java new file mode 100644 index 0000000..9eac5a6 --- /dev/null +++ b/src/ru/milandr/courses/polishchuk/TablesEqualityMain.java @@ -0,0 +1,38 @@ +package ru.milandr.courses.polishchuk; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +public class TablesEqualityMain { + public static void main(String[] args) { + try { + Class.forName("org.postgresql.Driver"); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + try ( + Connection conn1 = DriverManager.getConnection( + "jdbc:postgresql://localhost:5432/users_database", + "postgres", "postgres" + ); + Connection conn2 = DriverManager.getConnection( + "jdbc:postgresql://localhost:5432/users_database", + "postgres", "postgres" + ) + ) { + TablesEqualityTester tester = new TablesEqualityTester( + conn1, conn2, + "users4test", "users4test1", + "id,first_name,last_name" + ); + if (tester.equalityTest()) { + System.out.println("Equals"); + } else { + System.out.println("Not equal"); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/ru/milandr/courses/polishchuk/TablesEqualityTester.java b/src/ru/milandr/courses/polishchuk/TablesEqualityTester.java index 0fd275d..3b58f20 100644 --- a/src/ru/milandr/courses/polishchuk/TablesEqualityTester.java +++ b/src/ru/milandr/courses/polishchuk/TablesEqualityTester.java @@ -2,36 +2,98 @@ import java.sql.Connection; import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Arrays; +import java.util.*; +import java.util.stream.IntStream; public class TablesEqualityTester { private Connection db1Connection; private Connection db2Connection; private String table1Name; private String table2Name; - private ArrayList columnNames; + private String columnNames; + private int columnsNum; public TablesEqualityTester(Connection db1Connection, Connection db2Connection, String table1Name, String table2Name, - String columns) { + String columnNames) { this.db1Connection = db1Connection; this.db2Connection = db2Connection; this.table1Name = table1Name; this.table2Name = table2Name; - this.columnNames = new ArrayList(); - Arrays.stream(columns.split(",")).forEach(col -> columnNames.add(col)); + this.columnNames = columnNames; + this.columnsNum = columnNames.split(",").length; + } + + private ArrayList> initArrayFromResultSet(ResultSet resultSet, int size) throws SQLException { + ArrayList> dbEntries = new ArrayList>(); + + IntStream.range(0, size).forEach(i -> { + try { + resultSet.next(); + } catch (SQLException e) { + e.printStackTrace(); + System.exit(-1); + } + ArrayList list = new ArrayList(); + IntStream.range(1, columnsNum + 1).forEach( + col -> { + String value = null; + try { + value = resultSet.getString(col); + } catch (SQLException e) { + e.printStackTrace(); + System.exit(-1); + } + list.add(value); + } + ); + dbEntries.add(list); + }); + return dbEntries; } public boolean equalityTest() throws SQLException { - String request = "select " + - columnNames.stream().reduce("", (s1, s2)-> s1 + "," + s2).toString() + - "from ?"; - PreparedStatement stmtDB1 = null; - PreparedStatement stmtDB2 = db1Connection.prepareStatement( - "select " + - columnNames.stream().reduce("", (s1, s2)-> s1 + "," + s2).toString() + - ""); + ResultSet count1 = db1Connection.prepareStatement("select count(*) from " + table1Name).executeQuery(); + ResultSet count2 = db2Connection.prepareStatement("select count(*) from " + table2Name).executeQuery(); + count1.next(); + count2.next(); + int size1 = Integer.parseInt(count1.getString(1)); + int size2 = Integer.parseInt(count2.getString(1)); + + System.out.format("s1: %d s2: %d\n", size1, size2); + if (size1 != size2) { + return false; + } + if (size1 == 0) { + return true; + } + + PreparedStatement stmtDB1 = db1Connection.prepareStatement("select " + columnNames + " from " + table1Name); + PreparedStatement stmtDB2 = db2Connection.prepareStatement("select " + columnNames + " from " + table2Name); + ResultSet resultSet1 = stmtDB1.executeQuery(); + ResultSet resultSet2 = stmtDB2.executeQuery(); + + ArrayList> db1Entries = initArrayFromResultSet(resultSet1, size1); + ArrayList> db2Entries = initArrayFromResultSet(resultSet2, size2); + + System.out.println(db1Entries.size()); + + db1Entries.sort((t1, t2) -> + IntStream.range(1, columnsNum).reduce(0, (acc, j) -> acc == 0 ? t1.get(j).compareTo(t2.get(j - 1)) : acc) + ); + db2Entries.sort((t1, t2) -> + IntStream.range(1, columnsNum).reduce(0, (acc, j) -> acc == 0 ? t1.get(j).compareTo(t2.get(j - 1)) : acc) + ); + + int result = IntStream.range(0, size1).reduce(0, + (acc, i) -> acc == 0 ? + IntStream.range(0, columnsNum).reduce(0, + (innerAcc, j) -> innerAcc == 0 ? + db1Entries.get(i).get(j).compareTo(db2Entries.get(i).get(j)) : innerAcc + ) : acc + ); + return result == 0; } } \ No newline at end of file From 7bfe31861c420233a13b70bbc8553707b6f2ea20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D0=B8=D1=89=D1=83=D0=BA=20=D0=90=D0=BB?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20=D0=9C=D0=B8=D1=85?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=D0=B8=D1=87?= Date: Wed, 29 Jul 2020 11:41:14 +0300 Subject: [PATCH 6/6] Remove prints from TablesEqualityTester --- src/ru/milandr/courses/polishchuk/TablesEqualityTester.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/ru/milandr/courses/polishchuk/TablesEqualityTester.java b/src/ru/milandr/courses/polishchuk/TablesEqualityTester.java index 3b58f20..319aaa0 100644 --- a/src/ru/milandr/courses/polishchuk/TablesEqualityTester.java +++ b/src/ru/milandr/courses/polishchuk/TablesEqualityTester.java @@ -62,7 +62,6 @@ public boolean equalityTest() throws SQLException { int size1 = Integer.parseInt(count1.getString(1)); int size2 = Integer.parseInt(count2.getString(1)); - System.out.format("s1: %d s2: %d\n", size1, size2); if (size1 != size2) { return false; } @@ -78,8 +77,6 @@ public boolean equalityTest() throws SQLException { ArrayList> db1Entries = initArrayFromResultSet(resultSet1, size1); ArrayList> db2Entries = initArrayFromResultSet(resultSet2, size2); - System.out.println(db1Entries.size()); - db1Entries.sort((t1, t2) -> IntStream.range(1, columnsNum).reduce(0, (acc, j) -> acc == 0 ? t1.get(j).compareTo(t2.get(j - 1)) : acc) );