Updated Branches: refs/heads/0.2-dev 0f78613d6 -> 747caacfd
Working on BLUR-41, the enum that was QUERY_TYPE is now in the QueryWritableMapper class. This should make it easier to add new query writable types to Blur. Project: http://git-wip-us.apache.org/repos/asf/incubator-blur/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-blur/commit/747caacf Tree: http://git-wip-us.apache.org/repos/asf/incubator-blur/tree/747caacf Diff: http://git-wip-us.apache.org/repos/asf/incubator-blur/diff/747caacf Branch: refs/heads/0.2-dev Commit: 747caacfde51b5009b2f96440b37e11b52813409 Parents: 0f78613 Author: Aaron McCurry <[email protected]> Authored: Sun Feb 10 21:58:32 2013 -0500 Committer: Aaron McCurry <[email protected]> Committed: Sun Feb 10 21:58:32 2013 -0500 ---------------------------------------------------------------------- .../lucene/serializer/AbtractQueryWritable.java | 16 ++- .../lucene/serializer/BooleanQueryWritable.java | 5 + .../blur/lucene/serializer/FuzzyQueryWritable.java | 5 + .../serializer/MatchAllDocsQueryWritable.java | 8 +- .../blur/lucene/serializer/ProtoSerializer.java | 4 +- .../apache/blur/lucene/serializer/QUERY_TYPE.java | 133 --------------- .../blur/lucene/serializer/QueryWritable.java | 26 ++-- .../lucene/serializer/QueryWritableMapper.java | 80 +++++++++ .../blur/lucene/serializer/TermQueryWritable.java | 5 + .../lucene/serializer/WildcardQueryWritable.java | 61 +++++++ 10 files changed, 193 insertions(+), 150 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/747caacf/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/AbtractQueryWritable.java ---------------------------------------------------------------------- diff --git a/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/AbtractQueryWritable.java b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/AbtractQueryWritable.java index 1e59fba..68a62c2 100644 --- a/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/AbtractQueryWritable.java +++ b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/AbtractQueryWritable.java @@ -19,10 +19,22 @@ package org.apache.blur.lucene.serializer; import org.apache.hadoop.io.Writable; import org.apache.lucene.search.Query; -public abstract class AbtractQueryWritable<T extends Query> implements Writable { +public abstract class AbtractQueryWritable<T extends Query> implements Writable, Cloneable { - public abstract Query getQuery(); + public abstract T getQuery(); public abstract void setQuery(T query); + public abstract Class<T> getType(); + + @SuppressWarnings("unchecked") + @Override + public AbtractQueryWritable<T> clone() { + try { + return (AbtractQueryWritable<T>) super.clone(); + } catch (CloneNotSupportedException e) { + throw new RuntimeException(e); + } + } + } http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/747caacf/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/BooleanQueryWritable.java ---------------------------------------------------------------------- diff --git a/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/BooleanQueryWritable.java b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/BooleanQueryWritable.java index a7da00b..a21afce 100644 --- a/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/BooleanQueryWritable.java +++ b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/BooleanQueryWritable.java @@ -70,4 +70,9 @@ public class BooleanQueryWritable extends AbtractQueryWritable<BooleanQuery> { } + @Override + public Class<BooleanQuery> getType() { + return BooleanQuery.class; + } + } http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/747caacf/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/FuzzyQueryWritable.java ---------------------------------------------------------------------- diff --git a/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/FuzzyQueryWritable.java b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/FuzzyQueryWritable.java index d285f5b..fe1d920 100644 --- a/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/FuzzyQueryWritable.java +++ b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/FuzzyQueryWritable.java @@ -102,4 +102,9 @@ public class FuzzyQueryWritable extends AbtractQueryWritable<FuzzyQuery> { throw new RuntimeException(e); } } + + @Override + public Class<FuzzyQuery> getType() { + return FuzzyQuery.class; + } } http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/747caacf/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/MatchAllDocsQueryWritable.java ---------------------------------------------------------------------- diff --git a/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/MatchAllDocsQueryWritable.java b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/MatchAllDocsQueryWritable.java index 88e988b..8828b00 100644 --- a/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/MatchAllDocsQueryWritable.java +++ b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/MatchAllDocsQueryWritable.java @@ -5,7 +5,6 @@ import java.io.DataOutput; import java.io.IOException; import org.apache.lucene.search.MatchAllDocsQuery; -import org.apache.lucene.search.Query; public class MatchAllDocsQueryWritable extends AbtractQueryWritable<MatchAllDocsQuery> { @@ -24,7 +23,7 @@ public class MatchAllDocsQueryWritable extends AbtractQueryWritable<MatchAllDocs } @Override - public Query getQuery() { + public MatchAllDocsQuery getQuery() { return query; } @@ -33,4 +32,9 @@ public class MatchAllDocsQueryWritable extends AbtractQueryWritable<MatchAllDocs this.query = query; } + @Override + public Class<MatchAllDocsQuery> getType() { + return MatchAllDocsQuery.class; + } + } http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/747caacf/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/ProtoSerializer.java ---------------------------------------------------------------------- diff --git a/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/ProtoSerializer.java b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/ProtoSerializer.java index 0aada55..b666b54 100644 --- a/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/ProtoSerializer.java +++ b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/ProtoSerializer.java @@ -32,7 +32,7 @@ public class ProtoSerializer { QueryParser parser = new QueryParser(Version.LUCENE_40, "", new StandardAnalyzer(Version.LUCENE_40)); - Query query = parser.parse("a:v1 b:v2 c:v3~"); + Query query = parser.parse("a:v1 b:v2 c:v3~ c:asda*asda"); QueryWritable queryWritable = new QueryWritable(query); DataOutputBuffer buffer = new DataOutputBuffer(); @@ -62,7 +62,7 @@ public class ProtoSerializer { QueryWritable inQw = new QueryWritable(); long s = System.nanoTime(); - int count = 1000000; + int count = 100000; for (int i = 0; i < count; i++) { outQw.setQuery(query); outQw.write(buffer); http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/747caacf/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/QUERY_TYPE.java ---------------------------------------------------------------------- diff --git a/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/QUERY_TYPE.java b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/QUERY_TYPE.java deleted file mode 100644 index 495261a..0000000 --- a/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/QUERY_TYPE.java +++ /dev/null @@ -1,133 +0,0 @@ -package org.apache.blur.lucene.serializer; - -/** - * 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. - */ -import org.apache.lucene.queries.BoostingQuery; -import org.apache.lucene.queries.CustomScoreQuery; -import org.apache.lucene.queries.mlt.MoreLikeThisQuery; -import org.apache.lucene.sandbox.queries.FuzzyLikeThisQuery; -import org.apache.lucene.search.AutomatonQuery; -import org.apache.lucene.search.BooleanQuery; -import org.apache.lucene.search.ConstantScoreQuery; -import org.apache.lucene.search.DisjunctionMaxQuery; -import org.apache.lucene.search.FilteredQuery; -import org.apache.lucene.search.FuzzyQuery; -import org.apache.lucene.search.MatchAllDocsQuery; -import org.apache.lucene.search.MultiPhraseQuery; -import org.apache.lucene.search.NGramPhraseQuery; -import org.apache.lucene.search.NumericRangeQuery; -import org.apache.lucene.search.PhraseQuery; -import org.apache.lucene.search.PrefixQuery; -import org.apache.lucene.search.Query; -import org.apache.lucene.search.RegexpQuery; -import org.apache.lucene.search.TermQuery; -import org.apache.lucene.search.TermRangeQuery; -import org.apache.lucene.search.WildcardQuery; - -public enum QUERY_TYPE { - BOOLEAN((byte) 0), TERM((byte) 1), FUZZY((byte) 2), MATCH_ALL_DOCS((byte) 3); - - private final byte type; - - private QUERY_TYPE(byte type) { - this.type = type; - } - - public byte getType() { - return type; - } - - public static QUERY_TYPE lookup(byte type) { - switch (type) { - case 0: - return BOOLEAN; - case 1: - return TERM; - case 2: - return FUZZY; - case 3: - return MATCH_ALL_DOCS; - default: - throw new RuntimeException("Type [" + type + "] is not supported"); - } - } - - public static QUERY_TYPE lookup(Query query) { - if (query instanceof BooleanQuery) { - return BOOLEAN; - } else if (query instanceof TermQuery) { - return TERM; - } else if (query instanceof FuzzyQuery) { - return FUZZY; - } else if (query instanceof BoostingQuery) { - throw new RuntimeException("no impl"); - } else if (query instanceof ConstantScoreQuery) { - throw new RuntimeException("no impl"); - } else if (query instanceof CustomScoreQuery) { - throw new RuntimeException("no impl"); - } else if (query instanceof DisjunctionMaxQuery) { - throw new RuntimeException("no impl"); - } else if (query instanceof FilteredQuery) { - throw new RuntimeException("no impl"); - } else if (query instanceof FuzzyLikeThisQuery) { - throw new RuntimeException("no impl"); - } else if (query instanceof MatchAllDocsQuery) { - return MATCH_ALL_DOCS; - } else if (query instanceof MoreLikeThisQuery) { - throw new RuntimeException("no impl"); - } else if (query instanceof MultiPhraseQuery) { - throw new RuntimeException("no impl"); - } else if (query instanceof AutomatonQuery) { - throw new RuntimeException("no impl"); - } else if (query instanceof RegexpQuery) { - throw new RuntimeException("no impl"); - } else if (query instanceof WildcardQuery) { - throw new RuntimeException("no impl"); - } else if (query instanceof FuzzyQuery) { - throw new RuntimeException("no impl"); - } else if (query instanceof NumericRangeQuery) { - throw new RuntimeException("no impl"); - } else if (query instanceof PrefixQuery) { - throw new RuntimeException("no impl"); - } else if (query instanceof RegexpQuery) { - throw new RuntimeException("no impl"); - } else if (query instanceof TermRangeQuery) { - throw new RuntimeException("no impl"); - } else if (query instanceof PhraseQuery) { - throw new RuntimeException("no impl"); - } else if (query instanceof NGramPhraseQuery) { - throw new RuntimeException("no impl"); - } else { - throw new RuntimeException("Query" + query + "] is not supported"); - } - } - - public static AbtractQueryWritable<?> lookupQueryWritable(QUERY_TYPE type) { - switch (type) { - case BOOLEAN: - return new BooleanQueryWritable(); - case TERM: - return new TermQueryWritable(); - case FUZZY: - return new FuzzyQueryWritable(); - case MATCH_ALL_DOCS: - return new MatchAllDocsQueryWritable(); - default: - throw new RuntimeException("Type [" + type + "] is not supported"); - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/747caacf/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/QueryWritable.java ---------------------------------------------------------------------- diff --git a/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/QueryWritable.java b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/QueryWritable.java index 2a1fa93..9e9c227 100644 --- a/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/QueryWritable.java +++ b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/QueryWritable.java @@ -25,7 +25,7 @@ import org.apache.lucene.search.Query; public class QueryWritable extends AbtractQueryWritable<Query> { private Query query; - private QUERY_TYPE lookup; + private QueryWritableMapper lookup; public QueryWritable() { @@ -33,7 +33,7 @@ public class QueryWritable extends AbtractQueryWritable<Query> { public QueryWritable(Query query) { this.query = query; - this.lookup = QUERY_TYPE.lookup(query); + this.lookup = QueryWritableMapper.lookup(query); } public Query getQuery() { @@ -42,29 +42,33 @@ public class QueryWritable extends AbtractQueryWritable<Query> { public void setQuery(Query query) { this.query = query; - this.lookup = QUERY_TYPE.lookup(query); + this.lookup = QueryWritableMapper.lookup(query); } - public QUERY_TYPE getLookup() { + public QueryWritableMapper getLookup() { return lookup; } - @SuppressWarnings("unchecked") @Override public void write(DataOutput out) throws IOException { - out.write(lookup.getType()); - AbtractQueryWritable<Query> writable = (AbtractQueryWritable<Query>) QUERY_TYPE.lookupQueryWritable(lookup); + out.writeInt(lookup.getType()); + AbtractQueryWritable<Query> writable = QueryWritableMapper.getNewQueryWritable(lookup, Query.class); writable.setQuery(query); writable.write(out); } - @SuppressWarnings("unchecked") @Override public void readFields(DataInput in) throws IOException { - byte b = in.readByte(); - lookup = QUERY_TYPE.lookup(b); - AbtractQueryWritable<Query> writable = (AbtractQueryWritable<Query>) QUERY_TYPE.lookupQueryWritable(lookup); + int t = in.readInt(); + lookup = QueryWritableMapper.lookup(t); + AbtractQueryWritable<Query> writable = QueryWritableMapper.getNewQueryWritable(lookup, Query.class); writable.readFields(in); query = writable.getQuery(); } + + @Override + public Class<Query> getType() { + return Query.class; + } + } http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/747caacf/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/QueryWritableMapper.java ---------------------------------------------------------------------- diff --git a/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/QueryWritableMapper.java b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/QueryWritableMapper.java new file mode 100644 index 0000000..4e10a70 --- /dev/null +++ b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/QueryWritableMapper.java @@ -0,0 +1,80 @@ +package org.apache.blur.lucene.serializer; + +/** + * 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. + */ +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.lucene.search.Query; + +public class QueryWritableMapper { + + private static Map<Class<? extends Query>, QueryWritableMapper> queryToType = new ConcurrentHashMap<Class<? extends Query>, QueryWritableMapper>(); + private static Map<Integer, QueryWritableMapper> idsToWritable = new ConcurrentHashMap<Integer, QueryWritableMapper>(); + + static { + register(0, new BooleanQueryWritable()); + register(1, new TermQueryWritable()); + register(2, new FuzzyQueryWritable()); + register(3, new MatchAllDocsQueryWritable()); + register(4, new WildcardQueryWritable()); + } + + private static synchronized void register(int id, AbtractQueryWritable<? extends Query> queryWritable) { + QueryWritableMapper qt = new QueryWritableMapper(id, queryWritable); + idsToWritable.put(id, qt); + queryToType.put(queryWritable.getType(), qt); + } + + private final int id; + private final AbtractQueryWritable<? extends Query> queryWritable; + + private QueryWritableMapper(int id, AbtractQueryWritable<? extends Query> queryWritable) { + this.id = id; + this.queryWritable = queryWritable; + } + + public int getType() { + return id; + } + + public AbtractQueryWritable<?> instance() { + return queryWritable.clone(); + } + + public static QueryWritableMapper lookup(int id) { + QueryWritableMapper type = idsToWritable.get(id); + if (type == null) { + throw new RuntimeException("Type [" + id + "] not found"); + } + return type; + } + + public static QueryWritableMapper lookup(Query query) { + QueryWritableMapper type = queryToType.get(query.getClass()); + if (type == null) { + throw new RuntimeException("Type [" + query.getClass() + "] for query [" + query + "] not found"); + } + return type; + } + + @SuppressWarnings("unchecked") + public static <R extends Query> AbtractQueryWritable<R> getNewQueryWritable(QueryWritableMapper lookup, Class<R> clazz) { + QueryWritableMapper type = lookup(lookup.getType()); + return (AbtractQueryWritable<R>) type.instance(); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/747caacf/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/TermQueryWritable.java ---------------------------------------------------------------------- diff --git a/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/TermQueryWritable.java b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/TermQueryWritable.java index 4173ac2..069eee7 100644 --- a/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/TermQueryWritable.java +++ b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/TermQueryWritable.java @@ -59,4 +59,9 @@ public class TermQueryWritable extends AbtractQueryWritable<TermQuery> { query.setBoost(boost); } + @Override + public Class<TermQuery> getType() { + return TermQuery.class; + } + } http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/747caacf/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/WildcardQueryWritable.java ---------------------------------------------------------------------- diff --git a/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/WildcardQueryWritable.java b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/WildcardQueryWritable.java new file mode 100644 index 0000000..04028ed --- /dev/null +++ b/src/blur-query/src/main/java/org/apache/blur/lucene/serializer/WildcardQueryWritable.java @@ -0,0 +1,61 @@ +package org.apache.blur.lucene.serializer; + +/** + * 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. + */ +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +import org.apache.lucene.index.Term; +import org.apache.lucene.search.WildcardQuery; + +public class WildcardQueryWritable extends AbtractQueryWritable<WildcardQuery> { + + private WildcardQuery query; + + @Override + public void write(DataOutput out) throws IOException { + out.writeFloat(query.getBoost()); + Term term = query.getTerm(); + new TermWritable(term).write(out); + } + + @Override + public void readFields(DataInput in) throws IOException { + float boost = in.readFloat(); + TermWritable termWritable = new TermWritable(); + termWritable.readFields(in); + query = new WildcardQuery(termWritable.getTerm()); + query.setBoost(boost); + } + + @Override + public WildcardQuery getQuery() { + return query; + } + + @Override + public void setQuery(WildcardQuery query) { + this.query = query; + } + + @Override + public Class<WildcardQuery> getType() { + return WildcardQuery.class; + } + +}
