blob: cab327e519d58000fb8741bbc0ca51629f1c8055 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.pirk.general;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Map;
import org.apache.hadoop.io.MapWritable;
import org.apache.pirk.schema.data.DataSchema;
import org.apache.pirk.schema.data.DataSchemaRegistry;
import org.apache.pirk.schema.query.QuerySchemaRegistry;
import org.apache.pirk.test.utils.Inputs;
import org.apache.pirk.utils.QueryParserUtils;
import org.apache.pirk.utils.StringUtils;
import org.apache.pirk.utils.SystemConfiguration;
import org.json.simple.JSONObject;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Class for testing the QueryParser methods
*/
public class QueryParserUtilsTest
{
private static final Logger logger = LoggerFactory.getLogger(QueryParserUtilsTest.class);
private static MapWritable doc = null; // MapWritable with arrays in json string representation
private static MapWritable docWAW = null; // MapWritable with arrays as WritableArrayWritable objects
private static Map<String,Object> docMap = null; // arrays as ArrayList<String>
private static DataSchema dSchema = null;
@BeforeClass
public static void setup() throws Exception
{
ArrayList<JSONObject> dataElementsJSON = Inputs.createJSONDataElements();
// Reset the schema properties and registries
DataSchemaRegistry.clearRegistry();
QuerySchemaRegistry.clearRegistry();
SystemConfiguration.setProperty("data.schemas", "none");
SystemConfiguration.setProperty("query.schemas", "none");
Inputs.createSchemaFiles(null, false, null);
dSchema = DataSchemaRegistry.get(Inputs.TEST_DATA_SCHEMA_NAME);
doc = StringUtils.jsonStringToMapWritableWithArrayWritable(dataElementsJSON.get(0).toJSONString(), dSchema);
docWAW = StringUtils.jsonStringToMapWritableWithWritableArrayWritable(dataElementsJSON.get(0).toJSONString(), dSchema);
docMap = StringUtils.jsonStringToMap(dataElementsJSON.get(0).toJSONString(), dSchema);
}
@AfterClass
public static void teardown()
{
// Reset the schema properties and registries
DataSchemaRegistry.clearRegistry();
QuerySchemaRegistry.clearRegistry();
SystemConfiguration.setProperty("data.schemas", "none");
SystemConfiguration.setProperty("query.schemas", "none");
}
@Test
public void testSingleQuery()
{
String query1 = "?q=src_ip:55.55.55.55";
assertTrue(QueryParserUtils.checkRecord(query1, doc, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable(query1, docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecord(query1, docMap, dSchema));
String query2 = "?q=qname:a.b.c.com";
assertTrue(QueryParserUtils.checkRecord(query2, doc, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable(query2, docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecord(query2, docMap, dSchema));
String query3 = "?q=qname:d.b.c.com";
assertFalse(QueryParserUtils.checkRecord(query3, doc, dSchema));
assertFalse(QueryParserUtils.checkRecordWritableArrayWritable(query3, docWAW, dSchema));
assertFalse(QueryParserUtils.checkRecord(query3, docMap, dSchema));
}
@Test
public void testQueryFieldDoesNotExist()
{
logger.info("running testQueryFieldDoesNotExist");
// Field does not exist, this should not be found
String query = "?q=nonexistent-field:*check*";
assertFalse(QueryParserUtils.checkRecordWritableArrayWritable(query, docWAW, dSchema));
assertFalse(QueryParserUtils.checkRecord(query, doc, dSchema));
assertFalse(QueryParserUtils.checkRecord(query, docMap, dSchema));
// First field does not exist, but second should be found
String query2 = "?q=nonexistent-field:*check*+OR+qname:*a.b.c.com*";
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable(query2, docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecord(query2, doc, dSchema));
assertTrue(QueryParserUtils.checkRecord(query2, docMap, dSchema));
// First field does not exist, second field does, but AND operator makes query false
String query3 = "?q=nonexistent-field:*check*+AND+qname:*a.b.c.com*";
assertFalse(QueryParserUtils.checkRecordWritableArrayWritable(query3, docWAW, dSchema));
assertFalse(QueryParserUtils.checkRecord(query3, doc, dSchema));
assertFalse(QueryParserUtils.checkRecord(query3, docMap, dSchema));
logger.info("completed testQueryFieldDoesNotExist");
}
@Test
public void testIgnoreCase()
{
logger.info("running testIgnoreCase");
// with case sensitivity, should NOT be found
String query = "?q=qname:*A.b.c.com*";
assertFalse(QueryParserUtils.checkRecord(query, doc, dSchema));
assertFalse(QueryParserUtils.checkRecordWritableArrayWritable(query, docWAW, dSchema));
assertFalse(QueryParserUtils.checkRecord(query, docMap, dSchema));
// with case sensitivity, should be found
String query2 = "?q=qname:*a.b.c.com*";
assertTrue(QueryParserUtils.checkRecord(query2, doc, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable(query2, docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecord(query2, docMap, dSchema));
// adds @ flag = case insensitivity, thus should be found
String query3 = "?q=qname@:*A.b.c.com*";
assertTrue(QueryParserUtils.checkRecord(query3, doc, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable(query3, docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecord(query3, docMap, dSchema));
logger.info("completed testIgnoreCase");
}
@Test
public void testSingleValueRangeQuery()
{
testSingleValueRangeQueryMapWritable();
testSingleValueRangeQueryMap();
testSingleValueRangeQueryMapWritableWAW();
}
private void testSingleValueRangeQueryMapWritable()
{
assertTrue(QueryParserUtils.checkRecord("?q=rcode:[0+TO+2]", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=rcode:{-1+TO+2}", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=rcode:[-1+TO+0]", doc, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=rcode:{0+TO+3}", doc, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=rcode:[3+TO+10]", doc, dSchema));
}
private void testSingleValueRangeQueryMap()
{
assertTrue(QueryParserUtils.checkRecord("?q=rcode:[0+TO+2]", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=rcode:{-1+TO+2}", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=rcode:[-1+TO+0]", docMap, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=rcode:{0+TO+3}", docMap, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=rcode:[3+TO+10]", docMap, dSchema));
}
private void testSingleValueRangeQueryMapWritableWAW()
{
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=rcode:[0+TO+2]", docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=rcode:{-1+TO+2}", docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=rcode:[-1+TO+0]", docWAW, dSchema));
assertFalse(QueryParserUtils.checkRecordWritableArrayWritable("?q=rcode:{0+TO+3}", docWAW, dSchema));
assertFalse(QueryParserUtils.checkRecordWritableArrayWritable("?q=rcode:[3+TO+10]", docWAW, dSchema));
}
@Test
public void testIPRangeQuery()
{
testIPRangeQueryMapWritable();
testIPRangeQueryMap();
testIPRangeQueryMapWritableWAW();
}
public void testIPRangeQueryMapWritable()
{
// src_ip: 55.55.55.55
// ip: 10.20.30.40,10.20.30.60
assertTrue(QueryParserUtils.checkRecord("?q=src_ip:[55.55.55.0+TO+173.248.255.255]", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=src_ip:[55.55.55.0+TO+55.55.55.100]", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=src_ip:[55.55.55.2+TO+55.55.55.55]", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=src_ip:{55.55.55.2+TO+55.55.55.57}", doc, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=src_ip:{173.248.188.0+TO+173.248.188.10}", doc, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=src_ip:{55.55.55.2+TO+55.55.55.55}", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=ip:[10.20.30.50+TO+10.20.30.69]", doc, dSchema));
}
public void testIPRangeQueryMapWritableWAW()
{
// src_ip: 55.55.55.55
// ip: 10.20.30.40,10.20.30.60
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=src_ip:[55.55.55.0+TO+173.248.255.255]", docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=src_ip:[55.55.55.0+TO+55.55.55.100]", docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=src_ip:[55.55.55.2+TO+55.55.55.55]", docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=src_ip:{55.55.55.2+TO+55.55.55.57}", docWAW, dSchema));
assertFalse(QueryParserUtils.checkRecordWritableArrayWritable("?q=src_ip:{173.248.188.0+TO+173.248.188.10}", docWAW, dSchema));
assertFalse(QueryParserUtils.checkRecordWritableArrayWritable("?q=src_ip:{55.55.55.2+TO+55.55.55.55}", docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=ip:[10.20.30.50+TO+10.20.30.69]", docWAW, dSchema));
}
public void testIPRangeQueryMap()
{
// src_ip: 55.55.55.55
// ip: 10.20.30.40,10.20.30.60
assertTrue(QueryParserUtils.checkRecord("?q=src_ip:[55.55.55.0+TO+173.248.255.255]", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=src_ip:[55.55.55.0+TO+55.55.55.100]", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=src_ip:[55.55.55.2+TO+55.55.55.55]", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=src_ip:{55.55.55.2+TO+55.55.55.57}", docMap, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=src_ip:{173.248.188.0+TO+173.248.188.10}", docMap, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=src_ip:{55.55.55.2+TO+55.55.55.55}", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=ip:[10.20.30.50+TO+10.20.30.69]", docMap, dSchema));
}
@Test
public void testDateRangeQuery()
{
testDateRangeQueryMapWritable();
testDateRangeQueryMapWritableWAW();
testDateRangeQueryMap();
}
private void testDateRangeQueryMapWritable()
{
// date: 2016-02-20T23:29:05.000Z
assertTrue(QueryParserUtils.checkRecord("?q=date:[2014-05-05T20:33:07.000Z+TO+2016-02-20T23:29:05.000Z]", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=date:[2015-05-05T20:33:07.000Z+TO+2016-04-20T23:29:05.000Z]", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=date:[2016-02-20T23:29:05.000Z+TO+2017-02-20T23:29:05.000Z]", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=date:{2015-06-05T20:33:07.000Z+TO+2016-02-20T23:30:05.000Z}", doc, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=date:[2013-05-05T20:33:07.000Z+TO+2014-07-05T20:33:07.000Z]", doc, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=date:{2015-05-05T20:33:07.000Z+TO+2016-02-20T23:29:05.000Z}", doc, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=date:{2015-06-05T20:33:07.000Z+TO+2015-07-05T20:33:07.000Z}", doc, dSchema));
}
private void testDateRangeQueryMap()
{
// date: 2016-02-20T23:29:05.000Z
assertTrue(QueryParserUtils.checkRecord("?q=date:[2014-05-05T20:33:07.000Z+TO+2016-02-20T23:29:05.000Z]", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=date:[2015-05-05T20:33:07.000Z+TO+2016-04-20T23:29:05.000Z]", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=date:[2016-02-20T23:29:05.000Z+TO+2017-02-20T23:29:05.000Z]", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=date:{2015-06-05T20:33:07.000Z+TO+2016-02-20T23:30:05.000Z}", docMap, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=date:[2013-05-05T20:33:07.000Z+TO+2014-07-05T20:33:07.000Z]", docMap, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=date:{2015-05-05T20:33:07.000Z+TO+2016-02-20T23:29:05.000Z}", docMap, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=date:{2015-06-05T20:33:07.000Z+TO+2015-07-05T20:33:07.000Z}", docMap, dSchema));
}
private void testDateRangeQueryMapWritableWAW()
{
// date: 2016-02-20T23:29:05.000Z
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=date:[2014-05-05T20:33:07.000Z+TO+2016-02-20T23:29:05.000Z]", docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=date:[2015-05-05T20:33:07.000Z+TO+2016-04-20T23:29:05.000Z]", docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=date:[2016-02-20T23:29:05.000Z+TO+2017-02-20T23:29:05.000Z]", docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=date:{2015-06-05T20:33:07.000Z+TO+2016-02-20T23:30:05.000Z}", docWAW, dSchema));
assertFalse(QueryParserUtils.checkRecordWritableArrayWritable("?q=date:[2013-05-05T20:33:07.000Z+TO+2014-07-05T20:33:07.000Z]", docWAW, dSchema));
assertFalse(QueryParserUtils.checkRecordWritableArrayWritable("?q=date:{2015-05-05T20:33:07.000Z+TO+2016-02-20T23:29:05.000Z}", docWAW, dSchema));
assertFalse(QueryParserUtils.checkRecordWritableArrayWritable("?q=date:{2015-06-05T20:33:07.000Z+TO+2015-07-05T20:33:07.000Z}", docWAW, dSchema));
}
@Test
public void testBooleanQuery()
{
testBooleanQueryMapWritable();
testBooleanQueryMapMapWritableWAW();
testBooleanQueryMap();
}
private void testBooleanQueryMapWritable()
{
assertTrue(QueryParserUtils.checkRecord("?q=qtype:1+AND+date:[2015-05-05T20:33:07.000Z+TO+2016-02-20T23:29:05.000Z]", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qtype:5+OR+date:[2015-05-05T20:33:07.000Z+TO+2016-02-20T23:29:05.000Z]", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qtype:1+AND+rcode:0+AND+date:[2015-05-05T20:33:07.000Z+TO+2016-02-20T23:29:05.000Z]", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qtype:1+AND+rcode:0+OR+date:[2013-05-05T20:33:07.000Z+TO+2014-07-05T20:33:07.000Z]", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qtype:1+AND+rcode:1+OR+date:[2015-05-05T20:33:07.000Z+TO+2016-02-20T23:29:05.000Z]", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qtype:5+OR+qtype:2+OR+rcode:0", doc, dSchema));
}
private void testBooleanQueryMap()
{
assertTrue(QueryParserUtils.checkRecord("?q=qtype:1+AND+date:[2015-05-05T20:33:07.000Z+TO+2016-02-20T23:29:05.000Z]", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qtype:5+OR+date:[2015-05-05T20:33:07.000Z+TO+2016-02-20T23:29:05.000Z]", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qtype:1+AND+rcode:0+AND+date:[2015-05-05T20:33:07.000Z+TO+2016-02-20T23:29:05.000Z]", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qtype:1+AND+rcode:0+OR+date:[2013-05-05T20:33:07.000Z+TO+2014-07-05T20:33:07.000Z]", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qtype:1+AND+rcode:1+OR+date:[2015-05-05T20:33:07.000Z+TO+2016-02-20T23:29:05.000Z]", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qtype:5+OR+qtype:2+OR+rcode:0", docMap, dSchema));
}
private void testBooleanQueryMapMapWritableWAW()
{
assertTrue(
QueryParserUtils.checkRecordWritableArrayWritable("?q=qtype:1+AND+date:[2015-05-05T20:33:07.000Z+TO+2016-02-20T23:29:05.000Z]", docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=qtype:5+OR+date:[2015-05-05T20:33:07.000Z+TO+2016-02-20T23:29:05.000Z]", docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=qtype:1+AND+rcode:0+AND+date:[2015-05-05T20:33:07.000Z+TO+2016-02-20T23:29:05.000Z]",
docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=qtype:1+AND+rcode:0+OR+date:[2013-05-05T20:33:07.000Z+TO+2014-07-05T20:33:07.000Z]",
docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=qtype:1+AND+rcode:1+OR+date:[2015-05-05T20:33:07.000Z+TO+2016-02-20T23:29:05.000Z]",
docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=qtype:5+OR+qtype:2+OR+rcode:0", docWAW, dSchema));
}
@Test
public void testAllQuery()
{
assertTrue(QueryParserUtils.checkRecord("?q=*", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=*", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=*", docWAW, dSchema));
}
@Test
public void testWildcardQuery()
{
testWildcardQueryMapWritable();
testWildcardQueryMap();
testWildcardQueryMapWritableWAW();
}
private void testWildcardQueryMapWritable()
{
assertTrue(QueryParserUtils.checkRecord("?q=qname:*.com", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qname:a.b.c.c*m", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qname:a.b*", doc, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=qname:*.org", doc, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=qname:mrtf*", doc, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=qname:nedeljnik*.uk", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qname:a.b.c.c?m", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qname:a.b.?.com", doc, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qname:?.b.c.com", doc, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=qname:medelj?ikafera.com", doc, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=qname:nedeljntkafer?.com", doc, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=qname:?edeljnikrfera.com", doc, dSchema));
}
private void testWildcardQueryMap()
{
assertTrue(QueryParserUtils.checkRecord("?q=qname:*.com", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qname:a.b.c.c*m", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qname:a.b*", docMap, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=qname:*.org", docMap, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=qname:mrtf*", docMap, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=qname:nedeljnik*.uk", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qname:a.b.c.c?m", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qname:a.b.?.com", docMap, dSchema));
assertTrue(QueryParserUtils.checkRecord("?q=qname:?.b.c.com", docMap, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=qname:medelj?ikafera.com", docMap, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=qname:nedeljntkafer?.com", docMap, dSchema));
assertFalse(QueryParserUtils.checkRecord("?q=qname:?edeljnikrfera.com", docMap, dSchema));
}
private void testWildcardQueryMapWritableWAW()
{
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=qname:*.com", docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=qname:a.b.c.c*m", docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=qname:a.b*", docWAW, dSchema));
assertFalse(QueryParserUtils.checkRecordWritableArrayWritable("?q=qname:*.org", docWAW, dSchema));
assertFalse(QueryParserUtils.checkRecordWritableArrayWritable("?q=qname:mrtf*", docWAW, dSchema));
assertFalse(QueryParserUtils.checkRecordWritableArrayWritable("?q=qname:nedeljnik*.uk", docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=qname:a.b.c.c?m", docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=qname:a.b.?.com", docWAW, dSchema));
assertTrue(QueryParserUtils.checkRecordWritableArrayWritable("?q=qname:?.b.c.com", docWAW, dSchema));
assertFalse(QueryParserUtils.checkRecordWritableArrayWritable("?q=qname:medelj?ikafera.com", docWAW, dSchema));
assertFalse(QueryParserUtils.checkRecordWritableArrayWritable("?q=qname:nedeljntkafer?.com", docWAW, dSchema));
assertFalse(QueryParserUtils.checkRecordWritableArrayWritable("?q=qname:?edeljnikrfera.com", docWAW, dSchema));
}
}