| /* |
| * 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.solr.search; |
| |
| import java.util.Random; |
| |
| import org.apache.lucene.util.FixedBitSet; |
| import org.apache.lucene.util.SuppressForbidden; |
| import org.apache.solr.util.RTimer; |
| |
| /** |
| */ |
| public class DocSetPerf { |
| |
| // use test instead of assert since asserts may be turned off |
| public static void test(boolean condition) { |
| if (!condition) { |
| throw new RuntimeException("test requestHandler: assertion failed!"); |
| } |
| } |
| |
| static FixedBitSet bs; |
| static BitDocSet bds; |
| static HashDocSet hds; |
| static int[] ids; // not unique |
| |
| static Random rand = getRandom(); |
| |
| @SuppressForbidden(reason = "No testcase, use of java.util.Random allowed") |
| private static Random getRandom() { |
| return new Random(); |
| } |
| |
| static void generate(int maxSize, int bitsToSet) { |
| bs = new FixedBitSet(maxSize); |
| ids = new int[bitsToSet]; |
| int count=0; |
| if (maxSize>0) { |
| for (int i=0; i<bitsToSet; i++) { |
| int id=rand.nextInt(maxSize); |
| if (!bs.get(id)) { |
| bs.set(id); |
| ids[count++]=id; |
| } |
| } |
| } |
| bds = new BitDocSet(bs,bitsToSet); |
| hds = new HashDocSet(ids,0,count); |
| } |
| |
| public static void main(String[] args) { |
| String bsSize=args[0]; |
| boolean randSize=false; |
| |
| if (bsSize.endsWith("-")) { |
| bsSize=bsSize.substring(0,bsSize.length()-1); |
| randSize=true; |
| } |
| |
| int bitSetSize = Integer.parseInt(bsSize); |
| int numSets = Integer.parseInt(args[1]); |
| int numBitsSet = Integer.parseInt(args[2]); |
| String test = args[3].intern(); |
| int iter = Integer.parseInt(args[4]); |
| |
| long ret=0; |
| |
| FixedBitSet[] sets = new FixedBitSet[numSets]; |
| DocSet[] bset = new DocSet[numSets]; |
| DocSet[] hset = new DocSet[numSets]; |
| |
| for (int i=0; i<numSets; i++) { |
| generate(randSize ? rand.nextInt(bitSetSize) : bitSetSize, numBitsSet); |
| sets[i] = bs; |
| bset[i] = bds; |
| hset[i] = hds; |
| } |
| |
| final RTimer timer = new RTimer(); |
| |
| if ("test".equals(test)) { |
| for (int it=0; it<iter; it++) { |
| generate(randSize ? rand.nextInt(bitSetSize) : bitSetSize, numBitsSet); |
| FixedBitSet bs1=bs; |
| BitDocSet bds1=bds; |
| HashDocSet hds1=hds; |
| generate(randSize ? rand.nextInt(bitSetSize) : bitSetSize, numBitsSet); |
| |
| FixedBitSet res = bs1.clone(); |
| res.and(bs); |
| int icount = res.cardinality(); |
| |
| test(bds1.intersection(bds).size() == icount); |
| test(bds1.intersectionSize(bds) == icount); |
| if (bds1.intersection(hds).size() != icount) { |
| DocSet ds = bds1.intersection(hds); |
| System.out.println("STOP"); |
| } |
| |
| test(bds1.intersection(hds).size() == icount); |
| test(bds1.intersectionSize(hds) == icount); |
| test(hds1.intersection(bds).size() == icount); |
| test(hds1.intersectionSize(bds) == icount); |
| test(hds1.intersection(hds).size() == icount); |
| test(hds1.intersectionSize(hds) == icount); |
| |
| ret += icount; |
| } |
| } |
| |
| String type=null; |
| String oper=null; |
| |
| if (test.endsWith("B")) { type="B"; } |
| if (test.endsWith("H")) { type="H"; } |
| if (test.endsWith("M")) { type="M"; } |
| if (test.startsWith("intersect")) oper="intersect"; |
| if (test.startsWith("intersectSize")) oper="intersectSize"; |
| if (test.startsWith("intersectAndSize")) oper="intersectSize"; |
| |
| |
| if (oper!=null) { |
| for (int it=0; it<iter; it++) { |
| int idx1 = rand.nextInt(numSets); |
| int idx2 = rand.nextInt(numSets); |
| DocSet a=null,b=null; |
| |
| if (type=="B") { |
| a=bset[idx1]; b=bset[idx2]; |
| } else if (type=="H") { |
| a=hset[idx1]; b=bset[idx2]; |
| } else if (type=="M") { |
| if (idx1 < idx2) { |
| a=bset[idx1]; |
| b=hset[idx2]; |
| } else { |
| a=hset[idx1]; |
| b=bset[idx2]; |
| } |
| } |
| |
| if (oper=="intersect") { |
| DocSet res = a.intersection(b); |
| ret += res.ramBytesUsed(); |
| } else if (oper=="intersectSize") { |
| ret += a.intersectionSize(b); |
| } else if (oper=="intersectAndSize") { |
| DocSet res = a.intersection(b); |
| ret += res.size(); |
| } |
| } |
| } |
| |
| System.out.println("TIME="+timer.getTime()); |
| |
| System.out.println("ret="+ret); |
| } |
| |
| } |