package org.araqne.logdb.query.parser; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.araqne.logdb.QueryCommand; import org.araqne.logdb.QueryContext; import org.araqne.logdb.QueryParseException; import org.araqne.logdb.QueryParserService; import org.araqne.logdb.QueryResultFactory; import org.araqne.logdb.query.command.Join; import org.araqne.logdb.query.command.Join.JoinType; import org.araqne.logdb.query.command.Table; import org.araqne.logdb.query.command.Table.TableParams; import org.araqne.logdb.query.engine.QueryResultFactoryImpl; import org.araqne.storage.api.FilePath; import org.araqne.storage.api.StorageManager; import org.araqne.storage.api.URIResolver; import org.araqne.storage.localfile.LocalFilePath; import org.junit.Test; import org.mockito.ArgumentMatcher; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; public class JoinParserTest { static { System.setProperty("araqne.data.dir", "."); } public static class LocalStorageManager implements StorageManager { @Override public FilePath resolveFilePath(String path) { return new LocalFilePath(path); } @Override public void start() { } @Override public void stop() { } @Override public void addURIResolver(URIResolver r) { throw new UnsupportedOperationException(); } } @Test public void testFieldListParse() { QueryParserService p = prepareMockQueryParser(); StorageManager storageManager = new LocalStorageManager(); QueryResultFactory resultFactory = new QueryResultFactoryImpl(storageManager); resultFactory.start(); JoinParser parser = new JoinParser(p, resultFactory); parser.setQueryParserService(p); { String joinCommand = "join ip, port [ table users ]"; QueryContext context = new QueryContext(null); Join join = (Join) parser.parse(context, joinCommand); assertEquals(JoinType.Inner, join.getType()); assertEquals(2, join.getSortFields().length); assertEquals("ip", join.getSortFields()[0].getName()); assertEquals("port", join.getSortFields()[1].getName()); assertTrue(join.getSortFields()[0].isAsc()); assertTrue(join.getSortFields()[1].isAsc()); assertTrue(join.getSubQuery().getCommands().get(0) instanceof Table); } { String joinCommand = "join +ip, port [ table users ]"; QueryContext context = new QueryContext(null); Join join = (Join) parser.parse(context, joinCommand); assertEquals(JoinType.Inner, join.getType()); assertEquals(2, join.getSortFields().length); assertEquals("ip", join.getSortFields()[0].getName()); assertEquals("port", join.getSortFields()[1].getName()); assertTrue(join.getSortFields()[0].isAsc()); assertTrue(join.getSortFields()[1].isAsc()); assertTrue(join.getSubQuery().getCommands().get(0) instanceof Table); } { String joinCommand = "join +ip, +port [ table users ]"; QueryContext context = new QueryContext(null); Join join = (Join) parser.parse(context, joinCommand); assertEquals(JoinType.Inner, join.getType()); assertEquals(2, join.getSortFields().length); assertEquals("ip", join.getSortFields()[0].getName()); assertEquals("port", join.getSortFields()[1].getName()); assertTrue(join.getSortFields()[0].isAsc()); assertTrue(join.getSortFields()[1].isAsc()); assertTrue(join.getSubQuery().getCommands().get(0) instanceof Table); } { String joinCommand = "join ip, +port [ table users ]"; QueryContext context = new QueryContext(null); Join join = (Join) parser.parse(context, joinCommand); assertEquals(JoinType.Inner, join.getType()); assertEquals(2, join.getSortFields().length); assertEquals("ip", join.getSortFields()[0].getName()); assertEquals("port", join.getSortFields()[1].getName()); assertTrue(join.getSortFields()[0].isAsc()); assertTrue(join.getSortFields()[1].isAsc()); assertTrue(join.getSubQuery().getCommands().get(0) instanceof Table); } { String joinCommand = "join ip, +port, seq [ table users ]"; QueryContext context = new QueryContext(null); Join join = (Join) parser.parse(context, joinCommand); assertEquals(JoinType.Inner, join.getType()); assertEquals(3, join.getSortFields().length); assertEquals("ip", join.getSortFields()[0].getName()); assertEquals("port", join.getSortFields()[1].getName()); assertEquals("seq", join.getSortFields()[2].getName()); assertTrue(join.getSortFields()[0].isAsc()); assertTrue(join.getSortFields()[1].isAsc()); assertTrue(join.getSortFields()[2].isAsc()); assertTrue(join.getSubQuery().getCommands().get(0) instanceof Table); } { String joinCommand = "join ip, +port, -seq [ table users ]"; QueryContext context = new QueryContext(null); Join join = (Join) parser.parse(context, joinCommand); assertEquals(JoinType.Inner, join.getType()); assertEquals(3, join.getSortFields().length); assertEquals("ip", join.getSortFields()[0].getName()); assertEquals("port", join.getSortFields()[1].getName()); assertEquals("seq", join.getSortFields()[2].getName()); assertTrue(join.getSortFields()[0].isAsc()); assertTrue(join.getSortFields()[1].isAsc()); assertFalse(join.getSortFields()[2].isAsc()); assertTrue(join.getSubQuery().getCommands().get(0) instanceof Table); } { String joinCommand = "join -ip, -port, seq [ table users ]"; QueryContext context = new QueryContext(null); Join join = (Join) parser.parse(context, joinCommand); assertEquals(JoinType.Inner, join.getType()); assertEquals(3, join.getSortFields().length); assertEquals("ip", join.getSortFields()[0].getName()); assertEquals("port", join.getSortFields()[1].getName()); assertEquals("seq", join.getSortFields()[2].getName()); assertFalse(join.getSortFields()[0].isAsc()); assertFalse(join.getSortFields()[1].isAsc()); assertTrue(join.getSortFields()[2].isAsc()); assertTrue(join.getSubQuery().getCommands().get(0) instanceof Table); } } @Test public void testParse() { String joinCommand = "join ip [ table users ]"; QueryParserService p = prepareMockQueryParser(); StorageManager storageManager = new LocalStorageManager(); QueryResultFactory resultFactory = new QueryResultFactoryImpl(storageManager); resultFactory.start(); JoinParser parser = new JoinParser(p, resultFactory); parser.setQueryParserService(p); QueryContext context = new QueryContext(null); Join join = (Join) parser.parse(context, joinCommand); assertEquals(JoinType.Inner, join.getType()); assertEquals(1, join.getSortFields().length); assertEquals("ip", join.getSortFields()[0].getName()); assertTrue(join.getSortFields()[0].isAsc()); assertTrue(join.getSubQuery().getCommands().get(0) instanceof Table); } @Test public void testParenthese() { QueryParserService p = prepareMockQueryParser(); StorageManager storageManager = new LocalStorageManager(); QueryResultFactory resultFactory = new QueryResultFactoryImpl(storageManager); resultFactory.start(); JoinParser parser = new JoinParser(p, resultFactory); parser.setQueryParserService(p); try { String joinCommand = "join _id string([table iis])"; @SuppressWarnings("unused") QueryContext context = new QueryContext(null); Join join = (Join) parser.parse(context, joinCommand); fail(); } catch (QueryParseException e) { } } @Test public void testLeftJoinType() { QueryParserService p = prepareMockQueryParser(); StorageManager storageManager = new LocalStorageManager(); QueryResultFactory resultFactory = new QueryResultFactoryImpl(storageManager); resultFactory.start(); JoinParser parser = new JoinParser(p, resultFactory); parser.setQueryParserService(p); QueryContext context = new QueryContext(null); Join join = (Join) parser.parse(context, "join type=left ip [ table users ]"); assertEquals(JoinType.Left, join.getType()); assertEquals(1, join.getSortFields().length); assertEquals("ip", join.getSortFields()[0].getName()); assertTrue(join.getSortFields()[0].isAsc()); assertTrue(join.getSubQuery().getCommands().get(0) instanceof Table); } private QueryParserService prepareMockQueryParser() { QueryParserService p = mock(QueryParserService.class); when(p.parseCommands(any(QueryContext.class), eq("table users"))).then(new QueryParserServiceAnswer()); return p; } private class QueryParserServiceAnswer implements Answer<List<QueryCommand>> { @Override public List<QueryCommand> answer(InvocationOnMock invocation) throws Throwable { TableParams params = new TableParams(); params.setTableSpecs(Arrays.<TableSpec> asList(new WildcardTableSpec("users"))); QueryCommand table = new Table(params); ArrayList<QueryCommand> commands = new ArrayList<QueryCommand>(); commands.add(table); return commands; } } }