/**
* Copyright (c) 2011-2014 Exxeleron GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.exxeleron.qjava;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
/**
* Utility class for testing serialization and deserialization.
*/
class QExpressions {
private final Map<String, Object[]> reference = new LinkedHashMap<String, Object[]>();
@SuppressWarnings("serial")
private void initExpressions() throws QException {
reference.put("1+`", new Object[] { new QException("type") });
reference.put("()", new Object[] { new Object[0] });
reference.put("::", new Object[] { null });
reference.put("1", new Object[] { 1L, Long.valueOf(1) });
reference.put("1i", new Object[] { 1, Integer.valueOf(1) });
reference.put("-234h", new Object[] { (short) -234, Short.valueOf((short) -234) });
reference.put("1b", new Object[] { true, Boolean.TRUE });
reference.put("0x2a", new Object[] { (byte) 0x2a, Byte.valueOf((byte) 0x2a) });
reference.put("89421099511627575j", new Object[] { 89421099511627575L, Long.valueOf(89421099511627575L) });
reference.put("3.234", new Object[] { 3.234, Double.valueOf(3.234) });
reference.put("5.5e", new Object[] { (float) 5.5, Float.valueOf((float) 5.5) });
reference.put("\"0\"", new Object[] { '0', Character.valueOf('0') });
reference.put("\"abc\"", new Object[] { "abc".toCharArray() });
reference.put("\"\"", new Object[] { "".toCharArray() });
reference.put("\"quick brown fox jumps over a lazy dog\"", new Object[] { "quick brown fox jumps over a lazy dog".toCharArray() });
reference.put("`abc", new Object[] { "abc" });
reference.put("`quickbrownfoxjumpsoveralazydog", new Object[] { "quickbrownfoxjumpsoveralazydog" });
reference.put("2000.01.04D05:36:57.600", new Object[] { new QTimestamp(279417600000000L) });
reference.put("2001.01m", new Object[] { new QMonth(12) });
reference.put("2001.01.01", new Object[] { new QDate(366) });
reference.put("2000.05.01", new Object[] { new QDate(121) });
reference.put("2000.01.04T05:36:57.600", new Object[] { new QDateTime(3.234) });
reference.put("0D05:36:57.600", new Object[] { new QTimespan(20217600000000L) });
reference.put("12:01", new Object[] { new QMinute(721) });
reference.put("12:05:00", new Object[] { new QSecond(43500) });
reference.put("12:04:59.123", new Object[] { new QTime(43499123) });
reference.put("0b", new Object[] { QType.getQNull(QType.BOOL) });
reference.put("0x00", new Object[] { QType.getQNull(QType.BYTE) });
reference.put("0Nh", new Object[] { QType.getQNull(QType.SHORT) });
reference.put("0N", new Object[] { QType.getQNull(QType.LONG) });
reference.put("0Ni", new Object[] { QType.getQNull(QType.INT) });
reference.put("0Nj", new Object[] { QType.getQNull(QType.LONG) });
reference.put("0Ne", new Object[] { QType.getQNull(QType.FLOAT) });
reference.put("0n", new Object[] { QType.getQNull(QType.DOUBLE) });
reference.put("\" \"", new Object[] { QType.getQNull(QType.CHAR) });
reference.put("`", new Object[] { QType.getQNull(QType.SYMBOL) });
reference.put("0Np", new Object[] { QType.getQNull(QType.TIMESTAMP) });
reference.put("0Nm", new Object[] { QType.getQNull(QType.MONTH) });
reference.put("0Nd", new Object[] { QType.getQNull(QType.DATE) });
reference.put("0Nz", new Object[] { QType.getQNull(QType.DATETIME) });
reference.put("0Nn", new Object[] { QType.getQNull(QType.TIMESPAN) });
reference.put("0Nu", new Object[] { QType.getQNull(QType.MINUTE) });
reference.put("0Nv", new Object[] { QType.getQNull(QType.SECOND) });
reference.put("0Nt", new Object[] { QType.getQNull(QType.TIME) });
reference
.put("(0b;1b;0b)",
new Object[] { new boolean[] { false, true, false }, new Boolean[] { false, true, false },
Arrays.asList(new Boolean[] { false, true, false }) });
reference.put("(0x01;0x02;0xff)",
new Object[] { new byte[] { 1, 2, (byte) 255 }, new Byte[] { 1, 2, (byte) 255 }, Arrays.asList(new Byte[] { 1, 2, (byte) 255 }) });
reference.put("(1h;2h;3h)", new Object[] { new short[] { 1, 2, 3 }, new Short[] { 1, 2, 3 }, Arrays.asList(new Short[] { 1, 2, 3 }) });
reference.put("1 2 3", new Object[] { new long[] { 1, 2, 3 }, new Long[] { 1L, 2L, 3L }, Arrays.asList(new Long[] { 1L, 2L, 3L }) });
reference.put("(1i;2i;3i)", new Object[] { new int[] { 1, 2, 3 }, new Integer[] { 1, 2, 3 }, Arrays.asList(new Integer[] { 1, 2, 3 }) });
reference.put("(1j;2j;3j)", new Object[] { new long[] { 1, 2, 3 }, new Long[] { 1L, 2L, 3L }, Arrays.asList(new Long[] { 1L, 2L, 3L }) });
reference.put("(5.5e; 8.5e)", new Object[] { new float[] { 5.5f, 8.5f }, new Float[] { 5.5f, 8.5f }, Arrays.asList(new Float[] { 5.5f, 8.5f }) });
reference.put("3.23 6.46", new Object[] { new double[] { 3.23, 6.46 }, new Double[] { 3.23, 6.46 }, Arrays.asList(new Double[] { 3.23, 6.46 }) });
reference.put("(1;`bcd;\"0bc\";5.5e)", new Object[] { new Object[] { 1L, "bcd", "0bc".toCharArray(), (float) 5.5 } });
reference.put("(42;::;`foo)", new Object[] { new Object[] { 42L, null, "foo" } });
reference.put("(enlist 1h; 2; enlist 3j)", new Object[] { new Object[] { new short[] { 1 }, 2L, new long[] { 3 } } });
reference.put("`the`quick`brown`fox",
new Object[] { new String[] { "the", "quick", "brown", "fox" }, Arrays.asList(new String[] { "the", "quick", "brown", "fox" }) });
reference.put("``quick``fox", new Object[] { new String[] { "", "quick", "", "fox" }, Arrays.asList(new String[] { "", "quick", "", "fox" }) });
reference.put("``", new Object[] { new String[] { "", "" }, Arrays.asList(new String[] { "", "" }) });
reference.put(
"(\"quick\"; \"brown\"; \"fox\"; \"jumps\"; \"over\"; \"a lazy\"; \"dog\")",
new Object[] {
new Object[] { "quick".toCharArray(), "brown".toCharArray(), "fox".toCharArray(), "jumps".toCharArray(), "over".toCharArray(),
"a lazy".toCharArray(), "dog".toCharArray() },
Arrays.asList(new Object[] { "quick".toCharArray(), "brown".toCharArray(), "fox".toCharArray(), "jumps".toCharArray(),
"over".toCharArray(), "a lazy".toCharArray(), "dog".toCharArray() }) });
reference.put("(\"quick\"; \"brown\"; \"fox\")", new Object[] { new char[][] { "quick".toCharArray(), "brown".toCharArray(), "fox".toCharArray() } });
reference.put("2000.01.04D05:36:57.600 0Np", new Object[] { new QTimestamp[] { new QTimestamp(279417600000000L), new QTimestamp(Long.MIN_VALUE) } });
reference.put("(2001.01m; 0Nm)", new Object[] { new QMonth[] { new QMonth(12), new QMonth(Integer.MIN_VALUE) } });
reference.put("2001.01.01 2000.05.01 0Nd", new Object[] { new QDate[] { new QDate(366), new QDate(121), new QDate(Integer.MIN_VALUE) } });
reference.put("2000.01.04T05:36:57.600 0Nz", new Object[] { new QDateTime[] { new QDateTime(3.234), new QDateTime(Double.NaN) } });
reference.put("0D05:36:57.600 0Nn", new Object[] { new QTimespan[] { new QTimespan(20217600000000L), new QTimespan(Long.MIN_VALUE) } });
reference.put("12:01 0Nu", new Object[] { new QMinute[] { new QMinute(721), new QMinute(Integer.MIN_VALUE) } });
reference.put("12:05:00 0Nv", new Object[] { new QSecond[] { new QSecond(43500), new QSecond(Integer.MIN_VALUE) } });
reference.put("12:04:59.123 0Nt", new Object[] { new QTime[] { new QTime(43499123), new QTime(Integer.MIN_VALUE) } });
reference.put("(enlist `a)!(enlist 1)", new Object[] { new QDictionary(new String[] { "a" }, new long[] { 1 }) });
reference.put("1 2!`abc`cdefgh", new Object[] { new QDictionary(new long[] { 1, 2 }, new String[] { "abc", "cdefgh" }) });
reference.put("(`x`y!(`a;2))", new Object[] { new QDictionary(new String[] { "x", "y" }, new Object[] { "a", 2L }) });
reference.put("`abc`def`gh!([] one: 1 2 3; two: 4 5 6)", new Object[] { new QDictionary(new String[] { "abc", "def", "gh" }, new QTable(
new String[] { "one", "two" }, new Object[] { new long[] { 1, 2, 3 }, new long[] { 4, 5, 6 } })) });
reference.put("(1;2h;3.3;\"4\")!(`one;2 3;\"456\";(7;8 9))", new Object[] {
new QDictionary(new Object[] { 1L, (short) 2, 3.3, '4' },
new Object[] { "one", new long[] { 2, 3 }, "456".toCharArray(),
new Object[] { 7L, new long[] { 8, 9 } } }),
new LinkedHashMap<Object, Object>() {
{
put(1L, "one");
put((short) 2, new long[] { 2, 3 });
put(3.3, "456".toCharArray());
put('4', new Object[] { 7L, new long[] { 8, 9 } });
}
} });
reference.put("(0 1; 2 3)!`first`second", new Object[] { new QDictionary(new Object[] { new long[] { 0, 1 }, new long[] { 2, 3 } },
new String[] { "first", "second" }) });
reference.put("`A`B`C!((1;2.2;3);(`x`y!(`a;2));5.5)", new Object[] { new QDictionary(new String[] { "A", "B", "C" },
new Object[] { new Object[] { 1L, 2.2, 3L }, new QDictionary(new String[] { "x", "y" }, new Object[] { "a", 2L }), 5.5 }) });
reference.put("flip `abc`def!(1 2 3; 4 5 6)", new Object[] { new QTable(new String[] { "abc", "def" }, new Object[] { new long[] { 1, 2, 3 },
new long[] { 4, 5, 6 } }) });
reference.put("flip `name`iq!(`Dent`Beeblebrox`Prefect;98 42 126)", new Object[] { new QTable(new String[] { "name", "iq" },
new Object[] { new String[] { "Dent", "Beeblebrox", "Prefect" }, new long[] { 98, 42, 126 } }) });
reference.put("flip `name`iq`grade!(`Dent`Beeblebrox`Prefect;98 42 126;\"a c\")", new Object[] { new QTable(new String[] { "name", "iq", "grade" },
new Object[] { new String[] { "Dent", "Beeblebrox", "Prefect" }, new long[] { 98, 42, 126 }, new char[] { 'a', ' ', 'c' } }) });
reference.put(
"flip `name`iq`fullname!(`Dent`Beeblebrox`Prefect;98 42 126;(\"Arthur Dent\"; \"Zaphod Beeblebrox\"; \"Ford Prefect\"))",
new Object[] { new QTable(new String[] { "name", "iq", "fullname" }, new Object[] {
new String[] { "Dent", "Beeblebrox", "Prefect" },
new long[] { 98, 42, 126 },
new Object[] { "Arthur Dent".toCharArray(),
"Zaphod Beeblebrox".toCharArray(),
"Ford Prefect".toCharArray() } }) });
reference.put("([] sc:1 2 3; nsc:(1 2; 3 4; 5 6 7))", new Object[] { new QTable(new String[] { "sc", "nsc" },
new Object[] { new long[] { 1, 2, 3 }, new Object[] { new long[] { 1, 2 }, new long[] { 3, 4 }, new long[] { 5, 6, 7 } } }) });
reference.put("([] name:`symbol$(); iq:`int$())", new Object[] { new QTable(new String[] { "name", "iq" },
new Object[] { new String[] {}, new int[] {} }) });
reference.put("([] pos:`d1`d2`d3;dates:(2001.01.01;2000.05.01;0Nd))", new Object[] { new QTable(new String[] { "pos", "dates" },
new Object[] { new String[] { "d1", "d2", "d3" }, new QDate[] { new QDate(366), new QDate(121), new QDate(Integer.MIN_VALUE) } }) });
reference.put("([eid:1001 1002 1003] pos:`d1`d2`d3;dates:(2001.01.01;2000.05.01;0Nd))", new Object[] { new QKeyedTable(new QTable(
new String[] { "eid" }, new Object[] { new long[] { 1001, 1002, 1003 } }), new QTable(new String[] { "pos", "dates" },
new Object[] { new String[] { "d1", "d2", "d3" }, new QDate[] { new QDate(366), new QDate(121), new QDate(Integer.MIN_VALUE) } })) });
reference.put("{x+y}", new Object[] { new QLambda("{x+y}") });
reference.put("{x+y}[3]", new Object[] { new QProjection(new Object[] { new QLambda("{x+y}"), 3L }) });
reference.put("0Ng", new Object[] { new UUID(0, 0) });
reference.put("\"G\"$\"8c680a01-5a49-5aab-5a65-d4bfddb6a661\"", new Object[] { UUID.fromString("8c680a01-5a49-5aab-5a65-d4bfddb6a661") });
reference.put("(\"G\"$\"8c680a01-5a49-5aab-5a65-d4bfddb6a661\"; 0Ng)",
new Object[] { new UUID[] { UUID.fromString("8c680a01-5a49-5aab-5a65-d4bfddb6a661"), new UUID(0, 0) } });
}
private final Map<String, byte[]> expressions = new LinkedHashMap<String, byte[]>();
QExpressions(final String file) {
try {
initExpressions();
} catch ( final QException e ) {
e.printStackTrace();
}
try {
final BufferedReader input = new BufferedReader(new FileReader(file));
try {
String query = null;
String expression = null;
while ( true ) {
query = input.readLine();
expression = input.readLine();
if ( query != null && expression != null && !expression.equals("") ) {
expressions.put(query, stringToByteArray(expression));
} else {
break;
}
}
} finally {
input.close();
}
} catch ( final IOException ex ) {
ex.printStackTrace();
}
}
Set<String> getExpressions() {
return expressions.keySet();
}
Object getReferenceObject( final String expression ) {
return reference.get(expression)[0];
}
Object[] getReferenceObjects( final String expression ) {
return reference.get(expression);
}
public byte[] getBinaryExpression( final String expression ) {
return expressions.get(expression);
}
private static byte[] stringToByteArray( final String hex ) {
final int numberChars = hex.length();
final byte[] bytes = new byte[numberChars / 2];
for ( int i = 0; i < numberChars; i += 2 ) {
bytes[i / 2] = (byte) (short) Short.valueOf(hex.substring(i, i + 2), 16);
}
return bytes;
}
}