Project

General

Profile

1
package eu.dnetlib.data.oai.store.parser;
2

    
3
import java.time.LocalDateTime;
4
import java.time.ZoneId;
5
import java.time.format.DateTimeFormatter;
6
import java.util.Date;
7

    
8
import com.google.common.collect.Lists;
9
import com.mongodb.BasicDBObject;
10
import com.mongodb.DBObject;
11
import com.mongodb.util.JSON;
12
import eu.dnetlib.oai.parser.MongoQueryParser;
13
import org.apache.commons.logging.Log;
14
import org.apache.commons.logging.LogFactory;
15
import org.bson.conversions.Bson;
16
import org.bson.types.ObjectId;
17
import org.junit.Test;
18

    
19
import static org.junit.Assert.assertEquals;
20

    
21
public class MongoQueryParserTest {
22

    
23
	private static final Log log = LogFactory.getLog(MongoQueryParserTest.class); // NOPMD by marko on 11/24/08 5:02 PM
24
	private final MongoQueryParser mongoParser = new MongoQueryParser();
25

    
26
	@Test
27
	public void testParseEq() {
28
		final Bson expected = new BasicDBObject("set", "CEDIASManuscripts");
29
		final Bson o = this.mongoParser.parse("set = \"CEDIASManuscripts\"");
30
		assertEquals(expected, o);
31

    
32
	}
33

    
34
	@Test
35
	public void testParseNeq() {
36
		final Bson expected = new BasicDBObject("set", new BasicDBObject("$ne", "CEDIASManuscripts"));
37
		final Bson o = this.mongoParser.parse("set <> \"CEDIASManuscripts\"");
38
		assertEquals(expected, o);
39
	}
40

    
41
	@Test
42
	public void testParseAnd() {
43
		final BasicDBObject expected = new BasicDBObject("$and", Lists.newArrayList(new BasicDBObject("set", new BasicDBObject("$ne", "CEDIASManuscripts")),
44
				new BasicDBObject("pippo", new BasicDBObject("$gt", "x"))));
45
		final Bson o = this.mongoParser.parse("set <> \"CEDIASManuscripts\" AND pippo > x");
46
		log.info(o);
47
		assertEquals(expected, o);
48
	}
49

    
50
	@Test
51
	public void testParseOr() {
52
		final BasicDBObject expected = new BasicDBObject("$or", Lists.newArrayList(new BasicDBObject("set", new BasicDBObject("$ne", "CEDIASManuscripts")),
53
				new BasicDBObject("pippo", new BasicDBObject("$gt", "x"))));
54
		final Bson o = this.mongoParser.parse("set <> \"CEDIASManuscripts\" OR pippo > x");
55
		log.info(o);
56
		assertEquals(expected, o);
57
	}
58

    
59
	@Test
60
	public void testParseNot() {
61
		final BasicDBObject expected = new BasicDBObject("$and", Lists.newArrayList(new BasicDBObject("set", "CEDIASManuscripts"), new BasicDBObject("$not",
62
				new BasicDBObject("pippo", new BasicDBObject("$gt", "x")))));
63
		final Bson o = this.mongoParser.parse("set = \"CEDIASManuscripts\" NOT pippo > x");
64
		// log.info(o)
65
		assertEquals(expected, o);
66
	}
67

    
68
	@Test
69
	public void testParseStar() {
70
		final BasicDBObject expected = new BasicDBObject();
71
		final Bson o = this.mongoParser.parse("*");
72
		final Bson o2 = this.mongoParser.parse("*=*");
73
		assertEquals(expected, o);
74
		assertEquals(expected, o2);
75
	}
76

    
77
	@Test
78
	public void testParseStarAnd() {
79
		final BasicDBObject expected =
80
				new BasicDBObject("$and", Lists.newArrayList(new BasicDBObject(), new BasicDBObject("pippo", new BasicDBObject("$gt", "x"))));
81
		final Bson o = this.mongoParser.parse("* AND pippo > x");
82
		final Bson o2 = this.mongoParser.parse("*=* AND pippo > x");
83
		assertEquals(expected, o);
84
		assertEquals(expected, o2);
85
	}
86

    
87
	@Test
88
	public void testParseIdQuery() {
89
		final BasicDBObject expected = new BasicDBObject("_id", new BasicDBObject("$gt", new ObjectId("5225e093aabf055637bf2c65")));
90
		final Bson o = this.mongoParser.parse("_id > 5225e093aabf055637bf2c65");
91
		assertEquals(expected, o);
92
	}
93

    
94
	@Test
95
	public void testParseUntilDatestamp() {
96
		final Date dateTime = Date.from(this.parseDate("2014-04-03T00:00:00.000Z").atZone(ZoneId.systemDefault()).toInstant());
97
		final BasicDBObject expected =
98
				new BasicDBObject("$and", Lists.newArrayList(new BasicDBObject("oaftype", new BasicDBObject("$ne", "person")), new BasicDBObject(
99
						"datestamp", new BasicDBObject("$lt", dateTime))));
100
		final Bson o = this.mongoParser.parse("(oaftype <> \"person\") AND datestamp <= 2014-04-02");
101
		System.out.println("o.toString() = " + expected.toString());
102
		System.out.println("o.toString() = " + o.toString());
103

    
104
		assertEquals(expected, o);
105
	}
106

    
107
	@Test
108
	public void testJsonParsing() {
109
		final String jsonQuery = "{licenses:{$elemMatch:{\"license\" : \"OPEN\", \"hostedby\" : {$ne:\"Europe PubMed Central\"}}}}";
110
		final DBObject query = (DBObject) JSON.parse(jsonQuery);
111
		System.out.println(query);
112
	}
113

    
114
	private LocalDateTime parseDate(final String date) {
115
		final DateTimeFormatter dateNoTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
116
		final DateTimeFormatter iso8601NoMsTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ");
117
		final DateTimeFormatter iso8601Formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'.'SSS'Z'");
118
		try {
119
			System.err.println("Using default " + iso8601Formatter.getClass());
120
			return LocalDateTime.parse(date, iso8601Formatter);
121
		} catch (final Exception e) {
122
			e.printStackTrace();
123
			try {
124
				System.err.println("Switching to ISO with no millisecond date formatter: yyyy-MM-dd'T'HH:mm:ssZ");
125
				return LocalDateTime.parse(date, iso8601NoMsTimeFormatter);
126
			} catch (final Exception ex) {
127
				System.err.println("Switching to simple date formatter: yyyy-MM-dd");
128
				return LocalDateTime.parse(date, dateNoTimeFormatter);
129
			}
130
		}
131
	}
132

    
133
}
    (1-1/1)