Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 120 additions & 0 deletions projects/elinrin/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>ru.mipt.diht.students</groupId>
<artifactId>parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>

<groupId>ru.mipt.diht.students</groupId>
<artifactId>elinrin</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<packaging>jar</packaging>

<name>elinrin</name>
<url>http://maven.apache.org</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>

<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.190</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.beust</groupId>
<artifactId>jcommander</artifactId>
<version>1.48</version>
</dependency>

<dependency>
<groupId>org.twitter4j</groupId>
<artifactId>twitter4j-stream</artifactId>
<version>4.0.4</version>
</dependency>

<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20141113</version>
</dependency>

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>17.0</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.5</version>
</dependency>

<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.1</version>
<scope>test</scope>
<optional>true</optional>
<exclusions>
<exclusion>
<artifactId>junit</artifactId>
<groupId>junit</groupId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.1</version>
<scope>test</scope>
<optional>true</optional>
<exclusions>
<exclusion>
<artifactId>mockito-all</artifactId>
<groupId>org.mockito</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.tngtech.java</groupId>
<artifactId>junit-dataprovider</artifactId>
<version>1.10.1</version>
</dependency>

</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package ru.mipt.diht.students.elinrin.collectionquery;

import ru.mipt.diht.students.elinrin.collectionquery.aggregatesImpl.Avg;
import ru.mipt.diht.students.elinrin.collectionquery.aggregatesImpl.Count;
import ru.mipt.diht.students.elinrin.collectionquery.aggregatesImpl.Max;
import ru.mipt.diht.students.elinrin.collectionquery.aggregatesImpl.Min;

import java.util.function.Function;

