Skip to content

Commit

Permalink
Performance improvement on SolrQueryInList
Browse files Browse the repository at this point in the history
Previously the SolrQueryInList serialiser would print out a query on the
field "id" with the list {1,2,3} as:
id:(1) OR id:(2) OR id:(3)
I replaced this with:
id:((1) OR (2) OR (3))
  • Loading branch information
Stephen Lacy committed Oct 1, 2012
1 parent 952cf17 commit 2a8b85a
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 92 deletions.
174 changes: 87 additions & 87 deletions SolrNet.DSL.Tests/QueryBuildingTests.cs
Original file line number Diff line number Diff line change
@@ -1,94 +1,94 @@
#region license
// Copyright (c) 2007-2010 Mauricio Scheffer
//
// 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.
#endregion

using System;
using MbUnit.Framework;
using SolrNet.Impl.FieldSerializers;
using SolrNet.Impl.QuerySerializers;

namespace SolrNet.DSL.Tests {
[TestFixture]
public class QueryBuildingTests {

public string Serialize(object q) {
var serializer = new DefaultQuerySerializer(new DefaultFieldSerializer());
return serializer.Serialize(q);
}


[Test]
public void Simple() {
var q = Query.Simple("name:solr");
Assert.AreEqual("name:solr", q.Query);
}

[Test]
public void FieldValue() {
var q = Query.Field("name").Is("solr");
Assert.AreEqual("name:(solr)", Serialize(q));
}

[Test]
public void FieldValueDecimal() {
var q = Query.Field("price").Is(400);
Assert.AreEqual("price:(400)", Serialize(q));
}

[Test]
public void FieldValueEmpty() {
var q = Query.Field("price").Is("");
Assert.AreEqual("price:(\"\")", Serialize(q));
}

[Test]
public void FieldValueNot() {
var q = Query.Field("name").Is("solr").Not();
Assert.AreEqual("-name:(solr)", Serialize(q));
}

[Test]
#region license
// Copyright (c) 2007-2010 Mauricio Scheffer
//
// 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.
#endregion

using System;
using MbUnit.Framework;
using SolrNet.Impl.FieldSerializers;
using SolrNet.Impl.QuerySerializers;

namespace SolrNet.DSL.Tests {
[TestFixture]
public class QueryBuildingTests {

public string Serialize(object q) {
var serializer = new DefaultQuerySerializer(new DefaultFieldSerializer());
return serializer.Serialize(q);
}


[Test]
public void Simple() {
var q = Query.Simple("name:solr");
Assert.AreEqual("name:solr", q.Query);
}

[Test]
public void FieldValue() {
var q = Query.Field("name").Is("solr");
Assert.AreEqual("name:(solr)", Serialize(q));
}

[Test]
public void FieldValueDecimal() {
var q = Query.Field("price").Is(400);
Assert.AreEqual("price:(400)", Serialize(q));
}

[Test]
public void FieldValueEmpty() {
var q = Query.Field("price").Is("");
Assert.AreEqual("price:(\"\")", Serialize(q));
}

[Test]
public void FieldValueNot() {
var q = Query.Field("name").Is("solr").Not();
Assert.AreEqual("-name:(solr)", Serialize(q));
}

[Test]
public void FieldValueRequired() {
var q = Query.Field("name").Is("solr").Required();
Assert.AreEqual("+name:(solr)", Serialize(q));
}

[Test]
public void Range() {
var q = Query.Field("price").From(10).To(20);
Assert.AreEqual("price:[10 TO 20]", Serialize(q));
}

[Test]
public void InList() {
var q = Query.Field("price").In(10, 20, 30);
Assert.AreEqual("(price:(10) OR price:(20) OR price:(30))", Serialize(q));
}

[Test]
public void InList_empty_is_ignored() {
var q = Query.Field("price").In(new string[0]) && Query.Field("id").Is(123);
var query = Serialize(q);
Console.WriteLine(query);
Assert.AreEqual("(id:(123))", query);
}

[Test]
public void HasValue() {
var q = Query.Field("name").HasAnyValue();
Assert.AreEqual("name:[* TO *]", Serialize(q));
}
}
public void Range() {
var q = Query.Field("price").From(10).To(20);
Assert.AreEqual("price:[10 TO 20]", Serialize(q));
}

[Test]
public void InList() {
var q = Query.Field("price").In(10, 20, 30);
Assert.AreEqual("(price:((10) OR (20) OR (30)))", Serialize(q));
}

[Test]
public void InList_empty_is_ignored() {
var q = Query.Field("price").In(new string[0]) && Query.Field("id").Is(123);
var query = Serialize(q);
Console.WriteLine(query);
Assert.AreEqual("(id:(123))", query);
}

[Test]
public void HasValue() {
var q = Query.Field("name").HasAnyValue();
Assert.AreEqual("name:[* TO *]", Serialize(q));
}
}
}
2 changes: 1 addition & 1 deletion SolrNet.Tests/SolrNotQueryTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public void RangeQuery() {
public void QueryInList() {
var q = new SolrQueryInList("desc", "samsung", "hitachi", "fujitsu");
var notq = new SolrNotQuery(q);
Assert.AreEqual("-(desc:(samsung) OR desc:(hitachi) OR desc:(fujitsu))", Serialize(notq));
Assert.AreEqual("-(desc:((samsung) OR (hitachi) OR (fujitsu)))", Serialize(notq));
}

[Test]
Expand Down
6 changes: 3 additions & 3 deletions SolrNet.Tests/SolrQueryInListTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,20 +31,20 @@ public string Serialize(object q) {
[Test]
public void ListOfInt() {
var q = new SolrQueryInList("id", new[] {1, 2, 3, 4}.Select(i => i.ToString()));
Assert.AreEqual("(id:(1) OR id:(2) OR id:(3) OR id:(4))", Serialize(q));
Assert.AreEqual("(id:((1) OR (2) OR (3) OR (4)))", Serialize(q));
}

[Test]
public void ShouldQuoteValues() {
var q = new SolrQueryInList("id", new[] {"one", "two thousand"});
Assert.AreEqual("(id:(one) OR id:(\"two thousand\"))", Serialize(q));
Assert.AreEqual("(id:((one) OR (\"two thousand\")))", Serialize(q));
}


[Test]
public void ShouldQuoteEmptyValues() {
var q = new SolrQueryInList("id", new[] { "", "two thousand" });
Assert.AreEqual("(id:(\"\") OR id:(\"two thousand\"))", Serialize(q));
Assert.AreEqual("(id:((\"\") OR (\"two thousand\")))", Serialize(q));
}

[Test]
Expand Down
4 changes: 3 additions & 1 deletion SolrNet/Impl/QuerySerializers/QueryInListSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@ public QueryInListSerializer(ISolrQuerySerializer serializer) {
public override string Serialize(SolrQueryInList q) {
if (string.IsNullOrEmpty(q.FieldName) || q.List == null || !q.List.Any())
return null;
return "(" + string.Join(" OR ", q.List.Select(l => serializer.Serialize(new SolrQueryByField(q.FieldName, l))).ToArray()) + ")";

var array = q.List.Select(x =>"(" + QueryByFieldSerializer.Quote(x) + ")").ToArray();
return "(" + serializer.Serialize(new SolrQueryByField(q.FieldName,string.Join(" OR ",array)){Quoted = false}) + ")";
}
}
}

0 comments on commit 2a8b85a

Please sign in to comment.