public class Aggregates {
public static <T, R extends Comparable> Function<T, R> max(final Function<T, R> expression) {
return new Max<>(expression);
}

public static <C, T extends Comparable<T>> Function<C, T> min(final Function<C, T> expression) {
return new Min<>(expression);
}

public static <T> Function<T, Integer> count(final Function<T, ?> expression) {
return new Count<>(expression);
}

public static <T> Function<T, Double> avg(final Function<T, ? extends Number> expression) {
return new Avg<>(expression);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
package ru.mipt.diht.students.elinrin.collectionquery;

import ru.mipt.diht.students.elinrin.collectionquery.impl.Tuple;

import java.lang.reflect.InvocationTargetException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Objects;

import static ru.mipt.diht.students.elinrin.collectionquery.Aggregates.avg;
import static ru.mipt.diht.students.elinrin.collectionquery.Aggregates.count;
import static ru.mipt.diht.students.elinrin.collectionquery.CollectionQuery.Student.student;
import static ru.mipt.diht.students.elinrin.collectionquery.Conditions.rlike;
import static ru.mipt.diht.students.elinrin.collectionquery.OrderByConditions.asc;
import static ru.mipt.diht.students.elinrin.collectionquery.OrderByConditions.desc;
import static ru.mipt.diht.students.elinrin.collectionquery.Sources.list;
import static ru.mipt.diht.students.elinrin.collectionquery.impl.FromStmt.from;

/*nnn*/

public class CollectionQuery {
static final int TWENTY = 20;
static final int HUNDRED = 100;
/**
* Make this code work!
*
* @param args
*/
public static void main(final String[] args) throws InvocationTargetException, NoSuchMethodException,
InstantiationException, IllegalAccessException {
Iterable<Statistics> statistics =
from(list(
student("ivanov", LocalDate.parse("1986-08-06"), "496"),
student("ivanov", LocalDate.parse("1986-08-06"), "496")))
.select(Statistics.class, Student::getGroup, count(Student::getGroup), avg(Student::age))
.where(rlike(Student::getName, ".*ov").and(s -> s.age() > TWENTY))
.groupBy(Student::getName)
.having(s -> s.getCount() > 0)
.orderBy(asc(Statistics::getGroup), desc(count(Statistics::getGroup)))
.limit(HUNDRED)
.union()
.from(list(student("ivanov", LocalDate.parse("1985-08-06"), "496")))
.selectDistinct(Statistics.class, s -> "all",
count(Student::getDateOfBith), avg(Student::age))
.groupBy(Student::getGroup)
.execute();
statistics.forEach(System.out::print);


Iterable<Tuple<String, String>> mentorsByStudent =
from(list(student("ivanov", LocalDate.parse("1985-08-06"), "496"),
student("sidorov", LocalDate.parse("1986-08-06"), "497"),
student("vasilev", LocalDate.parse("1986-08-06"), "496"),
student("petrov", LocalDate.parse("1986-08-06"), "497")))
.join(list(Group.group("497", "mr.solovev")))
.on((s, g) -> Objects.equals(s.getGroup(), g.getGroup()))
.select(sg -> sg.getFirst().getName(), sg -> sg.getSecond().getMentor())
.where(s -> Objects.equals(s.getFirst().getName(), "sidorov"))
.union()
.from(list(student("ivanov", LocalDate.parse("1985-08-06"), "496"),
student("sidorov", LocalDate.parse("1986-08-06"), "497"),
student("vasilev", LocalDate.parse("1986-08-06"), "496"),
student("petrov", LocalDate.parse("1986-08-06"), "497")))
.join(list(Group.group("496", "mr.ilanov")))
.on(s -> s.getGroup(), f -> f.getGroup())
.select(sg -> sg.getFirst().getName(), sg -> sg.getSecond().getMentor())
.execute();
mentorsByStudent.forEach(System.out::print);
}

public static class Student {
private final String name;

private final LocalDate dateOfBith;

private final String group;

public final String getName() {
return name;
}

public Student(final String gottenName, final LocalDate gottenDateOfBith, final String gottenGroup) {
name = gottenName;
dateOfBith = gottenDateOfBith;
group = gottenGroup;
}

public Student(final String gottenName, final String gottenGroup) {
name = gottenName;
dateOfBith = null;
group = gottenGroup;
}

public final LocalDate getDateOfBith() {
return dateOfBith;
}

public final String getGroup() {
return group;
}

public final Double age() {
return (double) ChronoUnit.YEARS.between(getDateOfBith(), LocalDateTime.now());
}

public static Student student(final String name, final LocalDate dateOfBith, final String group) {
return new Student(name, dateOfBith, group);
}

@Override
public final String toString() {
StringBuilder result = new StringBuilder().append("Student{");
if (group != null) {
result.append("group='").append(group).append('\'');
}
if (name != null) {
result.append(", name=").append(name);
}
if (dateOfBith != null) {
result.append(", age=").append(dateOfBith);
}
result.append("}\n");
return result.toString();
}
}

public static class Group {
private final String group;
private final String mentor;

public Group(final String gottenGroup, final String gottenMentor) {
group = gottenGroup;
mentor = gottenMentor;
}

public final String getGroup() {
return group;
}

public final String getMentor() {
return mentor;
}

public static Group group(final String ggroup, final String mmentor) {
return new Group(ggroup, mmentor);
}

@Override
public final String toString() {
StringBuilder result = new StringBuilder().append("Student{");
if (group != null) {
result.append("group='").append(group).append('\'');
}
if (mentor != null) {
result.append(", name=").append(mentor);
}
result.append("}\n");
return result.toString();
}
}


public static class Statistics {

private final String group;
private final Integer count;
private final Double age;

public final String getGroup() {
return group;
}

public final Integer getCount() {
return count;
}

public final Double getAge() {
return age;
}

public Statistics(final String gottenGroup, final Integer gottenCount) {
group = gottenGroup;
count = gottenCount;
age = null;
}

public Statistics(final String gottenGroup, final Integer gottenCount, final Double gottenAge) {
group = gottenGroup;
count = gottenCount;
age = gottenAge;
}

public Statistics(final String gottenGroup) {
group = gottenGroup;
count = null;
age = null;
}

@Override
public final String toString() {
StringBuilder result = new StringBuilder().append("Statistics{");
if (group != null) {
result.append("group='").append(group).append('\'');
}
if (count != null) {
result.append(", count=").append(count);
}
if (age != null) {
result.append(", age=").append(age);
}
result.append("}\n");
return result.toString();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package ru.mipt.diht.students.elinrin.collectionquery;

import java.util.function.Function;
import java.util.function.Predicate;

public class Conditions<T> {
public static <T> Predicate<T> rlike(final Function<T, String> expression, final String regexp) {
return element -> expression.apply(element).matches(regexp);
}

public static <T> Predicate<T> like(final Function<T, String> expression, final String pattern) {
throw new UnsupportedOperationException();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package ru.mipt.diht.students.elinrin.collectionquery;

import java.util.Comparator;
import java.util.function.Function;

public final class OrderByConditions {

public static <T, R extends Comparable<R>> Comparator<T> asc(final Function<T, R> expression) {
return (o1, o2) -> expression.apply(o1).compareTo(expression.apply(o2));
}

public static <T, R extends Comparable<R>> Comparator<T> desc(final Function<T, R> expression) {
return (o1, o2) -> expression.apply(o2).compareTo(expression.apply(o1));
}

}
Loading