From a2b91a17c04cd96c67aedf370104abbb82f06c19 Mon Sep 17 00:00:00 2001 From: honma Date: Fri, 14 Nov 2014 15:02:04 +0800 Subject: [PATCH 01/65] ii half way --- job/pom.xml | 24 ++++++ .../kylinolap/job/coprocessor/IIEndpointTest.java | 91 ++++++++++++++++++++++ .../hbase/coprocessor/example/ExampleEndpoint.java | 11 ++- .../hbase/coprocessor/ExampleEndpointTest.java | 20 +++-- 4 files changed, 131 insertions(+), 15 deletions(-) create mode 100644 job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java diff --git a/job/pom.xml b/job/pom.xml index cc99f65..a0cca25 100644 --- a/job/pom.xml +++ b/job/pom.xml @@ -181,6 +181,30 @@ provided + + org.apache.hbase + hbase-testing-util + ${hbase-hadoop2.version} + test + + + javax.servlet + servlet-api + + + javax.servlet.jsp + jsp-api + + + + + + com.kylinolap + kylin-storage + ${project.parent.version} + test + + diff --git a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java new file mode 100644 index 0000000..ac91ab0 --- /dev/null +++ b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java @@ -0,0 +1,91 @@ +package com.kylinolap.job.coprocessor; + +import com.kylinolap.common.util.BytesUtil; +import com.kylinolap.cube.invertedindex.IIKeyValueCodec; +import com.kylinolap.job.hadoop.invertedindex.IICreateHTableJob; +import com.kylinolap.metadata.model.invertedindex.InvertedIndexDesc; +import com.kylinolap.storage.hbase.coprocessor.IIEndpoint; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.*; +import org.apache.hadoop.hbase.client.HBaseAdmin; +import org.apache.hadoop.hbase.coprocessor.CoprocessorHost; +import org.apache.hadoop.hbase.io.compress.Compression; +import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding; +import org.apache.hadoop.hbase.security.User; +import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.util.ToolRunner; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + + +/** + * Created by Hongbin Ma(Binmahone) on 11/14/14. + */ +public class IIEndpointTest { + + private static final TableName TEST_TABLE = TableName.valueOf("II_cube_htable"); + private static final byte[] TEST_COLUMN = Bytes.toBytes("col"); + + private static HBaseTestingUtility TEST_UTIL = null; + private static Configuration CONF = null; + + @BeforeClass + public static void setupBeforeClass() throws Exception { + TEST_UTIL = new HBaseTestingUtility(); + CONF = TEST_UTIL.getConfiguration(); + + //add endpoint coprocessor + CONF.setStrings(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, + IIEndpoint.class.getName()); + + //create table and bulk load data + TEST_UTIL.startMiniCluster(); + //TEST_UTIL.createTable(TEST_TABLE, new byte[][] { TEST_FAMILY }); + + + int sharding = 4; + + HTableDescriptor tableDesc = new HTableDescriptor(TEST_TABLE); + HColumnDescriptor cf = new HColumnDescriptor(InvertedIndexDesc.HBASE_FAMILY); + cf.setMaxVersions(1); + //cf.setCompressionType(Compression.Algorithm.LZO); + //cf.setDataBlockEncoding(DataBlockEncoding.FAST_DIFF); + tableDesc.addFamily(cf); + + if (User.isHBaseSecurityEnabled(CONF)) { + // add coprocessor for bulk load + tableDesc.addCoprocessor("org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint"); + } + + + byte[][] splitKeys = getSplits(sharding); + if (splitKeys.length == 0) + splitKeys = null; + + TEST_UTIL.createTable(tableDesc, splitKeys, CONF); + HBaseAdmin hBaseAdmin = new HBaseAdmin(CONF); + hBaseAdmin.listTableNames(); + } + + //one region for one shard + private static byte[][] getSplits(int shard) { + byte[][] result = new byte[shard - 1][]; + for (int i = 1; i < shard; ++i) { + byte[] split = new byte[IIKeyValueCodec.SHARD_LEN]; + BytesUtil.writeUnsigned(i, split, 0, IIKeyValueCodec.SHARD_LEN); + result[i - 1] = split; + } + return result; + } + + @AfterClass + public static void tearDownAfterClass() throws Exception { + TEST_UTIL.shutdownMiniCluster(); + } + + @Test + public void testEndpoint() throws Throwable { + + } +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/example/ExampleEndpoint.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/example/ExampleEndpoint.java index 920be76..a4ce62c 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/example/ExampleEndpoint.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/example/ExampleEndpoint.java @@ -76,7 +76,8 @@ public void getRowCount(RpcController controller, ExampleProtos.CountRequest req if (scanner != null) { try { scanner.close(); - } catch (IOException ignored) {} + } catch (IOException ignored) { + } } } done.run(response); @@ -111,7 +112,8 @@ public void getKeyValueCount(RpcController controller, ExampleProtos.CountReques if (scanner != null) { try { scanner.close(); - } catch (IOException ignored) {} + } catch (IOException ignored) { + } } } done.run(response); @@ -123,14 +125,15 @@ public void getKeyValueCount(RpcController controller, ExampleProtos.CountReques * coprocessor is loaded. Since this is a coprocessor endpoint, it always expects to be loaded * on a table region, so always expects this to be an instance of * {@link RegionCoprocessorEnvironment}. + * * @param env the environment provided by the coprocessor host * @throws IOException if the provided environment is not an instance of - * {@code RegionCoprocessorEnvironment} + * {@code RegionCoprocessorEnvironment} */ @Override public void start(CoprocessorEnvironment env) throws IOException { if (env instanceof RegionCoprocessorEnvironment) { - this.env = (RegionCoprocessorEnvironment)env; + this.env = (RegionCoprocessorEnvironment) env; } else { throw new CoprocessorException("Must be loaded on a table region!"); } diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/ExampleEndpointTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/ExampleEndpointTest.java index 03fb5b3..7c2b2e4 100644 --- a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/ExampleEndpointTest.java +++ b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/ExampleEndpointTest.java @@ -2,23 +2,24 @@ import com.kylinolap.storage.hbase.coprocessor.example.ExampleEndpoint; import com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos; -import com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.TableName; -import org.apache.hadoop.hbase.client.*; +import org.apache.hadoop.hbase.client.HConnection; +import org.apache.hadoop.hbase.client.HConnectionManager; +import org.apache.hadoop.hbase.client.HTableInterface; +import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.coprocessor.Batch; import org.apache.hadoop.hbase.coprocessor.CoprocessorHost; import org.apache.hadoop.hbase.ipc.BlockingRpcCallback; import org.apache.hadoop.hbase.ipc.ServerRpcController; import org.apache.hadoop.hbase.util.Bytes; -import org.junit.*; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Ignore; +import org.junit.Test; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; -import java.net.InetAddress; import java.util.Iterator; import java.util.Map; @@ -39,10 +40,6 @@ @BeforeClass public static void setupBeforeClass() throws Exception { - - - - TEST_UTIL = new HBaseTestingUtility(); CONF = TEST_UTIL.getConfiguration(); CONF.setStrings(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, @@ -50,6 +47,7 @@ public static void setupBeforeClass() throws Exception { TEST_UTIL.startMiniCluster(); TEST_UTIL.createTable(TEST_TABLE, new byte[][] { TEST_FAMILY }); + } @AfterClass From a229145129898ef43529d180a59d038af4323e47 Mon Sep 17 00:00:00 2001 From: honma Date: Fri, 14 Nov 2014 16:11:54 +0800 Subject: [PATCH 02/65] for pull --- .../com/kylinolap/job/coprocessor/IIEndpointTest.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java index ac91ab0..ba528dc 100644 --- a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java +++ b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java @@ -2,6 +2,7 @@ import com.kylinolap.common.util.BytesUtil; import com.kylinolap.cube.invertedindex.IIKeyValueCodec; +import com.kylinolap.job.hadoop.hbase.BulkLoadJob; import com.kylinolap.job.hadoop.invertedindex.IICreateHTableJob; import com.kylinolap.metadata.model.invertedindex.InvertedIndexDesc; import com.kylinolap.storage.hbase.coprocessor.IIEndpoint; @@ -24,8 +25,8 @@ */ public class IIEndpointTest { - private static final TableName TEST_TABLE = TableName.valueOf("II_cube_htable"); - private static final byte[] TEST_COLUMN = Bytes.toBytes("col"); + private static final TableName TEST_TABLE = TableName.valueOf("tt"); + private static final byte[] TEST_COLUMN = Bytes.toBytes("f"); private static HBaseTestingUtility TEST_UTIL = null; private static Configuration CONF = null; @@ -44,6 +45,7 @@ public static void setupBeforeClass() throws Exception { //TEST_UTIL.createTable(TEST_TABLE, new byte[][] { TEST_FAMILY }); + int sharding = 4; HTableDescriptor tableDesc = new HTableDescriptor(TEST_TABLE); @@ -63,9 +65,16 @@ public static void setupBeforeClass() throws Exception { if (splitKeys.length == 0) splitKeys = null; - TEST_UTIL.createTable(tableDesc, splitKeys, CONF); + TEST_UTIL.createTable(tableDesc.getTableName(),TEST_COLUMN, splitKeys); + HBaseAdmin hBaseAdmin = new HBaseAdmin(CONF); - hBaseAdmin.listTableNames(); + TableName[] tables = hBaseAdmin.listTableNames(); + + + //String temp = "-cubename \"test_kylin_cube_ii\" -htablename \"test_III\""; + String temp = "-cubename \"test_kylin_cube_ii\" -input \"/tmp/test_III_hfile\" -htablename \"test_III\"" + + ToolRunner.run(CONF,new BulkLoadJob(),) } //one region for one shard From a3d65cae331704a024e0d26932619501097122f0 Mon Sep 17 00:00:00 2001 From: honma Date: Fri, 14 Nov 2014 17:51:08 +0800 Subject: [PATCH 03/65] add hfile for mini cluster --- .../com/kylinolap/common/util/BytesUtilTest.java | 23 +++++ examples/test_case_cube/II_hfile/_SUCCESS | 0 .../II_hfile/f/0231cd23988c45bbadd37fb0361f2541 | Bin 0 -> 33170 bytes .../II_hfile/f/102b80c54f164655bc671fa398c51144 | Bin 0 -> 31706 bytes .../II_hfile/f/90106e7e1bce458eb73649807d3d2e43 | Bin 0 -> 36823 bytes .../II_hfile/f/a132d55a5c8d4878a8dd846ed530a74d | Bin 0 -> 38853 bytes .../kylinolap/job/coprocessor/IIEndpointTest.java | 107 +++++++++++++++++++-- 7 files changed, 121 insertions(+), 9 deletions(-) create mode 100644 common/src/test/java/com/kylinolap/common/util/BytesUtilTest.java create mode 100644 examples/test_case_cube/II_hfile/_SUCCESS create mode 100644 examples/test_case_cube/II_hfile/f/0231cd23988c45bbadd37fb0361f2541 create mode 100644 examples/test_case_cube/II_hfile/f/102b80c54f164655bc671fa398c51144 create mode 100644 examples/test_case_cube/II_hfile/f/90106e7e1bce458eb73649807d3d2e43 create mode 100644 examples/test_case_cube/II_hfile/f/a132d55a5c8d4878a8dd846ed530a74d diff --git a/common/src/test/java/com/kylinolap/common/util/BytesUtilTest.java b/common/src/test/java/com/kylinolap/common/util/BytesUtilTest.java new file mode 100644 index 0000000..344ba42 --- /dev/null +++ b/common/src/test/java/com/kylinolap/common/util/BytesUtilTest.java @@ -0,0 +1,23 @@ +package com.kylinolap.common.util; + +import junit.framework.TestCase; +import org.junit.Test; + +import java.nio.ByteBuffer; + +/** + * by honma + */ +public class BytesUtilTest extends TestCase { + @Test + public void test() { + ByteBuffer buffer = ByteBuffer.allocate(10000); + int[] x = new int[] { 1, 2, 3 }; + BytesUtil.writeIntArray(x,buffer); + buffer.flip(); + by + + } + + +} \ No newline at end of file diff --git a/examples/test_case_cube/II_hfile/_SUCCESS b/examples/test_case_cube/II_hfile/_SUCCESS new file mode 100644 index 0000000..e69de29 diff --git a/examples/test_case_cube/II_hfile/f/0231cd23988c45bbadd37fb0361f2541 b/examples/test_case_cube/II_hfile/f/0231cd23988c45bbadd37fb0361f2541 new file mode 100644 index 0000000000000000000000000000000000000000..6ada13c0ea97875ffdece75fc44ee7f285cf9a49 GIT binary patch literal 33170 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 literal 0 HcmV?d00001 diff --git a/examples/test_case_cube/II_hfile/f/102b80c54f164655bc671fa398c51144 b/examples/test_case_cube/II_hfile/f/102b80c54f164655bc671fa398c51144 new file mode 100644 index 0000000000000000000000000000000000000000..c04b75c46ace6927780e21956f4564f529e66796 GIT binary patch literal 31706 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 z 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 literal 0 HcmV?d00001 diff --git a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java index ba528dc..e0f9d2f 100644 --- a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java +++ b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java @@ -1,35 +1,62 @@ package com.kylinolap.job.coprocessor; +import com.google.protobuf.ByteString; +import com.kylinolap.common.KylinConfig; import com.kylinolap.common.util.BytesUtil; +import com.kylinolap.common.util.HBaseMetadataTestCase; +import com.kylinolap.common.util.HadoopUtil; +import com.kylinolap.cube.CubeInstance; +import com.kylinolap.cube.CubeManager; +import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.invertedindex.IIKeyValueCodec; +import com.kylinolap.cube.invertedindex.TableRecord; +import com.kylinolap.cube.invertedindex.TableRecordInfo; +import com.kylinolap.cube.invertedindex.TableRecordInfoDigest; import com.kylinolap.job.hadoop.hbase.BulkLoadJob; +import com.kylinolap.job.hadoop.invertedindex.IIBulkLoadJob; import com.kylinolap.job.hadoop.invertedindex.IICreateHTableJob; import com.kylinolap.metadata.model.invertedindex.InvertedIndexDesc; import com.kylinolap.storage.hbase.coprocessor.IIEndpoint; +import com.kylinolap.storage.hbase.coprocessor.generated.IIProtos; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.LocatedFileStatus; +import org.apache.hadoop.fs.Path; +import org.apache.hadoop.fs.RemoteIterator; import org.apache.hadoop.hbase.*; -import org.apache.hadoop.hbase.client.HBaseAdmin; +import org.apache.hadoop.hbase.client.*; +import org.apache.hadoop.hbase.client.coprocessor.Batch; import org.apache.hadoop.hbase.coprocessor.CoprocessorHost; -import org.apache.hadoop.hbase.io.compress.Compression; -import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding; +import org.apache.hadoop.hbase.ipc.BlockingRpcCallback; +import org.apache.hadoop.hbase.ipc.ServerRpcController; import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.util.ToolRunner; import org.junit.AfterClass; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + /** * Created by Hongbin Ma(Binmahone) on 11/14/14. */ -public class IIEndpointTest { +public class IIEndpointTest extends HBaseMetadataTestCase { - private static final TableName TEST_TABLE = TableName.valueOf("tt"); + private static final TableName TEST_TABLE = TableName.valueOf("test_III"); private static final byte[] TEST_COLUMN = Bytes.toBytes("f"); private static HBaseTestingUtility TEST_UTIL = null; private static Configuration CONF = null; + private static HConnection hconn; + + private CubeInstance cube; + private CubeSegment seg; @BeforeClass public static void setupBeforeClass() throws Exception { @@ -44,6 +71,15 @@ public static void setupBeforeClass() throws Exception { TEST_UTIL.startMiniCluster(); //TEST_UTIL.createTable(TEST_TABLE, new byte[][] { TEST_FAMILY }); + org.apache.hadoop.fs.FileSystem fs = org.apache.hadoop.fs.FileSystem.get(CONF); + fs.copyFromLocalFile(false, new Path("../examples/test_case_cube/II_hfile/"), new Path("/tmp/test_III_hfile")); + + +// RemoteIterator iterator = fs.listFiles(new Path("/tmp/test_III_hfile"), true); +// while (iterator.hasNext()) { +// LocatedFileStatus a = iterator.next(); +// System.out.println(a.getPath()); +// } int sharding = 4; @@ -65,18 +101,40 @@ public static void setupBeforeClass() throws Exception { if (splitKeys.length == 0) splitKeys = null; - TEST_UTIL.createTable(tableDesc.getTableName(),TEST_COLUMN, splitKeys); + TEST_UTIL.createTable(tableDesc.getTableName(), TEST_COLUMN, splitKeys); HBaseAdmin hBaseAdmin = new HBaseAdmin(CONF); TableName[] tables = hBaseAdmin.listTableNames(); + String temp = "-cubename \"test_kylin_cube_ii\" -input \"/tmp/test_III_hfile\" -htablename \"test_III\""; + ToolRunner.run(CONF, new IIBulkLoadJob(), temp.split("\\s+")); //String temp = "-cubename \"test_kylin_cube_ii\" -htablename \"test_III\""; - String temp = "-cubename \"test_kylin_cube_ii\" -input \"/tmp/test_III_hfile\" -htablename \"test_III\"" - ToolRunner.run(CONF,new BulkLoadJob(),) + hconn = HConnectionManager.createConnection(CONF); +// HTableInterface hTableInterface = conn.getTable("tt"); +// ResultScanner scanner = hTableInterface.getScanner(new Scan()); +// Iterator resultIterator = scanner.iterator(); +// int count = 0; +// while (resultIterator.hasNext()) { +// resultIterator.next(); +// count++; +// } +// +// System.out.println(count); + + } + @Before + public void setup() throws Exception { + this.createTestMetadata(); + + this.cube = CubeManager.getInstance(getTestConfig()).getCube("test_kylin_cube_ii"); + this.seg = cube.getFirstSegment(); + } + + //one region for one shard private static byte[][] getSplits(int shard) { byte[][] result = new byte[shard - 1][]; @@ -95,6 +153,37 @@ public static void tearDownAfterClass() throws Exception { @Test public void testEndpoint() throws Throwable { - + String tableName = seg.getStorageLocationIdentifier(); + HTableInterface table = hconn.getTable(tableName); + final TableRecordInfoDigest recordInfo = new TableRecordInfo(seg); + final IIProtos.IIRequest request = IIProtos.IIRequest.newBuilder().setTableInfo( + ByteString.copyFrom(TableRecordInfoDigest.serialize(recordInfo))).build(); + + Map> results = table.coprocessorService(IIProtos.RowsService.class, + null, null, + new Batch.Call>() { + public List call(IIProtos.RowsService counter) throws IOException { + ServerRpcController controller = new ServerRpcController(); + BlockingRpcCallback rpcCallback = + new BlockingRpcCallback(); + counter.getRows(controller, request, rpcCallback); + IIProtos.IIResponse response = rpcCallback.get(); + if (controller.failedOnException()) { + throw controller.getFailedOn(); + } + + List records = new ArrayList(); + for (ByteString raw : response.getRowsList()) { + TableRecord record = new TableRecord(recordInfo); + record.setBytes(raw.toByteArray(), 0, raw.size()); + records.add(record); + } + return records; + } + }); + + for (Map.Entry> entry : results.entrySet()) { + System.out.println("result count : " + entry.getValue()); + } } } From a22c0bb58b63688e8709075448355fef5c7c9112 Mon Sep 17 00:00:00 2001 From: honma Date: Tue, 18 Nov 2014 10:21:46 +0800 Subject: [PATCH 04/65] rename coprocessor package to endpoint --- .../kylinolap/job/coprocessor/IIEndpointTest.java | 11 +- .../hbase/coprocessor/HbaseServerKVIterator.java | 78 -- .../storage/hbase/coprocessor/IIEndpoint.java | 94 -- .../hbase/coprocessor/IIResponseAdapter.java | 7 - .../hbase/coprocessor/example/ExampleEndpoint.java | 146 --- .../example/generated/ExampleProtos.java | 1148 ------------------ .../coprocessor/example/generated/NodeProtos.java | 938 --------------- .../hbase/coprocessor/generated/IIProtos.java | 1237 -------------------- .../hbase/endpoint/HbaseServerKVIterator.java | 78 ++ .../storage/hbase/endpoint/IIEndpoint.java | 94 ++ .../storage/hbase/endpoint/IIResponseAdapter.java | 7 + .../hbase/endpoint/example/ExampleEndpoint.java | 146 +++ .../endpoint/example/generated/ExampleProtos.java | 1148 ++++++++++++++++++ .../endpoint/example/generated/NodeProtos.java | 938 +++++++++++++++ .../storage/hbase/endpoint/generated/IIProtos.java | 1237 ++++++++++++++++++++ .../storage/hbase/InvertedIndexHBaseTest.java | 2 +- .../hbase/coprocessor/ExampleEndpointTest.java | 97 -- .../storage/hbase/coprocessor/ProtobufTest.java | 41 - .../hbase/endpoint/ExampleEndpointTest.java | 97 ++ .../storage/hbase/endpoint/ProtobufTest.java | 41 + 20 files changed, 3789 insertions(+), 3796 deletions(-) delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/HbaseServerKVIterator.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/IIEndpoint.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/IIResponseAdapter.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/example/ExampleEndpoint.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/example/generated/ExampleProtos.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/example/generated/NodeProtos.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/generated/IIProtos.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/endpoint/HbaseServerKVIterator.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIResponseAdapter.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/ExampleEndpoint.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/generated/ExampleProtos.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/generated/NodeProtos.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/endpoint/generated/IIProtos.java delete mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/ExampleEndpointTest.java delete mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/ProtobufTest.java create mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/endpoint/ExampleEndpointTest.java create mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/endpoint/ProtobufTest.java diff --git a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java index e0f9d2f..de1c4fb 100644 --- a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java +++ b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java @@ -1,10 +1,8 @@ package com.kylinolap.job.coprocessor; import com.google.protobuf.ByteString; -import com.kylinolap.common.KylinConfig; import com.kylinolap.common.util.BytesUtil; import com.kylinolap.common.util.HBaseMetadataTestCase; -import com.kylinolap.common.util.HadoopUtil; import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.CubeSegment; @@ -12,16 +10,12 @@ import com.kylinolap.cube.invertedindex.TableRecord; import com.kylinolap.cube.invertedindex.TableRecordInfo; import com.kylinolap.cube.invertedindex.TableRecordInfoDigest; -import com.kylinolap.job.hadoop.hbase.BulkLoadJob; import com.kylinolap.job.hadoop.invertedindex.IIBulkLoadJob; -import com.kylinolap.job.hadoop.invertedindex.IICreateHTableJob; import com.kylinolap.metadata.model.invertedindex.InvertedIndexDesc; -import com.kylinolap.storage.hbase.coprocessor.IIEndpoint; -import com.kylinolap.storage.hbase.coprocessor.generated.IIProtos; +import com.kylinolap.storage.hbase.endpoint.IIEndpoint; +import com.kylinolap.storage.hbase.endpoint.generated.IIProtos; import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.LocatedFileStatus; import org.apache.hadoop.fs.Path; -import org.apache.hadoop.fs.RemoteIterator; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.client.coprocessor.Batch; @@ -38,7 +32,6 @@ import java.io.IOException; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import java.util.Map; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/HbaseServerKVIterator.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/HbaseServerKVIterator.java deleted file mode 100644 index f89f362..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/HbaseServerKVIterator.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.kylinolap.storage.hbase.coprocessor; - -import org.apache.commons.io.IOUtils; -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.io.ImmutableBytesWritable; -import org.apache.hadoop.hbase.regionserver.RegionScanner; -import org.apache.hadoop.hbase.util.Pair; - -import java.io.Closeable; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * Created by honma on 11/10/14. - */ -public class HbaseServerKVIterator implements Iterable>, Closeable { - - private RegionScanner innerScaner; - - List results = new ArrayList(); - - public HbaseServerKVIterator(RegionScanner innerScaner) { - this.innerScaner = innerScaner; - } - - @Override - public void close() throws IOException { - IOUtils.closeQuietly(this.innerScaner); - } - - @Override - public Iterator> iterator() { - return new Iterator>() { - - ImmutableBytesWritable key = new ImmutableBytesWritable(); - ImmutableBytesWritable value = new ImmutableBytesWritable(); - Pair pair = new Pair<>(key, value); - - private boolean hasMore = true; - - @Override - public boolean hasNext() { - return hasMore; - } - - - @Override - public Pair next() { - if (!hasNext()) { - try { - hasMore = innerScaner.nextRaw(results); - } catch (IOException e) { - throw new RuntimeException(e); - } - - if (results.size() < 1) - throw new IllegalStateException("Hbase row contains less than 1 row"); - - Cell c = results.get(0); - key.set(c.getRowArray(), c.getRowOffset(), c.getRowLength()); - value.set(c.getValueArray(), c.getValueOffset(), c.getValueLength()); - return pair; - } else { - return null; - } - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - }; - } - -} - diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/IIEndpoint.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/IIEndpoint.java deleted file mode 100644 index 7c1d2dd..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/IIEndpoint.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.kylinolap.storage.hbase.coprocessor; - -import com.google.protobuf.ByteString; -import com.google.protobuf.RpcCallback; -import com.google.protobuf.RpcController; -import com.google.protobuf.Service; -import com.kylinolap.cube.invertedindex.*; -import com.kylinolap.storage.hbase.coprocessor.generated.IIProtos; -import org.apache.commons.io.IOUtils; -import org.apache.hadoop.hbase.Coprocessor; -import org.apache.hadoop.hbase.CoprocessorEnvironment; -import org.apache.hadoop.hbase.client.Scan; -import org.apache.hadoop.hbase.coprocessor.CoprocessorException; -import org.apache.hadoop.hbase.coprocessor.CoprocessorService; -import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; -import org.apache.hadoop.hbase.protobuf.ResponseConverter; -import org.apache.hadoop.hbase.regionserver.HRegion; -import org.apache.hadoop.hbase.regionserver.RegionScanner; - -import java.io.IOException; -import java.nio.ByteBuffer; - -/** - * Created by honma on 11/7/14. - */ -public class IIEndpoint extends IIProtos.RowsService - implements Coprocessor, CoprocessorService { - - private RegionCoprocessorEnvironment env; - - public IIEndpoint() { - } - - @Override - public void getRows(RpcController controller, IIProtos.IIRequest request, RpcCallback done) { - IIProtos.IIResponse response = null; - RegionScanner innerScanner = null; - HRegion region = null; - try { - ByteBuffer byteBuffer = request.getTableInfo().asReadOnlyByteBuffer(); - TableRecordInfoDigest tableInfo = TableRecordInfoDigest.deserialize(byteBuffer); - - region = env.getRegion(); - innerScanner = region.getScanner(new Scan()); - region.startRegionOperation(); - - synchronized (innerScanner) { - IIProtos.IIResponse.Builder responseBuilder = IIProtos.IIResponse.newBuilder(); - - IIKeyValueCodec codec = new IIKeyValueCodec(tableInfo); - for (Slice slice : codec.decodeKeyValue(new HbaseServerKVIterator(innerScanner))) { - for (TableRecordBytes recordBytes : slice) { - responseBuilder.addRows(ByteString.copyFrom(recordBytes.getBytes())); - } - } - - response = responseBuilder.build(); - } - - } catch (IOException ioe) { - ResponseConverter.setControllerException(controller, ioe); - } finally { - IOUtils.closeQuietly(innerScanner); - if (region != null) { - try { - region.closeRegionOperation(); - } catch (IOException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - } - - done.run(response); - } - - @Override - public void start(CoprocessorEnvironment env) throws IOException { - if (env instanceof RegionCoprocessorEnvironment) { - this.env = (RegionCoprocessorEnvironment) env; - } else { - throw new CoprocessorException("Must be loaded on a table region!"); - } - } - - @Override - public void stop(CoprocessorEnvironment env) throws IOException { - } - - @Override - public Service getService() { - return this; - } -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/IIResponseAdapter.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/IIResponseAdapter.java deleted file mode 100644 index 27a87c0..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/IIResponseAdapter.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.kylinolap.storage.hbase.coprocessor; - -/** - * Created by honma on 11/10/14. - */ -public class IIResponseAdapter { -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/example/ExampleEndpoint.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/example/ExampleEndpoint.java deleted file mode 100644 index a4ce62c..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/example/ExampleEndpoint.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.kylinolap.storage.hbase.coprocessor.example; - -import com.google.protobuf.RpcCallback; -import com.google.protobuf.RpcController; -import com.google.protobuf.Service; -import com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos; -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.CellUtil; -import org.apache.hadoop.hbase.Coprocessor; -import org.apache.hadoop.hbase.CoprocessorEnvironment; -import org.apache.hadoop.hbase.client.Scan; -import org.apache.hadoop.hbase.coprocessor.CoprocessorException; -import org.apache.hadoop.hbase.coprocessor.CoprocessorService; -import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; -import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter; -import org.apache.hadoop.hbase.protobuf.ResponseConverter; -import org.apache.hadoop.hbase.regionserver.InternalScanner; -import org.apache.hadoop.hbase.util.Bytes; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -/** - * Created by honma on 11/3/14. - */ - -public class ExampleEndpoint extends ExampleProtos.RowCountService - implements Coprocessor, CoprocessorService { - private RegionCoprocessorEnvironment env; - - public ExampleEndpoint() { - } - - /** - * Just returns a reference to this object, which implements the RowCounterService interface. - */ - @Override - public Service getService() { - return this; - } - - /** - * Returns a count of the rows in the region where this coprocessor is loaded. - */ - @Override - public void getRowCount(RpcController controller, ExampleProtos.CountRequest request, - RpcCallback done) { - Scan scan = new Scan(); - scan.setFilter(new FirstKeyOnlyFilter()); - ExampleProtos.CountResponse response = null; - InternalScanner scanner = null; - try { - scanner = env.getRegion().getScanner(scan); - List results = new ArrayList(); - boolean hasMore = false; - byte[] lastRow = null; - long count = 0; - do { - hasMore = scanner.next(results); - for (Cell kv : results) { - byte[] currentRow = CellUtil.cloneRow(kv); - if (lastRow == null || !Bytes.equals(lastRow, currentRow)) { - lastRow = currentRow; - count++; - } - } - results.clear(); - } while (hasMore); - - response = ExampleProtos.CountResponse.newBuilder() - .setCount(count).build(); - } catch (IOException ioe) { - ResponseConverter.setControllerException(controller, ioe); - } finally { - if (scanner != null) { - try { - scanner.close(); - } catch (IOException ignored) { - } - } - } - done.run(response); - } - - /** - * Returns a count of all KeyValues in the region where this coprocessor is loaded. - */ - @Override - public void getKeyValueCount(RpcController controller, ExampleProtos.CountRequest request, - RpcCallback done) { - ExampleProtos.CountResponse response = null; - InternalScanner scanner = null; - try { - scanner = env.getRegion().getScanner(new Scan()); - List results = new ArrayList(); - boolean hasMore = false; - long count = 0; - do { - hasMore = scanner.next(results); - for (Cell kv : results) { - count++; - } - results.clear(); - } while (hasMore); - - response = ExampleProtos.CountResponse.newBuilder() - .setCount(count).build(); - } catch (IOException ioe) { - ResponseConverter.setControllerException(controller, ioe); - } finally { - if (scanner != null) { - try { - scanner.close(); - } catch (IOException ignored) { - } - } - } - done.run(response); - } - - /** - * Stores a reference to the coprocessor environment provided by the - * {@link org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost} from the region where this - * coprocessor is loaded. Since this is a coprocessor endpoint, it always expects to be loaded - * on a table region, so always expects this to be an instance of - * {@link RegionCoprocessorEnvironment}. - * - * @param env the environment provided by the coprocessor host - * @throws IOException if the provided environment is not an instance of - * {@code RegionCoprocessorEnvironment} - */ - @Override - public void start(CoprocessorEnvironment env) throws IOException { - if (env instanceof RegionCoprocessorEnvironment) { - this.env = (RegionCoprocessorEnvironment) env; - } else { - throw new CoprocessorException("Must be loaded on a table region!"); - } - } - - @Override - public void stop(CoprocessorEnvironment env) throws IOException { - // nothing to do - } -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/example/generated/ExampleProtos.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/example/generated/ExampleProtos.java deleted file mode 100644 index 2f8db1b..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/example/generated/ExampleProtos.java +++ /dev/null @@ -1,1148 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: example.proto - -package com.kylinolap.storage.hbase.coprocessor.example.generated; - -public final class ExampleProtos { - private ExampleProtos() {} - public static void registerAllExtensions( - com.google.protobuf.ExtensionRegistry registry) { - } - public interface CountRequestOrBuilder - extends com.google.protobuf.MessageOrBuilder { - } - /** - * Protobuf type {@code CountRequest} - */ - public static final class CountRequest extends - com.google.protobuf.GeneratedMessage - implements CountRequestOrBuilder { - // Use CountRequest.newBuilder() to construct. - private CountRequest(com.google.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - private CountRequest(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } - - private static final CountRequest defaultInstance; - public static CountRequest getDefaultInstance() { - return defaultInstance; - } - - public CountRequest getDefaultInstanceForType() { - return defaultInstance; - } - - private final com.google.protobuf.UnknownFieldSet unknownFields; - @java.lang.Override - public final com.google.protobuf.UnknownFieldSet - getUnknownFields() { - return this.unknownFields; - } - private CountRequest( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - initFields(); - com.google.protobuf.UnknownFieldSet.Builder unknownFields = - com.google.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, - extensionRegistry, tag)) { - done = true; - } - break; - } - } - } - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException( - e.getMessage()).setUnfinishedMessage(this); - } finally { - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.internal_static_CountRequest_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.internal_static_CountRequest_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest.class, com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest.Builder.class); - } - - public static com.google.protobuf.Parser PARSER = - new com.google.protobuf.AbstractParser() { - public CountRequest parsePartialFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return new CountRequest(input, extensionRegistry); - } - }; - - @java.lang.Override - public com.google.protobuf.Parser getParserForType() { - return PARSER; - } - - private void initFields() { - } - private byte memoizedIsInitialized = -1; - public final boolean isInitialized() { - byte isInitialized = memoizedIsInitialized; - if (isInitialized != -1) return isInitialized == 1; - - memoizedIsInitialized = 1; - return true; - } - - public void writeTo(com.google.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - getUnknownFields().writeTo(output); - } - - private int memoizedSerializedSize = -1; - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) return size; - - size = 0; - size += getUnknownFields().getSerializedSize(); - memoizedSerializedSize = size; - return size; - } - - private static final long serialVersionUID = 0L; - @java.lang.Override - protected java.lang.Object writeReplace() - throws java.io.ObjectStreamException { - return super.writeReplace(); - } - - @java.lang.Override - public boolean equals(final java.lang.Object obj) { - if (obj == this) { - return true; - } - if (!(obj instanceof com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest)) { - return super.equals(obj); - } - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest other = (com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest) obj; - - boolean result = true; - result = result && - getUnknownFields().equals(other.getUnknownFields()); - return result; - } - - private int memoizedHashCode = 0; - @java.lang.Override - public int hashCode() { - if (memoizedHashCode != 0) { - return memoizedHashCode; - } - int hash = 41; - hash = (19 * hash) + getDescriptorForType().hashCode(); - hash = (29 * hash) + getUnknownFields().hashCode(); - memoizedHashCode = hash; - return hash; - } - - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest parseFrom( - com.google.protobuf.ByteString data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest parseFrom( - com.google.protobuf.ByteString data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest parseFrom(byte[] data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest parseFrom( - byte[] data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest parseFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest parseFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest parseDelimitedFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest parseFrom( - com.google.protobuf.CodedInputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest parseFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static Builder newBuilder() { return Builder.create(); } - public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest prototype) { - return newBuilder().mergeFrom(prototype); - } - public Builder toBuilder() { return newBuilder(this); } - - @java.lang.Override - protected Builder newBuilderForType( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - Builder builder = new Builder(parent); - return builder; - } - /** - * Protobuf type {@code CountRequest} - */ - public static final class Builder extends - com.google.protobuf.GeneratedMessage.Builder - implements com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequestOrBuilder { - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.internal_static_CountRequest_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.internal_static_CountRequest_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest.class, com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest.Builder.class); - } - - // Construct using com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest.newBuilder() - private Builder() { - maybeForceBuilderInitialization(); - } - - private Builder( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - super(parent); - maybeForceBuilderInitialization(); - } - private void maybeForceBuilderInitialization() { - if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { - } - } - private static Builder create() { - return new Builder(); - } - - public Builder clear() { - super.clear(); - return this; - } - - public Builder clone() { - return create().mergeFrom(buildPartial()); - } - - public com.google.protobuf.Descriptors.Descriptor - getDescriptorForType() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.internal_static_CountRequest_descriptor; - } - - public com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest getDefaultInstanceForType() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest.getDefaultInstance(); - } - - public com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest build() { - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - public com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest buildPartial() { - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest result = new com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest(this); - onBuilt(); - return result; - } - - public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest) { - return mergeFrom((com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest)other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest other) { - if (other == com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest.getDefaultInstance()) return this; - this.mergeUnknownFields(other.getUnknownFields()); - return this; - } - - public final boolean isInitialized() { - return true; - } - - public Builder mergeFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest parsedMessage = null; - try { - parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest) e.getUnfinishedMessage(); - throw e; - } finally { - if (parsedMessage != null) { - mergeFrom(parsedMessage); - } - } - return this; - } - - // @@protoc_insertion_point(builder_scope:CountRequest) - } - - static { - defaultInstance = new CountRequest(true); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:CountRequest) - } - - public interface CountResponseOrBuilder - extends com.google.protobuf.MessageOrBuilder { - - // required int64 count = 1 [default = 0]; - /** - * required int64 count = 1 [default = 0]; - */ - boolean hasCount(); - /** - * required int64 count = 1 [default = 0]; - */ - long getCount(); - } - /** - * Protobuf type {@code CountResponse} - */ - public static final class CountResponse extends - com.google.protobuf.GeneratedMessage - implements CountResponseOrBuilder { - // Use CountResponse.newBuilder() to construct. - private CountResponse(com.google.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - private CountResponse(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } - - private static final CountResponse defaultInstance; - public static CountResponse getDefaultInstance() { - return defaultInstance; - } - - public CountResponse getDefaultInstanceForType() { - return defaultInstance; - } - - private final com.google.protobuf.UnknownFieldSet unknownFields; - @java.lang.Override - public final com.google.protobuf.UnknownFieldSet - getUnknownFields() { - return this.unknownFields; - } - private CountResponse( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - initFields(); - int mutable_bitField0_ = 0; - com.google.protobuf.UnknownFieldSet.Builder unknownFields = - com.google.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, - extensionRegistry, tag)) { - done = true; - } - break; - } - case 8: { - bitField0_ |= 0x00000001; - count_ = input.readInt64(); - break; - } - } - } - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException( - e.getMessage()).setUnfinishedMessage(this); - } finally { - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.internal_static_CountResponse_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.internal_static_CountResponse_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.class, com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.Builder.class); - } - - public static com.google.protobuf.Parser PARSER = - new com.google.protobuf.AbstractParser() { - public CountResponse parsePartialFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return new CountResponse(input, extensionRegistry); - } - }; - - @java.lang.Override - public com.google.protobuf.Parser getParserForType() { - return PARSER; - } - - private int bitField0_; - // required int64 count = 1 [default = 0]; - public static final int COUNT_FIELD_NUMBER = 1; - private long count_; - /** - * required int64 count = 1 [default = 0]; - */ - public boolean hasCount() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * required int64 count = 1 [default = 0]; - */ - public long getCount() { - return count_; - } - - private void initFields() { - count_ = 0L; - } - private byte memoizedIsInitialized = -1; - public final boolean isInitialized() { - byte isInitialized = memoizedIsInitialized; - if (isInitialized != -1) return isInitialized == 1; - - if (!hasCount()) { - memoizedIsInitialized = 0; - return false; - } - memoizedIsInitialized = 1; - return true; - } - - public void writeTo(com.google.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - if (((bitField0_ & 0x00000001) == 0x00000001)) { - output.writeInt64(1, count_); - } - getUnknownFields().writeTo(output); - } - - private int memoizedSerializedSize = -1; - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) return size; - - size = 0; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - size += com.google.protobuf.CodedOutputStream - .computeInt64Size(1, count_); - } - size += getUnknownFields().getSerializedSize(); - memoizedSerializedSize = size; - return size; - } - - private static final long serialVersionUID = 0L; - @java.lang.Override - protected java.lang.Object writeReplace() - throws java.io.ObjectStreamException { - return super.writeReplace(); - } - - @java.lang.Override - public boolean equals(final java.lang.Object obj) { - if (obj == this) { - return true; - } - if (!(obj instanceof com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse)) { - return super.equals(obj); - } - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse other = (com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse) obj; - - boolean result = true; - result = result && (hasCount() == other.hasCount()); - if (hasCount()) { - result = result && (getCount() - == other.getCount()); - } - result = result && - getUnknownFields().equals(other.getUnknownFields()); - return result; - } - - private int memoizedHashCode = 0; - @java.lang.Override - public int hashCode() { - if (memoizedHashCode != 0) { - return memoizedHashCode; - } - int hash = 41; - hash = (19 * hash) + getDescriptorForType().hashCode(); - if (hasCount()) { - hash = (37 * hash) + COUNT_FIELD_NUMBER; - hash = (53 * hash) + hashLong(getCount()); - } - hash = (29 * hash) + getUnknownFields().hashCode(); - memoizedHashCode = hash; - return hash; - } - - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse parseFrom( - com.google.protobuf.ByteString data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse parseFrom( - com.google.protobuf.ByteString data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse parseFrom(byte[] data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse parseFrom( - byte[] data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse parseFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse parseFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse parseDelimitedFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse parseFrom( - com.google.protobuf.CodedInputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse parseFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static Builder newBuilder() { return Builder.create(); } - public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse prototype) { - return newBuilder().mergeFrom(prototype); - } - public Builder toBuilder() { return newBuilder(this); } - - @java.lang.Override - protected Builder newBuilderForType( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - Builder builder = new Builder(parent); - return builder; - } - /** - * Protobuf type {@code CountResponse} - */ - public static final class Builder extends - com.google.protobuf.GeneratedMessage.Builder - implements com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponseOrBuilder { - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.internal_static_CountResponse_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.internal_static_CountResponse_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.class, com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.Builder.class); - } - - // Construct using com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.newBuilder() - private Builder() { - maybeForceBuilderInitialization(); - } - - private Builder( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - super(parent); - maybeForceBuilderInitialization(); - } - private void maybeForceBuilderInitialization() { - if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { - } - } - private static Builder create() { - return new Builder(); - } - - public Builder clear() { - super.clear(); - count_ = 0L; - bitField0_ = (bitField0_ & ~0x00000001); - return this; - } - - public Builder clone() { - return create().mergeFrom(buildPartial()); - } - - public com.google.protobuf.Descriptors.Descriptor - getDescriptorForType() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.internal_static_CountResponse_descriptor; - } - - public com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse getDefaultInstanceForType() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.getDefaultInstance(); - } - - public com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse build() { - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - public com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse buildPartial() { - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse result = new com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse(this); - int from_bitField0_ = bitField0_; - int to_bitField0_ = 0; - if (((from_bitField0_ & 0x00000001) == 0x00000001)) { - to_bitField0_ |= 0x00000001; - } - result.count_ = count_; - result.bitField0_ = to_bitField0_; - onBuilt(); - return result; - } - - public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse) { - return mergeFrom((com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse)other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse other) { - if (other == com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.getDefaultInstance()) return this; - if (other.hasCount()) { - setCount(other.getCount()); - } - this.mergeUnknownFields(other.getUnknownFields()); - return this; - } - - public final boolean isInitialized() { - if (!hasCount()) { - - return false; - } - return true; - } - - public Builder mergeFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse parsedMessage = null; - try { - parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse) e.getUnfinishedMessage(); - throw e; - } finally { - if (parsedMessage != null) { - mergeFrom(parsedMessage); - } - } - return this; - } - private int bitField0_; - - // required int64 count = 1 [default = 0]; - private long count_ ; - /** - * required int64 count = 1 [default = 0]; - */ - public boolean hasCount() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * required int64 count = 1 [default = 0]; - */ - public long getCount() { - return count_; - } - /** - * required int64 count = 1 [default = 0]; - */ - public Builder setCount(long value) { - bitField0_ |= 0x00000001; - count_ = value; - onChanged(); - return this; - } - /** - * required int64 count = 1 [default = 0]; - */ - public Builder clearCount() { - bitField0_ = (bitField0_ & ~0x00000001); - count_ = 0L; - onChanged(); - return this; - } - - // @@protoc_insertion_point(builder_scope:CountResponse) - } - - static { - defaultInstance = new CountResponse(true); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:CountResponse) - } - - /** - * Protobuf service {@code RowCountService} - */ - public static abstract class RowCountService - implements com.google.protobuf.Service { - protected RowCountService() {} - - public interface Interface { - /** - * rpc getRowCount(.CountRequest) returns (.CountResponse); - */ - public abstract void getRowCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest request, - com.google.protobuf.RpcCallback done); - - /** - * rpc getKeyValueCount(.CountRequest) returns (.CountResponse); - */ - public abstract void getKeyValueCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest request, - com.google.protobuf.RpcCallback done); - - } - - public static com.google.protobuf.Service newReflectiveService( - final Interface impl) { - return new RowCountService() { - @java.lang.Override - public void getRowCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest request, - com.google.protobuf.RpcCallback done) { - impl.getRowCount(controller, request, done); - } - - @java.lang.Override - public void getKeyValueCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest request, - com.google.protobuf.RpcCallback done) { - impl.getKeyValueCount(controller, request, done); - } - - }; - } - - public static com.google.protobuf.BlockingService - newReflectiveBlockingService(final BlockingInterface impl) { - return new com.google.protobuf.BlockingService() { - public final com.google.protobuf.Descriptors.ServiceDescriptor - getDescriptorForType() { - return getDescriptor(); - } - - public final com.google.protobuf.Message callBlockingMethod( - com.google.protobuf.Descriptors.MethodDescriptor method, - com.google.protobuf.RpcController controller, - com.google.protobuf.Message request) - throws com.google.protobuf.ServiceException { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.callBlockingMethod() given method descriptor for " + - "wrong service type."); - } - switch(method.getIndex()) { - case 0: - return impl.getRowCount(controller, (com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest)request); - case 1: - return impl.getKeyValueCount(controller, (com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest)request); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public final com.google.protobuf.Message - getRequestPrototype( - com.google.protobuf.Descriptors.MethodDescriptor method) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.getRequestPrototype() given method " + - "descriptor for wrong service type."); - } - switch(method.getIndex()) { - case 0: - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest.getDefaultInstance(); - case 1: - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest.getDefaultInstance(); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public final com.google.protobuf.Message - getResponsePrototype( - com.google.protobuf.Descriptors.MethodDescriptor method) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.getResponsePrototype() given method " + - "descriptor for wrong service type."); - } - switch(method.getIndex()) { - case 0: - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.getDefaultInstance(); - case 1: - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.getDefaultInstance(); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - }; - } - - /** - * rpc getRowCount(.CountRequest) returns (.CountResponse); - */ - public abstract void getRowCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest request, - com.google.protobuf.RpcCallback done); - - /** - * rpc getKeyValueCount(.CountRequest) returns (.CountResponse); - */ - public abstract void getKeyValueCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest request, - com.google.protobuf.RpcCallback done); - - public static final - com.google.protobuf.Descriptors.ServiceDescriptor - getDescriptor() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.getDescriptor().getServices().get(0); - } - public final com.google.protobuf.Descriptors.ServiceDescriptor - getDescriptorForType() { - return getDescriptor(); - } - - public final void callMethod( - com.google.protobuf.Descriptors.MethodDescriptor method, - com.google.protobuf.RpcController controller, - com.google.protobuf.Message request, - com.google.protobuf.RpcCallback< - com.google.protobuf.Message> done) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.callMethod() given method descriptor for wrong " + - "service type."); - } - switch(method.getIndex()) { - case 0: - this.getRowCount(controller, (com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest)request, - com.google.protobuf.RpcUtil.specializeCallback( - done)); - return; - case 1: - this.getKeyValueCount(controller, (com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest)request, - com.google.protobuf.RpcUtil.specializeCallback( - done)); - return; - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public final com.google.protobuf.Message - getRequestPrototype( - com.google.protobuf.Descriptors.MethodDescriptor method) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.getRequestPrototype() given method " + - "descriptor for wrong service type."); - } - switch(method.getIndex()) { - case 0: - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest.getDefaultInstance(); - case 1: - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest.getDefaultInstance(); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public final com.google.protobuf.Message - getResponsePrototype( - com.google.protobuf.Descriptors.MethodDescriptor method) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.getResponsePrototype() given method " + - "descriptor for wrong service type."); - } - switch(method.getIndex()) { - case 0: - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.getDefaultInstance(); - case 1: - return com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.getDefaultInstance(); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public static Stub newStub( - com.google.protobuf.RpcChannel channel) { - return new Stub(channel); - } - - public static final class Stub extends com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.RowCountService implements Interface { - private Stub(com.google.protobuf.RpcChannel channel) { - this.channel = channel; - } - - private final com.google.protobuf.RpcChannel channel; - - public com.google.protobuf.RpcChannel getChannel() { - return channel; - } - - public void getRowCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest request, - com.google.protobuf.RpcCallback done) { - channel.callMethod( - getDescriptor().getMethods().get(0), - controller, - request, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.getDefaultInstance(), - com.google.protobuf.RpcUtil.generalizeCallback( - done, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.class, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.getDefaultInstance())); - } - - public void getKeyValueCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest request, - com.google.protobuf.RpcCallback done) { - channel.callMethod( - getDescriptor().getMethods().get(1), - controller, - request, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.getDefaultInstance(), - com.google.protobuf.RpcUtil.generalizeCallback( - done, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.class, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.getDefaultInstance())); - } - } - - public static BlockingInterface newBlockingStub( - com.google.protobuf.BlockingRpcChannel channel) { - return new BlockingStub(channel); - } - - public interface BlockingInterface { - public com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse getRowCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest request) - throws com.google.protobuf.ServiceException; - - public com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse getKeyValueCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest request) - throws com.google.protobuf.ServiceException; - } - - private static final class BlockingStub implements BlockingInterface { - private BlockingStub(com.google.protobuf.BlockingRpcChannel channel) { - this.channel = channel; - } - - private final com.google.protobuf.BlockingRpcChannel channel; - - public com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse getRowCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest request) - throws com.google.protobuf.ServiceException { - return (com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse) channel.callBlockingMethod( - getDescriptor().getMethods().get(0), - controller, - request, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.getDefaultInstance()); - } - - - public com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse getKeyValueCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest request) - throws com.google.protobuf.ServiceException { - return (com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse) channel.callBlockingMethod( - getDescriptor().getMethods().get(1), - controller, - request, - com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.getDefaultInstance()); - } - - } - - // @@protoc_insertion_point(class_scope:RowCountService) - } - - private static com.google.protobuf.Descriptors.Descriptor - internal_static_CountRequest_descriptor; - private static - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_CountRequest_fieldAccessorTable; - private static com.google.protobuf.Descriptors.Descriptor - internal_static_CountResponse_descriptor; - private static - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_CountResponse_fieldAccessorTable; - - public static com.google.protobuf.Descriptors.FileDescriptor - getDescriptor() { - return descriptor; - } - private static com.google.protobuf.Descriptors.FileDescriptor - descriptor; - static { - java.lang.String[] descriptorData = { - "\n\rexample.proto\"\016\n\014CountRequest\"!\n\rCount" + - "Response\022\020\n\005count\030\001 \002(\003:\00102r\n\017RowCountSe" + - "rvice\022,\n\013getRowCount\022\r.CountRequest\032\016.Co" + - "untResponse\0221\n\020getKeyValueCount\022\r.CountR" + - "equest\032\016.CountResponseBR\n9com.kylinolap." + - "storage.hbase.coprocessor.example.genera" + - "tedB\rExampleProtosH\001\210\001\001\240\001\001" - }; - com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = - new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { - public com.google.protobuf.ExtensionRegistry assignDescriptors( - com.google.protobuf.Descriptors.FileDescriptor root) { - descriptor = root; - internal_static_CountRequest_descriptor = - getDescriptor().getMessageTypes().get(0); - internal_static_CountRequest_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_CountRequest_descriptor, - new java.lang.String[] { }); - internal_static_CountResponse_descriptor = - getDescriptor().getMessageTypes().get(1); - internal_static_CountResponse_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_CountResponse_descriptor, - new java.lang.String[] { "Count", }); - return null; - } - }; - com.google.protobuf.Descriptors.FileDescriptor - .internalBuildGeneratedFileFrom(descriptorData, - new com.google.protobuf.Descriptors.FileDescriptor[] { - }, assigner); - } - - // @@protoc_insertion_point(outer_class_scope) -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/example/generated/NodeProtos.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/example/generated/NodeProtos.java deleted file mode 100644 index cee1328..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/example/generated/NodeProtos.java +++ /dev/null @@ -1,938 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: Node.proto - -package com.kylinolap.storage.hbase.coprocessor.example.generated; - -public final class NodeProtos { - private NodeProtos() {} - public static void registerAllExtensions( - com.google.protobuf.ExtensionRegistry registry) { - } - public interface NodeOrBuilder - extends com.google.protobuf.MessageOrBuilder { - - // required string name = 1; - /** - * required string name = 1; - */ - boolean hasName(); - /** - * required string name = 1; - */ - java.lang.String getName(); - /** - * required string name = 1; - */ - com.google.protobuf.ByteString - getNameBytes(); - - // optional .Node left = 2; - /** - * optional .Node left = 2; - */ - boolean hasLeft(); - /** - * optional .Node left = 2; - */ - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node getLeft(); - /** - * optional .Node left = 2; - */ - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.NodeOrBuilder getLeftOrBuilder(); - - // optional .Node right = 3; - /** - * optional .Node right = 3; - */ - boolean hasRight(); - /** - * optional .Node right = 3; - */ - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node getRight(); - /** - * optional .Node right = 3; - */ - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.NodeOrBuilder getRightOrBuilder(); - } - /** - * Protobuf type {@code Node} - */ - public static final class Node extends - com.google.protobuf.GeneratedMessage - implements NodeOrBuilder { - // Use Node.newBuilder() to construct. - private Node(com.google.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - private Node(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } - - private static final Node defaultInstance; - public static Node getDefaultInstance() { - return defaultInstance; - } - - public Node getDefaultInstanceForType() { - return defaultInstance; - } - - private final com.google.protobuf.UnknownFieldSet unknownFields; - @java.lang.Override - public final com.google.protobuf.UnknownFieldSet - getUnknownFields() { - return this.unknownFields; - } - private Node( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - initFields(); - int mutable_bitField0_ = 0; - com.google.protobuf.UnknownFieldSet.Builder unknownFields = - com.google.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, - extensionRegistry, tag)) { - done = true; - } - break; - } - case 10: { - bitField0_ |= 0x00000001; - name_ = input.readBytes(); - break; - } - case 18: { - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.Builder subBuilder = null; - if (((bitField0_ & 0x00000002) == 0x00000002)) { - subBuilder = left_.toBuilder(); - } - left_ = input.readMessage(com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.PARSER, extensionRegistry); - if (subBuilder != null) { - subBuilder.mergeFrom(left_); - left_ = subBuilder.buildPartial(); - } - bitField0_ |= 0x00000002; - break; - } - case 26: { - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.Builder subBuilder = null; - if (((bitField0_ & 0x00000004) == 0x00000004)) { - subBuilder = right_.toBuilder(); - } - right_ = input.readMessage(com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.PARSER, extensionRegistry); - if (subBuilder != null) { - subBuilder.mergeFrom(right_); - right_ = subBuilder.buildPartial(); - } - bitField0_ |= 0x00000004; - break; - } - } - } - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException( - e.getMessage()).setUnfinishedMessage(this); - } finally { - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.internal_static_Node_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.internal_static_Node_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.class, com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.Builder.class); - } - - public static com.google.protobuf.Parser PARSER = - new com.google.protobuf.AbstractParser() { - public Node parsePartialFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return new Node(input, extensionRegistry); - } - }; - - @java.lang.Override - public com.google.protobuf.Parser getParserForType() { - return PARSER; - } - - private int bitField0_; - // required string name = 1; - public static final int NAME_FIELD_NUMBER = 1; - private java.lang.Object name_; - /** - * required string name = 1; - */ - public boolean hasName() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * required string name = 1; - */ - public java.lang.String getName() { - java.lang.Object ref = name_; - if (ref instanceof java.lang.String) { - return (java.lang.String) ref; - } else { - com.google.protobuf.ByteString bs = - (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - if (bs.isValidUtf8()) { - name_ = s; - } - return s; - } - } - /** - * required string name = 1; - */ - public com.google.protobuf.ByteString - getNameBytes() { - java.lang.Object ref = name_; - if (ref instanceof java.lang.String) { - com.google.protobuf.ByteString b = - com.google.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - name_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } - } - - // optional .Node left = 2; - public static final int LEFT_FIELD_NUMBER = 2; - private com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node left_; - /** - * optional .Node left = 2; - */ - public boolean hasLeft() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - /** - * optional .Node left = 2; - */ - public com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node getLeft() { - return left_; - } - /** - * optional .Node left = 2; - */ - public com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.NodeOrBuilder getLeftOrBuilder() { - return left_; - } - - // optional .Node right = 3; - public static final int RIGHT_FIELD_NUMBER = 3; - private com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node right_; - /** - * optional .Node right = 3; - */ - public boolean hasRight() { - return ((bitField0_ & 0x00000004) == 0x00000004); - } - /** - * optional .Node right = 3; - */ - public com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node getRight() { - return right_; - } - /** - * optional .Node right = 3; - */ - public com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.NodeOrBuilder getRightOrBuilder() { - return right_; - } - - private void initFields() { - name_ = ""; - left_ = com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.getDefaultInstance(); - right_ = com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.getDefaultInstance(); - } - private byte memoizedIsInitialized = -1; - public final boolean isInitialized() { - byte isInitialized = memoizedIsInitialized; - if (isInitialized != -1) return isInitialized == 1; - - if (!hasName()) { - memoizedIsInitialized = 0; - return false; - } - if (hasLeft()) { - if (!getLeft().isInitialized()) { - memoizedIsInitialized = 0; - return false; - } - } - if (hasRight()) { - if (!getRight().isInitialized()) { - memoizedIsInitialized = 0; - return false; - } - } - memoizedIsInitialized = 1; - return true; - } - - public void writeTo(com.google.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - if (((bitField0_ & 0x00000001) == 0x00000001)) { - output.writeBytes(1, getNameBytes()); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - output.writeMessage(2, left_); - } - if (((bitField0_ & 0x00000004) == 0x00000004)) { - output.writeMessage(3, right_); - } - getUnknownFields().writeTo(output); - } - - private int memoizedSerializedSize = -1; - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) return size; - - size = 0; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - size += com.google.protobuf.CodedOutputStream - .computeBytesSize(1, getNameBytes()); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - size += com.google.protobuf.CodedOutputStream - .computeMessageSize(2, left_); - } - if (((bitField0_ & 0x00000004) == 0x00000004)) { - size += com.google.protobuf.CodedOutputStream - .computeMessageSize(3, right_); - } - size += getUnknownFields().getSerializedSize(); - memoizedSerializedSize = size; - return size; - } - - private static final long serialVersionUID = 0L; - @java.lang.Override - protected java.lang.Object writeReplace() - throws java.io.ObjectStreamException { - return super.writeReplace(); - } - - public static com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node parseFrom( - com.google.protobuf.ByteString data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node parseFrom( - com.google.protobuf.ByteString data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node parseFrom(byte[] data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node parseFrom( - byte[] data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node parseFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node parseFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node parseDelimitedFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node parseFrom( - com.google.protobuf.CodedInputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node parseFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static Builder newBuilder() { return Builder.create(); } - public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node prototype) { - return newBuilder().mergeFrom(prototype); - } - public Builder toBuilder() { return newBuilder(this); } - - @java.lang.Override - protected Builder newBuilderForType( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - Builder builder = new Builder(parent); - return builder; - } - /** - * Protobuf type {@code Node} - */ - public static final class Builder extends - com.google.protobuf.GeneratedMessage.Builder - implements com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.NodeOrBuilder { - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.internal_static_Node_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.internal_static_Node_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.class, com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.Builder.class); - } - - // Construct using com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.newBuilder() - private Builder() { - maybeForceBuilderInitialization(); - } - - private Builder( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - super(parent); - maybeForceBuilderInitialization(); - } - private void maybeForceBuilderInitialization() { - if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { - getLeftFieldBuilder(); - getRightFieldBuilder(); - } - } - private static Builder create() { - return new Builder(); - } - - public Builder clear() { - super.clear(); - name_ = ""; - bitField0_ = (bitField0_ & ~0x00000001); - if (leftBuilder_ == null) { - left_ = com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.getDefaultInstance(); - } else { - leftBuilder_.clear(); - } - bitField0_ = (bitField0_ & ~0x00000002); - if (rightBuilder_ == null) { - right_ = com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.getDefaultInstance(); - } else { - rightBuilder_.clear(); - } - bitField0_ = (bitField0_ & ~0x00000004); - return this; - } - - public Builder clone() { - return create().mergeFrom(buildPartial()); - } - - public com.google.protobuf.Descriptors.Descriptor - getDescriptorForType() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.internal_static_Node_descriptor; - } - - public com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node getDefaultInstanceForType() { - return com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.getDefaultInstance(); - } - - public com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node build() { - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - public com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node buildPartial() { - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node result = new com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node(this); - int from_bitField0_ = bitField0_; - int to_bitField0_ = 0; - if (((from_bitField0_ & 0x00000001) == 0x00000001)) { - to_bitField0_ |= 0x00000001; - } - result.name_ = name_; - if (((from_bitField0_ & 0x00000002) == 0x00000002)) { - to_bitField0_ |= 0x00000002; - } - if (leftBuilder_ == null) { - result.left_ = left_; - } else { - result.left_ = leftBuilder_.build(); - } - if (((from_bitField0_ & 0x00000004) == 0x00000004)) { - to_bitField0_ |= 0x00000004; - } - if (rightBuilder_ == null) { - result.right_ = right_; - } else { - result.right_ = rightBuilder_.build(); - } - result.bitField0_ = to_bitField0_; - onBuilt(); - return result; - } - - public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node) { - return mergeFrom((com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node)other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node other) { - if (other == com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.getDefaultInstance()) return this; - if (other.hasName()) { - bitField0_ |= 0x00000001; - name_ = other.name_; - onChanged(); - } - if (other.hasLeft()) { - mergeLeft(other.getLeft()); - } - if (other.hasRight()) { - mergeRight(other.getRight()); - } - this.mergeUnknownFields(other.getUnknownFields()); - return this; - } - - public final boolean isInitialized() { - if (!hasName()) { - - return false; - } - if (hasLeft()) { - if (!getLeft().isInitialized()) { - - return false; - } - } - if (hasRight()) { - if (!getRight().isInitialized()) { - - return false; - } - } - return true; - } - - public Builder mergeFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node parsedMessage = null; - try { - parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node) e.getUnfinishedMessage(); - throw e; - } finally { - if (parsedMessage != null) { - mergeFrom(parsedMessage); - } - } - return this; - } - private int bitField0_; - - // required string name = 1; - private java.lang.Object name_ = ""; - /** - * required string name = 1; - */ - public boolean hasName() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * required string name = 1; - */ - public java.lang.String getName() { - java.lang.Object ref = name_; - if (!(ref instanceof java.lang.String)) { - java.lang.String s = ((com.google.protobuf.ByteString) ref) - .toStringUtf8(); - name_ = s; - return s; - } else { - return (java.lang.String) ref; - } - } - /** - * required string name = 1; - */ - public com.google.protobuf.ByteString - getNameBytes() { - java.lang.Object ref = name_; - if (ref instanceof String) { - com.google.protobuf.ByteString b = - com.google.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - name_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } - } - /** - * required string name = 1; - */ - public Builder setName( - java.lang.String value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000001; - name_ = value; - onChanged(); - return this; - } - /** - * required string name = 1; - */ - public Builder clearName() { - bitField0_ = (bitField0_ & ~0x00000001); - name_ = getDefaultInstance().getName(); - onChanged(); - return this; - } - /** - * required string name = 1; - */ - public Builder setNameBytes( - com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000001; - name_ = value; - onChanged(); - return this; - } - - // optional .Node left = 2; - private com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node left_ = com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.getDefaultInstance(); - private com.google.protobuf.SingleFieldBuilder< - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node, com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.Builder, com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.NodeOrBuilder> leftBuilder_; - /** - * optional .Node left = 2; - */ - public boolean hasLeft() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - /** - * optional .Node left = 2; - */ - public com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node getLeft() { - if (leftBuilder_ == null) { - return left_; - } else { - return leftBuilder_.getMessage(); - } - } - /** - * optional .Node left = 2; - */ - public Builder setLeft(com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node value) { - if (leftBuilder_ == null) { - if (value == null) { - throw new NullPointerException(); - } - left_ = value; - onChanged(); - } else { - leftBuilder_.setMessage(value); - } - bitField0_ |= 0x00000002; - return this; - } - /** - * optional .Node left = 2; - */ - public Builder setLeft( - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.Builder builderForValue) { - if (leftBuilder_ == null) { - left_ = builderForValue.build(); - onChanged(); - } else { - leftBuilder_.setMessage(builderForValue.build()); - } - bitField0_ |= 0x00000002; - return this; - } - /** - * optional .Node left = 2; - */ - public Builder mergeLeft(com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node value) { - if (leftBuilder_ == null) { - if (((bitField0_ & 0x00000002) == 0x00000002) && - left_ != com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.getDefaultInstance()) { - left_ = - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.newBuilder(left_).mergeFrom(value).buildPartial(); - } else { - left_ = value; - } - onChanged(); - } else { - leftBuilder_.mergeFrom(value); - } - bitField0_ |= 0x00000002; - return this; - } - /** - * optional .Node left = 2; - */ - public Builder clearLeft() { - if (leftBuilder_ == null) { - left_ = com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.getDefaultInstance(); - onChanged(); - } else { - leftBuilder_.clear(); - } - bitField0_ = (bitField0_ & ~0x00000002); - return this; - } - /** - * optional .Node left = 2; - */ - public com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.Builder getLeftBuilder() { - bitField0_ |= 0x00000002; - onChanged(); - return getLeftFieldBuilder().getBuilder(); - } - /** - * optional .Node left = 2; - */ - public com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.NodeOrBuilder getLeftOrBuilder() { - if (leftBuilder_ != null) { - return leftBuilder_.getMessageOrBuilder(); - } else { - return left_; - } - } - /** - * optional .Node left = 2; - */ - private com.google.protobuf.SingleFieldBuilder< - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node, com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.Builder, com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.NodeOrBuilder> - getLeftFieldBuilder() { - if (leftBuilder_ == null) { - leftBuilder_ = new com.google.protobuf.SingleFieldBuilder< - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node, com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.Builder, com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.NodeOrBuilder>( - left_, - getParentForChildren(), - isClean()); - left_ = null; - } - return leftBuilder_; - } - - // optional .Node right = 3; - private com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node right_ = com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.getDefaultInstance(); - private com.google.protobuf.SingleFieldBuilder< - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node, com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.Builder, com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.NodeOrBuilder> rightBuilder_; - /** - * optional .Node right = 3; - */ - public boolean hasRight() { - return ((bitField0_ & 0x00000004) == 0x00000004); - } - /** - * optional .Node right = 3; - */ - public com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node getRight() { - if (rightBuilder_ == null) { - return right_; - } else { - return rightBuilder_.getMessage(); - } - } - /** - * optional .Node right = 3; - */ - public Builder setRight(com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node value) { - if (rightBuilder_ == null) { - if (value == null) { - throw new NullPointerException(); - } - right_ = value; - onChanged(); - } else { - rightBuilder_.setMessage(value); - } - bitField0_ |= 0x00000004; - return this; - } - /** - * optional .Node right = 3; - */ - public Builder setRight( - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.Builder builderForValue) { - if (rightBuilder_ == null) { - right_ = builderForValue.build(); - onChanged(); - } else { - rightBuilder_.setMessage(builderForValue.build()); - } - bitField0_ |= 0x00000004; - return this; - } - /** - * optional .Node right = 3; - */ - public Builder mergeRight(com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node value) { - if (rightBuilder_ == null) { - if (((bitField0_ & 0x00000004) == 0x00000004) && - right_ != com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.getDefaultInstance()) { - right_ = - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.newBuilder(right_).mergeFrom(value).buildPartial(); - } else { - right_ = value; - } - onChanged(); - } else { - rightBuilder_.mergeFrom(value); - } - bitField0_ |= 0x00000004; - return this; - } - /** - * optional .Node right = 3; - */ - public Builder clearRight() { - if (rightBuilder_ == null) { - right_ = com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.getDefaultInstance(); - onChanged(); - } else { - rightBuilder_.clear(); - } - bitField0_ = (bitField0_ & ~0x00000004); - return this; - } - /** - * optional .Node right = 3; - */ - public com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.Builder getRightBuilder() { - bitField0_ |= 0x00000004; - onChanged(); - return getRightFieldBuilder().getBuilder(); - } - /** - * optional .Node right = 3; - */ - public com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.NodeOrBuilder getRightOrBuilder() { - if (rightBuilder_ != null) { - return rightBuilder_.getMessageOrBuilder(); - } else { - return right_; - } - } - /** - * optional .Node right = 3; - */ - private com.google.protobuf.SingleFieldBuilder< - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node, com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.Builder, com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.NodeOrBuilder> - getRightFieldBuilder() { - if (rightBuilder_ == null) { - rightBuilder_ = new com.google.protobuf.SingleFieldBuilder< - com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node, com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.Builder, com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.NodeOrBuilder>( - right_, - getParentForChildren(), - isClean()); - right_ = null; - } - return rightBuilder_; - } - - // @@protoc_insertion_point(builder_scope:Node) - } - - static { - defaultInstance = new Node(true); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:Node) - } - - private static com.google.protobuf.Descriptors.Descriptor - internal_static_Node_descriptor; - private static - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_Node_fieldAccessorTable; - - public static com.google.protobuf.Descriptors.FileDescriptor - getDescriptor() { - return descriptor; - } - private static com.google.protobuf.Descriptors.FileDescriptor - descriptor; - static { - java.lang.String[] descriptorData = { - "\n\nNode.proto\"?\n\004Node\022\014\n\004name\030\001 \002(\t\022\023\n\004le" + - "ft\030\002 \001(\0132\005.Node\022\024\n\005right\030\003 \001(\0132\005.NodeBG\n" + - "9com.kylinolap.storage.hbase.coprocessor" + - ".example.generatedB\nNodeProtos" - }; - com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = - new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { - public com.google.protobuf.ExtensionRegistry assignDescriptors( - com.google.protobuf.Descriptors.FileDescriptor root) { - descriptor = root; - internal_static_Node_descriptor = - getDescriptor().getMessageTypes().get(0); - internal_static_Node_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_Node_descriptor, - new java.lang.String[] { "Name", "Left", "Right", }); - return null; - } - }; - com.google.protobuf.Descriptors.FileDescriptor - .internalBuildGeneratedFileFrom(descriptorData, - new com.google.protobuf.Descriptors.FileDescriptor[] { - }, assigner); - } - - // @@protoc_insertion_point(outer_class_scope) -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/generated/IIProtos.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/generated/IIProtos.java deleted file mode 100644 index 90224c4..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/generated/IIProtos.java +++ /dev/null @@ -1,1237 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: II.proto - -package com.kylinolap.storage.hbase.coprocessor.generated; - -public final class IIProtos { - private IIProtos() {} - public static void registerAllExtensions( - com.google.protobuf.ExtensionRegistry registry) { - } - public interface IIRequestOrBuilder - extends com.google.protobuf.MessageOrBuilder { - - // required bytes tableInfo = 1; - /** - * required bytes tableInfo = 1; - */ - boolean hasTableInfo(); - /** - * required bytes tableInfo = 1; - */ - com.google.protobuf.ByteString getTableInfo(); - } - /** - * Protobuf type {@code IIRequest} - */ - public static final class IIRequest extends - com.google.protobuf.GeneratedMessage - implements IIRequestOrBuilder { - // Use IIRequest.newBuilder() to construct. - private IIRequest(com.google.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - private IIRequest(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } - - private static final IIRequest defaultInstance; - public static IIRequest getDefaultInstance() { - return defaultInstance; - } - - public IIRequest getDefaultInstanceForType() { - return defaultInstance; - } - - private final com.google.protobuf.UnknownFieldSet unknownFields; - @java.lang.Override - public final com.google.protobuf.UnknownFieldSet - getUnknownFields() { - return this.unknownFields; - } - private IIRequest( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - initFields(); - int mutable_bitField0_ = 0; - com.google.protobuf.UnknownFieldSet.Builder unknownFields = - com.google.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, - extensionRegistry, tag)) { - done = true; - } - break; - } - case 10: { - bitField0_ |= 0x00000001; - tableInfo_ = input.readBytes(); - break; - } - } - } - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException( - e.getMessage()).setUnfinishedMessage(this); - } finally { - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.internal_static_IIRequest_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.internal_static_IIRequest_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest.class, com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest.Builder.class); - } - - public static com.google.protobuf.Parser PARSER = - new com.google.protobuf.AbstractParser() { - public IIRequest parsePartialFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return new IIRequest(input, extensionRegistry); - } - }; - - @java.lang.Override - public com.google.protobuf.Parser getParserForType() { - return PARSER; - } - - private int bitField0_; - // required bytes tableInfo = 1; - public static final int TABLEINFO_FIELD_NUMBER = 1; - private com.google.protobuf.ByteString tableInfo_; - /** - * required bytes tableInfo = 1; - */ - public boolean hasTableInfo() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * required bytes tableInfo = 1; - */ - public com.google.protobuf.ByteString getTableInfo() { - return tableInfo_; - } - - private void initFields() { - tableInfo_ = com.google.protobuf.ByteString.EMPTY; - } - private byte memoizedIsInitialized = -1; - public final boolean isInitialized() { - byte isInitialized = memoizedIsInitialized; - if (isInitialized != -1) return isInitialized == 1; - - if (!hasTableInfo()) { - memoizedIsInitialized = 0; - return false; - } - memoizedIsInitialized = 1; - return true; - } - - public void writeTo(com.google.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - if (((bitField0_ & 0x00000001) == 0x00000001)) { - output.writeBytes(1, tableInfo_); - } - getUnknownFields().writeTo(output); - } - - private int memoizedSerializedSize = -1; - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) return size; - - size = 0; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - size += com.google.protobuf.CodedOutputStream - .computeBytesSize(1, tableInfo_); - } - size += getUnknownFields().getSerializedSize(); - memoizedSerializedSize = size; - return size; - } - - private static final long serialVersionUID = 0L; - @java.lang.Override - protected java.lang.Object writeReplace() - throws java.io.ObjectStreamException { - return super.writeReplace(); - } - - @java.lang.Override - public boolean equals(final java.lang.Object obj) { - if (obj == this) { - return true; - } - if (!(obj instanceof com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest)) { - return super.equals(obj); - } - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest other = (com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest) obj; - - boolean result = true; - result = result && (hasTableInfo() == other.hasTableInfo()); - if (hasTableInfo()) { - result = result && getTableInfo() - .equals(other.getTableInfo()); - } - result = result && - getUnknownFields().equals(other.getUnknownFields()); - return result; - } - - private int memoizedHashCode = 0; - @java.lang.Override - public int hashCode() { - if (memoizedHashCode != 0) { - return memoizedHashCode; - } - int hash = 41; - hash = (19 * hash) + getDescriptorForType().hashCode(); - if (hasTableInfo()) { - hash = (37 * hash) + TABLEINFO_FIELD_NUMBER; - hash = (53 * hash) + getTableInfo().hashCode(); - } - hash = (29 * hash) + getUnknownFields().hashCode(); - memoizedHashCode = hash; - return hash; - } - - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest parseFrom( - com.google.protobuf.ByteString data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest parseFrom( - com.google.protobuf.ByteString data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest parseFrom(byte[] data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest parseFrom( - byte[] data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest parseFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest parseFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input); - } - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest parseDelimitedFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest parseFrom( - com.google.protobuf.CodedInputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest parseFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static Builder newBuilder() { return Builder.create(); } - public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest prototype) { - return newBuilder().mergeFrom(prototype); - } - public Builder toBuilder() { return newBuilder(this); } - - @java.lang.Override - protected Builder newBuilderForType( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - Builder builder = new Builder(parent); - return builder; - } - /** - * Protobuf type {@code IIRequest} - */ - public static final class Builder extends - com.google.protobuf.GeneratedMessage.Builder - implements com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequestOrBuilder { - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.internal_static_IIRequest_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.internal_static_IIRequest_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest.class, com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest.Builder.class); - } - - // Construct using com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest.newBuilder() - private Builder() { - maybeForceBuilderInitialization(); - } - - private Builder( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - super(parent); - maybeForceBuilderInitialization(); - } - private void maybeForceBuilderInitialization() { - if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { - } - } - private static Builder create() { - return new Builder(); - } - - public Builder clear() { - super.clear(); - tableInfo_ = com.google.protobuf.ByteString.EMPTY; - bitField0_ = (bitField0_ & ~0x00000001); - return this; - } - - public Builder clone() { - return create().mergeFrom(buildPartial()); - } - - public com.google.protobuf.Descriptors.Descriptor - getDescriptorForType() { - return com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.internal_static_IIRequest_descriptor; - } - - public com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest getDefaultInstanceForType() { - return com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest.getDefaultInstance(); - } - - public com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest build() { - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - public com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest buildPartial() { - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest result = new com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest(this); - int from_bitField0_ = bitField0_; - int to_bitField0_ = 0; - if (((from_bitField0_ & 0x00000001) == 0x00000001)) { - to_bitField0_ |= 0x00000001; - } - result.tableInfo_ = tableInfo_; - result.bitField0_ = to_bitField0_; - onBuilt(); - return result; - } - - public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest) { - return mergeFrom((com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest)other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest other) { - if (other == com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest.getDefaultInstance()) return this; - if (other.hasTableInfo()) { - setTableInfo(other.getTableInfo()); - } - this.mergeUnknownFields(other.getUnknownFields()); - return this; - } - - public final boolean isInitialized() { - if (!hasTableInfo()) { - - return false; - } - return true; - } - - public Builder mergeFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest parsedMessage = null; - try { - parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest) e.getUnfinishedMessage(); - throw e; - } finally { - if (parsedMessage != null) { - mergeFrom(parsedMessage); - } - } - return this; - } - private int bitField0_; - - // required bytes tableInfo = 1; - private com.google.protobuf.ByteString tableInfo_ = com.google.protobuf.ByteString.EMPTY; - /** - * required bytes tableInfo = 1; - */ - public boolean hasTableInfo() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * required bytes tableInfo = 1; - */ - public com.google.protobuf.ByteString getTableInfo() { - return tableInfo_; - } - /** - * required bytes tableInfo = 1; - */ - public Builder setTableInfo(com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000001; - tableInfo_ = value; - onChanged(); - return this; - } - /** - * required bytes tableInfo = 1; - */ - public Builder clearTableInfo() { - bitField0_ = (bitField0_ & ~0x00000001); - tableInfo_ = getDefaultInstance().getTableInfo(); - onChanged(); - return this; - } - - // @@protoc_insertion_point(builder_scope:IIRequest) - } - - static { - defaultInstance = new IIRequest(true); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:IIRequest) - } - - public interface IIResponseOrBuilder - extends com.google.protobuf.MessageOrBuilder { - - // repeated bytes rows = 1; - /** - * repeated bytes rows = 1; - */ - java.util.List getRowsList(); - /** - * repeated bytes rows = 1; - */ - int getRowsCount(); - /** - * repeated bytes rows = 1; - */ - com.google.protobuf.ByteString getRows(int index); - } - /** - * Protobuf type {@code IIResponse} - */ - public static final class IIResponse extends - com.google.protobuf.GeneratedMessage - implements IIResponseOrBuilder { - // Use IIResponse.newBuilder() to construct. - private IIResponse(com.google.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - private IIResponse(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } - - private static final IIResponse defaultInstance; - public static IIResponse getDefaultInstance() { - return defaultInstance; - } - - public IIResponse getDefaultInstanceForType() { - return defaultInstance; - } - - private final com.google.protobuf.UnknownFieldSet unknownFields; - @java.lang.Override - public final com.google.protobuf.UnknownFieldSet - getUnknownFields() { - return this.unknownFields; - } - private IIResponse( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - initFields(); - int mutable_bitField0_ = 0; - com.google.protobuf.UnknownFieldSet.Builder unknownFields = - com.google.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, - extensionRegistry, tag)) { - done = true; - } - break; - } - case 10: { - if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) { - rows_ = new java.util.ArrayList(); - mutable_bitField0_ |= 0x00000001; - } - rows_.add(input.readBytes()); - break; - } - } - } - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException( - e.getMessage()).setUnfinishedMessage(this); - } finally { - if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) { - rows_ = java.util.Collections.unmodifiableList(rows_); - } - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.internal_static_IIResponse_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.internal_static_IIResponse_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse.class, com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse.Builder.class); - } - - public static com.google.protobuf.Parser PARSER = - new com.google.protobuf.AbstractParser() { - public IIResponse parsePartialFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return new IIResponse(input, extensionRegistry); - } - }; - - @java.lang.Override - public com.google.protobuf.Parser getParserForType() { - return PARSER; - } - - // repeated bytes rows = 1; - public static final int ROWS_FIELD_NUMBER = 1; - private java.util.List rows_; - /** - * repeated bytes rows = 1; - */ - public java.util.List - getRowsList() { - return rows_; - } - /** - * repeated bytes rows = 1; - */ - public int getRowsCount() { - return rows_.size(); - } - /** - * repeated bytes rows = 1; - */ - public com.google.protobuf.ByteString getRows(int index) { - return rows_.get(index); - } - - private void initFields() { - rows_ = java.util.Collections.emptyList(); - } - private byte memoizedIsInitialized = -1; - public final boolean isInitialized() { - byte isInitialized = memoizedIsInitialized; - if (isInitialized != -1) return isInitialized == 1; - - memoizedIsInitialized = 1; - return true; - } - - public void writeTo(com.google.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - for (int i = 0; i < rows_.size(); i++) { - output.writeBytes(1, rows_.get(i)); - } - getUnknownFields().writeTo(output); - } - - private int memoizedSerializedSize = -1; - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) return size; - - size = 0; - { - int dataSize = 0; - for (int i = 0; i < rows_.size(); i++) { - dataSize += com.google.protobuf.CodedOutputStream - .computeBytesSizeNoTag(rows_.get(i)); - } - size += dataSize; - size += 1 * getRowsList().size(); - } - size += getUnknownFields().getSerializedSize(); - memoizedSerializedSize = size; - return size; - } - - private static final long serialVersionUID = 0L; - @java.lang.Override - protected java.lang.Object writeReplace() - throws java.io.ObjectStreamException { - return super.writeReplace(); - } - - @java.lang.Override - public boolean equals(final java.lang.Object obj) { - if (obj == this) { - return true; - } - if (!(obj instanceof com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse)) { - return super.equals(obj); - } - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse other = (com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse) obj; - - boolean result = true; - result = result && getRowsList() - .equals(other.getRowsList()); - result = result && - getUnknownFields().equals(other.getUnknownFields()); - return result; - } - - private int memoizedHashCode = 0; - @java.lang.Override - public int hashCode() { - if (memoizedHashCode != 0) { - return memoizedHashCode; - } - int hash = 41; - hash = (19 * hash) + getDescriptorForType().hashCode(); - if (getRowsCount() > 0) { - hash = (37 * hash) + ROWS_FIELD_NUMBER; - hash = (53 * hash) + getRowsList().hashCode(); - } - hash = (29 * hash) + getUnknownFields().hashCode(); - memoizedHashCode = hash; - return hash; - } - - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse parseFrom( - com.google.protobuf.ByteString data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse parseFrom( - com.google.protobuf.ByteString data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse parseFrom(byte[] data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse parseFrom( - byte[] data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse parseFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse parseFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input); - } - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse parseDelimitedFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse parseFrom( - com.google.protobuf.CodedInputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse parseFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static Builder newBuilder() { return Builder.create(); } - public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse prototype) { - return newBuilder().mergeFrom(prototype); - } - public Builder toBuilder() { return newBuilder(this); } - - @java.lang.Override - protected Builder newBuilderForType( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - Builder builder = new Builder(parent); - return builder; - } - /** - * Protobuf type {@code IIResponse} - */ - public static final class Builder extends - com.google.protobuf.GeneratedMessage.Builder - implements com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponseOrBuilder { - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.internal_static_IIResponse_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.internal_static_IIResponse_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse.class, com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse.Builder.class); - } - - // Construct using com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse.newBuilder() - private Builder() { - maybeForceBuilderInitialization(); - } - - private Builder( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - super(parent); - maybeForceBuilderInitialization(); - } - private void maybeForceBuilderInitialization() { - if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { - } - } - private static Builder create() { - return new Builder(); - } - - public Builder clear() { - super.clear(); - rows_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000001); - return this; - } - - public Builder clone() { - return create().mergeFrom(buildPartial()); - } - - public com.google.protobuf.Descriptors.Descriptor - getDescriptorForType() { - return com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.internal_static_IIResponse_descriptor; - } - - public com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse getDefaultInstanceForType() { - return com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse.getDefaultInstance(); - } - - public com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse build() { - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - public com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse buildPartial() { - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse result = new com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse(this); - int from_bitField0_ = bitField0_; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - rows_ = java.util.Collections.unmodifiableList(rows_); - bitField0_ = (bitField0_ & ~0x00000001); - } - result.rows_ = rows_; - onBuilt(); - return result; - } - - public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse) { - return mergeFrom((com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse)other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse other) { - if (other == com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse.getDefaultInstance()) return this; - if (!other.rows_.isEmpty()) { - if (rows_.isEmpty()) { - rows_ = other.rows_; - bitField0_ = (bitField0_ & ~0x00000001); - } else { - ensureRowsIsMutable(); - rows_.addAll(other.rows_); - } - onChanged(); - } - this.mergeUnknownFields(other.getUnknownFields()); - return this; - } - - public final boolean isInitialized() { - return true; - } - - public Builder mergeFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse parsedMessage = null; - try { - parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse) e.getUnfinishedMessage(); - throw e; - } finally { - if (parsedMessage != null) { - mergeFrom(parsedMessage); - } - } - return this; - } - private int bitField0_; - - // repeated bytes rows = 1; - private java.util.List rows_ = java.util.Collections.emptyList(); - private void ensureRowsIsMutable() { - if (!((bitField0_ & 0x00000001) == 0x00000001)) { - rows_ = new java.util.ArrayList(rows_); - bitField0_ |= 0x00000001; - } - } - /** - * repeated bytes rows = 1; - */ - public java.util.List - getRowsList() { - return java.util.Collections.unmodifiableList(rows_); - } - /** - * repeated bytes rows = 1; - */ - public int getRowsCount() { - return rows_.size(); - } - /** - * repeated bytes rows = 1; - */ - public com.google.protobuf.ByteString getRows(int index) { - return rows_.get(index); - } - /** - * repeated bytes rows = 1; - */ - public Builder setRows( - int index, com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - ensureRowsIsMutable(); - rows_.set(index, value); - onChanged(); - return this; - } - /** - * repeated bytes rows = 1; - */ - public Builder addRows(com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - ensureRowsIsMutable(); - rows_.add(value); - onChanged(); - return this; - } - /** - * repeated bytes rows = 1; - */ - public Builder addAllRows( - java.lang.Iterable values) { - ensureRowsIsMutable(); - super.addAll(values, rows_); - onChanged(); - return this; - } - /** - * repeated bytes rows = 1; - */ - public Builder clearRows() { - rows_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000001); - onChanged(); - return this; - } - - // @@protoc_insertion_point(builder_scope:IIResponse) - } - - static { - defaultInstance = new IIResponse(true); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:IIResponse) - } - - /** - * Protobuf service {@code RowsService} - */ - public static abstract class RowsService - implements com.google.protobuf.Service { - protected RowsService() {} - - public interface Interface { - /** - * rpc getRows(.IIRequest) returns (.IIResponse); - */ - public abstract void getRows( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest request, - com.google.protobuf.RpcCallback done); - - } - - public static com.google.protobuf.Service newReflectiveService( - final Interface impl) { - return new RowsService() { - @java.lang.Override - public void getRows( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest request, - com.google.protobuf.RpcCallback done) { - impl.getRows(controller, request, done); - } - - }; - } - - public static com.google.protobuf.BlockingService - newReflectiveBlockingService(final BlockingInterface impl) { - return new com.google.protobuf.BlockingService() { - public final com.google.protobuf.Descriptors.ServiceDescriptor - getDescriptorForType() { - return getDescriptor(); - } - - public final com.google.protobuf.Message callBlockingMethod( - com.google.protobuf.Descriptors.MethodDescriptor method, - com.google.protobuf.RpcController controller, - com.google.protobuf.Message request) - throws com.google.protobuf.ServiceException { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.callBlockingMethod() given method descriptor for " + - "wrong service type."); - } - switch(method.getIndex()) { - case 0: - return impl.getRows(controller, (com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest)request); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public final com.google.protobuf.Message - getRequestPrototype( - com.google.protobuf.Descriptors.MethodDescriptor method) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.getRequestPrototype() given method " + - "descriptor for wrong service type."); - } - switch(method.getIndex()) { - case 0: - return com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest.getDefaultInstance(); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public final com.google.protobuf.Message - getResponsePrototype( - com.google.protobuf.Descriptors.MethodDescriptor method) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.getResponsePrototype() given method " + - "descriptor for wrong service type."); - } - switch(method.getIndex()) { - case 0: - return com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse.getDefaultInstance(); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - }; - } - - /** - * rpc getRows(.IIRequest) returns (.IIResponse); - */ - public abstract void getRows( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest request, - com.google.protobuf.RpcCallback done); - - public static final - com.google.protobuf.Descriptors.ServiceDescriptor - getDescriptor() { - return com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.getDescriptor().getServices().get(0); - } - public final com.google.protobuf.Descriptors.ServiceDescriptor - getDescriptorForType() { - return getDescriptor(); - } - - public final void callMethod( - com.google.protobuf.Descriptors.MethodDescriptor method, - com.google.protobuf.RpcController controller, - com.google.protobuf.Message request, - com.google.protobuf.RpcCallback< - com.google.protobuf.Message> done) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.callMethod() given method descriptor for wrong " + - "service type."); - } - switch(method.getIndex()) { - case 0: - this.getRows(controller, (com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest)request, - com.google.protobuf.RpcUtil.specializeCallback( - done)); - return; - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public final com.google.protobuf.Message - getRequestPrototype( - com.google.protobuf.Descriptors.MethodDescriptor method) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.getRequestPrototype() given method " + - "descriptor for wrong service type."); - } - switch(method.getIndex()) { - case 0: - return com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest.getDefaultInstance(); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public final com.google.protobuf.Message - getResponsePrototype( - com.google.protobuf.Descriptors.MethodDescriptor method) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.getResponsePrototype() given method " + - "descriptor for wrong service type."); - } - switch(method.getIndex()) { - case 0: - return com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse.getDefaultInstance(); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public static Stub newStub( - com.google.protobuf.RpcChannel channel) { - return new Stub(channel); - } - - public static final class Stub extends com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.RowsService implements Interface { - private Stub(com.google.protobuf.RpcChannel channel) { - this.channel = channel; - } - - private final com.google.protobuf.RpcChannel channel; - - public com.google.protobuf.RpcChannel getChannel() { - return channel; - } - - public void getRows( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest request, - com.google.protobuf.RpcCallback done) { - channel.callMethod( - getDescriptor().getMethods().get(0), - controller, - request, - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse.getDefaultInstance(), - com.google.protobuf.RpcUtil.generalizeCallback( - done, - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse.class, - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse.getDefaultInstance())); - } - } - - public static BlockingInterface newBlockingStub( - com.google.protobuf.BlockingRpcChannel channel) { - return new BlockingStub(channel); - } - - public interface BlockingInterface { - public com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse getRows( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest request) - throws com.google.protobuf.ServiceException; - } - - private static final class BlockingStub implements BlockingInterface { - private BlockingStub(com.google.protobuf.BlockingRpcChannel channel) { - this.channel = channel; - } - - private final com.google.protobuf.BlockingRpcChannel channel; - - public com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse getRows( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest request) - throws com.google.protobuf.ServiceException { - return (com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse) channel.callBlockingMethod( - getDescriptor().getMethods().get(0), - controller, - request, - com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse.getDefaultInstance()); - } - - } - - // @@protoc_insertion_point(class_scope:RowsService) - } - - private static com.google.protobuf.Descriptors.Descriptor - internal_static_IIRequest_descriptor; - private static - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_IIRequest_fieldAccessorTable; - private static com.google.protobuf.Descriptors.Descriptor - internal_static_IIResponse_descriptor; - private static - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_IIResponse_fieldAccessorTable; - - public static com.google.protobuf.Descriptors.FileDescriptor - getDescriptor() { - return descriptor; - } - private static com.google.protobuf.Descriptors.FileDescriptor - descriptor; - static { - java.lang.String[] descriptorData = { - "\n\010II.proto\"\036\n\tIIRequest\022\021\n\ttableInfo\030\001 \002" + - "(\014\"\032\n\nIIResponse\022\014\n\004rows\030\001 \003(\01421\n\013RowsSe" + - "rvice\022\"\n\007getRows\022\n.IIRequest\032\013.IIRespons" + - "eBE\n1com.kylinolap.storage.hbase.coproce" + - "ssor.generatedB\010IIProtosH\001\210\001\001\240\001\001" - }; - com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = - new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { - public com.google.protobuf.ExtensionRegistry assignDescriptors( - com.google.protobuf.Descriptors.FileDescriptor root) { - descriptor = root; - internal_static_IIRequest_descriptor = - getDescriptor().getMessageTypes().get(0); - internal_static_IIRequest_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_IIRequest_descriptor, - new java.lang.String[] { "TableInfo", }); - internal_static_IIResponse_descriptor = - getDescriptor().getMessageTypes().get(1); - internal_static_IIResponse_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_IIResponse_descriptor, - new java.lang.String[] { "Rows", }); - return null; - } - }; - com.google.protobuf.Descriptors.FileDescriptor - .internalBuildGeneratedFileFrom(descriptorData, - new com.google.protobuf.Descriptors.FileDescriptor[] { - }, assigner); - } - - // @@protoc_insertion_point(outer_class_scope) -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/HbaseServerKVIterator.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/HbaseServerKVIterator.java new file mode 100644 index 0000000..e6e0e1e --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/HbaseServerKVIterator.java @@ -0,0 +1,78 @@ +package com.kylinolap.storage.hbase.endpoint; + +import org.apache.commons.io.IOUtils; +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.io.ImmutableBytesWritable; +import org.apache.hadoop.hbase.regionserver.RegionScanner; +import org.apache.hadoop.hbase.util.Pair; + +import java.io.Closeable; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * Created by honma on 11/10/14. + */ +public class HbaseServerKVIterator implements Iterable>, Closeable { + + private RegionScanner innerScaner; + + List results = new ArrayList(); + + public HbaseServerKVIterator(RegionScanner innerScaner) { + this.innerScaner = innerScaner; + } + + @Override + public void close() throws IOException { + IOUtils.closeQuietly(this.innerScaner); + } + + @Override + public Iterator> iterator() { + return new Iterator>() { + + ImmutableBytesWritable key = new ImmutableBytesWritable(); + ImmutableBytesWritable value = new ImmutableBytesWritable(); + Pair pair = new Pair<>(key, value); + + private boolean hasMore = true; + + @Override + public boolean hasNext() { + return hasMore; + } + + + @Override + public Pair next() { + if (!hasNext()) { + try { + hasMore = innerScaner.nextRaw(results); + } catch (IOException e) { + throw new RuntimeException(e); + } + + if (results.size() < 1) + throw new IllegalStateException("Hbase row contains less than 1 row"); + + Cell c = results.get(0); + key.set(c.getRowArray(), c.getRowOffset(), c.getRowLength()); + value.set(c.getValueArray(), c.getValueOffset(), c.getValueLength()); + return pair; + } else { + return null; + } + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } + +} + diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java new file mode 100644 index 0000000..8f5610d --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java @@ -0,0 +1,94 @@ +package com.kylinolap.storage.hbase.endpoint; + +import com.google.protobuf.ByteString; +import com.google.protobuf.RpcCallback; +import com.google.protobuf.RpcController; +import com.google.protobuf.Service; +import com.kylinolap.cube.invertedindex.*; +import com.kylinolap.storage.hbase.endpoint.generated.IIProtos; +import org.apache.commons.io.IOUtils; +import org.apache.hadoop.hbase.Coprocessor; +import org.apache.hadoop.hbase.CoprocessorEnvironment; +import org.apache.hadoop.hbase.client.Scan; +import org.apache.hadoop.hbase.coprocessor.CoprocessorException; +import org.apache.hadoop.hbase.coprocessor.CoprocessorService; +import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; +import org.apache.hadoop.hbase.protobuf.ResponseConverter; +import org.apache.hadoop.hbase.regionserver.HRegion; +import org.apache.hadoop.hbase.regionserver.RegionScanner; + +import java.io.IOException; +import java.nio.ByteBuffer; + +/** + * Created by honma on 11/7/14. + */ +public class IIEndpoint extends IIProtos.RowsService + implements Coprocessor, CoprocessorService { + + private RegionCoprocessorEnvironment env; + + public IIEndpoint() { + } + + @Override + public void getRows(RpcController controller, IIProtos.IIRequest request, RpcCallback done) { + IIProtos.IIResponse response = null; + RegionScanner innerScanner = null; + HRegion region = null; + try { + ByteBuffer byteBuffer = request.getTableInfo().asReadOnlyByteBuffer(); + TableRecordInfoDigest tableInfo = TableRecordInfoDigest.deserialize(byteBuffer); + + region = env.getRegion(); + innerScanner = region.getScanner(new Scan()); + region.startRegionOperation(); + + synchronized (innerScanner) { + IIProtos.IIResponse.Builder responseBuilder = IIProtos.IIResponse.newBuilder(); + + IIKeyValueCodec codec = new IIKeyValueCodec(tableInfo); + for (Slice slice : codec.decodeKeyValue(new HbaseServerKVIterator(innerScanner))) { + for (TableRecordBytes recordBytes : slice) { + responseBuilder.addRows(ByteString.copyFrom(recordBytes.getBytes())); + } + } + + response = responseBuilder.build(); + } + + } catch (IOException ioe) { + ResponseConverter.setControllerException(controller, ioe); + } finally { + IOUtils.closeQuietly(innerScanner); + if (region != null) { + try { + region.closeRegionOperation(); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + } + + done.run(response); + } + + @Override + public void start(CoprocessorEnvironment env) throws IOException { + if (env instanceof RegionCoprocessorEnvironment) { + this.env = (RegionCoprocessorEnvironment) env; + } else { + throw new CoprocessorException("Must be loaded on a table region!"); + } + } + + @Override + public void stop(CoprocessorEnvironment env) throws IOException { + } + + @Override + public Service getService() { + return this; + } +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIResponseAdapter.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIResponseAdapter.java new file mode 100644 index 0000000..541981e --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIResponseAdapter.java @@ -0,0 +1,7 @@ +package com.kylinolap.storage.hbase.endpoint; + +/** + * Created by honma on 11/10/14. + */ +public class IIResponseAdapter { +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/ExampleEndpoint.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/ExampleEndpoint.java new file mode 100644 index 0000000..1131a9b --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/ExampleEndpoint.java @@ -0,0 +1,146 @@ +package com.kylinolap.storage.hbase.endpoint.example; + +import com.google.protobuf.RpcCallback; +import com.google.protobuf.RpcController; +import com.google.protobuf.Service; +import com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos; +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.CellUtil; +import org.apache.hadoop.hbase.Coprocessor; +import org.apache.hadoop.hbase.CoprocessorEnvironment; +import org.apache.hadoop.hbase.client.Scan; +import org.apache.hadoop.hbase.coprocessor.CoprocessorException; +import org.apache.hadoop.hbase.coprocessor.CoprocessorService; +import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; +import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter; +import org.apache.hadoop.hbase.protobuf.ResponseConverter; +import org.apache.hadoop.hbase.regionserver.InternalScanner; +import org.apache.hadoop.hbase.util.Bytes; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by honma on 11/3/14. + */ + +public class ExampleEndpoint extends ExampleProtos.RowCountService + implements Coprocessor, CoprocessorService { + private RegionCoprocessorEnvironment env; + + public ExampleEndpoint() { + } + + /** + * Just returns a reference to this object, which implements the RowCounterService interface. + */ + @Override + public Service getService() { + return this; + } + + /** + * Returns a count of the rows in the region where this coprocessor is loaded. + */ + @Override + public void getRowCount(RpcController controller, ExampleProtos.CountRequest request, + RpcCallback done) { + Scan scan = new Scan(); + scan.setFilter(new FirstKeyOnlyFilter()); + ExampleProtos.CountResponse response = null; + InternalScanner scanner = null; + try { + scanner = env.getRegion().getScanner(scan); + List results = new ArrayList(); + boolean hasMore = false; + byte[] lastRow = null; + long count = 0; + do { + hasMore = scanner.next(results); + for (Cell kv : results) { + byte[] currentRow = CellUtil.cloneRow(kv); + if (lastRow == null || !Bytes.equals(lastRow, currentRow)) { + lastRow = currentRow; + count++; + } + } + results.clear(); + } while (hasMore); + + response = ExampleProtos.CountResponse.newBuilder() + .setCount(count).build(); + } catch (IOException ioe) { + ResponseConverter.setControllerException(controller, ioe); + } finally { + if (scanner != null) { + try { + scanner.close(); + } catch (IOException ignored) { + } + } + } + done.run(response); + } + + /** + * Returns a count of all KeyValues in the region where this coprocessor is loaded. + */ + @Override + public void getKeyValueCount(RpcController controller, ExampleProtos.CountRequest request, + RpcCallback done) { + ExampleProtos.CountResponse response = null; + InternalScanner scanner = null; + try { + scanner = env.getRegion().getScanner(new Scan()); + List results = new ArrayList(); + boolean hasMore = false; + long count = 0; + do { + hasMore = scanner.next(results); + for (Cell kv : results) { + count++; + } + results.clear(); + } while (hasMore); + + response = ExampleProtos.CountResponse.newBuilder() + .setCount(count).build(); + } catch (IOException ioe) { + ResponseConverter.setControllerException(controller, ioe); + } finally { + if (scanner != null) { + try { + scanner.close(); + } catch (IOException ignored) { + } + } + } + done.run(response); + } + + /** + * Stores a reference to the coprocessor environment provided by the + * {@link org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost} from the region where this + * coprocessor is loaded. Since this is a coprocessor endpoint, it always expects to be loaded + * on a table region, so always expects this to be an instance of + * {@link RegionCoprocessorEnvironment}. + * + * @param env the environment provided by the coprocessor host + * @throws IOException if the provided environment is not an instance of + * {@code RegionCoprocessorEnvironment} + */ + @Override + public void start(CoprocessorEnvironment env) throws IOException { + if (env instanceof RegionCoprocessorEnvironment) { + this.env = (RegionCoprocessorEnvironment) env; + } else { + throw new CoprocessorException("Must be loaded on a table region!"); + } + } + + @Override + public void stop(CoprocessorEnvironment env) throws IOException { + // nothing to do + } +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/generated/ExampleProtos.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/generated/ExampleProtos.java new file mode 100644 index 0000000..b0e3458 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/generated/ExampleProtos.java @@ -0,0 +1,1148 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: example.proto + +package com.kylinolap.storage.hbase.endpoint.example.generated; + +public final class ExampleProtos { + private ExampleProtos() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface CountRequestOrBuilder + extends com.google.protobuf.MessageOrBuilder { + } + /** + * Protobuf type {@code CountRequest} + */ + public static final class CountRequest extends + com.google.protobuf.GeneratedMessage + implements CountRequestOrBuilder { + // Use CountRequest.newBuilder() to construct. + private CountRequest(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private CountRequest(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final CountRequest defaultInstance; + public static CountRequest getDefaultInstance() { + return defaultInstance; + } + + public CountRequest getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CountRequest( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountRequest_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.class, com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public CountRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CountRequest(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private void initFields() { + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest)) { + return super.equals(obj); + } + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest other = (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest) obj; + + boolean result = true; + result = result && + getUnknownFields().equals(other.getUnknownFields()); + return result; + } + + private int memoizedHashCode = 0; + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptorForType().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code CountRequest} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountRequest_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.class, com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.Builder.class); + } + + // Construct using com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountRequest_descriptor; + } + + public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest getDefaultInstanceForType() { + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.getDefaultInstance(); + } + + public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest build() { + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest buildPartial() { + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest result = new com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest(this); + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest) { + return mergeFrom((com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest other) { + if (other == com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.getDefaultInstance()) return this; + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + // @@protoc_insertion_point(builder_scope:CountRequest) + } + + static { + defaultInstance = new CountRequest(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:CountRequest) + } + + public interface CountResponseOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // required int64 count = 1 [default = 0]; + /** + * required int64 count = 1 [default = 0]; + */ + boolean hasCount(); + /** + * required int64 count = 1 [default = 0]; + */ + long getCount(); + } + /** + * Protobuf type {@code CountResponse} + */ + public static final class CountResponse extends + com.google.protobuf.GeneratedMessage + implements CountResponseOrBuilder { + // Use CountResponse.newBuilder() to construct. + private CountResponse(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private CountResponse(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final CountResponse defaultInstance; + public static CountResponse getDefaultInstance() { + return defaultInstance; + } + + public CountResponse getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CountResponse( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + count_ = input.readInt64(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountResponse_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.class, com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public CountResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CountResponse(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // required int64 count = 1 [default = 0]; + public static final int COUNT_FIELD_NUMBER = 1; + private long count_; + /** + * required int64 count = 1 [default = 0]; + */ + public boolean hasCount() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required int64 count = 1 [default = 0]; + */ + public long getCount() { + return count_; + } + + private void initFields() { + count_ = 0L; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + if (!hasCount()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeInt64(1, count_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(1, count_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse)) { + return super.equals(obj); + } + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse other = (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse) obj; + + boolean result = true; + result = result && (hasCount() == other.hasCount()); + if (hasCount()) { + result = result && (getCount() + == other.getCount()); + } + result = result && + getUnknownFields().equals(other.getUnknownFields()); + return result; + } + + private int memoizedHashCode = 0; + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptorForType().hashCode(); + if (hasCount()) { + hash = (37 * hash) + COUNT_FIELD_NUMBER; + hash = (53 * hash) + hashLong(getCount()); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code CountResponse} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountResponse_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.class, com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.Builder.class); + } + + // Construct using com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + count_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountResponse_descriptor; + } + + public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse getDefaultInstanceForType() { + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance(); + } + + public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse build() { + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse buildPartial() { + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse result = new com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.count_ = count_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse) { + return mergeFrom((com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse other) { + if (other == com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance()) return this; + if (other.hasCount()) { + setCount(other.getCount()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasCount()) { + + return false; + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // required int64 count = 1 [default = 0]; + private long count_ ; + /** + * required int64 count = 1 [default = 0]; + */ + public boolean hasCount() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required int64 count = 1 [default = 0]; + */ + public long getCount() { + return count_; + } + /** + * required int64 count = 1 [default = 0]; + */ + public Builder setCount(long value) { + bitField0_ |= 0x00000001; + count_ = value; + onChanged(); + return this; + } + /** + * required int64 count = 1 [default = 0]; + */ + public Builder clearCount() { + bitField0_ = (bitField0_ & ~0x00000001); + count_ = 0L; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:CountResponse) + } + + static { + defaultInstance = new CountResponse(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:CountResponse) + } + + /** + * Protobuf service {@code RowCountService} + */ + public static abstract class RowCountService + implements com.google.protobuf.Service { + protected RowCountService() {} + + public interface Interface { + /** + * rpc getRowCount(.CountRequest) returns (.CountResponse); + */ + public abstract void getRowCount( + com.google.protobuf.RpcController controller, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request, + com.google.protobuf.RpcCallback done); + + /** + * rpc getKeyValueCount(.CountRequest) returns (.CountResponse); + */ + public abstract void getKeyValueCount( + com.google.protobuf.RpcController controller, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request, + com.google.protobuf.RpcCallback done); + + } + + public static com.google.protobuf.Service newReflectiveService( + final Interface impl) { + return new RowCountService() { + @java.lang.Override + public void getRowCount( + com.google.protobuf.RpcController controller, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request, + com.google.protobuf.RpcCallback done) { + impl.getRowCount(controller, request, done); + } + + @java.lang.Override + public void getKeyValueCount( + com.google.protobuf.RpcController controller, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request, + com.google.protobuf.RpcCallback done) { + impl.getKeyValueCount(controller, request, done); + } + + }; + } + + public static com.google.protobuf.BlockingService + newReflectiveBlockingService(final BlockingInterface impl) { + return new com.google.protobuf.BlockingService() { + public final com.google.protobuf.Descriptors.ServiceDescriptor + getDescriptorForType() { + return getDescriptor(); + } + + public final com.google.protobuf.Message callBlockingMethod( + com.google.protobuf.Descriptors.MethodDescriptor method, + com.google.protobuf.RpcController controller, + com.google.protobuf.Message request) + throws com.google.protobuf.ServiceException { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.callBlockingMethod() given method descriptor for " + + "wrong service type."); + } + switch(method.getIndex()) { + case 0: + return impl.getRowCount(controller, (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest)request); + case 1: + return impl.getKeyValueCount(controller, (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest)request); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public final com.google.protobuf.Message + getRequestPrototype( + com.google.protobuf.Descriptors.MethodDescriptor method) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.getRequestPrototype() given method " + + "descriptor for wrong service type."); + } + switch(method.getIndex()) { + case 0: + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.getDefaultInstance(); + case 1: + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.getDefaultInstance(); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public final com.google.protobuf.Message + getResponsePrototype( + com.google.protobuf.Descriptors.MethodDescriptor method) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.getResponsePrototype() given method " + + "descriptor for wrong service type."); + } + switch(method.getIndex()) { + case 0: + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance(); + case 1: + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance(); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + }; + } + + /** + * rpc getRowCount(.CountRequest) returns (.CountResponse); + */ + public abstract void getRowCount( + com.google.protobuf.RpcController controller, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request, + com.google.protobuf.RpcCallback done); + + /** + * rpc getKeyValueCount(.CountRequest) returns (.CountResponse); + */ + public abstract void getKeyValueCount( + com.google.protobuf.RpcController controller, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request, + com.google.protobuf.RpcCallback done); + + public static final + com.google.protobuf.Descriptors.ServiceDescriptor + getDescriptor() { + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.getDescriptor().getServices().get(0); + } + public final com.google.protobuf.Descriptors.ServiceDescriptor + getDescriptorForType() { + return getDescriptor(); + } + + public final void callMethod( + com.google.protobuf.Descriptors.MethodDescriptor method, + com.google.protobuf.RpcController controller, + com.google.protobuf.Message request, + com.google.protobuf.RpcCallback< + com.google.protobuf.Message> done) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.callMethod() given method descriptor for wrong " + + "service type."); + } + switch(method.getIndex()) { + case 0: + this.getRowCount(controller, (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest)request, + com.google.protobuf.RpcUtil.specializeCallback( + done)); + return; + case 1: + this.getKeyValueCount(controller, (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest)request, + com.google.protobuf.RpcUtil.specializeCallback( + done)); + return; + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public final com.google.protobuf.Message + getRequestPrototype( + com.google.protobuf.Descriptors.MethodDescriptor method) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.getRequestPrototype() given method " + + "descriptor for wrong service type."); + } + switch(method.getIndex()) { + case 0: + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.getDefaultInstance(); + case 1: + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.getDefaultInstance(); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public final com.google.protobuf.Message + getResponsePrototype( + com.google.protobuf.Descriptors.MethodDescriptor method) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.getResponsePrototype() given method " + + "descriptor for wrong service type."); + } + switch(method.getIndex()) { + case 0: + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance(); + case 1: + return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance(); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public static Stub newStub( + com.google.protobuf.RpcChannel channel) { + return new Stub(channel); + } + + public static final class Stub extends com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.RowCountService implements Interface { + private Stub(com.google.protobuf.RpcChannel channel) { + this.channel = channel; + } + + private final com.google.protobuf.RpcChannel channel; + + public com.google.protobuf.RpcChannel getChannel() { + return channel; + } + + public void getRowCount( + com.google.protobuf.RpcController controller, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request, + com.google.protobuf.RpcCallback done) { + channel.callMethod( + getDescriptor().getMethods().get(0), + controller, + request, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance(), + com.google.protobuf.RpcUtil.generalizeCallback( + done, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.class, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance())); + } + + public void getKeyValueCount( + com.google.protobuf.RpcController controller, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request, + com.google.protobuf.RpcCallback done) { + channel.callMethod( + getDescriptor().getMethods().get(1), + controller, + request, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance(), + com.google.protobuf.RpcUtil.generalizeCallback( + done, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.class, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance())); + } + } + + public static BlockingInterface newBlockingStub( + com.google.protobuf.BlockingRpcChannel channel) { + return new BlockingStub(channel); + } + + public interface BlockingInterface { + public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse getRowCount( + com.google.protobuf.RpcController controller, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request) + throws com.google.protobuf.ServiceException; + + public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse getKeyValueCount( + com.google.protobuf.RpcController controller, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request) + throws com.google.protobuf.ServiceException; + } + + private static final class BlockingStub implements BlockingInterface { + private BlockingStub(com.google.protobuf.BlockingRpcChannel channel) { + this.channel = channel; + } + + private final com.google.protobuf.BlockingRpcChannel channel; + + public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse getRowCount( + com.google.protobuf.RpcController controller, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request) + throws com.google.protobuf.ServiceException { + return (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse) channel.callBlockingMethod( + getDescriptor().getMethods().get(0), + controller, + request, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance()); + } + + + public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse getKeyValueCount( + com.google.protobuf.RpcController controller, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request) + throws com.google.protobuf.ServiceException { + return (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse) channel.callBlockingMethod( + getDescriptor().getMethods().get(1), + controller, + request, + com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance()); + } + + } + + // @@protoc_insertion_point(class_scope:RowCountService) + } + + private static com.google.protobuf.Descriptors.Descriptor + internal_static_CountRequest_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_CountRequest_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_CountResponse_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_CountResponse_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\rexample.proto\"\016\n\014CountRequest\"!\n\rCount" + + "Response\022\020\n\005count\030\001 \002(\003:\00102r\n\017RowCountSe" + + "rvice\022,\n\013getRowCount\022\r.CountRequest\032\016.Co" + + "untResponse\0221\n\020getKeyValueCount\022\r.CountR" + + "equest\032\016.CountResponseBR\n9com.kylinolap." + + "storage.hbase.coprocessor.example.genera" + + "tedB\rExampleProtosH\001\210\001\001\240\001\001" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + internal_static_CountRequest_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_CountRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_CountRequest_descriptor, + new java.lang.String[] { }); + internal_static_CountResponse_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_CountResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_CountResponse_descriptor, + new java.lang.String[] { "Count", }); + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/generated/NodeProtos.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/generated/NodeProtos.java new file mode 100644 index 0000000..923fd8f --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/generated/NodeProtos.java @@ -0,0 +1,938 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: Node.proto + +package com.kylinolap.storage.hbase.endpoint.example.generated; + +public final class NodeProtos { + private NodeProtos() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface NodeOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // required string name = 1; + /** + * required string name = 1; + */ + boolean hasName(); + /** + * required string name = 1; + */ + java.lang.String getName(); + /** + * required string name = 1; + */ + com.google.protobuf.ByteString + getNameBytes(); + + // optional .Node left = 2; + /** + * optional .Node left = 2; + */ + boolean hasLeft(); + /** + * optional .Node left = 2; + */ + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node getLeft(); + /** + * optional .Node left = 2; + */ + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder getLeftOrBuilder(); + + // optional .Node right = 3; + /** + * optional .Node right = 3; + */ + boolean hasRight(); + /** + * optional .Node right = 3; + */ + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node getRight(); + /** + * optional .Node right = 3; + */ + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder getRightOrBuilder(); + } + /** + * Protobuf type {@code Node} + */ + public static final class Node extends + com.google.protobuf.GeneratedMessage + implements NodeOrBuilder { + // Use Node.newBuilder() to construct. + private Node(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Node(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Node defaultInstance; + public static Node getDefaultInstance() { + return defaultInstance; + } + + public Node getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Node( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + name_ = input.readBytes(); + break; + } + case 18: { + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + subBuilder = left_.toBuilder(); + } + left_ = input.readMessage(com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(left_); + left_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + case 26: { + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + subBuilder = right_.toBuilder(); + } + right_ = input.readMessage(com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(right_); + right_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.internal_static_Node_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.internal_static_Node_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.class, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Node parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Node(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // required string name = 1; + public static final int NAME_FIELD_NUMBER = 1; + private java.lang.Object name_; + /** + * required string name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required string name = 1; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + * required string name = 1; + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional .Node left = 2; + public static final int LEFT_FIELD_NUMBER = 2; + private com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node left_; + /** + * optional .Node left = 2; + */ + public boolean hasLeft() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .Node left = 2; + */ + public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node getLeft() { + return left_; + } + /** + * optional .Node left = 2; + */ + public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder getLeftOrBuilder() { + return left_; + } + + // optional .Node right = 3; + public static final int RIGHT_FIELD_NUMBER = 3; + private com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node right_; + /** + * optional .Node right = 3; + */ + public boolean hasRight() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .Node right = 3; + */ + public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node getRight() { + return right_; + } + /** + * optional .Node right = 3; + */ + public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder getRightOrBuilder() { + return right_; + } + + private void initFields() { + name_ = ""; + left_ = com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance(); + right_ = com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + if (!hasName()) { + memoizedIsInitialized = 0; + return false; + } + if (hasLeft()) { + if (!getLeft().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasRight()) { + if (!getRight().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeMessage(2, left_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeMessage(3, right_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, left_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, right_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Node} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.internal_static_Node_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.internal_static_Node_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.class, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder.class); + } + + // Construct using com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getLeftFieldBuilder(); + getRightFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + if (leftBuilder_ == null) { + left_ = com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance(); + } else { + leftBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + if (rightBuilder_ == null) { + right_ = com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance(); + } else { + rightBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.internal_static_Node_descriptor; + } + + public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node getDefaultInstanceForType() { + return com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance(); + } + + public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node build() { + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node buildPartial() { + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node result = new com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.name_ = name_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + if (leftBuilder_ == null) { + result.left_ = left_; + } else { + result.left_ = leftBuilder_.build(); + } + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + if (rightBuilder_ == null) { + result.right_ = right_; + } else { + result.right_ = rightBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node) { + return mergeFrom((com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node other) { + if (other == com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance()) return this; + if (other.hasName()) { + bitField0_ |= 0x00000001; + name_ = other.name_; + onChanged(); + } + if (other.hasLeft()) { + mergeLeft(other.getLeft()); + } + if (other.hasRight()) { + mergeRight(other.getRight()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasName()) { + + return false; + } + if (hasLeft()) { + if (!getLeft().isInitialized()) { + + return false; + } + } + if (hasRight()) { + if (!getRight().isInitialized()) { + + return false; + } + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // required string name = 1; + private java.lang.Object name_ = ""; + /** + * required string name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required string name = 1; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + java.lang.String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + name_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string name = 1; + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * required string name = 1; + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + /** + * required string name = 1; + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000001); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * required string name = 1; + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + + // optional .Node left = 2; + private com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node left_ = com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder> leftBuilder_; + /** + * optional .Node left = 2; + */ + public boolean hasLeft() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .Node left = 2; + */ + public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node getLeft() { + if (leftBuilder_ == null) { + return left_; + } else { + return leftBuilder_.getMessage(); + } + } + /** + * optional .Node left = 2; + */ + public Builder setLeft(com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node value) { + if (leftBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + left_ = value; + onChanged(); + } else { + leftBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .Node left = 2; + */ + public Builder setLeft( + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder builderForValue) { + if (leftBuilder_ == null) { + left_ = builderForValue.build(); + onChanged(); + } else { + leftBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .Node left = 2; + */ + public Builder mergeLeft(com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node value) { + if (leftBuilder_ == null) { + if (((bitField0_ & 0x00000002) == 0x00000002) && + left_ != com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance()) { + left_ = + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.newBuilder(left_).mergeFrom(value).buildPartial(); + } else { + left_ = value; + } + onChanged(); + } else { + leftBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .Node left = 2; + */ + public Builder clearLeft() { + if (leftBuilder_ == null) { + left_ = com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance(); + onChanged(); + } else { + leftBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + * optional .Node left = 2; + */ + public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder getLeftBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getLeftFieldBuilder().getBuilder(); + } + /** + * optional .Node left = 2; + */ + public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder getLeftOrBuilder() { + if (leftBuilder_ != null) { + return leftBuilder_.getMessageOrBuilder(); + } else { + return left_; + } + } + /** + * optional .Node left = 2; + */ + private com.google.protobuf.SingleFieldBuilder< + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder> + getLeftFieldBuilder() { + if (leftBuilder_ == null) { + leftBuilder_ = new com.google.protobuf.SingleFieldBuilder< + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder>( + left_, + getParentForChildren(), + isClean()); + left_ = null; + } + return leftBuilder_; + } + + // optional .Node right = 3; + private com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node right_ = com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder> rightBuilder_; + /** + * optional .Node right = 3; + */ + public boolean hasRight() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .Node right = 3; + */ + public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node getRight() { + if (rightBuilder_ == null) { + return right_; + } else { + return rightBuilder_.getMessage(); + } + } + /** + * optional .Node right = 3; + */ + public Builder setRight(com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node value) { + if (rightBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + right_ = value; + onChanged(); + } else { + rightBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .Node right = 3; + */ + public Builder setRight( + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder builderForValue) { + if (rightBuilder_ == null) { + right_ = builderForValue.build(); + onChanged(); + } else { + rightBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .Node right = 3; + */ + public Builder mergeRight(com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node value) { + if (rightBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004) && + right_ != com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance()) { + right_ = + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.newBuilder(right_).mergeFrom(value).buildPartial(); + } else { + right_ = value; + } + onChanged(); + } else { + rightBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .Node right = 3; + */ + public Builder clearRight() { + if (rightBuilder_ == null) { + right_ = com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance(); + onChanged(); + } else { + rightBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + * optional .Node right = 3; + */ + public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder getRightBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getRightFieldBuilder().getBuilder(); + } + /** + * optional .Node right = 3; + */ + public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder getRightOrBuilder() { + if (rightBuilder_ != null) { + return rightBuilder_.getMessageOrBuilder(); + } else { + return right_; + } + } + /** + * optional .Node right = 3; + */ + private com.google.protobuf.SingleFieldBuilder< + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder> + getRightFieldBuilder() { + if (rightBuilder_ == null) { + rightBuilder_ = new com.google.protobuf.SingleFieldBuilder< + com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder>( + right_, + getParentForChildren(), + isClean()); + right_ = null; + } + return rightBuilder_; + } + + // @@protoc_insertion_point(builder_scope:Node) + } + + static { + defaultInstance = new Node(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:Node) + } + + private static com.google.protobuf.Descriptors.Descriptor + internal_static_Node_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_Node_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\nNode.proto\"?\n\004Node\022\014\n\004name\030\001 \002(\t\022\023\n\004le" + + "ft\030\002 \001(\0132\005.Node\022\024\n\005right\030\003 \001(\0132\005.NodeBG\n" + + "9com.kylinolap.storage.hbase.coprocessor" + + ".example.generatedB\nNodeProtos" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + internal_static_Node_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Node_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_Node_descriptor, + new java.lang.String[] { "Name", "Left", "Right", }); + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/generated/IIProtos.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/generated/IIProtos.java new file mode 100644 index 0000000..fd6bd52 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/generated/IIProtos.java @@ -0,0 +1,1237 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: II.proto + +package com.kylinolap.storage.hbase.endpoint.generated; + +public final class IIProtos { + private IIProtos() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface IIRequestOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // required bytes tableInfo = 1; + /** + * required bytes tableInfo = 1; + */ + boolean hasTableInfo(); + /** + * required bytes tableInfo = 1; + */ + com.google.protobuf.ByteString getTableInfo(); + } + /** + * Protobuf type {@code IIRequest} + */ + public static final class IIRequest extends + com.google.protobuf.GeneratedMessage + implements IIRequestOrBuilder { + // Use IIRequest.newBuilder() to construct. + private IIRequest(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private IIRequest(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final IIRequest defaultInstance; + public static IIRequest getDefaultInstance() { + return defaultInstance; + } + + public IIRequest getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private IIRequest( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + tableInfo_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIRequest_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.class, com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public IIRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new IIRequest(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // required bytes tableInfo = 1; + public static final int TABLEINFO_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString tableInfo_; + /** + * required bytes tableInfo = 1; + */ + public boolean hasTableInfo() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required bytes tableInfo = 1; + */ + public com.google.protobuf.ByteString getTableInfo() { + return tableInfo_; + } + + private void initFields() { + tableInfo_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + if (!hasTableInfo()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, tableInfo_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, tableInfo_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest)) { + return super.equals(obj); + } + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest other = (com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest) obj; + + boolean result = true; + result = result && (hasTableInfo() == other.hasTableInfo()); + if (hasTableInfo()) { + result = result && getTableInfo() + .equals(other.getTableInfo()); + } + result = result && + getUnknownFields().equals(other.getUnknownFields()); + return result; + } + + private int memoizedHashCode = 0; + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptorForType().hashCode(); + if (hasTableInfo()) { + hash = (37 * hash) + TABLEINFO_FIELD_NUMBER; + hash = (53 * hash) + getTableInfo().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code IIRequest} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIRequest_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.class, com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.Builder.class); + } + + // Construct using com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + tableInfo_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIRequest_descriptor; + } + + public com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest getDefaultInstanceForType() { + return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.getDefaultInstance(); + } + + public com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest build() { + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest buildPartial() { + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest result = new com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.tableInfo_ = tableInfo_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest) { + return mergeFrom((com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest other) { + if (other == com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.getDefaultInstance()) return this; + if (other.hasTableInfo()) { + setTableInfo(other.getTableInfo()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasTableInfo()) { + + return false; + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // required bytes tableInfo = 1; + private com.google.protobuf.ByteString tableInfo_ = com.google.protobuf.ByteString.EMPTY; + /** + * required bytes tableInfo = 1; + */ + public boolean hasTableInfo() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required bytes tableInfo = 1; + */ + public com.google.protobuf.ByteString getTableInfo() { + return tableInfo_; + } + /** + * required bytes tableInfo = 1; + */ + public Builder setTableInfo(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + tableInfo_ = value; + onChanged(); + return this; + } + /** + * required bytes tableInfo = 1; + */ + public Builder clearTableInfo() { + bitField0_ = (bitField0_ & ~0x00000001); + tableInfo_ = getDefaultInstance().getTableInfo(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:IIRequest) + } + + static { + defaultInstance = new IIRequest(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:IIRequest) + } + + public interface IIResponseOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // repeated bytes rows = 1; + /** + * repeated bytes rows = 1; + */ + java.util.List getRowsList(); + /** + * repeated bytes rows = 1; + */ + int getRowsCount(); + /** + * repeated bytes rows = 1; + */ + com.google.protobuf.ByteString getRows(int index); + } + /** + * Protobuf type {@code IIResponse} + */ + public static final class IIResponse extends + com.google.protobuf.GeneratedMessage + implements IIResponseOrBuilder { + // Use IIResponse.newBuilder() to construct. + private IIResponse(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private IIResponse(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final IIResponse defaultInstance; + public static IIResponse getDefaultInstance() { + return defaultInstance; + } + + public IIResponse getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private IIResponse( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + rows_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + rows_.add(input.readBytes()); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + rows_ = java.util.Collections.unmodifiableList(rows_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIResponse_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.class, com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public IIResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new IIResponse(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + // repeated bytes rows = 1; + public static final int ROWS_FIELD_NUMBER = 1; + private java.util.List rows_; + /** + * repeated bytes rows = 1; + */ + public java.util.List + getRowsList() { + return rows_; + } + /** + * repeated bytes rows = 1; + */ + public int getRowsCount() { + return rows_.size(); + } + /** + * repeated bytes rows = 1; + */ + public com.google.protobuf.ByteString getRows(int index) { + return rows_.get(index); + } + + private void initFields() { + rows_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + for (int i = 0; i < rows_.size(); i++) { + output.writeBytes(1, rows_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + { + int dataSize = 0; + for (int i = 0; i < rows_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeBytesSizeNoTag(rows_.get(i)); + } + size += dataSize; + size += 1 * getRowsList().size(); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse)) { + return super.equals(obj); + } + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse other = (com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse) obj; + + boolean result = true; + result = result && getRowsList() + .equals(other.getRowsList()); + result = result && + getUnknownFields().equals(other.getUnknownFields()); + return result; + } + + private int memoizedHashCode = 0; + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptorForType().hashCode(); + if (getRowsCount() > 0) { + hash = (37 * hash) + ROWS_FIELD_NUMBER; + hash = (53 * hash) + getRowsList().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code IIResponse} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIResponse_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.class, com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.Builder.class); + } + + // Construct using com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + rows_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIResponse_descriptor; + } + + public com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse getDefaultInstanceForType() { + return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.getDefaultInstance(); + } + + public com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse build() { + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse buildPartial() { + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse result = new com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse(this); + int from_bitField0_ = bitField0_; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + rows_ = java.util.Collections.unmodifiableList(rows_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.rows_ = rows_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse) { + return mergeFrom((com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse other) { + if (other == com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.getDefaultInstance()) return this; + if (!other.rows_.isEmpty()) { + if (rows_.isEmpty()) { + rows_ = other.rows_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureRowsIsMutable(); + rows_.addAll(other.rows_); + } + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // repeated bytes rows = 1; + private java.util.List rows_ = java.util.Collections.emptyList(); + private void ensureRowsIsMutable() { + if (!((bitField0_ & 0x00000001) == 0x00000001)) { + rows_ = new java.util.ArrayList(rows_); + bitField0_ |= 0x00000001; + } + } + /** + * repeated bytes rows = 1; + */ + public java.util.List + getRowsList() { + return java.util.Collections.unmodifiableList(rows_); + } + /** + * repeated bytes rows = 1; + */ + public int getRowsCount() { + return rows_.size(); + } + /** + * repeated bytes rows = 1; + */ + public com.google.protobuf.ByteString getRows(int index) { + return rows_.get(index); + } + /** + * repeated bytes rows = 1; + */ + public Builder setRows( + int index, com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureRowsIsMutable(); + rows_.set(index, value); + onChanged(); + return this; + } + /** + * repeated bytes rows = 1; + */ + public Builder addRows(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureRowsIsMutable(); + rows_.add(value); + onChanged(); + return this; + } + /** + * repeated bytes rows = 1; + */ + public Builder addAllRows( + java.lang.Iterable values) { + ensureRowsIsMutable(); + super.addAll(values, rows_); + onChanged(); + return this; + } + /** + * repeated bytes rows = 1; + */ + public Builder clearRows() { + rows_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:IIResponse) + } + + static { + defaultInstance = new IIResponse(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:IIResponse) + } + + /** + * Protobuf service {@code RowsService} + */ + public static abstract class RowsService + implements com.google.protobuf.Service { + protected RowsService() {} + + public interface Interface { + /** + * rpc getRows(.IIRequest) returns (.IIResponse); + */ + public abstract void getRows( + com.google.protobuf.RpcController controller, + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest request, + com.google.protobuf.RpcCallback done); + + } + + public static com.google.protobuf.Service newReflectiveService( + final Interface impl) { + return new RowsService() { + @java.lang.Override + public void getRows( + com.google.protobuf.RpcController controller, + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest request, + com.google.protobuf.RpcCallback done) { + impl.getRows(controller, request, done); + } + + }; + } + + public static com.google.protobuf.BlockingService + newReflectiveBlockingService(final BlockingInterface impl) { + return new com.google.protobuf.BlockingService() { + public final com.google.protobuf.Descriptors.ServiceDescriptor + getDescriptorForType() { + return getDescriptor(); + } + + public final com.google.protobuf.Message callBlockingMethod( + com.google.protobuf.Descriptors.MethodDescriptor method, + com.google.protobuf.RpcController controller, + com.google.protobuf.Message request) + throws com.google.protobuf.ServiceException { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.callBlockingMethod() given method descriptor for " + + "wrong service type."); + } + switch(method.getIndex()) { + case 0: + return impl.getRows(controller, (com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest)request); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public final com.google.protobuf.Message + getRequestPrototype( + com.google.protobuf.Descriptors.MethodDescriptor method) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.getRequestPrototype() given method " + + "descriptor for wrong service type."); + } + switch(method.getIndex()) { + case 0: + return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.getDefaultInstance(); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public final com.google.protobuf.Message + getResponsePrototype( + com.google.protobuf.Descriptors.MethodDescriptor method) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.getResponsePrototype() given method " + + "descriptor for wrong service type."); + } + switch(method.getIndex()) { + case 0: + return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.getDefaultInstance(); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + }; + } + + /** + * rpc getRows(.IIRequest) returns (.IIResponse); + */ + public abstract void getRows( + com.google.protobuf.RpcController controller, + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest request, + com.google.protobuf.RpcCallback done); + + public static final + com.google.protobuf.Descriptors.ServiceDescriptor + getDescriptor() { + return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.getDescriptor().getServices().get(0); + } + public final com.google.protobuf.Descriptors.ServiceDescriptor + getDescriptorForType() { + return getDescriptor(); + } + + public final void callMethod( + com.google.protobuf.Descriptors.MethodDescriptor method, + com.google.protobuf.RpcController controller, + com.google.protobuf.Message request, + com.google.protobuf.RpcCallback< + com.google.protobuf.Message> done) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.callMethod() given method descriptor for wrong " + + "service type."); + } + switch(method.getIndex()) { + case 0: + this.getRows(controller, (com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest)request, + com.google.protobuf.RpcUtil.specializeCallback( + done)); + return; + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public final com.google.protobuf.Message + getRequestPrototype( + com.google.protobuf.Descriptors.MethodDescriptor method) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.getRequestPrototype() given method " + + "descriptor for wrong service type."); + } + switch(method.getIndex()) { + case 0: + return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.getDefaultInstance(); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public final com.google.protobuf.Message + getResponsePrototype( + com.google.protobuf.Descriptors.MethodDescriptor method) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.getResponsePrototype() given method " + + "descriptor for wrong service type."); + } + switch(method.getIndex()) { + case 0: + return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.getDefaultInstance(); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public static Stub newStub( + com.google.protobuf.RpcChannel channel) { + return new Stub(channel); + } + + public static final class Stub extends com.kylinolap.storage.hbase.endpoint.generated.IIProtos.RowsService implements Interface { + private Stub(com.google.protobuf.RpcChannel channel) { + this.channel = channel; + } + + private final com.google.protobuf.RpcChannel channel; + + public com.google.protobuf.RpcChannel getChannel() { + return channel; + } + + public void getRows( + com.google.protobuf.RpcController controller, + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest request, + com.google.protobuf.RpcCallback done) { + channel.callMethod( + getDescriptor().getMethods().get(0), + controller, + request, + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.getDefaultInstance(), + com.google.protobuf.RpcUtil.generalizeCallback( + done, + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.class, + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.getDefaultInstance())); + } + } + + public static BlockingInterface newBlockingStub( + com.google.protobuf.BlockingRpcChannel channel) { + return new BlockingStub(channel); + } + + public interface BlockingInterface { + public com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse getRows( + com.google.protobuf.RpcController controller, + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest request) + throws com.google.protobuf.ServiceException; + } + + private static final class BlockingStub implements BlockingInterface { + private BlockingStub(com.google.protobuf.BlockingRpcChannel channel) { + this.channel = channel; + } + + private final com.google.protobuf.BlockingRpcChannel channel; + + public com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse getRows( + com.google.protobuf.RpcController controller, + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest request) + throws com.google.protobuf.ServiceException { + return (com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse) channel.callBlockingMethod( + getDescriptor().getMethods().get(0), + controller, + request, + com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.getDefaultInstance()); + } + + } + + // @@protoc_insertion_point(class_scope:RowsService) + } + + private static com.google.protobuf.Descriptors.Descriptor + internal_static_IIRequest_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_IIRequest_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_IIResponse_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_IIResponse_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\010II.proto\"\036\n\tIIRequest\022\021\n\ttableInfo\030\001 \002" + + "(\014\"\032\n\nIIResponse\022\014\n\004rows\030\001 \003(\01421\n\013RowsSe" + + "rvice\022\"\n\007getRows\022\n.IIRequest\032\013.IIRespons" + + "eBE\n1com.kylinolap.storage.hbase.coproce" + + "ssor.generatedB\010IIProtosH\001\210\001\001\240\001\001" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + internal_static_IIRequest_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_IIRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_IIRequest_descriptor, + new java.lang.String[] { "TableInfo", }); + internal_static_IIResponse_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_IIResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_IIResponse_descriptor, + new java.lang.String[] { "Rows", }); + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/InvertedIndexHBaseTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/InvertedIndexHBaseTest.java index c6b2811..46ec3cc 100644 --- a/storage/src/test/java/com/kylinolap/storage/hbase/InvertedIndexHBaseTest.java +++ b/storage/src/test/java/com/kylinolap/storage/hbase/InvertedIndexHBaseTest.java @@ -23,7 +23,7 @@ import com.google.protobuf.ByteString; import com.kylinolap.cube.invertedindex.*; -import com.kylinolap.storage.hbase.coprocessor.generated.IIProtos; +import com.kylinolap.storage.hbase.endpoint.generated.IIProtos; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.client.coprocessor.Batch; diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/ExampleEndpointTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/ExampleEndpointTest.java deleted file mode 100644 index 7c2b2e4..0000000 --- a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/ExampleEndpointTest.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.kylinolap.storage.hbase.coprocessor; - -import com.kylinolap.storage.hbase.coprocessor.example.ExampleEndpoint; -import com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos; -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.hbase.HBaseTestingUtility; -import org.apache.hadoop.hbase.TableName; -import org.apache.hadoop.hbase.client.HConnection; -import org.apache.hadoop.hbase.client.HConnectionManager; -import org.apache.hadoop.hbase.client.HTableInterface; -import org.apache.hadoop.hbase.client.Put; -import org.apache.hadoop.hbase.client.coprocessor.Batch; -import org.apache.hadoop.hbase.coprocessor.CoprocessorHost; -import org.apache.hadoop.hbase.ipc.BlockingRpcCallback; -import org.apache.hadoop.hbase.ipc.ServerRpcController; -import org.apache.hadoop.hbase.util.Bytes; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Ignore; -import org.junit.Test; - -import java.io.IOException; -import java.util.Iterator; -import java.util.Map; - -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertNotNull; - -/** - * Created by honma on 11/3/14. - */ -@Ignore -public class ExampleEndpointTest { - private static final TableName TEST_TABLE = TableName.valueOf("testrowcounter"); - private static final byte[] TEST_FAMILY = Bytes.toBytes("f"); - private static final byte[] TEST_COLUMN = Bytes.toBytes("col"); - - private static HBaseTestingUtility TEST_UTIL = null; - private static Configuration CONF = null; - - @BeforeClass - public static void setupBeforeClass() throws Exception { - TEST_UTIL = new HBaseTestingUtility(); - CONF = TEST_UTIL.getConfiguration(); - CONF.setStrings(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, - ExampleEndpoint.class.getName()); - - TEST_UTIL.startMiniCluster(); - TEST_UTIL.createTable(TEST_TABLE, new byte[][] { TEST_FAMILY }); - - } - - @AfterClass - public static void tearDownAfterClass() throws Exception { - TEST_UTIL.shutdownMiniCluster(); - } - - @Test - public void testEndpoint() throws Throwable { - - HConnection connection = HConnectionManager.createConnection(CONF); - HTableInterface table = connection.getTable(TEST_TABLE); - - // insert some test rows - for (int i = 0; i < 5; i++) { - byte[] iBytes = Bytes.toBytes(i); - Put p = new Put(iBytes); - p.add(TEST_FAMILY, TEST_COLUMN, iBytes); - table.put(p); - } - - final ExampleProtos.CountRequest request = ExampleProtos.CountRequest.getDefaultInstance(); - Map results = table.coprocessorService(ExampleProtos.RowCountService.class, - null, null, - new Batch.Call() { - public Long call(ExampleProtos.RowCountService counter) throws IOException { - ServerRpcController controller = new ServerRpcController(); - BlockingRpcCallback rpcCallback = - new BlockingRpcCallback(); - counter.getRowCount(controller, request, rpcCallback); - ExampleProtos.CountResponse response = rpcCallback.get(); - if (controller.failedOnException()) { - throw controller.getFailedOn(); - } - return (response != null && response.hasCount()) ? response.getCount() : 0; - } - }); - // should be one region with results - assertEquals(1, results.size()); - Iterator iter = results.values().iterator(); - Long val = iter.next(); - assertNotNull(val); - assertEquals(5l, val.longValue()); - } - - -} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/ProtobufTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/ProtobufTest.java deleted file mode 100644 index f149012..0000000 --- a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/ProtobufTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.kylinolap.storage.hbase.coprocessor; - -import com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos; -import org.junit.Assert; -import org.junit.Test; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; - -/** - * Created by honma on 11/6/14. - */ -public class ProtobufTest { - - @Test - public void testRecursive() throws IOException { - - - NodeProtos.Node node = NodeProtos.Node.newBuilder().setName("root"). - setLeft( - NodeProtos.Node.newBuilder().setName("L1 left"). - setLeft( - NodeProtos.Node.newBuilder().setName("L2 left most"))). - setRight( - NodeProtos.Node.newBuilder().setName("L1 right"). - setRight( - NodeProtos.Node.newBuilder().setName("L2 right most"))).build(); - - File a = File.createTempFile("dfsd", "fdsfsd"); - FileOutputStream outputStream = new FileOutputStream(a); - node.writeTo(outputStream); - outputStream.close(); - - FileInputStream inputStream = new FileInputStream(a); - NodeProtos.Node newNode = NodeProtos.Node.parseFrom(inputStream); - Assert.assertEquals(newNode.getLeft().getLeft().getName(), "L2 left most"); - - } -} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/endpoint/ExampleEndpointTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/endpoint/ExampleEndpointTest.java new file mode 100644 index 0000000..444c4bb --- /dev/null +++ b/storage/src/test/java/com/kylinolap/storage/hbase/endpoint/ExampleEndpointTest.java @@ -0,0 +1,97 @@ +package com.kylinolap.storage.hbase.endpoint; + +import com.kylinolap.storage.hbase.endpoint.example.ExampleEndpoint; +import com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.HBaseTestingUtility; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.HConnection; +import org.apache.hadoop.hbase.client.HConnectionManager; +import org.apache.hadoop.hbase.client.HTableInterface; +import org.apache.hadoop.hbase.client.Put; +import org.apache.hadoop.hbase.client.coprocessor.Batch; +import org.apache.hadoop.hbase.coprocessor.CoprocessorHost; +import org.apache.hadoop.hbase.ipc.BlockingRpcCallback; +import org.apache.hadoop.hbase.ipc.ServerRpcController; +import org.apache.hadoop.hbase.util.Bytes; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Ignore; +import org.junit.Test; + +import java.io.IOException; +import java.util.Iterator; +import java.util.Map; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNotNull; + +/** + * Created by honma on 11/3/14. + */ +@Ignore +public class ExampleEndpointTest { + private static final TableName TEST_TABLE = TableName.valueOf("testrowcounter"); + private static final byte[] TEST_FAMILY = Bytes.toBytes("f"); + private static final byte[] TEST_COLUMN = Bytes.toBytes("col"); + + private static HBaseTestingUtility TEST_UTIL = null; + private static Configuration CONF = null; + + @BeforeClass + public static void setupBeforeClass() throws Exception { + TEST_UTIL = new HBaseTestingUtility(); + CONF = TEST_UTIL.getConfiguration(); + CONF.setStrings(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, + ExampleEndpoint.class.getName()); + + TEST_UTIL.startMiniCluster(); + TEST_UTIL.createTable(TEST_TABLE, new byte[][] { TEST_FAMILY }); + + } + + @AfterClass + public static void tearDownAfterClass() throws Exception { + TEST_UTIL.shutdownMiniCluster(); + } + + @Test + public void testEndpoint() throws Throwable { + + HConnection connection = HConnectionManager.createConnection(CONF); + HTableInterface table = connection.getTable(TEST_TABLE); + + // insert some test rows + for (int i = 0; i < 5; i++) { + byte[] iBytes = Bytes.toBytes(i); + Put p = new Put(iBytes); + p.add(TEST_FAMILY, TEST_COLUMN, iBytes); + table.put(p); + } + + final ExampleProtos.CountRequest request = ExampleProtos.CountRequest.getDefaultInstance(); + Map results = table.coprocessorService(ExampleProtos.RowCountService.class, + null, null, + new Batch.Call() { + public Long call(ExampleProtos.RowCountService counter) throws IOException { + ServerRpcController controller = new ServerRpcController(); + BlockingRpcCallback rpcCallback = + new BlockingRpcCallback(); + counter.getRowCount(controller, request, rpcCallback); + ExampleProtos.CountResponse response = rpcCallback.get(); + if (controller.failedOnException()) { + throw controller.getFailedOn(); + } + return (response != null && response.hasCount()) ? response.getCount() : 0; + } + }); + // should be one region with results + assertEquals(1, results.size()); + Iterator iter = results.values().iterator(); + Long val = iter.next(); + assertNotNull(val); + assertEquals(5l, val.longValue()); + } + + +} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/endpoint/ProtobufTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/endpoint/ProtobufTest.java new file mode 100644 index 0000000..360dc52 --- /dev/null +++ b/storage/src/test/java/com/kylinolap/storage/hbase/endpoint/ProtobufTest.java @@ -0,0 +1,41 @@ +package com.kylinolap.storage.hbase.endpoint; + +import com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos; +import org.junit.Assert; +import org.junit.Test; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +/** + * Created by honma on 11/6/14. + */ +public class ProtobufTest { + + @Test + public void testRecursive() throws IOException { + + + NodeProtos.Node node = NodeProtos.Node.newBuilder().setName("root"). + setLeft( + NodeProtos.Node.newBuilder().setName("L1 left"). + setLeft( + NodeProtos.Node.newBuilder().setName("L2 left most"))). + setRight( + NodeProtos.Node.newBuilder().setName("L1 right"). + setRight( + NodeProtos.Node.newBuilder().setName("L2 right most"))).build(); + + File a = File.createTempFile("dfsd", "fdsfsd"); + FileOutputStream outputStream = new FileOutputStream(a); + node.writeTo(outputStream); + outputStream.close(); + + FileInputStream inputStream = new FileInputStream(a); + NodeProtos.Node newNode = NodeProtos.Node.parseFrom(inputStream); + Assert.assertEquals(newNode.getLeft().getLeft().getName(), "L2 left most"); + + } +} From ade62563c631206d74f2231f65882012250cc422 Mon Sep 17 00:00:00 2001 From: honma Date: Tue, 18 Nov 2014 16:10:33 +0800 Subject: [PATCH 05/65] fix bytesutil readint[] issue --- common/src/main/java/com/kylinolap/common/util/BytesUtil.java | 9 +++++++-- .../src/test/java/com/kylinolap/common/util/BytesUtilTest.java | 9 +++++++-- server/src/main/java/com/kylinolap/rest/DebugTomcat.java | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/com/kylinolap/common/util/BytesUtil.java b/common/src/main/java/com/kylinolap/common/util/BytesUtil.java index 93d72a4..d2c1098 100644 --- a/common/src/main/java/com/kylinolap/common/util/BytesUtil.java +++ b/common/src/main/java/com/kylinolap/common/util/BytesUtil.java @@ -282,7 +282,9 @@ public static void writeIntArray(int[] array, ByteBuffer out) { return; } writeVInt(array.length, out); - out.asIntBuffer().put(array); + for (int i = 0; i < array.length; ++i) { + writeVInt(array[i], out); + } } public static int[] readIntArray(ByteBuffer in) { @@ -290,7 +292,10 @@ public static void writeIntArray(int[] array, ByteBuffer out) { if (len < 0) return null; int[] array = new int[len]; - in.asIntBuffer().get(array); + + for (int i = 0; i < len; ++i) { + array[i] = readVInt(in); + } return array; } diff --git a/common/src/test/java/com/kylinolap/common/util/BytesUtilTest.java b/common/src/test/java/com/kylinolap/common/util/BytesUtilTest.java index 344ba42..f3e6453 100644 --- a/common/src/test/java/com/kylinolap/common/util/BytesUtilTest.java +++ b/common/src/test/java/com/kylinolap/common/util/BytesUtilTest.java @@ -13,10 +13,15 @@ public void test() { ByteBuffer buffer = ByteBuffer.allocate(10000); int[] x = new int[] { 1, 2, 3 }; - BytesUtil.writeIntArray(x,buffer); + BytesUtil.writeIntArray(x, buffer); buffer.flip(); - by + byte[] buf = new byte[buffer.limit()]; + System.arraycopy(buffer.array(), 0, buf, 0, buffer.limit()); + + ByteBuffer newBuffer = ByteBuffer.wrap(buf); + int[] y = BytesUtil.readIntArray(newBuffer); + assertEquals(y[2], 3); } diff --git a/server/src/main/java/com/kylinolap/rest/DebugTomcat.java b/server/src/main/java/com/kylinolap/rest/DebugTomcat.java index ac5b12e..cb2eff7 100644 --- a/server/src/main/java/com/kylinolap/rest/DebugTomcat.java +++ b/server/src/main/java/com/kylinolap/rest/DebugTomcat.java @@ -28,7 +28,7 @@ public class DebugTomcat { public static void main(String[] args) throws Exception { - int port = 80; + int port = 9080; if (args.length >= 1) { port = Integer.parseInt(args[0]); } From 745ef0248b45e375930f01a1abe806900b941bda Mon Sep 17 00:00:00 2001 From: honma Date: Wed, 19 Nov 2014 10:05:12 +0800 Subject: [PATCH 06/65] endpoint half way --- .../II_hfile/f/0231cd23988c45bbadd37fb0361f2541 | Bin 33170 -> 0 bytes .../II_hfile/f/0bbfb38d691147b7b2a70517eb8e3583 | Bin 0 -> 33394 bytes .../II_hfile/f/102b80c54f164655bc671fa398c51144 | Bin 31706 -> 0 bytes .../II_hfile/f/382f137c6bde49829ac4c44f04d76db1 | Bin 0 -> 39106 bytes .../II_hfile/f/574eb5a2aa074d308747b0ddd1c6c46e | Bin 0 -> 31890 bytes .../II_hfile/f/90106e7e1bce458eb73649807d3d2e43 | Bin 36823 -> 0 bytes .../II_hfile/f/a132d55a5c8d4878a8dd846ed530a74d | Bin 38853 -> 0 bytes .../II_hfile/f/c0fb7e5ceab1488384bb7670826e891f | Bin 0 -> 37066 bytes .../job/hadoop/invertedindex/IICreateHTableJob.java | 2 +- .../storage/hbase/endpoint/HbaseServerKVIterator.java | 4 ++-- .../kylinolap/storage/hbase/endpoint/IIEndpoint.java | 12 +++++++++++- 11 files changed, 14 insertions(+), 4 deletions(-) delete mode 100644 examples/test_case_cube/II_hfile/f/0231cd23988c45bbadd37fb0361f2541 create mode 100644 examples/test_case_cube/II_hfile/f/0bbfb38d691147b7b2a70517eb8e3583 delete mode 100644 examples/test_case_cube/II_hfile/f/102b80c54f164655bc671fa398c51144 create mode 100644 examples/test_case_cube/II_hfile/f/382f137c6bde49829ac4c44f04d76db1 create mode 100644 examples/test_case_cube/II_hfile/f/574eb5a2aa074d308747b0ddd1c6c46e delete mode 100644 examples/test_case_cube/II_hfile/f/90106e7e1bce458eb73649807d3d2e43 delete mode 100644 examples/test_case_cube/II_hfile/f/a132d55a5c8d4878a8dd846ed530a74d create mode 100644 examples/test_case_cube/II_hfile/f/c0fb7e5ceab1488384bb7670826e891f diff --git a/examples/test_case_cube/II_hfile/f/0231cd23988c45bbadd37fb0361f2541 b/examples/test_case_cube/II_hfile/f/0231cd23988c45bbadd37fb0361f2541 deleted file mode 100644 index 6ada13c0ea97875ffdece75fc44ee7f285cf9a49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33170 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 diff --git a/examples/test_case_cube/II_hfile/f/0bbfb38d691147b7b2a70517eb8e3583 b/examples/test_case_cube/II_hfile/f/0bbfb38d691147b7b2a70517eb8e3583 new file mode 100644 index 0000000000000000000000000000000000000000..8b43b19eab061be0628efce3f741473ce12cc902 GIT binary patch literal 33394 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 bfhPp^`TrdhNB{5fLg~L}{D0#EsYw49tCI=b literal 0 HcmV?d00001 diff --git a/examples/test_case_cube/II_hfile/f/102b80c54f164655bc671fa398c51144 b/examples/test_case_cube/II_hfile/f/102b80c54f164655bc671fa398c51144 deleted file mode 100644 index c04b75c46ace6927780e21956f4564f529e66796..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31706 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 literal 0 HcmV?d00001 diff --git a/examples/test_case_cube/II_hfile/f/574eb5a2aa074d308747b0ddd1c6c46e b/examples/test_case_cube/II_hfile/f/574eb5a2aa074d308747b0ddd1c6c46e new file mode 100644 index 0000000000000000000000000000000000000000..b483cce3e4c279f115cb5ac6087d08bfb40124f7 GIT binary patch literal 31890 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 literal 0 HcmV?d00001 diff --git a/examples/test_case_cube/II_hfile/f/90106e7e1bce458eb73649807d3d2e43 b/examples/test_case_cube/II_hfile/f/90106e7e1bce458eb73649807d3d2e43 deleted file mode 100644 index 08889c23d8a6a274257ac23f1cea58fa8d11c573..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36823 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 z 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 diff --git a/examples/test_case_cube/II_hfile/f/c0fb7e5ceab1488384bb7670826e891f b/examples/test_case_cube/II_hfile/f/c0fb7e5ceab1488384bb7670826e891f new file mode 100644 index 0000000000000000000000000000000000000000..ec6e881b003eeba61c9224bca9b71c15a51c5783 GIT binary patch literal 37066 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 literal 0 HcmV?d00001 diff --git a/job/src/main/java/com/kylinolap/job/hadoop/invertedindex/IICreateHTableJob.java b/job/src/main/java/com/kylinolap/job/hadoop/invertedindex/IICreateHTableJob.java index 04fd274..e7580ad 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/invertedindex/IICreateHTableJob.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/invertedindex/IICreateHTableJob.java @@ -59,7 +59,7 @@ public int run(String[] args) throws Exception { HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(tableName)); HColumnDescriptor cf = new HColumnDescriptor(InvertedIndexDesc.HBASE_FAMILY); cf.setMaxVersions(1); - cf.setCompressionType(Algorithm.LZO); + //cf.setCompressionType(Algorithm.LZO); cf.setDataBlockEncoding(DataBlockEncoding.FAST_DIFF); tableDesc.addFamily(cf); diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/HbaseServerKVIterator.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/HbaseServerKVIterator.java index e6e0e1e..1e2a312 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/HbaseServerKVIterator.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/HbaseServerKVIterator.java @@ -48,7 +48,7 @@ public boolean hasNext() { @Override public Pair next() { - if (!hasNext()) { + if (hasNext()) { try { hasMore = innerScaner.nextRaw(results); } catch (IOException e) { @@ -56,7 +56,7 @@ public boolean hasNext() { } if (results.size() < 1) - throw new IllegalStateException("Hbase row contains less than 1 row"); + throw new IllegalStateException("Hbase row contains less than 1 cell"); Cell c = results.get(0); key.set(c.getRowArray(), c.getRowOffset(), c.getRowLength()); diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java index 8f5610d..2ab391e 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java @@ -5,6 +5,8 @@ import com.google.protobuf.RpcController; import com.google.protobuf.Service; import com.kylinolap.cube.invertedindex.*; +import com.kylinolap.cube.kv.RowValueDecoder; +import com.kylinolap.metadata.model.cube.HBaseColumnDesc; import com.kylinolap.storage.hbase.endpoint.generated.IIProtos; import org.apache.commons.io.IOUtils; import org.apache.hadoop.hbase.Coprocessor; @@ -16,6 +18,7 @@ import org.apache.hadoop.hbase.protobuf.ResponseConverter; import org.apache.hadoop.hbase.regionserver.HRegion; import org.apache.hadoop.hbase.regionserver.RegionScanner; +import org.apache.hadoop.hbase.util.Bytes; import java.io.IOException; import java.nio.ByteBuffer; @@ -31,6 +34,13 @@ public IIEndpoint() { } + private Scan buildScan() { + Scan scan = new Scan(); + scan.addColumn(Bytes.toBytes("f"), Bytes.toBytes("c")); + + return scan; + } + @Override public void getRows(RpcController controller, IIProtos.IIRequest request, RpcCallback done) { IIProtos.IIResponse response = null; @@ -41,7 +51,7 @@ public void getRows(RpcController controller, IIProtos.IIRequest request, RpcCal TableRecordInfoDigest tableInfo = TableRecordInfoDigest.deserialize(byteBuffer); region = env.getRegion(); - innerScanner = region.getScanner(new Scan()); + innerScanner = region.getScanner(buildScan()); region.startRegionOperation(); synchronized (innerScanner) { From 286dddb0165909f8861d5ba2d6f091582606a86b Mon Sep 17 00:00:00 2001 From: honma Date: Wed, 19 Nov 2014 14:29:23 +0800 Subject: [PATCH 07/65] fixing endpoint bug --- cube/src/main/java/com/kylinolap/cube/invertedindex/Slice.java | 2 +- .../main/java/com/kylinolap/cube/invertedindex/TableRecord.java | 7 ------- .../java/com/kylinolap/cube/invertedindex/TableRecordBytes.java | 9 +++++++++ .../kylinolap/storage/hbase/endpoint/HbaseServerKVIterator.java | 3 +++ .../java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java | 1 + 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/cube/src/main/java/com/kylinolap/cube/invertedindex/Slice.java b/cube/src/main/java/com/kylinolap/cube/invertedindex/Slice.java index 250ece4..6d716a8 100644 --- a/cube/src/main/java/com/kylinolap/cube/invertedindex/Slice.java +++ b/cube/src/main/java/com/kylinolap/cube/invertedindex/Slice.java @@ -99,7 +99,7 @@ public void remove() { public Iterator iterator() { return new Iterator() { int i = 0; - TableRecord rec = new TableRecord(info); + TableRecordBytes rec = info.createTableRecord(); ImmutableBytesWritable temp = new ImmutableBytesWritable(); @Override diff --git a/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecord.java b/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecord.java index 53601e2..1f3da06 100644 --- a/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecord.java +++ b/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecord.java @@ -79,13 +79,6 @@ public String getValueString(int col) { return info().dict(col).getValueFromId(getValueID(col)); } - public void setValueBytes(int col, ImmutableBytesWritable bytes) { - System.arraycopy(bytes.get(), bytes.getOffset(), buf, info.offset(col), info.length(col)); - } - - public void getValueBytes(int col, ImmutableBytesWritable bytes) { - bytes.set(buf, info.offset(col), info.length(col)); - } private void setValueMetrics(int col, LongWritable value) { info().codec(col).write(value, buf, info.offset(col)); diff --git a/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordBytes.java b/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordBytes.java index a40362a..d985ac1 100644 --- a/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordBytes.java +++ b/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordBytes.java @@ -2,6 +2,7 @@ import com.kylinolap.common.util.BytesUtil; import com.kylinolap.dict.Dictionary; +import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.util.Bytes; import java.util.Arrays; @@ -49,6 +50,14 @@ public TableRecordBytes(TableRecordBytes another) { this.buf = Bytes.copy(another.buf); } + public void setValueBytes(int col, ImmutableBytesWritable bytes) { + System.arraycopy(bytes.get(), bytes.getOffset(), buf, info.offset(col), info.length(col)); + } + + public void getValueBytes(int col, ImmutableBytesWritable bytes) { + bytes.set(buf, info.offset(col), info.length(col)); + } + @Override public Object clone() { return new TableRecordBytes(this); diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/HbaseServerKVIterator.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/HbaseServerKVIterator.java index 1e2a312..5853006 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/HbaseServerKVIterator.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/HbaseServerKVIterator.java @@ -1,5 +1,6 @@ package com.kylinolap.storage.hbase.endpoint; +import com.kylinolap.common.util.BytesUtil; import org.apache.commons.io.IOUtils; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; @@ -61,6 +62,8 @@ public boolean hasNext() { Cell c = results.get(0); key.set(c.getRowArray(), c.getRowOffset(), c.getRowLength()); value.set(c.getValueArray(), c.getValueOffset(), c.getValueLength()); + + results.clear(); return pair; } else { return null; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java index 2ab391e..40c6d1d 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java @@ -54,6 +54,7 @@ public void getRows(RpcController controller, IIProtos.IIRequest request, RpcCal innerScanner = region.getScanner(buildScan()); region.startRegionOperation(); + synchronized (innerScanner) { IIProtos.IIResponse.Builder responseBuilder = IIProtos.IIResponse.newBuilder(); From 6c3d5a68f6b1a121d0347a1fcddf3a3998570a8d Mon Sep 17 00:00:00 2001 From: honma Date: Wed, 19 Nov 2014 14:39:22 +0800 Subject: [PATCH 08/65] endpoint is working --- cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecord.java | 1 - job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecord.java b/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecord.java index 1f3da06..dd4e3f5 100644 --- a/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecord.java +++ b/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecord.java @@ -17,7 +17,6 @@ package com.kylinolap.cube.invertedindex; import com.kylinolap.dict.DateStrDictionary; -import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.io.LongWritable; diff --git a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java index de1c4fb..c50aec6 100644 --- a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java +++ b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java @@ -176,7 +176,7 @@ public void testEndpoint() throws Throwable { }); for (Map.Entry> entry : results.entrySet()) { - System.out.println("result count : " + entry.getValue()); + System.out.println("result count : " + entry.getValue().size()); } } } From d3ff52e6db3f2cff35687aa219160e39549f942b Mon Sep 17 00:00:00 2001 From: honma Date: Wed, 19 Nov 2014 15:04:33 +0800 Subject: [PATCH 09/65] code cleaning --- .../kylinolap/job/coprocessor/IIEndpointTest.java | 36 +++++----------------- 1 file changed, 7 insertions(+), 29 deletions(-) diff --git a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java index c50aec6..98f87e2 100644 --- a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java +++ b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java @@ -62,26 +62,22 @@ public static void setupBeforeClass() throws Exception { //create table and bulk load data TEST_UTIL.startMiniCluster(); - //TEST_UTIL.createTable(TEST_TABLE, new byte[][] { TEST_FAMILY }); - org.apache.hadoop.fs.FileSystem fs = org.apache.hadoop.fs.FileSystem.get(CONF); - fs.copyFromLocalFile(false, new Path("../examples/test_case_cube/II_hfile/"), new Path("/tmp/test_III_hfile")); + //simulate bulk load + mockCubeHtable(); + hconn = HConnectionManager.createConnection(CONF); + } -// RemoteIterator iterator = fs.listFiles(new Path("/tmp/test_III_hfile"), true); -// while (iterator.hasNext()) { -// LocatedFileStatus a = iterator.next(); -// System.out.println(a.getPath()); -// } - + private static void mockCubeHtable() throws Exception { + org.apache.hadoop.fs.FileSystem fs = org.apache.hadoop.fs.FileSystem.get(CONF); + fs.copyFromLocalFile(false, new Path("../examples/test_case_cube/II_hfile/"), new Path("/tmp/test_III_hfile")); int sharding = 4; HTableDescriptor tableDesc = new HTableDescriptor(TEST_TABLE); HColumnDescriptor cf = new HColumnDescriptor(InvertedIndexDesc.HBASE_FAMILY); cf.setMaxVersions(1); - //cf.setCompressionType(Compression.Algorithm.LZO); - //cf.setDataBlockEncoding(DataBlockEncoding.FAST_DIFF); tableDesc.addFamily(cf); if (User.isHBaseSecurityEnabled(CONF)) { @@ -89,7 +85,6 @@ public static void setupBeforeClass() throws Exception { tableDesc.addCoprocessor("org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint"); } - byte[][] splitKeys = getSplits(sharding); if (splitKeys.length == 0) splitKeys = null; @@ -99,30 +94,13 @@ public static void setupBeforeClass() throws Exception { HBaseAdmin hBaseAdmin = new HBaseAdmin(CONF); TableName[] tables = hBaseAdmin.listTableNames(); - String temp = "-cubename \"test_kylin_cube_ii\" -input \"/tmp/test_III_hfile\" -htablename \"test_III\""; ToolRunner.run(CONF, new IIBulkLoadJob(), temp.split("\\s+")); - //String temp = "-cubename \"test_kylin_cube_ii\" -htablename \"test_III\""; - - hconn = HConnectionManager.createConnection(CONF); -// HTableInterface hTableInterface = conn.getTable("tt"); -// ResultScanner scanner = hTableInterface.getScanner(new Scan()); -// Iterator resultIterator = scanner.iterator(); -// int count = 0; -// while (resultIterator.hasNext()) { -// resultIterator.next(); -// count++; -// } -// -// System.out.println(count); - - } @Before public void setup() throws Exception { this.createTestMetadata(); - this.cube = CubeManager.getInstance(getTestConfig()).getCube("test_kylin_cube_ii"); this.seg = cube.getFirstSegment(); } From 597f4abc5f0e7e95ef25c69e7765e88dcdeccd6d Mon Sep 17 00:00:00 2001 From: honma Date: Thu, 20 Nov 2014 09:56:30 +0800 Subject: [PATCH 10/65] minor changes --- job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java | 4 ++-- .../main/java/com/kylinolap/storage/hbase/observer/SRowFilter.java | 3 ++- .../main/java/com/kylinolap/storage/hbase/observer/SRowProjector.java | 1 - .../java/com/kylinolap/storage/filter/BitMapFilterEvaluatorTest.java | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java index 98f87e2..2f2d23a 100644 --- a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java +++ b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java @@ -136,14 +136,14 @@ public void testEndpoint() throws Throwable { public List call(IIProtos.RowsService counter) throws IOException { ServerRpcController controller = new ServerRpcController(); BlockingRpcCallback rpcCallback = - new BlockingRpcCallback(); + new BlockingRpcCallback<>(); counter.getRows(controller, request, rpcCallback); IIProtos.IIResponse response = rpcCallback.get(); if (controller.failedOnException()) { throw controller.getFailedOn(); } - List records = new ArrayList(); + List records = new ArrayList<>(); for (ByteString raw : response.getRowsList()) { TableRecord record = new TableRecord(recordInfo); record.setBytes(raw.toByteArray(), 0, raw.size()); diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowFilter.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowFilter.java index 1ed12c6..1ebbcf0 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowFilter.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowFilter.java @@ -38,7 +38,8 @@ /** * @author yangli9 - * + * + * S for storage */ public class SRowFilter { diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowProjector.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowProjector.java index 46d98f4..d2be656 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowProjector.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowProjector.java @@ -32,7 +32,6 @@ /** * @author yangli9 - * */ public class SRowProjector { diff --git a/storage/src/test/java/com/kylinolap/storage/filter/BitMapFilterEvaluatorTest.java b/storage/src/test/java/com/kylinolap/storage/filter/BitMapFilterEvaluatorTest.java index 454c804..1d4bb17 100644 --- a/storage/src/test/java/com/kylinolap/storage/filter/BitMapFilterEvaluatorTest.java +++ b/storage/src/test/java/com/kylinolap/storage/filter/BitMapFilterEvaluatorTest.java @@ -43,7 +43,7 @@ @Override public ConciseSet getBitMap(TblColRef col, int valueId) { - if (col.equals(colA) == false) + if (!col.equals(colA)) return null; // i-th record has value ID i, and last record has value null From f43ef948e81d5048c3a2583b576f235de5444be2 Mon Sep 17 00:00:00 2001 From: honma Date: Thu, 20 Nov 2014 17:47:37 +0800 Subject: [PATCH 11/65] half way --- cube/src/main/java/com/kylinolap/cube/kv/RowValueDecoder.java | 8 ++++---- .../com/kylinolap/storage/hbase/observer/CoprocessorEnabler.java | 2 +- .../com/kylinolap/storage/hbase/observer/SRowAggregators.java | 2 +- .../main/java/com/kylinolap/storage/hbase/observer/SRowType.java | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cube/src/main/java/com/kylinolap/cube/kv/RowValueDecoder.java b/cube/src/main/java/com/kylinolap/cube/kv/RowValueDecoder.java index c36bc81..90cbf94 100644 --- a/cube/src/main/java/com/kylinolap/cube/kv/RowValueDecoder.java +++ b/cube/src/main/java/com/kylinolap/cube/kv/RowValueDecoder.java @@ -79,13 +79,13 @@ private void convertToJavaObjects(Object[] mapredObjs, Object[] results) { Object o = mapredObjs[i]; if (o instanceof LongWritable) - o = Long.valueOf(((LongWritable) o).get()); + o = ((LongWritable) o).get(); else if (o instanceof IntWritable) - o = Integer.valueOf(((IntWritable) o).get()); + o = ((IntWritable) o).get(); else if (o instanceof DoubleWritable) - o = Double.valueOf(((DoubleWritable) o).get()); + o = ((DoubleWritable) o).get(); else if (o instanceof FloatWritable) - o = Float.valueOf(((FloatWritable) o).get()); + o = ((FloatWritable) o).get(); results[i] = o; } diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/CoprocessorEnabler.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/CoprocessorEnabler.java index a60471b..86ecd27 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/CoprocessorEnabler.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/CoprocessorEnabler.java @@ -62,7 +62,7 @@ public static ResultScanner scanWithCoprocessorIfBeneficial(CubeSegment segment, SRowType type = SRowType.fromCuboid(segment, cuboid); SRowFilter filter = SRowFilter.fromFilter(segment, tupleFiler); SRowProjector projector = SRowProjector.fromColumns(segment, cuboid, groupBy); - SRowAggregators aggrs = SRowAggregators.fromValuDecoders(rowValueDecoders); + SRowAggregators aggrs = SRowAggregators.fromValueDecoders(rowValueDecoders); if (DEBUG_LOCAL_COPROCESSOR) { RegionScanner innerScanner = new RegionScannerAdapter(table.getScanner(scan)); diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowAggregators.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowAggregators.java index 988f45c..54b6302 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowAggregators.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowAggregators.java @@ -41,7 +41,7 @@ @SuppressWarnings({ "rawtypes", "unchecked" }) public class SRowAggregators { - public static SRowAggregators fromValuDecoders(Collection rowValueDecoders) { + public static SRowAggregators fromValueDecoders(Collection rowValueDecoders) { // each decoder represents one HBase column HCol[] hcols = new HCol[rowValueDecoders.size()]; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowType.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowType.java index 7fea097..9e6ed8f 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowType.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowType.java @@ -40,7 +40,7 @@ public static SRowType fromCuboid(CubeSegment seg, Cuboid cuboid) { List colList = cuboid.getColumns(); - TblColRef[] cols = (TblColRef[]) colList.toArray(new TblColRef[colList.size()]); + TblColRef[] cols = colList.toArray(new TblColRef[colList.size()]); RowKeyColumnIO colIO = new RowKeyColumnIO(seg); int[] colSizes = new int[cols.length]; for (int i = 0; i < cols.length; i++) { From bf3bf17dd60a0c1c2699bb42a422e8f8a63f3499 Mon Sep 17 00:00:00 2001 From: honma Date: Mon, 24 Nov 2014 09:08:28 +0800 Subject: [PATCH 12/65] bug fix and code refactor --- .../com/kylinolap/cube/invertedindex/Slice.java | 35 ---------------------- .../kylinolap/job/tools/DeployCoprocessorCLI.java | 2 +- .../storage/hbase/observer/SRowAggregators.java | 6 ++-- 3 files changed, 3 insertions(+), 40 deletions(-) diff --git a/cube/src/main/java/com/kylinolap/cube/invertedindex/Slice.java b/cube/src/main/java/com/kylinolap/cube/invertedindex/Slice.java index 6d716a8..b8e88c7 100644 --- a/cube/src/main/java/com/kylinolap/cube/invertedindex/Slice.java +++ b/cube/src/main/java/com/kylinolap/cube/invertedindex/Slice.java @@ -59,41 +59,6 @@ public long getTimestamp() { return timestamp; } - /** - * Standard iterator of Slice will return a iterator of TableRecordBytes, - * which cannot be printed/formated to readable text. - * By invoking this API client can avoid code like: - *

- * for (TableRecordBytes rec : slice) { - * TableRecord realRecord = (TableRecord) rec.clone(); - * } - *

- * Note this API cannot be called simultaneously with iterator() - * - * @return - */ - public Iterator readableIterator() { - final Iterator innerIterator = iterator(); - - return new Iterator() { - - - @Override - public boolean hasNext() { - return innerIterator.hasNext(); - } - - @Override - public TableRecord next() { - return (TableRecord) innerIterator.next(); - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - }; - } @Override public Iterator iterator() { diff --git a/job/src/main/java/com/kylinolap/job/tools/DeployCoprocessorCLI.java b/job/src/main/java/com/kylinolap/job/tools/DeployCoprocessorCLI.java index 546f2d5..5721d67 100644 --- a/job/src/main/java/com/kylinolap/job/tools/DeployCoprocessorCLI.java +++ b/job/src/main/java/com/kylinolap/job/tools/DeployCoprocessorCLI.java @@ -57,7 +57,7 @@ private static final Logger logger = LoggerFactory.getLogger(DeployCoprocessorCLI.class); - public static final String AGGR_COPROCESSOR_CLS_NAME = "com.kylinolap.storage.hbase.observor.AggregateRegionObserver"; + public static final String AGGR_COPROCESSOR_CLS_NAME = "com.kylinolap.storage.hbase.observer.AggregateRegionObserver"; public static void main(String[] args) throws IOException { KylinConfig kylinConfig = KylinConfig.getInstanceFromEnv(); diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowAggregators.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowAggregators.java index 54b6302..a817ba9 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowAggregators.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowAggregators.java @@ -36,7 +36,6 @@ /** * @author yangli9 - * */ @SuppressWarnings({ "rawtypes", "unchecked" }) public class SRowAggregators { @@ -47,7 +46,7 @@ public static SRowAggregators fromValueDecoders(Collection rowV HCol[] hcols = new HCol[rowValueDecoders.size()]; int i = 0; for (RowValueDecoder rowValueDecoder : rowValueDecoders) { - hcols[i++] = buildHCol(rowValueDecoder); + hcols[i++] = buildHCol(rowValueDecoder.getHBaseColumn()); } SRowAggregators aggrs = new SRowAggregators(hcols); @@ -55,8 +54,7 @@ public static SRowAggregators fromValueDecoders(Collection rowV } - private static HCol buildHCol(RowValueDecoder rowValueDecoder) { - HBaseColumnDesc desc = rowValueDecoder.getHBaseColumn(); + private static HCol buildHCol(HBaseColumnDesc desc) { byte[] family = Bytes.toBytes(desc.getColumnFamilyName()); byte[] qualifier = Bytes.toBytes(desc.getQualifier()); MeasureDesc[] measures = desc.getMeasures(); From a9d3061ebf47789ad660ab2e35ed1d50da3f62db Mon Sep 17 00:00:00 2001 From: honma Date: Tue, 25 Nov 2014 15:18:02 +0800 Subject: [PATCH 13/65] filter works on endpoint --- .../cube/invertedindex/BitMapContainer.java | 22 +- .../cube/invertedindex/ColumnValueContainer.java | 7 +- .../invertedindex/CompressedValueContainer.java | 53 ++- .../com/kylinolap/cube/invertedindex/Slice.java | 45 +++ .../kylinolap/job/coprocessor/IIEndpointTest.java | 83 ++++- .../storage/hbase/endpoint/IIEndpoint.java | 42 ++- .../hbase/endpoint/SliceBitMapProvider.java | 38 ++ .../storage/hbase/endpoint/generated/IIProtos.java | 402 ++++++++++++++++++++- .../storage/hbase/observer/SRowFilter.java | 16 +- .../storage/hbase/observer/SRowTuple.java | 5 +- .../kylinolap/storage/hbase/observer/SRowType.java | 5 +- .../com/kylinolap/storage/hbase/protobuf/II.proto | 10 +- .../storage/filter/BitMapFilterEvaluatorTest.java | 70 ++-- .../storage/hbase/InvertedIndexHBaseTest.java | 35 -- 14 files changed, 729 insertions(+), 104 deletions(-) create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/endpoint/SliceBitMapProvider.java diff --git a/cube/src/main/java/com/kylinolap/cube/invertedindex/BitMapContainer.java b/cube/src/main/java/com/kylinolap/cube/invertedindex/BitMapContainer.java index f1af35e..59a554b 100644 --- a/cube/src/main/java/com/kylinolap/cube/invertedindex/BitMapContainer.java +++ b/cube/src/main/java/com/kylinolap/cube/invertedindex/BitMapContainer.java @@ -31,7 +31,6 @@ /** * @author yangli9 - * */ public class BitMapContainer implements ColumnValueContainer { @@ -40,7 +39,7 @@ int size; ConciseSet[] sets; boolean closedForChange; - + transient byte[] temp; public BitMapContainer(TableRecordInfoDigest info, int col) { @@ -49,7 +48,7 @@ public BitMapContainer(TableRecordInfoDigest info, int col) { this.nValues = info.getMaxID(col) + 1; this.sets = null; this.closedForChange = false; - + this.temp = new byte[valueLen]; } @@ -67,14 +66,27 @@ public void append(int value) { sets[value].add(size); size++; } - + @Override public void getValueAt(int i, ImmutableBytesWritable valueBytes) { int value = getValueIntAt(i); BytesUtil.writeUnsigned(value, temp, 0, valueLen); valueBytes.set(temp, 0, valueLen); } - + + @Override + public ConciseSet getBitMap(int valueId) { + if (valueId >= 0 && valueId <= getMaxValueId()) + return sets[valueId]; + else + return sets[this.nValues]; + } + + @Override + public int getMaxValueId() { + return this.nValues - 1; + } + public int getValueIntAt(int i) { for (int v = 0; v < nValues; v++) { if (sets[v].contains(i)) { diff --git a/cube/src/main/java/com/kylinolap/cube/invertedindex/ColumnValueContainer.java b/cube/src/main/java/com/kylinolap/cube/invertedindex/ColumnValueContainer.java index a2ac4c3..ce64dd7 100644 --- a/cube/src/main/java/com/kylinolap/cube/invertedindex/ColumnValueContainer.java +++ b/cube/src/main/java/com/kylinolap/cube/invertedindex/ColumnValueContainer.java @@ -16,11 +16,11 @@ package com.kylinolap.cube.invertedindex; +import it.uniroma3.mat.extendedset.intset.ConciseSet; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; /** * @author yangli9 - * */ public interface ColumnValueContainer { @@ -33,4 +33,9 @@ // works only after closeForChange() void getValueAt(int i, ImmutableBytesWritable valueBytes); + ConciseSet getBitMap(int valueId); + + int getMaxValueId(); + + } diff --git a/cube/src/main/java/com/kylinolap/cube/invertedindex/CompressedValueContainer.java b/cube/src/main/java/com/kylinolap/cube/invertedindex/CompressedValueContainer.java index 6874e8f..0d85349 100644 --- a/cube/src/main/java/com/kylinolap/cube/invertedindex/CompressedValueContainer.java +++ b/cube/src/main/java/com/kylinolap/cube/invertedindex/CompressedValueContainer.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.util.Arrays; +import it.uniroma3.mat.extendedset.intset.ConciseSet; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.util.Bytes; @@ -28,10 +29,10 @@ /** * @author yangli9 - * */ public class CompressedValueContainer implements ColumnValueContainer { int valueLen; + int nValues; int cap; int size; byte[] uncompressed; @@ -39,6 +40,7 @@ public CompressedValueContainer(TableRecordInfoDigest info, int col, int cap) { this.valueLen = info.length(col); + this.nValues = info.getMaxID(col) + 1; this.cap = cap; this.size = 0; this.uncompressed = null; @@ -57,6 +59,17 @@ public void getValueAt(int i, ImmutableBytesWritable valueBytes) { valueBytes.set(uncompressed, valueLen * i, valueLen); } + @Override + public ConciseSet getBitMap(int valueId) { + createBitMapWrapperIfNecessary(); + return wrapper.getBitMap(valueId); + } + + @Override + public int getMaxValueId() { + return nValues - 1; + } + private void checkUpdateMode() { if (isClosedForChange()) { throw new IllegalArgumentException(); @@ -129,4 +142,42 @@ public boolean equals(Object obj) { return true; } + private BitmapWrapper wrapper = null; + + private void createBitMapWrapperIfNecessary() { + if (wrapper == null) + wrapper = new BitmapWrapper(); + } + + private class BitmapWrapper { + private ConciseSet[] sets; + + BitmapWrapper() { + sets = new ConciseSet[nValues + 1]; + for (int i = 0; i < sets.length; ++i) { + sets[i] = new ConciseSet(); + } + + for (int i = 0; i < size; ++i) { + int valueID = BytesUtil.readUnsigned(uncompressed, i * valueLen, valueLen); + if (notNullValue(valueID)) { + sets[valueID].add(i); + } else { + sets[nValues].add(i); + } + } + } + + private boolean notNullValue(int valueId) { + return valueId >= 0 && valueId <= getMaxValueId(); + } + + ConciseSet getBitMap(int valueId) { + if (notNullValue(valueId)) { + return sets[valueId]; + } else { + return sets[nValues]; + } + } + } } diff --git a/cube/src/main/java/com/kylinolap/cube/invertedindex/Slice.java b/cube/src/main/java/com/kylinolap/cube/invertedindex/Slice.java index b8e88c7..3550286 100644 --- a/cube/src/main/java/com/kylinolap/cube/invertedindex/Slice.java +++ b/cube/src/main/java/com/kylinolap/cube/invertedindex/Slice.java @@ -18,6 +18,7 @@ import java.util.Iterator; +import it.uniroma3.mat.extendedset.intset.ConciseSet; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; /** @@ -51,6 +52,10 @@ } } + public int getRecordCount() { + return this.nRecords; + } + public short getShard() { return shard; } @@ -59,6 +64,46 @@ public long getTimestamp() { return timestamp; } + public ColumnValueContainer getColumnValueContainer(int col) { + return containers[col]; + } + + private Iterator iteratorWithBitmap(final ConciseSet bitmap) { + + return new Iterator() { + int i = 0; + int iteratedCount = 0; + int resultSize = bitmap.size(); + + TableRecordBytes rec = info.createTableRecord(); + ImmutableBytesWritable temp = new ImmutableBytesWritable(); + + @Override + public boolean hasNext() { + return iteratedCount < resultSize; + } + + @Override + public TableRecordBytes next() { + while (!bitmap.contains(i) && i < nRecords - 1) { + i++; + } + for (int col = 0; col < nColumns; col++) { + containers[col].getValueAt(i, temp); + rec.setValueBytes(col, temp); + } + iteratedCount++; + + return rec; + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + + }; + } @Override public Iterator iterator() { diff --git a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java index 2f2d23a..2ff81a6 100644 --- a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java +++ b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java @@ -6,14 +6,25 @@ import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.CubeSegment; +import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.cube.invertedindex.IIKeyValueCodec; import com.kylinolap.cube.invertedindex.TableRecord; import com.kylinolap.cube.invertedindex.TableRecordInfo; import com.kylinolap.cube.invertedindex.TableRecordInfoDigest; import com.kylinolap.job.hadoop.invertedindex.IIBulkLoadJob; +import com.kylinolap.metadata.MetadataManager; +import com.kylinolap.metadata.model.cube.TblColRef; import com.kylinolap.metadata.model.invertedindex.InvertedIndexDesc; +import com.kylinolap.metadata.model.schema.ColumnDesc; +import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.storage.filter.ColumnTupleFilter; +import com.kylinolap.storage.filter.CompareTupleFilter; +import com.kylinolap.storage.filter.ConstantTupleFilter; +import com.kylinolap.storage.filter.TupleFilter; import com.kylinolap.storage.hbase.endpoint.IIEndpoint; import com.kylinolap.storage.hbase.endpoint.generated.IIProtos; +import com.kylinolap.storage.hbase.observer.SRowFilter; +import com.kylinolap.storage.hbase.observer.SRowType; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.*; @@ -35,6 +46,8 @@ import java.util.List; import java.util.Map; +import static org.junit.Assert.assertEquals; + /** * Created by Hongbin Ma(Binmahone) on 11/14/14. @@ -122,14 +135,43 @@ public static void tearDownAfterClass() throws Exception { TEST_UTIL.shutdownMiniCluster(); } - @Test - public void testEndpoint() throws Throwable { - String tableName = seg.getStorageLocationIdentifier(); - HTableInterface table = hconn.getTable(tableName); - final TableRecordInfoDigest recordInfo = new TableRecordInfo(seg); - final IIProtos.IIRequest request = IIProtos.IIRequest.newBuilder().setTableInfo( - ByteString.copyFrom(TableRecordInfoDigest.serialize(recordInfo))).build(); + private IIProtos.IIRequest prepareRequest(TupleFilter rootFilter) throws IOException { + + long baseCuboidId = Cuboid.getBaseCuboidId(this.cube.getDescriptor()); + SRowType type = SRowType.fromCuboid(this.seg, Cuboid.findById(cube.getDescriptor(), baseCuboidId)); + + SRowFilter filter = SRowFilter.fromFilter(this.seg, rootFilter); + + //SRowProjector projector = SRowProjector.fromColumns(segment, cuboid, groupBy); + //SRowAggregators aggrs = SRowAggregators.fromValueDecoders(rowValueDecoders); + + + TableRecordInfoDigest recordInfo = new TableRecordInfo(seg); + IIProtos.IIRequest request = IIProtos.IIRequest.newBuilder(). + setTableInfo(ByteString.copyFrom(TableRecordInfoDigest.serialize(recordInfo))). + setSRowType(ByteString.copyFrom(SRowType.serialize(type))). + setSRowFilter(ByteString.copyFrom(SRowFilter.serialize(filter))). + build(); + + return request; + } + + + private TupleFilter mockEQFiter(String value, TblColRef tblColRef) throws IOException { + CompareTupleFilter filter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.EQ); + filter.addChild(new ColumnTupleFilter(tblColRef)); + filter.addChild(new ConstantTupleFilter(value)); + return filter; + } + private TupleFilter mockNEQFiter(String value, TblColRef tblColRef) throws IOException { + CompareTupleFilter filter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.NEQ); + filter.addChild(new ColumnTupleFilter(tblColRef)); + filter.addChild(new ConstantTupleFilter(value)); + return filter; + } + + private List getResults(final IIProtos.IIRequest request, HTableInterface table) throws Throwable { Map> results = table.coprocessorService(IIProtos.RowsService.class, null, null, new Batch.Call>() { @@ -144,17 +186,44 @@ public void testEndpoint() throws Throwable { } List records = new ArrayList<>(); + TableRecordInfoDigest recordInfo = new TableRecordInfo(seg); for (ByteString raw : response.getRowsList()) { TableRecord record = new TableRecord(recordInfo); record.setBytes(raw.toByteArray(), 0, raw.size()); + System.out.println(record); records.add(record); } return records; } }); + List ret = new ArrayList(); for (Map.Entry> entry : results.entrySet()) { System.out.println("result count : " + entry.getValue().size()); + ret.addAll(entry.getValue()); } + return ret; + } + + @Test + public void testEndpoint() throws Throwable { + + String tableName = seg.getStorageLocationIdentifier(); + HTableInterface table = hconn.getTable(tableName); + + TableDesc tableDesc = MetadataManager.getInstance(getTestConfig()).getTableDesc("test_kylin_fact"); + ColumnDesc columnDesc = tableDesc.findColumnByName("LSTG_FORMAT_NAME"); + TblColRef lfn = new TblColRef(columnDesc); + TupleFilter filterA = mockEQFiter("ABIN", lfn); + TupleFilter filterB = mockNEQFiter("ABIN", lfn); + + IIProtos.IIRequest requestA = prepareRequest(filterA); + IIProtos.IIRequest requestB = prepareRequest(filterB); + + int resultA = getResults(requestA, table).size(); + int resultB = getResults(requestB, table).size(); + + + assertEquals(resultA + resultB, 10000); } } diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java index 40c6d1d..48bb544 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java @@ -7,7 +7,13 @@ import com.kylinolap.cube.invertedindex.*; import com.kylinolap.cube.kv.RowValueDecoder; import com.kylinolap.metadata.model.cube.HBaseColumnDesc; +import com.kylinolap.storage.filter.BitMapFilterEvaluator; import com.kylinolap.storage.hbase.endpoint.generated.IIProtos; +import com.kylinolap.storage.hbase.observer.SRowAggregators; +import com.kylinolap.storage.hbase.observer.SRowFilter; +import com.kylinolap.storage.hbase.observer.SRowProjector; +import com.kylinolap.storage.hbase.observer.SRowType; +import it.uniroma3.mat.extendedset.intset.ConciseSet; import org.apache.commons.io.IOUtils; import org.apache.hadoop.hbase.Coprocessor; import org.apache.hadoop.hbase.CoprocessorEnvironment; @@ -43,6 +49,26 @@ private Scan buildScan() { @Override public void getRows(RpcController controller, IIProtos.IIRequest request, RpcCallback done) { + + SRowType type = null; + SRowProjector projector = null; + SRowAggregators aggregators = null; + SRowFilter filter = null; + + if (request.hasSRowType()) { + type = SRowType.deserialize(request.getSRowType().toByteArray()); + } + if (request.hasSRowProjector()) { + projector = SRowProjector.deserialize(request.getSRowProjector().toByteArray()); + } + if (request.hasSRowAggregator()) { + aggregators = SRowAggregators.deserialize(request.getSRowAggregator().toByteArray()); + } + if (request.hasSRowFilter()) { + filter = SRowFilter.deserialize(request.getSRowFilter().toByteArray()); + } + + IIProtos.IIResponse response = null; RegionScanner innerScanner = null; HRegion region = null; @@ -60,8 +86,20 @@ public void getRows(RpcController controller, IIProtos.IIRequest request, RpcCal IIKeyValueCodec codec = new IIKeyValueCodec(tableInfo); for (Slice slice : codec.decodeKeyValue(new HbaseServerKVIterator(innerScanner))) { - for (TableRecordBytes recordBytes : slice) { - responseBuilder.addRows(ByteString.copyFrom(recordBytes.getBytes())); + if (filter != null) { + ConciseSet result = new BitMapFilterEvaluator(new SliceBitMapProvider(slice, type)).evaluate(filter.getFilter()); + int index = 0; + //TODO: should not use iterator mode for performance + for (TableRecordBytes recordBytes : slice) { + if (result.contains(index)) { + responseBuilder.addRows(ByteString.copyFrom(recordBytes.getBytes())); + } + index++; + } + } else { + for (TableRecordBytes recordBytes : slice) { + responseBuilder.addRows(ByteString.copyFrom(recordBytes.getBytes())); + } } } diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/SliceBitMapProvider.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/SliceBitMapProvider.java new file mode 100644 index 0000000..a622e68 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/SliceBitMapProvider.java @@ -0,0 +1,38 @@ +package com.kylinolap.storage.hbase.endpoint; + +import com.kylinolap.cube.invertedindex.Slice; +import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.storage.filter.BitMapFilterEvaluator; +import com.kylinolap.storage.hbase.observer.SRowType; +import it.uniroma3.mat.extendedset.intset.ConciseSet; + +/** + * Created by Hongbin Ma(Binmahone) on 11/24/14. + *

+ * an adapter + */ +public class SliceBitMapProvider implements BitMapFilterEvaluator.BitMapProvider { + + private Slice slice; + private SRowType type; + + public SliceBitMapProvider(Slice slice, SRowType type) { + this.slice = slice; + this.type = type; + } + + @Override + public ConciseSet getBitMap(TblColRef col, int valueId) { + return slice.getColumnValueContainer(type.getColIndexByTblColRef(col)).getBitMap(valueId); + } + + @Override + public int getRecordCount() { + return this.slice.getRecordCount(); + } + + @Override + public int getMaxValueId(TblColRef col) { + return slice.getColumnValueContainer(type.getColIndexByTblColRef(col)).getMaxValueId(); + } +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/generated/IIProtos.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/generated/IIProtos.java index fd6bd52..765dc2e 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/generated/IIProtos.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/generated/IIProtos.java @@ -1,5 +1,5 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! -// source: II.proto +// source: storage/src/main/java/com/kylinolap/storage/hbase/protobuf/II.proto package com.kylinolap.storage.hbase.endpoint.generated; @@ -20,6 +20,46 @@ public static void registerAllExtensions( * required bytes tableInfo = 1; */ com.google.protobuf.ByteString getTableInfo(); + + // required bytes sRowType = 2; + /** + * required bytes sRowType = 2; + */ + boolean hasSRowType(); + /** + * required bytes sRowType = 2; + */ + com.google.protobuf.ByteString getSRowType(); + + // optional bytes sRowFilter = 3; + /** + * optional bytes sRowFilter = 3; + */ + boolean hasSRowFilter(); + /** + * optional bytes sRowFilter = 3; + */ + com.google.protobuf.ByteString getSRowFilter(); + + // optional bytes sRowProjector = 4; + /** + * optional bytes sRowProjector = 4; + */ + boolean hasSRowProjector(); + /** + * optional bytes sRowProjector = 4; + */ + com.google.protobuf.ByteString getSRowProjector(); + + // optional bytes sRowAggregator = 5; + /** + * optional bytes sRowAggregator = 5; + */ + boolean hasSRowAggregator(); + /** + * optional bytes sRowAggregator = 5; + */ + com.google.protobuf.ByteString getSRowAggregator(); } /** * Protobuf type {@code IIRequest} @@ -77,6 +117,26 @@ private IIRequest( tableInfo_ = input.readBytes(); break; } + case 18: { + bitField0_ |= 0x00000002; + sRowType_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + sRowFilter_ = input.readBytes(); + break; + } + case 34: { + bitField0_ |= 0x00000008; + sRowProjector_ = input.readBytes(); + break; + } + case 42: { + bitField0_ |= 0x00000010; + sRowAggregator_ = input.readBytes(); + break; + } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { @@ -133,8 +193,76 @@ public boolean hasTableInfo() { return tableInfo_; } + // required bytes sRowType = 2; + public static final int SROWTYPE_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString sRowType_; + /** + * required bytes sRowType = 2; + */ + public boolean hasSRowType() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * required bytes sRowType = 2; + */ + public com.google.protobuf.ByteString getSRowType() { + return sRowType_; + } + + // optional bytes sRowFilter = 3; + public static final int SROWFILTER_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString sRowFilter_; + /** + * optional bytes sRowFilter = 3; + */ + public boolean hasSRowFilter() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes sRowFilter = 3; + */ + public com.google.protobuf.ByteString getSRowFilter() { + return sRowFilter_; + } + + // optional bytes sRowProjector = 4; + public static final int SROWPROJECTOR_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString sRowProjector_; + /** + * optional bytes sRowProjector = 4; + */ + public boolean hasSRowProjector() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes sRowProjector = 4; + */ + public com.google.protobuf.ByteString getSRowProjector() { + return sRowProjector_; + } + + // optional bytes sRowAggregator = 5; + public static final int SROWAGGREGATOR_FIELD_NUMBER = 5; + private com.google.protobuf.ByteString sRowAggregator_; + /** + * optional bytes sRowAggregator = 5; + */ + public boolean hasSRowAggregator() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional bytes sRowAggregator = 5; + */ + public com.google.protobuf.ByteString getSRowAggregator() { + return sRowAggregator_; + } + private void initFields() { tableInfo_ = com.google.protobuf.ByteString.EMPTY; + sRowType_ = com.google.protobuf.ByteString.EMPTY; + sRowFilter_ = com.google.protobuf.ByteString.EMPTY; + sRowProjector_ = com.google.protobuf.ByteString.EMPTY; + sRowAggregator_ = com.google.protobuf.ByteString.EMPTY; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -145,6 +273,10 @@ public final boolean isInitialized() { memoizedIsInitialized = 0; return false; } + if (!hasSRowType()) { + memoizedIsInitialized = 0; + return false; + } memoizedIsInitialized = 1; return true; } @@ -155,6 +287,18 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) if (((bitField0_ & 0x00000001) == 0x00000001)) { output.writeBytes(1, tableInfo_); } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, sRowType_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, sRowFilter_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, sRowProjector_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeBytes(5, sRowAggregator_); + } getUnknownFields().writeTo(output); } @@ -168,6 +312,22 @@ public int getSerializedSize() { size += com.google.protobuf.CodedOutputStream .computeBytesSize(1, tableInfo_); } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, sRowType_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, sRowFilter_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, sRowProjector_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(5, sRowAggregator_); + } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; @@ -196,6 +356,26 @@ public boolean equals(final java.lang.Object obj) { result = result && getTableInfo() .equals(other.getTableInfo()); } + result = result && (hasSRowType() == other.hasSRowType()); + if (hasSRowType()) { + result = result && getSRowType() + .equals(other.getSRowType()); + } + result = result && (hasSRowFilter() == other.hasSRowFilter()); + if (hasSRowFilter()) { + result = result && getSRowFilter() + .equals(other.getSRowFilter()); + } + result = result && (hasSRowProjector() == other.hasSRowProjector()); + if (hasSRowProjector()) { + result = result && getSRowProjector() + .equals(other.getSRowProjector()); + } + result = result && (hasSRowAggregator() == other.hasSRowAggregator()); + if (hasSRowAggregator()) { + result = result && getSRowAggregator() + .equals(other.getSRowAggregator()); + } result = result && getUnknownFields().equals(other.getUnknownFields()); return result; @@ -213,6 +393,22 @@ public int hashCode() { hash = (37 * hash) + TABLEINFO_FIELD_NUMBER; hash = (53 * hash) + getTableInfo().hashCode(); } + if (hasSRowType()) { + hash = (37 * hash) + SROWTYPE_FIELD_NUMBER; + hash = (53 * hash) + getSRowType().hashCode(); + } + if (hasSRowFilter()) { + hash = (37 * hash) + SROWFILTER_FIELD_NUMBER; + hash = (53 * hash) + getSRowFilter().hashCode(); + } + if (hasSRowProjector()) { + hash = (37 * hash) + SROWPROJECTOR_FIELD_NUMBER; + hash = (53 * hash) + getSRowProjector().hashCode(); + } + if (hasSRowAggregator()) { + hash = (37 * hash) + SROWAGGREGATOR_FIELD_NUMBER; + hash = (53 * hash) + getSRowAggregator().hashCode(); + } hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -302,7 +498,7 @@ protected Builder newBuilderForType( com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.class, com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.Builder.class); } - // Construct using com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIRequest.newBuilder() + // Construct using com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.newBuilder() private Builder() { maybeForceBuilderInitialization(); } @@ -324,6 +520,14 @@ public Builder clear() { super.clear(); tableInfo_ = com.google.protobuf.ByteString.EMPTY; bitField0_ = (bitField0_ & ~0x00000001); + sRowType_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + sRowFilter_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + sRowProjector_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + sRowAggregator_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000010); return this; } @@ -356,6 +560,22 @@ public Builder clone() { to_bitField0_ |= 0x00000001; } result.tableInfo_ = tableInfo_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.sRowType_ = sRowType_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.sRowFilter_ = sRowFilter_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.sRowProjector_ = sRowProjector_; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000010; + } + result.sRowAggregator_ = sRowAggregator_; result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -375,6 +595,18 @@ public Builder mergeFrom(com.kylinolap.storage.hbase.endpoint.generated.IIProtos if (other.hasTableInfo()) { setTableInfo(other.getTableInfo()); } + if (other.hasSRowType()) { + setSRowType(other.getSRowType()); + } + if (other.hasSRowFilter()) { + setSRowFilter(other.getSRowFilter()); + } + if (other.hasSRowProjector()) { + setSRowProjector(other.getSRowProjector()); + } + if (other.hasSRowAggregator()) { + setSRowAggregator(other.getSRowAggregator()); + } this.mergeUnknownFields(other.getUnknownFields()); return this; } @@ -384,6 +616,10 @@ public final boolean isInitialized() { return false; } + if (!hasSRowType()) { + + return false; + } return true; } @@ -442,6 +678,150 @@ public Builder clearTableInfo() { return this; } + // required bytes sRowType = 2; + private com.google.protobuf.ByteString sRowType_ = com.google.protobuf.ByteString.EMPTY; + /** + * required bytes sRowType = 2; + */ + public boolean hasSRowType() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * required bytes sRowType = 2; + */ + public com.google.protobuf.ByteString getSRowType() { + return sRowType_; + } + /** + * required bytes sRowType = 2; + */ + public Builder setSRowType(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + sRowType_ = value; + onChanged(); + return this; + } + /** + * required bytes sRowType = 2; + */ + public Builder clearSRowType() { + bitField0_ = (bitField0_ & ~0x00000002); + sRowType_ = getDefaultInstance().getSRowType(); + onChanged(); + return this; + } + + // optional bytes sRowFilter = 3; + private com.google.protobuf.ByteString sRowFilter_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes sRowFilter = 3; + */ + public boolean hasSRowFilter() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes sRowFilter = 3; + */ + public com.google.protobuf.ByteString getSRowFilter() { + return sRowFilter_; + } + /** + * optional bytes sRowFilter = 3; + */ + public Builder setSRowFilter(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + sRowFilter_ = value; + onChanged(); + return this; + } + /** + * optional bytes sRowFilter = 3; + */ + public Builder clearSRowFilter() { + bitField0_ = (bitField0_ & ~0x00000004); + sRowFilter_ = getDefaultInstance().getSRowFilter(); + onChanged(); + return this; + } + + // optional bytes sRowProjector = 4; + private com.google.protobuf.ByteString sRowProjector_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes sRowProjector = 4; + */ + public boolean hasSRowProjector() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes sRowProjector = 4; + */ + public com.google.protobuf.ByteString getSRowProjector() { + return sRowProjector_; + } + /** + * optional bytes sRowProjector = 4; + */ + public Builder setSRowProjector(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + sRowProjector_ = value; + onChanged(); + return this; + } + /** + * optional bytes sRowProjector = 4; + */ + public Builder clearSRowProjector() { + bitField0_ = (bitField0_ & ~0x00000008); + sRowProjector_ = getDefaultInstance().getSRowProjector(); + onChanged(); + return this; + } + + // optional bytes sRowAggregator = 5; + private com.google.protobuf.ByteString sRowAggregator_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes sRowAggregator = 5; + */ + public boolean hasSRowAggregator() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional bytes sRowAggregator = 5; + */ + public com.google.protobuf.ByteString getSRowAggregator() { + return sRowAggregator_; + } + /** + * optional bytes sRowAggregator = 5; + */ + public Builder setSRowAggregator(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + sRowAggregator_ = value; + onChanged(); + return this; + } + /** + * optional bytes sRowAggregator = 5; + */ + public Builder clearSRowAggregator() { + bitField0_ = (bitField0_ & ~0x00000010); + sRowAggregator_ = getDefaultInstance().getSRowAggregator(); + onChanged(); + return this; + } + // @@protoc_insertion_point(builder_scope:IIRequest) } @@ -761,7 +1141,7 @@ protected Builder newBuilderForType( com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.class, com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.Builder.class); } - // Construct using com.kylinolap.storage.hbase.coprocessor.generated.IIProtos.IIResponse.newBuilder() + // Construct using com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.newBuilder() private Builder() { maybeForceBuilderInitialization(); } @@ -1201,11 +1581,15 @@ private BlockingStub(com.google.protobuf.BlockingRpcChannel channel) { descriptor; static { java.lang.String[] descriptorData = { - "\n\010II.proto\"\036\n\tIIRequest\022\021\n\ttableInfo\030\001 \002" + - "(\014\"\032\n\nIIResponse\022\014\n\004rows\030\001 \003(\01421\n\013RowsSe" + - "rvice\022\"\n\007getRows\022\n.IIRequest\032\013.IIRespons" + - "eBE\n1com.kylinolap.storage.hbase.coproce" + - "ssor.generatedB\010IIProtosH\001\210\001\001\240\001\001" + "\nCstorage/src/main/java/com/kylinolap/st" + + "orage/hbase/protobuf/II.proto\"s\n\tIIReque" + + "st\022\021\n\ttableInfo\030\001 \002(\014\022\020\n\010sRowType\030\002 \002(\014\022" + + "\022\n\nsRowFilter\030\003 \001(\014\022\025\n\rsRowProjector\030\004 \001" + + "(\014\022\026\n\016sRowAggregator\030\005 \001(\014\"\032\n\nIIResponse" + + "\022\014\n\004rows\030\001 \003(\01421\n\013RowsService\022\"\n\007getRows" + + "\022\n.IIRequest\032\013.IIResponseBB\n.com.kylinol" + + "ap.storage.hbase.endpoint.generatedB\010IIP" + + "rotosH\001\210\001\001\240\001\001" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -1217,7 +1601,7 @@ private BlockingStub(com.google.protobuf.BlockingRpcChannel channel) { internal_static_IIRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_IIRequest_descriptor, - new java.lang.String[] { "TableInfo", }); + new java.lang.String[] { "TableInfo", "SRowType", "SRowFilter", "SRowProjector", "SRowAggregator", }); internal_static_IIResponse_descriptor = getDescriptor().getMessageTypes().get(1); internal_static_IIResponse_fieldAccessorTable = new diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowFilter.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowFilter.java index 1ebbcf0..7438539 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowFilter.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowFilter.java @@ -38,8 +38,8 @@ /** * @author yangli9 - * - * S for storage + *

+ * S for storage */ public class SRowFilter { @@ -52,7 +52,7 @@ public static SRowFilter fromFilter(final CubeSegment seg, TupleFilter rootFilte public TupleFilter onSerialize(TupleFilter filter) { if (filter == null) return filter; - + if (filter.getOperator() == FilterOperatorEnum.NOT && TupleFilter.isEvaluableRecursively(filter) == false) return ConstantTupleFilter.TRUE; @@ -176,16 +176,20 @@ private String translate(TblColRef column, String v, int roundingFlag) { public static SRowFilter deserialize(byte[] filterBytes) { TupleFilter filter = (filterBytes == null || filterBytes.length == 0) // - ? null // + ? null // : TupleFilterSerializer.deserialize(filterBytes); return new SRowFilter(filter); } // ============================================================================ - protected final TupleFilter filter; + public TupleFilter getFilter() { + return filter; + } + + private final TupleFilter filter; - protected SRowFilter(TupleFilter filter) { + public SRowFilter(TupleFilter filter) { this.filter = filter; } diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowTuple.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowTuple.java index f43becd..1d675f6 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowTuple.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowTuple.java @@ -27,7 +27,7 @@ /** * A special kind of tuple that exposes column value (dictionary ID) directly on * top of row key. - * + * * @author yangli9 */ public class SRowTuple implements ITuple { @@ -76,9 +76,10 @@ private String getValueAt(int i) { return values[i]; } + @Override public Object getValue(TblColRef col) { - int i = type.columnIdxMap.get(col); + int i = type.getColIndexByTblColRef(col); return getValueAt(i); } diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowType.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowType.java index 9e6ed8f..96bd21a 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowType.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowType.java @@ -34,7 +34,6 @@ /** * @author yangli9 - * */ public class SRowType { @@ -113,6 +112,10 @@ public SRowType(TblColRef[] columns, int[] columnSizes) { init(); } + public int getColIndexByTblColRef(TblColRef colRef) { + return columnIdxMap.get(colRef); + } + private void init() { int[] offsets = new int[columns.length]; int o = RowConstants.ROWKEY_CUBOIDID_LEN; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/protobuf/II.proto b/storage/src/main/java/com/kylinolap/storage/hbase/protobuf/II.proto index a73619a..2bc4cd4 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/protobuf/II.proto +++ b/storage/src/main/java/com/kylinolap/storage/hbase/protobuf/II.proto @@ -1,5 +1,8 @@ -option java_package = "com.kylinolap.storage.hbase.coprocessor.generated"; +// usage: +// protoc --java_out=./storage/src/main/java ./storage/src/main/java/com/kylinolap/storage/hbase/protobuf/II.proto + +option java_package = "com.kylinolap.storage.hbase.endpoint.generated"; option java_outer_classname = "IIProtos"; option java_generic_services = true; option java_generate_equals_and_hash = true; @@ -7,9 +10,12 @@ option optimize_for = SPEED; message IIRequest { required bytes tableInfo = 1; + required bytes sRowType = 2; + optional bytes sRowFilter = 3; + optional bytes sRowProjector = 4; + optional bytes sRowAggregator = 5; } - message IIResponse { repeated bytes rows = 1; } diff --git a/storage/src/test/java/com/kylinolap/storage/filter/BitMapFilterEvaluatorTest.java b/storage/src/test/java/com/kylinolap/storage/filter/BitMapFilterEvaluatorTest.java index 1d4bb17..95df001 100644 --- a/storage/src/test/java/com/kylinolap/storage/filter/BitMapFilterEvaluatorTest.java +++ b/storage/src/test/java/com/kylinolap/storage/filter/BitMapFilterEvaluatorTest.java @@ -4,12 +4,12 @@ import java.util.ArrayList; +import com.kylinolap.dict.Dictionary; import org.junit.Test; import it.uniroma3.mat.extendedset.intset.ConciseSet; import com.google.common.collect.Lists; -import com.kylinolap.dict.Dictionary; import com.kylinolap.metadata.model.cube.TblColRef; import com.kylinolap.metadata.model.schema.ColumnDesc; import com.kylinolap.metadata.model.schema.TableDesc; @@ -29,7 +29,7 @@ col.setTable(table); col.setName("colA"); colA = new TblColRef(col); - + col = new ColumnDesc(); col.setTable(table); col.setName("colB"); @@ -45,7 +45,7 @@ public ConciseSet getBitMap(TblColRef col, int valueId) { if (!col.equals(colA)) return null; - + // i-th record has value ID i, and last record has value null ConciseSet bitMap = new ConciseSet(); if (valueId < 0 || valueId > getMaxValueId(col)) // null @@ -70,45 +70,39 @@ public int getMaxValueId(TblColRef col) { BitMapFilterEvaluator eval = new BitMapFilterEvaluator(new MockBitMapProivder()); ArrayList basicFilters = Lists.newArrayList(); ArrayList basicResults = Lists.newArrayList(); - + public BitMapFilterEvaluatorTest() { basicFilters.add(compare(colA, FilterOperatorEnum.ISNULL)); basicResults.add(set(9)); - + basicFilters.add(compare(colA, FilterOperatorEnum.ISNOTNULL)); basicResults.add(set(0, 1, 2, 3, 4, 5, 6, 7, 8)); - + basicFilters.add(compare(colA, FilterOperatorEnum.EQ, 0)); basicResults.add(set(0)); - + basicFilters.add(compare(colA, FilterOperatorEnum.NEQ, 0)); basicResults.add(set(1, 2, 3, 4, 5, 6, 7, 8)); - + basicFilters.add(compare(colA, FilterOperatorEnum.IN, 0, 5)); basicResults.add(set(0, 5)); - + basicFilters.add(compare(colA, FilterOperatorEnum.NOTIN, 0, 5)); basicResults.add(set(1, 2, 3, 4, 6, 7, 8)); - + basicFilters.add(compare(colA, FilterOperatorEnum.LT, 3)); basicResults.add(set(0, 1, 2)); - + basicFilters.add(compare(colA, FilterOperatorEnum.LTE, 3)); basicResults.add(set(0, 1, 2, 3)); - + basicFilters.add(compare(colA, FilterOperatorEnum.GT, 3)); basicResults.add(set(4, 5, 6, 7, 8)); - + basicFilters.add(compare(colA, FilterOperatorEnum.GTE, 3)); basicResults.add(set(3, 4, 5, 6, 7, 8)); } - private ConciseSet set(int... ints) { - ConciseSet set = new ConciseSet(); - for (int i : ints) - set.add(i); - return set; - } @Test public void testBasics() { @@ -116,7 +110,7 @@ public void testBasics() { assertEquals(basicResults.get(i), eval.evaluate(basicFilters.get(i))); } } - + @Test public void testLogicalAnd() { for (int i = 0; i < basicFilters.size(); i++) { @@ -128,7 +122,7 @@ public void testLogicalAnd() { } } } - + @Test public void testLogicalOr() { for (int i = 0; i < basicFilters.size(); i++) { @@ -140,20 +134,21 @@ public void testLogicalOr() { } } } - + @Test public void testNotEvaluable() { CompareTupleFilter notEvaluable = compare(colB, FilterOperatorEnum.EQ, 0); assertEquals(null, eval.evaluate(notEvaluable)); - + LogicalTupleFilter or = logical(FilterOperatorEnum.OR, basicFilters.get(1), notEvaluable); assertEquals(null, eval.evaluate(or)); - + LogicalTupleFilter and = logical(FilterOperatorEnum.AND, basicFilters.get(1), notEvaluable); assertEquals(basicResults.get(1), eval.evaluate(and)); } - - private CompareTupleFilter compare(TblColRef col, FilterOperatorEnum op, int... ids) { + + + public static CompareTupleFilter compare(TblColRef col, TupleFilter.FilterOperatorEnum op, int... ids) { CompareTupleFilter filter = new CompareTupleFilter(op); filter.setNullString(idToStr(Dictionary.NULL_ID[1])); filter.addChild(columnFilter(col)); @@ -162,24 +157,33 @@ private CompareTupleFilter compare(TblColRef col, FilterOperatorEnum op, int... } return filter; } - - private LogicalTupleFilter logical(FilterOperatorEnum op, TupleFilter... filters) { + + public static LogicalTupleFilter logical(TupleFilter.FilterOperatorEnum op, TupleFilter... filters) { LogicalTupleFilter filter = new LogicalTupleFilter(op); for (TupleFilter f : filters) filter.addChild(f); return filter; } - - private ColumnTupleFilter columnFilter(TblColRef col) { + + public static ColumnTupleFilter columnFilter(TblColRef col) { return new ColumnTupleFilter(col); } - private ConstantTupleFilter constFilter(int id) { + public static ConstantTupleFilter constFilter(int id) { return new ConstantTupleFilter(idToStr(id)); } - - private String idToStr(int id) { + + public static ConciseSet set(int... ints) { + ConciseSet set = new ConciseSet(); + for (int i : ints) + set.add(i); + return set; + } + + + public static String idToStr(int id) { byte[] bytes = new byte[] { (byte) id }; return Dictionary.dictIdToString(bytes, 0, bytes.length); } + } diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/InvertedIndexHBaseTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/InvertedIndexHBaseTest.java index 46ec3cc..88dea42 100644 --- a/storage/src/test/java/com/kylinolap/storage/hbase/InvertedIndexHBaseTest.java +++ b/storage/src/test/java/com/kylinolap/storage/hbase/InvertedIndexHBaseTest.java @@ -89,41 +89,6 @@ public void testLoad() throws Exception { System.out.println(records.size() + " records"); } - @Test - public void testEndpoint() throws Throwable { - String tableName = seg.getStorageLocationIdentifier(); - HTableInterface table = hconn.getTable(tableName); - final TableRecordInfoDigest recordInfo = new TableRecordInfo(seg); - final IIProtos.IIRequest request = IIProtos.IIRequest.newBuilder().setTableInfo( - ByteString.copyFrom(TableRecordInfoDigest.serialize(recordInfo))).build(); - - Map> results = table.coprocessorService(IIProtos.RowsService.class, - null, null, - new Batch.Call>() { - public List call(IIProtos.RowsService counter) throws IOException { - ServerRpcController controller = new ServerRpcController(); - BlockingRpcCallback rpcCallback = - new BlockingRpcCallback(); - counter.getRows(controller, request, rpcCallback); - IIProtos.IIResponse response = rpcCallback.get(); - if (controller.failedOnException()) { - throw controller.getFailedOn(); - } - - List records = new ArrayList(); - for (ByteString raw : response.getRowsList()) { - TableRecord record = new TableRecord(recordInfo); - record.setBytes(raw.toByteArray(), 0, raw.size()); - records.add(record); - } - return records; - } - }); - - for (Map.Entry> entry : results.entrySet()) { - System.out.println("result count : " + entry.getValue()); - } - } private List iterateRecords(List slices) { List records = Lists.newArrayList(); From de921e5ead8e52b293d0a08a9812c68796853ea4 Mon Sep 17 00:00:00 2001 From: "Li, Yang" Date: Thu, 27 Nov 2014 18:28:04 +0800 Subject: [PATCH 14/65] package refactor for metadata --- .../main/java/com/kylinolap/cube/CubeManager.java | 6 +- .../main/java/com/kylinolap/cube/CubeSegment.java | 2 +- .../com/kylinolap/cube/CubeSegmentValidator.java | 2 +- .../kylinolap/cube/cli/DictionaryGeneratorCLI.java | 2 +- .../com/kylinolap/cube/common/RowKeySplitter.java | 2 +- .../java/com/kylinolap/cube/cuboid/Cuboid.java | 2 +- .../kylinolap/cube/dataGen/FactTableGenerator.java | 6 +- .../cube/estimation/CubeSizeEstimationCLI.java | 2 +- .../cube/invertedindex/TableRecordInfo.java | 6 +- .../kylinolap/cube/kv/AbstractRowKeyEncoder.java | 2 +- .../com/kylinolap/cube/kv/FuzzyMaskEncoder.java | 2 +- .../java/com/kylinolap/cube/kv/RowKeyColumnIO.java | 2 +- .../com/kylinolap/cube/kv/RowKeyColumnOrder.java | 2 +- .../java/com/kylinolap/cube/kv/RowKeyDecoder.java | 2 +- .../java/com/kylinolap/cube/kv/RowKeyEncoder.java | 2 +- .../com/kylinolap/cube/kv/RowValueDecoder.java | 2 +- .../kylinolap/cube/measure/MeasureAggregator.java | 4 +- .../kylinolap/cube/measure/MeasureAggregators.java | 2 +- .../kylinolap/cube/measure/MeasureSerializer.java | 2 +- .../measure/fixedlen/FixedLenMeasureCodec.java | 2 +- .../com/kylinolap/cube/project/ProjectManager.java | 10 +- .../com/kylinolap/cube/kv/RowValueDecoderTest.java | 2 +- .../kylinolap/cube/measure/MeasureCodecTest.java | 2 +- .../com/kylinolap/dict/DictionaryGenerator.java | 2 +- .../java/com/kylinolap/dict/DictionaryManager.java | 2 +- .../dict/lookup/DictionaryLookupTable.java | 2 +- .../kylinolap/dict/lookup/LookupBytesTable.java | 2 +- .../kylinolap/dict/lookup/LookupStringTable.java | 2 +- .../com/kylinolap/dict/lookup/LookupTable.java | 2 +- .../com/kylinolap/dict/lookup/SnapshotManager.java | 2 +- .../com/kylinolap/dict/lookup/SnapshotTable.java | 2 +- .../com/kylinolap/dict/DictionaryManagerTest.java | 2 +- .../java/com/kylinolap/dict/LookupTableTest.java | 2 +- .../com/kylinolap/dict/SnapshotManagerTest.java | 2 +- .../java/com/kylinolap/job/JoinedFlatTable.java | 4 +- .../kylinolap/job/hadoop/AbstractHadoopJob.java | 2 +- .../job/hadoop/cube/BaseCuboidMapper.java | 4 +- .../job/hadoop/cube/FactDistinctColumnsMapper.java | 2 +- .../hadoop/cube/FactDistinctColumnsReducer.java | 2 +- .../job/hadoop/cube/MergeCuboidMapper.java | 2 +- .../job/hadoop/cube/NewBaseCuboidMapper.java | 10 +- .../job/hadoop/hive/JoinedFlatTableDesc.java | 4 +- .../hadoop/invertedindex/IIDistinctColumnsJob.java | 4 +- .../com/kylinolap/job/tools/CubeMigrationCLI.java | 3 +- .../com/kylinolap/job/CubeDevelopTestCase.java | 5 +- .../job/hadoop/cube/MergeCuboidMapperTest.java | 2 +- .../com/kylinolap/metadata/MetadataManager.java | 2 +- .../com/kylinolap/metadata/model/ColumnDesc.java | 125 +++++++++ .../kylinolap/metadata/model/DataModelDesc.java | 19 ++ .../com/kylinolap/metadata/model/DataType.java | 279 +++++++++++++++++++++ .../com/kylinolap/metadata/model/DatabaseDesc.java | 75 ++++++ .../com/kylinolap/metadata/model/JoinDesc.java | 135 ++++++++++ .../com/kylinolap/metadata/model/LookupDesc.java | 16 ++ .../com/kylinolap/metadata/model/TableDesc.java | 129 ++++++++++ .../kylinolap/metadata/model/cube/CubeDesc.java | 10 +- .../metadata/model/cube/CubePartitionDesc.java | 1 + .../metadata/model/cube/DimensionDesc.java | 4 +- .../metadata/model/cube/FunctionDesc.java | 193 -------------- .../metadata/model/cube/HBaseColumnDesc.java | 1 + .../metadata/model/cube/HBaseMappingDesc.java | 1 + .../metadata/model/cube/HierarchyDesc.java | 1 + .../kylinolap/metadata/model/cube/JoinDesc.java | 134 ---------- .../kylinolap/metadata/model/cube/MeasureDesc.java | 1 + .../metadata/model/cube/ParameterDesc.java | 122 --------- .../metadata/model/cube/RowKeyColDesc.java | 1 + .../kylinolap/metadata/model/cube/RowKeyDesc.java | 1 + .../kylinolap/metadata/model/cube/TblColRef.java | 141 ----------- .../model/invertedindex/InvertedIndexDesc.java | 6 +- .../metadata/model/realization/FunctionDesc.java | 193 ++++++++++++++ .../model/realization/IDataModelRealization.java | 9 + .../metadata/model/realization/ParameterDesc.java | 122 +++++++++ .../metadata/model/realization/TblColRef.java | 141 +++++++++++ .../metadata/model/schema/ColumnDesc.java | 125 --------- .../kylinolap/metadata/model/schema/DataType.java | 279 --------------------- .../metadata/model/schema/DatabaseDesc.java | 75 ------ .../kylinolap/metadata/model/schema/TableDesc.java | 129 ---------- .../metadata/tool/HiveSourceTableMgmt.java | 4 +- .../validation/SourceTableMetadataValidator.java | 2 +- .../metadata/validation/rule/FunctionRule.java | 10 +- .../kylinolap/metadata/MetadataManagerTest.java | 2 +- .../kylinolap/query/enumerator/CubeEnumerator.java | 4 +- .../query/enumerator/LookupTableEnumerator.java | 2 +- .../com/kylinolap/query/relnode/ColumnRowType.java | 2 +- .../kylinolap/query/relnode/OLAPAggregateRel.java | 10 +- .../com/kylinolap/query/relnode/OLAPContext.java | 6 +- .../com/kylinolap/query/relnode/OLAPFilterRel.java | 2 +- .../com/kylinolap/query/relnode/OLAPJoinRel.java | 4 +- .../kylinolap/query/relnode/OLAPProjectRel.java | 4 +- .../com/kylinolap/query/relnode/OLAPSortRel.java | 2 +- .../com/kylinolap/query/relnode/OLAPTableScan.java | 4 +- .../com/kylinolap/query/routing/QueryRouter.java | 8 +- .../com/kylinolap/query/schema/OLAPSchema.java | 2 +- .../kylinolap/query/schema/OLAPSchemaFactory.java | 4 +- .../java/com/kylinolap/query/schema/OLAPTable.java | 6 +- .../java/com/kylinolap/query/test/H2Database.java | 4 +- .../kylinolap/rest/controller/TableController.java | 4 +- .../kylinolap/rest/response/TableDescResponse.java | 2 +- .../com/kylinolap/rest/service/CubeService.java | 4 +- .../java/com/kylinolap/storage/IStorageEngine.java | 4 +- .../java/com/kylinolap/storage/StorageContext.java | 2 +- .../storage/filter/BitMapFilterEvaluator.java | 2 +- .../storage/filter/ColumnTupleFilter.java | 6 +- .../storage/filter/CompareTupleFilter.java | 2 +- .../kylinolap/storage/hbase/ColumnValueRange.java | 2 +- .../hbase/ConcurrentHBaseTupleIterator.java | 2 +- .../storage/hbase/CubeSegmentTupleIterator.java | 2 +- .../storage/hbase/DerivedFilterTranslator.java | 2 +- .../storage/hbase/FuzzyValueCombination.java | 2 +- .../com/kylinolap/storage/hbase/HBaseKeyRange.java | 2 +- .../storage/hbase/HBaseStorageEngine.java | 4 +- .../storage/hbase/InvertedIndexStorageEngine.java | 7 +- .../hbase/SerializedHBaseTupleIterator.java | 2 +- .../storage/hbase/observer/CoprocessorEnabler.java | 2 +- .../storage/hbase/observer/SRowFilter.java | 2 +- .../storage/hbase/observer/SRowProjector.java | 2 +- .../storage/hbase/observer/SRowTuple.java | 2 +- .../kylinolap/storage/hbase/observer/SRowType.java | 6 +- .../java/com/kylinolap/storage/tuple/ITuple.java | 2 +- .../java/com/kylinolap/storage/tuple/Tuple.java | 2 +- .../com/kylinolap/storage/tuple/TupleInfo.java | 2 +- .../storage/filter/BitMapFilterEvaluatorTest.java | 6 +- .../kylinolap/storage/filter/FilterBaseTest.java | 6 +- .../storage/filter/FilterEvaluateTest.java | 2 +- .../storage/filter/FilterSerializeTest.java | 6 +- .../storage/hbase/FuzzyValueCombinationTest.java | 6 +- .../observer/AggregateRegionObserverTest.java | 6 +- .../com/kylinolap/storage/test/StorageTest.java | 10 +- 127 files changed, 1430 insertions(+), 1369 deletions(-) create mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/ColumnDesc.java create mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java create mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/DataType.java create mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/DatabaseDesc.java create mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/JoinDesc.java create mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/LookupDesc.java create mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/cube/FunctionDesc.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/cube/JoinDesc.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/cube/ParameterDesc.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/cube/TblColRef.java create mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/realization/FunctionDesc.java create mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/realization/IDataModelRealization.java create mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/realization/ParameterDesc.java create mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/realization/TblColRef.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/schema/ColumnDesc.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/schema/DataType.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/schema/DatabaseDesc.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/schema/TableDesc.java diff --git a/cube/src/main/java/com/kylinolap/cube/CubeManager.java b/cube/src/main/java/com/kylinolap/cube/CubeManager.java index e7e8954..937477e 100644 --- a/cube/src/main/java/com/kylinolap/cube/CubeManager.java +++ b/cube/src/main/java/com/kylinolap/cube/CubeManager.java @@ -46,12 +46,12 @@ import com.kylinolap.dict.lookup.SnapshotManager; import com.kylinolap.dict.lookup.SnapshotTable; import com.kylinolap.metadata.MetadataManager; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.model.cube.DimensionDesc; -import com.kylinolap.metadata.model.cube.TblColRef; import com.kylinolap.metadata.model.invertedindex.InvertedIndexDesc; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author yangli9 diff --git a/cube/src/main/java/com/kylinolap/cube/CubeSegment.java b/cube/src/main/java/com/kylinolap/cube/CubeSegment.java index 6e34aa5..90f5443 100644 --- a/cube/src/main/java/com/kylinolap/cube/CubeSegment.java +++ b/cube/src/main/java/com/kylinolap/cube/CubeSegment.java @@ -26,7 +26,7 @@ import com.fasterxml.jackson.annotation.JsonBackReference; import com.fasterxml.jackson.annotation.JsonProperty; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; @JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) public class CubeSegment implements Comparable { diff --git a/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java b/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java index 524734b..1f3cb96 100644 --- a/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java +++ b/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java @@ -25,7 +25,7 @@ import com.kylinolap.dict.DictionaryManager; import com.kylinolap.metadata.model.cube.CubePartitionDesc.CubePartitionType; import com.kylinolap.metadata.model.cube.DimensionDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author xduo diff --git a/cube/src/main/java/com/kylinolap/cube/cli/DictionaryGeneratorCLI.java b/cube/src/main/java/com/kylinolap/cube/cli/DictionaryGeneratorCLI.java index c3dbe1a..2cee7ed 100644 --- a/cube/src/main/java/com/kylinolap/cube/cli/DictionaryGeneratorCLI.java +++ b/cube/src/main/java/com/kylinolap/cube/cli/DictionaryGeneratorCLI.java @@ -26,7 +26,7 @@ import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.CubeSegmentStatusEnum; import com.kylinolap.metadata.model.cube.DimensionDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; public class DictionaryGeneratorCLI { diff --git a/cube/src/main/java/com/kylinolap/cube/common/RowKeySplitter.java b/cube/src/main/java/com/kylinolap/cube/common/RowKeySplitter.java index c049b3a..a80fd66 100644 --- a/cube/src/main/java/com/kylinolap/cube/common/RowKeySplitter.java +++ b/cube/src/main/java/com/kylinolap/cube/common/RowKeySplitter.java @@ -22,7 +22,7 @@ import com.kylinolap.cube.kv.RowConstants; import com.kylinolap.cube.kv.RowKeyColumnIO; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author George Song (ysong1) diff --git a/cube/src/main/java/com/kylinolap/cube/cuboid/Cuboid.java b/cube/src/main/java/com/kylinolap/cube/cuboid/Cuboid.java index ea673a5..df7699a 100644 --- a/cube/src/main/java/com/kylinolap/cube/cuboid/Cuboid.java +++ b/cube/src/main/java/com/kylinolap/cube/cuboid/Cuboid.java @@ -31,7 +31,7 @@ import com.kylinolap.metadata.model.cube.RowKeyDesc; import com.kylinolap.metadata.model.cube.RowKeyDesc.AggrGroupMask; import com.kylinolap.metadata.model.cube.RowKeyDesc.HierarchyMask; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author George Song (ysong1) diff --git a/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java b/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java index 595e5c8..15e899c 100644 --- a/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java +++ b/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java @@ -17,12 +17,12 @@ import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; import com.kylinolap.metadata.MetadataManager; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.JoinDesc; import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.model.cube.DimensionDesc; -import com.kylinolap.metadata.model.cube.JoinDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.ColumnDesc; +import com.kylinolap.metadata.model.realization.TblColRef; /** * Created by hongbin on 5/20/14. diff --git a/cube/src/main/java/com/kylinolap/cube/estimation/CubeSizeEstimationCLI.java b/cube/src/main/java/com/kylinolap/cube/estimation/CubeSizeEstimationCLI.java index 494f1b0..cd1ac30 100644 --- a/cube/src/main/java/com/kylinolap/cube/estimation/CubeSizeEstimationCLI.java +++ b/cube/src/main/java/com/kylinolap/cube/estimation/CubeSizeEstimationCLI.java @@ -11,13 +11,13 @@ import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.cube.cuboid.CuboidScheduler; +import com.kylinolap.metadata.model.DataType; import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.model.cube.DimensionDesc; import com.kylinolap.metadata.model.cube.HierarchyDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; import com.kylinolap.metadata.model.cube.RowKeyColDesc; import com.kylinolap.metadata.model.cube.RowKeyDesc; -import com.kylinolap.metadata.model.schema.DataType; /** * Created by honma on 9/1/14. diff --git a/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfo.java b/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfo.java index b831328..2196a47 100644 --- a/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfo.java +++ b/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfo.java @@ -24,10 +24,10 @@ import com.kylinolap.cube.measure.fixedlen.FixedLenMeasureCodec; import com.kylinolap.dict.Dictionary; import com.kylinolap.dict.DictionaryManager; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; import com.kylinolap.metadata.model.invertedindex.InvertedIndexDesc; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author yangli9 diff --git a/cube/src/main/java/com/kylinolap/cube/kv/AbstractRowKeyEncoder.java b/cube/src/main/java/com/kylinolap/cube/kv/AbstractRowKeyEncoder.java index e2a367c..4e8bdb8 100644 --- a/cube/src/main/java/com/kylinolap/cube/kv/AbstractRowKeyEncoder.java +++ b/cube/src/main/java/com/kylinolap/cube/kv/AbstractRowKeyEncoder.java @@ -25,7 +25,7 @@ import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.dict.Dictionary; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * diff --git a/cube/src/main/java/com/kylinolap/cube/kv/FuzzyMaskEncoder.java b/cube/src/main/java/com/kylinolap/cube/kv/FuzzyMaskEncoder.java index e42ba1e..2f16207 100644 --- a/cube/src/main/java/com/kylinolap/cube/kv/FuzzyMaskEncoder.java +++ b/cube/src/main/java/com/kylinolap/cube/kv/FuzzyMaskEncoder.java @@ -19,7 +19,7 @@ import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.cuboid.Cuboid; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * diff --git a/cube/src/main/java/com/kylinolap/cube/kv/RowKeyColumnIO.java b/cube/src/main/java/com/kylinolap/cube/kv/RowKeyColumnIO.java index d064769..bbcd8fe 100644 --- a/cube/src/main/java/com/kylinolap/cube/kv/RowKeyColumnIO.java +++ b/cube/src/main/java/com/kylinolap/cube/kv/RowKeyColumnIO.java @@ -27,7 +27,7 @@ import com.kylinolap.cube.CubeSegment; import com.kylinolap.dict.Dictionary; import com.kylinolap.metadata.model.cube.RowKeyDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * Read/Write column values from/into bytes diff --git a/cube/src/main/java/com/kylinolap/cube/kv/RowKeyColumnOrder.java b/cube/src/main/java/com/kylinolap/cube/kv/RowKeyColumnOrder.java index db598c8..46944c9 100644 --- a/cube/src/main/java/com/kylinolap/cube/kv/RowKeyColumnOrder.java +++ b/cube/src/main/java/com/kylinolap/cube/kv/RowKeyColumnOrder.java @@ -19,7 +19,7 @@ import java.util.Collection; import java.util.Comparator; -import com.kylinolap.metadata.model.schema.DataType; +import com.kylinolap.metadata.model.DataType; /** * @author yangli9 diff --git a/cube/src/main/java/com/kylinolap/cube/kv/RowKeyDecoder.java b/cube/src/main/java/com/kylinolap/cube/kv/RowKeyDecoder.java index 527f546..f211e28 100644 --- a/cube/src/main/java/com/kylinolap/cube/kv/RowKeyDecoder.java +++ b/cube/src/main/java/com/kylinolap/cube/kv/RowKeyDecoder.java @@ -25,7 +25,7 @@ import com.kylinolap.cube.common.SplittedBytes; import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * diff --git a/cube/src/main/java/com/kylinolap/cube/kv/RowKeyEncoder.java b/cube/src/main/java/com/kylinolap/cube/kv/RowKeyEncoder.java index 6485d9f..9e53baf 100644 --- a/cube/src/main/java/com/kylinolap/cube/kv/RowKeyEncoder.java +++ b/cube/src/main/java/com/kylinolap/cube/kv/RowKeyEncoder.java @@ -24,7 +24,7 @@ import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.cuboid.Cuboid; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author George Song (ysong1) diff --git a/cube/src/main/java/com/kylinolap/cube/kv/RowValueDecoder.java b/cube/src/main/java/com/kylinolap/cube/kv/RowValueDecoder.java index c36bc81..1b149a2 100644 --- a/cube/src/main/java/com/kylinolap/cube/kv/RowValueDecoder.java +++ b/cube/src/main/java/com/kylinolap/cube/kv/RowValueDecoder.java @@ -27,9 +27,9 @@ import org.apache.hadoop.io.LongWritable; import com.kylinolap.cube.measure.MeasureCodec; -import com.kylinolap.metadata.model.cube.FunctionDesc; import com.kylinolap.metadata.model.cube.HBaseColumnDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; +import com.kylinolap.metadata.model.realization.FunctionDesc; /** * diff --git a/cube/src/main/java/com/kylinolap/cube/measure/MeasureAggregator.java b/cube/src/main/java/com/kylinolap/cube/measure/MeasureAggregator.java index 726cfca..ed332f8 100644 --- a/cube/src/main/java/com/kylinolap/cube/measure/MeasureAggregator.java +++ b/cube/src/main/java/com/kylinolap/cube/measure/MeasureAggregator.java @@ -16,8 +16,8 @@ package com.kylinolap.cube.measure; -import com.kylinolap.metadata.model.cube.FunctionDesc; -import com.kylinolap.metadata.model.schema.DataType; +import com.kylinolap.metadata.model.DataType; +import com.kylinolap.metadata.model.realization.FunctionDesc; /** * @author yangli9 diff --git a/cube/src/main/java/com/kylinolap/cube/measure/MeasureAggregators.java b/cube/src/main/java/com/kylinolap/cube/measure/MeasureAggregators.java index aa463b8..993c688 100644 --- a/cube/src/main/java/com/kylinolap/cube/measure/MeasureAggregators.java +++ b/cube/src/main/java/com/kylinolap/cube/measure/MeasureAggregators.java @@ -20,8 +20,8 @@ import java.util.HashMap; import java.util.Map; -import com.kylinolap.metadata.model.cube.FunctionDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; +import com.kylinolap.metadata.model.realization.FunctionDesc; /** * @author yangli9 diff --git a/cube/src/main/java/com/kylinolap/cube/measure/MeasureSerializer.java b/cube/src/main/java/com/kylinolap/cube/measure/MeasureSerializer.java index 9b2ece7..ec95387 100644 --- a/cube/src/main/java/com/kylinolap/cube/measure/MeasureSerializer.java +++ b/cube/src/main/java/com/kylinolap/cube/measure/MeasureSerializer.java @@ -19,7 +19,7 @@ import java.util.HashMap; import com.kylinolap.common.util.BytesSerializer; -import com.kylinolap.metadata.model.schema.DataType; +import com.kylinolap.metadata.model.DataType; /** * @author yangli9 diff --git a/cube/src/main/java/com/kylinolap/cube/measure/fixedlen/FixedLenMeasureCodec.java b/cube/src/main/java/com/kylinolap/cube/measure/fixedlen/FixedLenMeasureCodec.java index e8a7a08..6ea378c 100644 --- a/cube/src/main/java/com/kylinolap/cube/measure/fixedlen/FixedLenMeasureCodec.java +++ b/cube/src/main/java/com/kylinolap/cube/measure/fixedlen/FixedLenMeasureCodec.java @@ -1,6 +1,6 @@ package com.kylinolap.cube.measure.fixedlen; -import com.kylinolap.metadata.model.schema.DataType; +import com.kylinolap.metadata.model.DataType; abstract public class FixedLenMeasureCodec { diff --git a/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java b/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java index 12202b1..f4210e6 100644 --- a/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java +++ b/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java @@ -40,14 +40,14 @@ import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; import com.kylinolap.metadata.MetadataManager; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.JoinDesc; +import com.kylinolap.metadata.model.TableDesc; import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.model.cube.DimensionDesc; -import com.kylinolap.metadata.model.cube.FunctionDesc; -import com.kylinolap.metadata.model.cube.JoinDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.realization.FunctionDesc; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author xduo diff --git a/cube/src/test/java/com/kylinolap/cube/kv/RowValueDecoderTest.java b/cube/src/test/java/com/kylinolap/cube/kv/RowValueDecoderTest.java index 6595adc..3a9c3e4 100644 --- a/cube/src/test/java/com/kylinolap/cube/kv/RowValueDecoderTest.java +++ b/cube/src/test/java/com/kylinolap/cube/kv/RowValueDecoderTest.java @@ -32,9 +32,9 @@ import com.kylinolap.cube.measure.MeasureCodec; import com.kylinolap.metadata.MetadataManager; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.FunctionDesc; import com.kylinolap.metadata.model.cube.HBaseColumnDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; +import com.kylinolap.metadata.model.realization.FunctionDesc; /** * @author George Song (ysong1) diff --git a/cube/src/test/java/com/kylinolap/cube/measure/MeasureCodecTest.java b/cube/src/test/java/com/kylinolap/cube/measure/MeasureCodecTest.java index e3e78c9..baacd72 100644 --- a/cube/src/test/java/com/kylinolap/cube/measure/MeasureCodecTest.java +++ b/cube/src/test/java/com/kylinolap/cube/measure/MeasureCodecTest.java @@ -28,8 +28,8 @@ import com.kylinolap.common.hll.HyperLogLogPlusCounter; import com.kylinolap.cube.kv.RowConstants; -import com.kylinolap.metadata.model.cube.FunctionDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; +import com.kylinolap.metadata.model.realization.FunctionDesc; /** * @author yangli9 diff --git a/dictionary/src/main/java/com/kylinolap/dict/DictionaryGenerator.java b/dictionary/src/main/java/com/kylinolap/dict/DictionaryGenerator.java index e1b75fe..432ed19 100644 --- a/dictionary/src/main/java/com/kylinolap/dict/DictionaryGenerator.java +++ b/dictionary/src/main/java/com/kylinolap/dict/DictionaryGenerator.java @@ -32,7 +32,7 @@ import com.kylinolap.common.util.JsonUtil; import com.kylinolap.dict.lookup.ReadableTable; import com.kylinolap.dict.lookup.TableReader; -import com.kylinolap.metadata.model.schema.DataType; +import com.kylinolap.metadata.model.DataType; /** * @author yangli9 diff --git a/dictionary/src/main/java/com/kylinolap/dict/DictionaryManager.java b/dictionary/src/main/java/com/kylinolap/dict/DictionaryManager.java index 73bc9d9..65e8366 100644 --- a/dictionary/src/main/java/com/kylinolap/dict/DictionaryManager.java +++ b/dictionary/src/main/java/com/kylinolap/dict/DictionaryManager.java @@ -39,7 +39,7 @@ import com.kylinolap.dict.lookup.TableSignature; import com.kylinolap.metadata.MetadataManager; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; public class DictionaryManager { diff --git a/dictionary/src/main/java/com/kylinolap/dict/lookup/DictionaryLookupTable.java b/dictionary/src/main/java/com/kylinolap/dict/lookup/DictionaryLookupTable.java index 4d7686f..6aee589 100644 --- a/dictionary/src/main/java/com/kylinolap/dict/lookup/DictionaryLookupTable.java +++ b/dictionary/src/main/java/com/kylinolap/dict/lookup/DictionaryLookupTable.java @@ -19,7 +19,7 @@ import java.io.IOException; import com.kylinolap.dict.Dictionary; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.TableDesc; /** * An in-memory lookup table indexed by a dictionary column. The column value diff --git a/dictionary/src/main/java/com/kylinolap/dict/lookup/LookupBytesTable.java b/dictionary/src/main/java/com/kylinolap/dict/lookup/LookupBytesTable.java index 25f771f..46ac371 100644 --- a/dictionary/src/main/java/com/kylinolap/dict/lookup/LookupBytesTable.java +++ b/dictionary/src/main/java/com/kylinolap/dict/lookup/LookupBytesTable.java @@ -21,7 +21,7 @@ import org.apache.hadoop.hbase.util.Bytes; import com.kylinolap.common.util.ByteArray; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.TableDesc; /** * @author yangli9 diff --git a/dictionary/src/main/java/com/kylinolap/dict/lookup/LookupStringTable.java b/dictionary/src/main/java/com/kylinolap/dict/lookup/LookupStringTable.java index 0b6cc86..283e56c 100644 --- a/dictionary/src/main/java/com/kylinolap/dict/lookup/LookupStringTable.java +++ b/dictionary/src/main/java/com/kylinolap/dict/lookup/LookupStringTable.java @@ -18,7 +18,7 @@ import java.io.IOException; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.TableDesc; /** * @author yangli9 diff --git a/dictionary/src/main/java/com/kylinolap/dict/lookup/LookupTable.java b/dictionary/src/main/java/com/kylinolap/dict/lookup/LookupTable.java index 19d40ca..01d5767 100644 --- a/dictionary/src/main/java/com/kylinolap/dict/lookup/LookupTable.java +++ b/dictionary/src/main/java/com/kylinolap/dict/lookup/LookupTable.java @@ -27,7 +27,7 @@ import com.google.common.collect.Sets; import com.kylinolap.common.util.Array; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.TableDesc; /** * An in-memory lookup table, in which each cell is an object of type T. The diff --git a/dictionary/src/main/java/com/kylinolap/dict/lookup/SnapshotManager.java b/dictionary/src/main/java/com/kylinolap/dict/lookup/SnapshotManager.java index a47e614..61347ef 100644 --- a/dictionary/src/main/java/com/kylinolap/dict/lookup/SnapshotManager.java +++ b/dictionary/src/main/java/com/kylinolap/dict/lookup/SnapshotManager.java @@ -26,7 +26,7 @@ import com.kylinolap.common.KylinConfig; import com.kylinolap.common.persistence.ResourceStore; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.TableDesc; /** * @author yangli9 diff --git a/dictionary/src/main/java/com/kylinolap/dict/lookup/SnapshotTable.java b/dictionary/src/main/java/com/kylinolap/dict/lookup/SnapshotTable.java index 6415045..c45ad15 100644 --- a/dictionary/src/main/java/com/kylinolap/dict/lookup/SnapshotTable.java +++ b/dictionary/src/main/java/com/kylinolap/dict/lookup/SnapshotTable.java @@ -30,7 +30,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.kylinolap.common.persistence.ResourceStore; import com.kylinolap.common.persistence.RootPersistentEntity; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.TableDesc; /** * @author yangli9 diff --git a/dictionary/src/test/java/com/kylinolap/dict/DictionaryManagerTest.java b/dictionary/src/test/java/com/kylinolap/dict/DictionaryManagerTest.java index 8452811..2ee9a68 100644 --- a/dictionary/src/test/java/com/kylinolap/dict/DictionaryManagerTest.java +++ b/dictionary/src/test/java/com/kylinolap/dict/DictionaryManagerTest.java @@ -28,7 +28,7 @@ import com.kylinolap.common.util.LocalFileMetadataTestCase; import com.kylinolap.metadata.MetadataManager; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; public class DictionaryManagerTest extends LocalFileMetadataTestCase { diff --git a/dictionary/src/test/java/com/kylinolap/dict/LookupTableTest.java b/dictionary/src/test/java/com/kylinolap/dict/LookupTableTest.java index fda09cb..48c8cca 100644 --- a/dictionary/src/test/java/com/kylinolap/dict/LookupTableTest.java +++ b/dictionary/src/test/java/com/kylinolap/dict/LookupTableTest.java @@ -27,7 +27,7 @@ import com.kylinolap.dict.lookup.FileTable; import com.kylinolap.dict.lookup.LookupBytesTable; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.TableDesc; /** * @author yangli9 diff --git a/dictionary/src/test/java/com/kylinolap/dict/SnapshotManagerTest.java b/dictionary/src/test/java/com/kylinolap/dict/SnapshotManagerTest.java index aecc491..c699ba3 100644 --- a/dictionary/src/test/java/com/kylinolap/dict/SnapshotManagerTest.java +++ b/dictionary/src/test/java/com/kylinolap/dict/SnapshotManagerTest.java @@ -28,7 +28,7 @@ import com.kylinolap.dict.lookup.SnapshotTable; import com.kylinolap.dict.lookup.TableReader; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.TableDesc; /** * @author yangli9 diff --git a/job/src/main/java/com/kylinolap/job/JoinedFlatTable.java b/job/src/main/java/com/kylinolap/job/JoinedFlatTable.java index 2a411c1..b562f81 100644 --- a/job/src/main/java/com/kylinolap/job/JoinedFlatTable.java +++ b/job/src/main/java/com/kylinolap/job/JoinedFlatTable.java @@ -37,10 +37,10 @@ import com.kylinolap.job.hadoop.hive.JoinedFlatTableDesc; import com.kylinolap.job.hadoop.hive.JoinedFlatTableDesc.IntermediateColumnDesc; import com.kylinolap.job.hadoop.hive.SqlHiveDataTypeMapping; +import com.kylinolap.metadata.model.JoinDesc; import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.model.cube.DimensionDesc; -import com.kylinolap.metadata.model.cube.JoinDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author George Song (ysong1) diff --git a/job/src/main/java/com/kylinolap/job/hadoop/AbstractHadoopJob.java b/job/src/main/java/com/kylinolap/job/hadoop/AbstractHadoopJob.java index ed78fb7..44dabd3 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/AbstractHadoopJob.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/AbstractHadoopJob.java @@ -55,7 +55,7 @@ import com.kylinolap.job.JobInstance; import com.kylinolap.job.exception.JobException; import com.kylinolap.job.tools.OptionsHelper; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.TableDesc; @SuppressWarnings("static-access") public abstract class AbstractHadoopJob extends Configured implements Tool { diff --git a/job/src/main/java/com/kylinolap/job/hadoop/cube/BaseCuboidMapper.java b/job/src/main/java/com/kylinolap/job/hadoop/cube/BaseCuboidMapper.java index e3f7cb3..f85a5c8 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/cube/BaseCuboidMapper.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/cube/BaseCuboidMapper.java @@ -42,9 +42,9 @@ import com.kylinolap.job.hadoop.AbstractHadoopJob; import com.kylinolap.job.hadoop.hive.JoinedFlatTableDesc; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.FunctionDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; -import com.kylinolap.metadata.model.cube.ParameterDesc; +import com.kylinolap.metadata.model.realization.FunctionDesc; +import com.kylinolap.metadata.model.realization.ParameterDesc; /** * @author George Song (ysong1) diff --git a/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsMapper.java b/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsMapper.java index 236658d..f9b8ace 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsMapper.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsMapper.java @@ -36,7 +36,7 @@ import com.kylinolap.job.hadoop.hive.JoinedFlatTableDesc; import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.model.cube.RowKeyDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author yangli9 diff --git a/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsReducer.java b/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsReducer.java index e701781..58ab57f 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsReducer.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsReducer.java @@ -38,7 +38,7 @@ import com.kylinolap.job.constant.BatchConstants; import com.kylinolap.job.hadoop.AbstractHadoopJob; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author yangli9 diff --git a/job/src/main/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapper.java b/job/src/main/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapper.java index 0856282..83fbd95 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapper.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapper.java @@ -41,7 +41,7 @@ import com.kylinolap.job.constant.BatchConstants; import com.kylinolap.job.hadoop.AbstractHadoopJob; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author ysong1, honma diff --git a/job/src/main/java/com/kylinolap/job/hadoop/cube/NewBaseCuboidMapper.java b/job/src/main/java/com/kylinolap/job/hadoop/cube/NewBaseCuboidMapper.java index 66beac4..bc7b518 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/cube/NewBaseCuboidMapper.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/cube/NewBaseCuboidMapper.java @@ -50,14 +50,14 @@ import com.kylinolap.job.constant.BatchConstants; import com.kylinolap.job.hadoop.AbstractHadoopJob; import com.kylinolap.metadata.MetadataManager; +import com.kylinolap.metadata.model.JoinDesc; +import com.kylinolap.metadata.model.TableDesc; import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.model.cube.DimensionDesc; -import com.kylinolap.metadata.model.cube.FunctionDesc; -import com.kylinolap.metadata.model.cube.JoinDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; -import com.kylinolap.metadata.model.cube.ParameterDesc; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.realization.FunctionDesc; +import com.kylinolap.metadata.model.realization.ParameterDesc; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author George Song (ysong1),honma diff --git a/job/src/main/java/com/kylinolap/job/hadoop/hive/JoinedFlatTableDesc.java b/job/src/main/java/com/kylinolap/job/hadoop/hive/JoinedFlatTableDesc.java index 2fdce86..360d243 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/hive/JoinedFlatTableDesc.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/hive/JoinedFlatTableDesc.java @@ -23,9 +23,9 @@ import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.FunctionDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.FunctionDesc; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author George Song (ysong1) diff --git a/job/src/main/java/com/kylinolap/job/hadoop/invertedindex/IIDistinctColumnsJob.java b/job/src/main/java/com/kylinolap/job/hadoop/invertedindex/IIDistinctColumnsJob.java index bc12db2..3fbd378 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/invertedindex/IIDistinctColumnsJob.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/invertedindex/IIDistinctColumnsJob.java @@ -38,8 +38,8 @@ import com.kylinolap.job.constant.BatchConstants; import com.kylinolap.job.hadoop.AbstractHadoopJob; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; /** * @author yangli9 diff --git a/job/src/main/java/com/kylinolap/job/tools/CubeMigrationCLI.java b/job/src/main/java/com/kylinolap/job/tools/CubeMigrationCLI.java index 28237ca..a5ca470 100644 --- a/job/src/main/java/com/kylinolap/job/tools/CubeMigrationCLI.java +++ b/job/src/main/java/com/kylinolap/job/tools/CubeMigrationCLI.java @@ -11,8 +11,9 @@ import com.kylinolap.dict.lookup.SnapshotManager; import com.kylinolap.dict.lookup.SnapshotTable; import com.kylinolap.job.JobInstance; +import com.kylinolap.metadata.model.TableDesc; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.schema.TableDesc; + import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; diff --git a/job/src/test/java/com/kylinolap/job/CubeDevelopTestCase.java b/job/src/test/java/com/kylinolap/job/CubeDevelopTestCase.java index 7a84aec..9b81562 100644 --- a/job/src/test/java/com/kylinolap/job/CubeDevelopTestCase.java +++ b/job/src/test/java/com/kylinolap/job/CubeDevelopTestCase.java @@ -9,8 +9,9 @@ import com.kylinolap.job.engine.JobEngineConfig; import com.kylinolap.job.hadoop.hive.SqlHiveDataTypeMapping; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; + import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.maven.model.Model; diff --git a/job/src/test/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapperTest.java b/job/src/test/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapperTest.java index ede75b0..bb072a1 100644 --- a/job/src/test/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapperTest.java +++ b/job/src/test/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapperTest.java @@ -47,7 +47,7 @@ import com.kylinolap.dict.lookup.TableSignature; import com.kylinolap.job.constant.BatchConstants; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author honma diff --git a/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java b/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java index 3c8ea68..41be0a2 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java +++ b/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java @@ -37,9 +37,9 @@ import com.kylinolap.common.restclient.Broadcaster; import com.kylinolap.common.restclient.SingleValueCache; import com.kylinolap.common.util.JsonUtil; +import com.kylinolap.metadata.model.TableDesc; import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.model.invertedindex.InvertedIndexDesc; -import com.kylinolap.metadata.model.schema.TableDesc; import com.kylinolap.metadata.validation.CubeMetadataValidator; import com.kylinolap.metadata.validation.ValidateContext; diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/ColumnDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/ColumnDesc.java new file mode 100644 index 0000000..76393d3 --- /dev/null +++ b/metadata/src/main/java/com/kylinolap/metadata/model/ColumnDesc.java @@ -0,0 +1,125 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.metadata.model; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Column Metadata from Source. All name should be uppercase. + *

+ * User: lukhan Date: 10/15/13 Time: 9:07 AM To change this template use File | + * Settings | File Templates. + */ +@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +public class ColumnDesc { + @JsonProperty("id") + private String id; + @JsonProperty("name") + private String name; + @JsonProperty("datatype") + private String datatype; + + // parsed from data type + private DataType type; + + private TableDesc table; + private int zeroBasedIndex = -1; + private boolean isNullable = true; + + public ColumnDesc() { // default constructor for Jackson + } + + public int getZeroBasedIndex() { + return zeroBasedIndex; + } + + public String getDatatype() { + return datatype; + } + + public void setDatatype(String datatype) { + this.datatype = datatype; + type = DataType.getInstance(datatype); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public TableDesc getTable() { + return table; + } + + public void setTable(TableDesc table) { + this.table = table; + } + + public DataType getType() { + return type; + } + + public String getTypeName() { + return type.getName(); + } + + public int getTypePrecision() { + return type.getPrecision(); + } + + public int getTypeScale() { + return type.getScale(); + } + + public void setNullable(boolean nullable) { + this.isNullable = nullable; + } + + public boolean isNullable() { + return this.isNullable; + } + + public void init(TableDesc table) { + this.table = table; + + if (name != null) + name = name.toUpperCase(); + + if (id != null) + zeroBasedIndex = Integer.parseInt(id) - 1; + + type = DataType.getInstance(datatype); + } + + @Override + public String toString() { + return "ColumnDesc [name=" + name + ",table=" + table.getName() + "]"; + } + +} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java new file mode 100644 index 0000000..6489143 --- /dev/null +++ b/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java @@ -0,0 +1,19 @@ +package com.kylinolap.metadata.model; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +public class DataModelDesc { + + @JsonProperty("name") + private String name; + + @JsonProperty("fact_table") + private String factTable; + + @JsonProperty("lookups") + private LookupDesc[] lookups; + +} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/DataType.java b/metadata/src/main/java/com/kylinolap/metadata/model/DataType.java new file mode 100644 index 0000000..f96c0bd --- /dev/null +++ b/metadata/src/main/java/com/kylinolap/metadata/model/DataType.java @@ -0,0 +1,279 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.metadata.model; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.kylinolap.metadata.model.realization.TblColRef.InnerDataTypeEnum; + +/** + * @author yangli9 + * + */ +public class DataType { + + public static final String VALID_TYPES_STRING = "any|char|varchar|boolean|integer|tinyint|smallint|bigint|decimal|numeric|float|real|double" // + + "|date|time|datetime|timestamp|byte|int|short|long|string|hllc" // + + "|" + InnerDataTypeEnum.LITERAL.getDataType() // + + "|" + InnerDataTypeEnum.DERIVED.getDataType(); + + private static final Pattern TYPE_PATTERN = Pattern.compile( + // standard sql types, ref: + // http://www.w3schools.com/sql/sql_datatypes_general.asp + "(" + VALID_TYPES_STRING + ")" + "\\s*" // + + "(?:" + "[(]" + "([\\d\\s,]+)" + "[)]" + ")?", Pattern.CASE_INSENSITIVE); + + public static final Set INTEGER_FAMILY = new HashSet(); + public static final Set NUMBER_FAMILY = new HashSet(); + public static final Set DATETIME_FAMILY = new HashSet(); + private static final Set HLLC_PRECISIONS = new HashSet(); + private static final Map LEGACY_TYPE_MAP = new HashMap(); + static { + INTEGER_FAMILY.add("tinyint"); + INTEGER_FAMILY.add("smallint"); + INTEGER_FAMILY.add("integer"); + INTEGER_FAMILY.add("bigint"); + + NUMBER_FAMILY.addAll(INTEGER_FAMILY); + NUMBER_FAMILY.add("float"); + NUMBER_FAMILY.add("double"); + NUMBER_FAMILY.add("decimal"); + NUMBER_FAMILY.add("real"); + NUMBER_FAMILY.add("numeric"); + + DATETIME_FAMILY.add("date"); + DATETIME_FAMILY.add("time"); + DATETIME_FAMILY.add("datetime"); + DATETIME_FAMILY.add("timestamp"); + + LEGACY_TYPE_MAP.put("byte", "tinyint"); + LEGACY_TYPE_MAP.put("int", "integer"); + LEGACY_TYPE_MAP.put("short", "smallint"); + LEGACY_TYPE_MAP.put("long", "bigint"); + LEGACY_TYPE_MAP.put("string", "varchar"); + LEGACY_TYPE_MAP.put("hllc10", "hllc(10)"); + LEGACY_TYPE_MAP.put("hllc12", "hllc(12)"); + LEGACY_TYPE_MAP.put("hllc14", "hllc(14)"); + LEGACY_TYPE_MAP.put("hllc15", "hllc(15)"); + LEGACY_TYPE_MAP.put("hllc16", "hllc(16)"); + + for (int i = 10; i <= 16; i++) + HLLC_PRECISIONS.add(i); + } + + private static final ConcurrentMap CACHE = new ConcurrentHashMap(); + + public static DataType getInstance(String type) { + if (type == null) + return null; + + DataType dataType = new DataType(type); + DataType cached = CACHE.get(dataType); + if (cached == null) { + CACHE.put(dataType, dataType); + cached = dataType; + } + return cached; + } + + // ============================================================================ + + private String name; + private int precision; + private int scale; + + DataType(String datatype) { + parseDataType(datatype); + } + + private void parseDataType(String datatype) { + datatype = datatype.trim().toLowerCase(); + datatype = replaceLegacy(datatype); + + Matcher m = TYPE_PATTERN.matcher(datatype); + if (m.matches() == false) + throw new IllegalArgumentException("bad data type -- " + datatype + ", does not match " + TYPE_PATTERN); + + name = replaceLegacy(m.group(1)); + precision = -1; + scale = -1; + + String leftover = m.group(2); + if (leftover != null) { + String[] parts = leftover.split("\\s*,\\s*"); + for (int i = 0; i < parts.length; i++) { + int n; + try { + n = Integer.parseInt(parts[i]); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("bad data type -- " + datatype + ", precision/scale not numeric"); + } + if (i == 0) + precision = n; + else if (i == 1) + scale = n; + else + throw new IllegalArgumentException("bad data type -- " + datatype + ", too many precision/scale parts"); + } + } + + // FIXME 256 for unknown string precision + if ((name.equals("char") || name.equals("varchar")) && precision == -1) { + precision = 256; // to save memory at frontend, e.g. tableau will + // allocate memory according to this + } + + // FIXME (19,4) for unknown decimal precision + if ((name.equals("decimal") || name.equals("numeric")) && precision == -1) { + precision = 19; + scale = 4; + } + + if (isHLLC() && HLLC_PRECISIONS.contains(precision) == false) + throw new IllegalArgumentException("HLLC precision must be one of " + HLLC_PRECISIONS); + } + + private String replaceLegacy(String str) { + String replace = LEGACY_TYPE_MAP.get(str); + return replace == null ? str : replace; + } + + public int getSpaceEstimate() { + if (isTinyInt()) { + return 1; + } else if (isSmallInt()) { + return 2; + } else if (isInt()) { + return 4; + } else if (isBigInt()) { + return 8; + } else if (isFloat()) { + return 4; + } else if (isDouble()) { + return 8; + } else if (isDecimal()) { + return 8; + } else if (isHLLC()) { + return 1 << precision; + } + throw new IllegalStateException("The return type : " + name + " is not recognized;"); + } + + public boolean isIntegerFamily() { + return INTEGER_FAMILY.contains(name); + } + + public boolean isNumberFamily() { + return NUMBER_FAMILY.contains(name); + } + + public boolean isDateTimeFamily() { + return DATETIME_FAMILY.contains(name); + } + + public boolean isTinyInt() { + return name.equals("tinyint"); + } + + public boolean isSmallInt() { + return name.equals("smallint"); + } + + public boolean isInt() { + return name.equals("int"); + } + + public boolean isBigInt() { + return name.equals("bigint"); + } + + public boolean isFloat() { + return name.equals("float"); + } + + public boolean isDouble() { + return name.equals("double"); + } + + public boolean isDecimal() { + return name.equals("decimal"); + } + + public boolean isHLLC() { + return name.equals("hllc"); + } + + public String getName() { + return name; + } + + public int getPrecision() { + return precision; + } + + public int getScale() { + return scale; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + precision; + result = prime * result + scale; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + DataType other = (DataType) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (precision != other.precision) + return false; + if (scale != other.scale) + return false; + return true; + } + + @Override + public String toString() { + if (precision < 0 && scale < 0) + return name; + else if (scale < 0) + return name + "(" + precision + ")"; + else + return name + "(" + precision + "," + scale + ")"; + } +} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/DatabaseDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/DatabaseDesc.java new file mode 100644 index 0000000..d7ec5d2 --- /dev/null +++ b/metadata/src/main/java/com/kylinolap/metadata/model/DatabaseDesc.java @@ -0,0 +1,75 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.metadata.model; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; + +/** + * @author xjiang + */ +public class DatabaseDesc { + private String name; + + /** + * @return the name + */ + public String getName() { + return name.toUpperCase(); + } + + /** + * @param name + * the name to set + */ + public void setName(String name) { + this.name = name; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + + return "DatabaseDesc [name=" + name + "]"; + } + + public static HashMap extractDatabaseOccurenceCounts(List tables) { + HashMap databaseCounts = new HashMap(); + for (TableDesc tableDesc : tables) { + String databaseName = tableDesc.getDatabase(); + Integer counter = databaseCounts.get(databaseName); + if (counter != null) + databaseCounts.put(databaseName, counter + 1); + else + databaseCounts.put(databaseName, 1); + } + return databaseCounts; + } + + public static HashSet extractDatabaseNames(List tables) { + HashSet databaseNames = new HashSet(); + for (TableDesc tableDesc : tables) { + databaseNames.add(tableDesc.getDatabase()); + } + return databaseNames; + } +} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/JoinDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/JoinDesc.java new file mode 100644 index 0000000..a693c56 --- /dev/null +++ b/metadata/src/main/java/com/kylinolap/metadata/model/JoinDesc.java @@ -0,0 +1,135 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.metadata.model; + +import java.util.Arrays; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.metadata.model.realization.TblColRef; + +/** + * Created with IntelliJ IDEA. User: lukhan Date: 10/14/13 Time: 2:16 PM To + * change this template use File | Settings | File Templates. + */ +@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +public class JoinDesc { + + // inner, left, right, outer... + @JsonProperty("type") + private String type; + @JsonProperty("primary_key") + private String[] primaryKey; + @JsonProperty("foreign_key") + private String[] foreignKey; + + private TblColRef[] primaryKeyColumns; + private TblColRef[] foreignKeyColumns; + + public void swapPKFK() { + String[] t = primaryKey; + primaryKey = foreignKey; + foreignKey = t; + + TblColRef[] tt = primaryKeyColumns; + primaryKeyColumns = foreignKeyColumns; + foreignKeyColumns = tt; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String[] getPrimaryKey() { + return primaryKey; + } + + public void setPrimaryKey(String[] primaryKey) { + this.primaryKey = primaryKey; + } + + public String[] getForeignKey() { + return foreignKey; + } + + public void setForeignKey(String[] foreignKey) { + this.foreignKey = foreignKey; + } + + public TblColRef[] getPrimaryKeyColumns() { + return primaryKeyColumns; + } + + public void setPrimaryKeyColumns(TblColRef[] primaryKeyColumns) { + this.primaryKeyColumns = primaryKeyColumns; + } + + public TblColRef[] getForeignKeyColumns() { + return foreignKeyColumns; + } + + public void setForeignKeyColumns(TblColRef[] foreignKeyColumns) { + this.foreignKeyColumns = foreignKeyColumns; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + Arrays.hashCode(primaryKeyColumns); + result = prime * result + Arrays.hashCode(foreignKeyColumns); + result = prime * result + this.type.hashCode(); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + JoinDesc other = (JoinDesc) obj; + + if (!this.columnsEqualIgnoringOrder(foreignKeyColumns, other.foreignKeyColumns)) + return false; + if (!this.columnsEqualIgnoringOrder(primaryKeyColumns, other.primaryKeyColumns)) + return false; + + if (!this.type.equalsIgnoreCase(other.getType())) + return false; + return true; + } + + private boolean columnsEqualIgnoringOrder(TblColRef[] a, TblColRef[] b) { + if (a.length != b.length) + return false; + + return Arrays.asList(a).containsAll(Arrays.asList(b)); + } + + @Override + public String toString() { + return "JoinDesc [type=" + type + ", primary_key=" + Arrays.toString(primaryKey) + ", foreign_key=" + Arrays.toString(foreignKey) + "]"; + } + +} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/LookupDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/LookupDesc.java new file mode 100644 index 0000000..089ded8 --- /dev/null +++ b/metadata/src/main/java/com/kylinolap/metadata/model/LookupDesc.java @@ -0,0 +1,16 @@ +package com.kylinolap.metadata.model; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; + +@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +public class LookupDesc { + + @JsonProperty("table") + private String table; + + @JsonProperty("join") + private JoinDesc join; + +} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java new file mode 100644 index 0000000..0014e0f --- /dev/null +++ b/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java @@ -0,0 +1,129 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.metadata.model; + +import java.util.Arrays; +import java.util.Comparator; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.common.persistence.ResourceStore; +import com.kylinolap.common.persistence.RootPersistentEntity; + +/** + * Table Metadata from Source. All name should be uppercase. + *

+ * User: lukhan Date: 10/15/13 Time: 9:06 AM To change this template use File | + * Settings | File Templates. + */ +@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +public class TableDesc extends RootPersistentEntity { + @JsonProperty("name") + private String name; + @JsonProperty("columns") + private ColumnDesc[] columns; + + private DatabaseDesc database; + + public ColumnDesc findColumnByName(String name) { + for (ColumnDesc c : columns) { + // return first matched column + if (name.equalsIgnoreCase(c.getName())) { + return c; + } + } + return null; + } + + public String getResourcePath() { + return ResourceStore.TABLE_RESOURCE_ROOT + "/" + name + ".json"; + } + + // ============================================================================ + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + @JsonProperty("database") + public String getDatabase() { + if (database == null) { + return "DEFAULT"; + } + return database.getName(); + } + + @JsonProperty("database") + public void setDatabase(String database) { + this.database = new DatabaseDesc(); + this.database.setName(database); + } + + public ColumnDesc[] getColumns() { + return columns; + } + + public void setColumns(ColumnDesc[] columns) { + this.columns = columns; + } + + public int getMaxColumnIndex() { + int max = -1; + for (ColumnDesc col : columns) { + int idx = col.getZeroBasedIndex(); + max = Math.max(max, idx); + } + return max; + } + + public int getColumnCount() { + return getMaxColumnIndex() + 1; + } + + public void init() { + if (name != null) + name = name.toUpperCase(); + + if (getDatabase() != null) + setDatabase(getDatabase().toUpperCase()); + + if (columns != null) { + Arrays.sort(columns, new Comparator() { + @Override + public int compare(ColumnDesc col1, ColumnDesc col2) { + Integer id1 = Integer.parseInt(col1.getId()); + Integer id2 = Integer.parseInt(col2.getId()); + return id1.compareTo(id2); + } + }); + + for (ColumnDesc col : columns) { + col.init(this); + } + } + } + + @Override + public String toString() { + return "TableDesc [name=" + name + "]"; + } + +} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/CubeDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/CubeDesc.java index db9f177..5538114 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/CubeDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/cube/CubeDesc.java @@ -46,9 +46,13 @@ import com.kylinolap.common.util.JsonUtil; import com.kylinolap.metadata.MetadataConstances; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.DataType; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.DataType; +import com.kylinolap.metadata.model.JoinDesc; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.FunctionDesc; +import com.kylinolap.metadata.model.realization.ParameterDesc; +import com.kylinolap.metadata.model.realization.TblColRef; /** * Created with IntelliJ IDEA. User: lukhan Date: 9/24/13 Time: 10:40 AM To diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/CubePartitionDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/CubePartitionDesc.java index 270370f..1de33b1 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/CubePartitionDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/cube/CubePartitionDesc.java @@ -21,6 +21,7 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author xduo diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/DimensionDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/DimensionDesc.java index 142fc27..05f1100 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/DimensionDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/cube/DimensionDesc.java @@ -22,7 +22,9 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.JsonProperty; import com.kylinolap.common.util.StringUtil; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.JoinDesc; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.TblColRef; /** * Created with IntelliJ IDEA. User: lukhan Date: 9/24/13 Time: 10:40 AM To diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/FunctionDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/FunctionDesc.java deleted file mode 100644 index e7b7706..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/FunctionDesc.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.model.cube; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.kylinolap.metadata.model.schema.DataType; - -/** - * Created with IntelliJ IDEA. User: lukhan Date: 9/26/13 Time: 1:30 PM To - * change this template use File | Settings | File Templates. - */ -@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) -public class FunctionDesc { - - public static final String FUNC_SUM = "SUM"; - public static final String FUNC_MIN = "MIN"; - public static final String FUNC_MAX = "MAX"; - public static final String FUNC_COUNT = "COUNT"; - public static final String FUNC_COUNT_DISTINCT = "COUNT_DISTINCT"; - - public static final String PARAMTER_TYPE_CONSTANT = "constant"; - public static final String PARAMETER_TYPE_COLUMN = "column"; - - @JsonProperty("expression") - private String expression; - @JsonProperty("parameter") - private ParameterDesc parameter; - @JsonProperty("returntype") - private String returnType; - - private DataType returnDataType; - private boolean isAppliedOnDimension = false; - - public String getRewriteFieldName() { - if (isSum()) { - return getParameter().getValue(); - } else if (isCount()) { - return "COUNT__"; // ignores parameter, count(*), count(1), - // count(col) are all the same - } else { - return getFullExpression().replaceAll("[(), ]", "_"); - } - } - - public boolean needRewrite() { - return !isSum() && !isHolisticCountDistinct() && !isAppliedOnDimension(); - } - - public boolean isMin() { - return FUNC_MIN.equalsIgnoreCase(expression); - } - - public boolean isMax() { - return FUNC_MAX.equalsIgnoreCase(expression); - } - - public boolean isSum() { - return FUNC_SUM.equalsIgnoreCase(expression); - } - - public boolean isCount() { - return FUNC_COUNT.equalsIgnoreCase(expression); - } - - public boolean isCountDistinct() { - return FUNC_COUNT_DISTINCT.equalsIgnoreCase(expression); - } - - public boolean isHolisticCountDistinct() { - if (isCountDistinct() && returnDataType != null && returnDataType.isBigInt()) { - return true; - } else { - return false; - } - } - - /** - * Get Full Expression such as sum(amount), count(1), count(*)... - */ - public String getFullExpression() { - StringBuilder sb = new StringBuilder(expression); - sb.append("("); - if (parameter != null) { - sb.append(parameter.getValue()); - } - sb.append(")"); - return sb.toString(); - } - - public boolean isAppliedOnDimension() { - return isAppliedOnDimension; - } - - public void setAppliedOnDimension(boolean isAppliedOnDimension) { - this.isAppliedOnDimension = isAppliedOnDimension; - } - - public String getExpression() { - return expression; - } - - public void setExpression(String expression) { - this.expression = expression; - } - - public ParameterDesc getParameter() { - return parameter; - } - - public void setParameter(ParameterDesc parameter) { - this.parameter = parameter; - } - - public DataType getReturnDataType() { - return returnDataType; - } - - void setReturnDataType(DataType returnDataType) { - this.returnDataType = returnDataType; - } - - public String getSQLType() { - if (isCountDistinct()) - return "any"; - else if (isSum() || isMax() || isMin()) - return parameter.getColRefs().get(0).getDatatype(); - else - return returnType; - } - - public String getReturnType() { - return returnType; - } - - public void setReturnType(String returnType) { - this.returnType = returnType; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((expression == null) ? 0 : expression.hashCode()); - result = prime * result + ((parameter == null) ? 0 : parameter.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - FunctionDesc other = (FunctionDesc) obj; - if (expression == null) { - if (other.expression != null) - return false; - } else if (!expression.equals(other.expression)) - return false; - // NOTE: don't check the parameter of count() - if (isCount() == false) { - if (parameter == null) { - if (other.parameter != null) - return false; - } else if (!parameter.equals(other.parameter)) - return false; - } - return true; - } - - @Override - public String toString() { - return "FunctionDesc [expression=" + expression + ", parameter=" + parameter + ", returnType=" + returnType + "]"; - } - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseColumnDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseColumnDesc.java index 5f80eb7..c1eb6a6 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseColumnDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseColumnDesc.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.metadata.model.realization.FunctionDesc; /** * Created with IntelliJ IDEA. User: lukhan Date: 9/30/13 Time: 10:57 AM To diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseMappingDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseMappingDesc.java index 69488c5..4493cbd 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseMappingDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseMappingDesc.java @@ -23,6 +23,7 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.JsonProperty; import com.kylinolap.common.util.StringUtil; +import com.kylinolap.metadata.model.realization.FunctionDesc; /** * Created with IntelliJ IDEA. User: lukhan Date: 9/24/13 Time: 10:44 AM To diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/HierarchyDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/HierarchyDesc.java index 37af9d9..7b87bb3 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/HierarchyDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/cube/HierarchyDesc.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.metadata.model.realization.TblColRef; /** * Created with IntelliJ IDEA. User: lukhan Date: 9/24/13 Time: 10:46 AM To diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/JoinDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/JoinDesc.java deleted file mode 100644 index 44ce795..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/JoinDesc.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.model.cube; - -import java.util.Arrays; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Created with IntelliJ IDEA. User: lukhan Date: 10/14/13 Time: 2:16 PM To - * change this template use File | Settings | File Templates. - */ -@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) -public class JoinDesc { - - // inner, left, right, outer... - @JsonProperty("type") - private String type; - @JsonProperty("primary_key") - private String[] primaryKey; - @JsonProperty("foreign_key") - private String[] foreignKey; - - private TblColRef[] primaryKeyColumns; - private TblColRef[] foreignKeyColumns; - - public void swapPKFK() { - String[] t = primaryKey; - primaryKey = foreignKey; - foreignKey = t; - - TblColRef[] tt = primaryKeyColumns; - primaryKeyColumns = foreignKeyColumns; - foreignKeyColumns = tt; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String[] getPrimaryKey() { - return primaryKey; - } - - public void setPrimaryKey(String[] primaryKey) { - this.primaryKey = primaryKey; - } - - public String[] getForeignKey() { - return foreignKey; - } - - public void setForeignKey(String[] foreignKey) { - this.foreignKey = foreignKey; - } - - public TblColRef[] getPrimaryKeyColumns() { - return primaryKeyColumns; - } - - public void setPrimaryKeyColumns(TblColRef[] primaryKeyColumns) { - this.primaryKeyColumns = primaryKeyColumns; - } - - public TblColRef[] getForeignKeyColumns() { - return foreignKeyColumns; - } - - public void setForeignKeyColumns(TblColRef[] foreignKeyColumns) { - this.foreignKeyColumns = foreignKeyColumns; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + Arrays.hashCode(primaryKeyColumns); - result = prime * result + Arrays.hashCode(foreignKeyColumns); - result = prime * result + this.type.hashCode(); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - JoinDesc other = (JoinDesc) obj; - - if (!this.columnsEqualIgnoringOrder(foreignKeyColumns, other.foreignKeyColumns)) - return false; - if (!this.columnsEqualIgnoringOrder(primaryKeyColumns, other.primaryKeyColumns)) - return false; - - if (!this.type.equalsIgnoreCase(other.getType())) - return false; - return true; - } - - private boolean columnsEqualIgnoringOrder(TblColRef[] a, TblColRef[] b) { - if (a.length != b.length) - return false; - - return Arrays.asList(a).containsAll(Arrays.asList(b)); - } - - @Override - public String toString() { - return "JoinDesc [type=" + type + ", primary_key=" + Arrays.toString(primaryKey) + ", foreign_key=" + Arrays.toString(foreignKey) + "]"; - } - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/MeasureDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/MeasureDesc.java index 3ee07a4..1e44441 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/MeasureDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/cube/MeasureDesc.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.metadata.model.realization.FunctionDesc; /** * Created with IntelliJ IDEA. User: lukhan Date: 9/24/13 Time: 10:41 AM To diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/ParameterDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/ParameterDesc.java deleted file mode 100644 index b43df48..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/ParameterDesc.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.model.cube; - -import java.io.UnsupportedEncodingException; -import java.util.Arrays; -import java.util.List; - -import org.apache.hadoop.util.StringUtils; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Created with IntelliJ IDEA. User: lukhan Date: 9/30/13 Time: 2:46 PM To - * change this template use File | Settings | File Templates. - */ -@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) -public class ParameterDesc { - - public static final String COLUMN_TYPE = "column"; - - @JsonProperty("type") - private String type; - @JsonProperty("value") - private String value; - - private List colRefs; - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public byte[] getBytes() throws UnsupportedEncodingException { - return value.getBytes("UTF-8"); - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - public List getColRefs() { - return colRefs; - } - - public void setColRefs(List colRefs) { - this.colRefs = colRefs; - } - - public boolean isColumnType() { - return COLUMN_TYPE.equals(type); - } - - public void normalizeColumnValue() { - if (isColumnType()) { - String values[] = value.split("\\s*,\\s*"); - for (int i = 0; i < values.length; i++) - values[i] = values[i].toUpperCase(); - Arrays.sort(values); - value = StringUtils.join(",", values); - } - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((type == null) ? 0 : type.hashCode()); - result = prime * result + ((value == null) ? 0 : value.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ParameterDesc other = (ParameterDesc) obj; - if (type == null) { - if (other.type != null) - return false; - } else if (!type.equals(other.type)) - return false; - if (value == null) { - if (other.value != null) - return false; - } else if (!value.equals(other.value)) - return false; - return true; - } - - @Override - public String toString() { - return "ParameterDesc [type=" + type + ", value=" + value + "]"; - } - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/RowKeyColDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/RowKeyColDesc.java index e489f08..e2281e8 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/RowKeyColDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/cube/RowKeyColDesc.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author yangli9 diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/RowKeyDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/RowKeyDesc.java index 97372f7..cbb1e9d 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/RowKeyDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/cube/RowKeyDesc.java @@ -29,6 +29,7 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.JsonProperty; import com.kylinolap.common.util.StringUtil; +import com.kylinolap.metadata.model.realization.TblColRef; /** * Created by lukhan on 1/2/14. diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/TblColRef.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/TblColRef.java deleted file mode 100644 index a57c209..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/TblColRef.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.model.cube; - -import org.apache.commons.lang.StringUtils; - -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.DataType; -import com.kylinolap.metadata.model.schema.TableDesc; - -/** - * Created with IntelliJ IDEA. User: lukhan Date: 9/26/13 Time: 1:30 PM To - * change this template use File | Settings | File Templates. - */ -public class TblColRef { - - private static final String INNER_TABLE_NAME = "_kylin_table"; - - // used by projection rewrite, see OLAPProjectRel - public enum InnerDataTypeEnum { - - LITERAL("_literal_type"), DERIVED("_derived_type"); - - private final String dateType; - - private InnerDataTypeEnum(String name) { - this.dateType = name; - } - - public String getDataType() { - return dateType; - } - - public static boolean contains(String name) { - return LITERAL.getDataType().equals(name) || DERIVED.getDataType().equals(name); - } - } - - // used by projection rewrite, see OLAPProjectRel - public static TblColRef newInnerColumn(String columnName, InnerDataTypeEnum dataType) { - ColumnDesc column = new ColumnDesc(); - column.setName(columnName); - TableDesc table = new TableDesc(); - column.setTable(table); - TblColRef colRef = new TblColRef(column); - colRef.markInnerColumn(dataType); - return colRef; - } - - // ============================================================================ - - private ColumnDesc column; - - public TblColRef(ColumnDesc column) { - this.column = column; - } - - public ColumnDesc getColumn() { - return column; - } - - public void setColumn(ColumnDesc column) { - this.column = column; - } - - public String getName() { - return column.getName(); - } - - public String getTable() { - if (column.getTable() == null) { - return null; - } - return column.getTable().getName(); - } - - public String getDatatype() { - return column.getDatatype(); - } - - public DataType getType() { - return column.getType(); - } - - public void markInnerColumn(InnerDataTypeEnum dataType) { - this.column.setDatatype(dataType.getDataType()); - this.column.getTable().setName(INNER_TABLE_NAME); - } - - public boolean isInnerColumn() { - return InnerDataTypeEnum.contains(getDatatype()); - } - - public boolean isDerivedDataType() { - return InnerDataTypeEnum.DERIVED.getDataType().equals(getDatatype()); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - - result = prime * result + column.getTable().getName().hashCode(); - result = prime * result + column.getName().hashCode(); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - TblColRef other = (TblColRef) obj; - if (!StringUtils.equals(column.getTable().getName(), other.column.getTable().getName())) - return false; - if (!StringUtils.equals(column.getName(), other.column.getName())) - return false; - return true; - } - - @Override - public String toString() { - return (column.getTable() == null ? null : column.getTable().getName()) + "." + column.getName(); - } -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/invertedindex/InvertedIndexDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/invertedindex/InvertedIndexDesc.java index 324adb7..207187c 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/invertedindex/InvertedIndexDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/invertedindex/InvertedIndexDesc.java @@ -13,9 +13,9 @@ import com.kylinolap.common.persistence.RootPersistentEntity; import com.kylinolap.common.util.StringUtil; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author yangli9 diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/realization/FunctionDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/realization/FunctionDesc.java new file mode 100644 index 0000000..bd25c6c --- /dev/null +++ b/metadata/src/main/java/com/kylinolap/metadata/model/realization/FunctionDesc.java @@ -0,0 +1,193 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.metadata.model.realization; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.metadata.model.DataType; + +/** + * Created with IntelliJ IDEA. User: lukhan Date: 9/26/13 Time: 1:30 PM To + * change this template use File | Settings | File Templates. + */ +@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +public class FunctionDesc { + + public static final String FUNC_SUM = "SUM"; + public static final String FUNC_MIN = "MIN"; + public static final String FUNC_MAX = "MAX"; + public static final String FUNC_COUNT = "COUNT"; + public static final String FUNC_COUNT_DISTINCT = "COUNT_DISTINCT"; + + public static final String PARAMTER_TYPE_CONSTANT = "constant"; + public static final String PARAMETER_TYPE_COLUMN = "column"; + + @JsonProperty("expression") + private String expression; + @JsonProperty("parameter") + private ParameterDesc parameter; + @JsonProperty("returntype") + private String returnType; + + private DataType returnDataType; + private boolean isAppliedOnDimension = false; + + public String getRewriteFieldName() { + if (isSum()) { + return getParameter().getValue(); + } else if (isCount()) { + return "COUNT__"; // ignores parameter, count(*), count(1), + // count(col) are all the same + } else { + return getFullExpression().replaceAll("[(), ]", "_"); + } + } + + public boolean needRewrite() { + return !isSum() && !isHolisticCountDistinct() && !isAppliedOnDimension(); + } + + public boolean isMin() { + return FUNC_MIN.equalsIgnoreCase(expression); + } + + public boolean isMax() { + return FUNC_MAX.equalsIgnoreCase(expression); + } + + public boolean isSum() { + return FUNC_SUM.equalsIgnoreCase(expression); + } + + public boolean isCount() { + return FUNC_COUNT.equalsIgnoreCase(expression); + } + + public boolean isCountDistinct() { + return FUNC_COUNT_DISTINCT.equalsIgnoreCase(expression); + } + + public boolean isHolisticCountDistinct() { + if (isCountDistinct() && returnDataType != null && returnDataType.isBigInt()) { + return true; + } else { + return false; + } + } + + /** + * Get Full Expression such as sum(amount), count(1), count(*)... + */ + public String getFullExpression() { + StringBuilder sb = new StringBuilder(expression); + sb.append("("); + if (parameter != null) { + sb.append(parameter.getValue()); + } + sb.append(")"); + return sb.toString(); + } + + public boolean isAppliedOnDimension() { + return isAppliedOnDimension; + } + + public void setAppliedOnDimension(boolean isAppliedOnDimension) { + this.isAppliedOnDimension = isAppliedOnDimension; + } + + public String getExpression() { + return expression; + } + + public void setExpression(String expression) { + this.expression = expression; + } + + public ParameterDesc getParameter() { + return parameter; + } + + public void setParameter(ParameterDesc parameter) { + this.parameter = parameter; + } + + public DataType getReturnDataType() { + return returnDataType; + } + + public void setReturnDataType(DataType returnDataType) { + this.returnDataType = returnDataType; + } + + public String getSQLType() { + if (isCountDistinct()) + return "any"; + else if (isSum() || isMax() || isMin()) + return parameter.getColRefs().get(0).getDatatype(); + else + return returnType; + } + + public String getReturnType() { + return returnType; + } + + public void setReturnType(String returnType) { + this.returnType = returnType; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((expression == null) ? 0 : expression.hashCode()); + result = prime * result + ((parameter == null) ? 0 : parameter.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + FunctionDesc other = (FunctionDesc) obj; + if (expression == null) { + if (other.expression != null) + return false; + } else if (!expression.equals(other.expression)) + return false; + // NOTE: don't check the parameter of count() + if (isCount() == false) { + if (parameter == null) { + if (other.parameter != null) + return false; + } else if (!parameter.equals(other.parameter)) + return false; + } + return true; + } + + @Override + public String toString() { + return "FunctionDesc [expression=" + expression + ", parameter=" + parameter + ", returnType=" + returnType + "]"; + } + +} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/realization/IDataModelRealization.java b/metadata/src/main/java/com/kylinolap/metadata/model/realization/IDataModelRealization.java new file mode 100644 index 0000000..8142d1d --- /dev/null +++ b/metadata/src/main/java/com/kylinolap/metadata/model/realization/IDataModelRealization.java @@ -0,0 +1,9 @@ +package com.kylinolap.metadata.model.realization; + +public interface IDataModelRealization { + + /** Return a cost indicator for the realization, the lower, the better. Range from 0 - 100 typically. */ + int getCost(); + + +} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/realization/ParameterDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/realization/ParameterDesc.java new file mode 100644 index 0000000..036d291 --- /dev/null +++ b/metadata/src/main/java/com/kylinolap/metadata/model/realization/ParameterDesc.java @@ -0,0 +1,122 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.metadata.model.realization; + +import java.io.UnsupportedEncodingException; +import java.util.Arrays; +import java.util.List; + +import org.apache.hadoop.util.StringUtils; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Created with IntelliJ IDEA. User: lukhan Date: 9/30/13 Time: 2:46 PM To + * change this template use File | Settings | File Templates. + */ +@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +public class ParameterDesc { + + public static final String COLUMN_TYPE = "column"; + + @JsonProperty("type") + private String type; + @JsonProperty("value") + private String value; + + private List colRefs; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public byte[] getBytes() throws UnsupportedEncodingException { + return value.getBytes("UTF-8"); + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public List getColRefs() { + return colRefs; + } + + public void setColRefs(List colRefs) { + this.colRefs = colRefs; + } + + public boolean isColumnType() { + return COLUMN_TYPE.equals(type); + } + + public void normalizeColumnValue() { + if (isColumnType()) { + String values[] = value.split("\\s*,\\s*"); + for (int i = 0; i < values.length; i++) + values[i] = values[i].toUpperCase(); + Arrays.sort(values); + value = StringUtils.join(",", values); + } + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((type == null) ? 0 : type.hashCode()); + result = prime * result + ((value == null) ? 0 : value.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ParameterDesc other = (ParameterDesc) obj; + if (type == null) { + if (other.type != null) + return false; + } else if (!type.equals(other.type)) + return false; + if (value == null) { + if (other.value != null) + return false; + } else if (!value.equals(other.value)) + return false; + return true; + } + + @Override + public String toString() { + return "ParameterDesc [type=" + type + ", value=" + value + "]"; + } + +} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/realization/TblColRef.java b/metadata/src/main/java/com/kylinolap/metadata/model/realization/TblColRef.java new file mode 100644 index 0000000..feb0ce9 --- /dev/null +++ b/metadata/src/main/java/com/kylinolap/metadata/model/realization/TblColRef.java @@ -0,0 +1,141 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.metadata.model.realization; + +import org.apache.commons.lang.StringUtils; + +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.DataType; +import com.kylinolap.metadata.model.TableDesc; + +/** + * Created with IntelliJ IDEA. User: lukhan Date: 9/26/13 Time: 1:30 PM To + * change this template use File | Settings | File Templates. + */ +public class TblColRef { + + private static final String INNER_TABLE_NAME = "_kylin_table"; + + // used by projection rewrite, see OLAPProjectRel + public enum InnerDataTypeEnum { + + LITERAL("_literal_type"), DERIVED("_derived_type"); + + private final String dateType; + + private InnerDataTypeEnum(String name) { + this.dateType = name; + } + + public String getDataType() { + return dateType; + } + + public static boolean contains(String name) { + return LITERAL.getDataType().equals(name) || DERIVED.getDataType().equals(name); + } + } + + // used by projection rewrite, see OLAPProjectRel + public static TblColRef newInnerColumn(String columnName, InnerDataTypeEnum dataType) { + ColumnDesc column = new ColumnDesc(); + column.setName(columnName); + TableDesc table = new TableDesc(); + column.setTable(table); + TblColRef colRef = new TblColRef(column); + colRef.markInnerColumn(dataType); + return colRef; + } + + // ============================================================================ + + private ColumnDesc column; + + public TblColRef(ColumnDesc column) { + this.column = column; + } + + public ColumnDesc getColumn() { + return column; + } + + public void setColumn(ColumnDesc column) { + this.column = column; + } + + public String getName() { + return column.getName(); + } + + public String getTable() { + if (column.getTable() == null) { + return null; + } + return column.getTable().getName(); + } + + public String getDatatype() { + return column.getDatatype(); + } + + public DataType getType() { + return column.getType(); + } + + public void markInnerColumn(InnerDataTypeEnum dataType) { + this.column.setDatatype(dataType.getDataType()); + this.column.getTable().setName(INNER_TABLE_NAME); + } + + public boolean isInnerColumn() { + return InnerDataTypeEnum.contains(getDatatype()); + } + + public boolean isDerivedDataType() { + return InnerDataTypeEnum.DERIVED.getDataType().equals(getDatatype()); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + + result = prime * result + column.getTable().getName().hashCode(); + result = prime * result + column.getName().hashCode(); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + TblColRef other = (TblColRef) obj; + if (!StringUtils.equals(column.getTable().getName(), other.column.getTable().getName())) + return false; + if (!StringUtils.equals(column.getName(), other.column.getName())) + return false; + return true; + } + + @Override + public String toString() { + return (column.getTable() == null ? null : column.getTable().getName()) + "." + column.getName(); + } +} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/schema/ColumnDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/schema/ColumnDesc.java deleted file mode 100644 index 1facf04..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/schema/ColumnDesc.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.model.schema; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Column Metadata from Source. All name should be uppercase. - *

- * User: lukhan Date: 10/15/13 Time: 9:07 AM To change this template use File | - * Settings | File Templates. - */ -@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) -public class ColumnDesc { - @JsonProperty("id") - private String id; - @JsonProperty("name") - private String name; - @JsonProperty("datatype") - private String datatype; - - // parsed from data type - private DataType type; - - private TableDesc table; - private int zeroBasedIndex = -1; - private boolean isNullable = true; - - public ColumnDesc() { // default constructor for Jackson - } - - public int getZeroBasedIndex() { - return zeroBasedIndex; - } - - public String getDatatype() { - return datatype; - } - - public void setDatatype(String datatype) { - this.datatype = datatype; - type = DataType.getInstance(datatype); - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public TableDesc getTable() { - return table; - } - - public void setTable(TableDesc table) { - this.table = table; - } - - public DataType getType() { - return type; - } - - public String getTypeName() { - return type.getName(); - } - - public int getTypePrecision() { - return type.getPrecision(); - } - - public int getTypeScale() { - return type.getScale(); - } - - public void setNullable(boolean nullable) { - this.isNullable = nullable; - } - - public boolean isNullable() { - return this.isNullable; - } - - public void init(TableDesc table) { - this.table = table; - - if (name != null) - name = name.toUpperCase(); - - if (id != null) - zeroBasedIndex = Integer.parseInt(id) - 1; - - type = DataType.getInstance(datatype); - } - - @Override - public String toString() { - return "ColumnDesc [name=" + name + ",table=" + table.getName() + "]"; - } - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/schema/DataType.java b/metadata/src/main/java/com/kylinolap/metadata/model/schema/DataType.java deleted file mode 100644 index 387c93b..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/schema/DataType.java +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.model.schema; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import com.kylinolap.metadata.model.cube.TblColRef.InnerDataTypeEnum; - -/** - * @author yangli9 - * - */ -public class DataType { - - public static final String VALID_TYPES_STRING = "any|char|varchar|boolean|integer|tinyint|smallint|bigint|decimal|numeric|float|real|double" // - + "|date|time|datetime|timestamp|byte|int|short|long|string|hllc" // - + "|" + InnerDataTypeEnum.LITERAL.getDataType() // - + "|" + InnerDataTypeEnum.DERIVED.getDataType(); - - private static final Pattern TYPE_PATTERN = Pattern.compile( - // standard sql types, ref: - // http://www.w3schools.com/sql/sql_datatypes_general.asp - "(" + VALID_TYPES_STRING + ")" + "\\s*" // - + "(?:" + "[(]" + "([\\d\\s,]+)" + "[)]" + ")?", Pattern.CASE_INSENSITIVE); - - public static final Set INTEGER_FAMILY = new HashSet(); - public static final Set NUMBER_FAMILY = new HashSet(); - public static final Set DATETIME_FAMILY = new HashSet(); - private static final Set HLLC_PRECISIONS = new HashSet(); - private static final Map LEGACY_TYPE_MAP = new HashMap(); - static { - INTEGER_FAMILY.add("tinyint"); - INTEGER_FAMILY.add("smallint"); - INTEGER_FAMILY.add("integer"); - INTEGER_FAMILY.add("bigint"); - - NUMBER_FAMILY.addAll(INTEGER_FAMILY); - NUMBER_FAMILY.add("float"); - NUMBER_FAMILY.add("double"); - NUMBER_FAMILY.add("decimal"); - NUMBER_FAMILY.add("real"); - NUMBER_FAMILY.add("numeric"); - - DATETIME_FAMILY.add("date"); - DATETIME_FAMILY.add("time"); - DATETIME_FAMILY.add("datetime"); - DATETIME_FAMILY.add("timestamp"); - - LEGACY_TYPE_MAP.put("byte", "tinyint"); - LEGACY_TYPE_MAP.put("int", "integer"); - LEGACY_TYPE_MAP.put("short", "smallint"); - LEGACY_TYPE_MAP.put("long", "bigint"); - LEGACY_TYPE_MAP.put("string", "varchar"); - LEGACY_TYPE_MAP.put("hllc10", "hllc(10)"); - LEGACY_TYPE_MAP.put("hllc12", "hllc(12)"); - LEGACY_TYPE_MAP.put("hllc14", "hllc(14)"); - LEGACY_TYPE_MAP.put("hllc15", "hllc(15)"); - LEGACY_TYPE_MAP.put("hllc16", "hllc(16)"); - - for (int i = 10; i <= 16; i++) - HLLC_PRECISIONS.add(i); - } - - private static final ConcurrentMap CACHE = new ConcurrentHashMap(); - - public static DataType getInstance(String type) { - if (type == null) - return null; - - DataType dataType = new DataType(type); - DataType cached = CACHE.get(dataType); - if (cached == null) { - CACHE.put(dataType, dataType); - cached = dataType; - } - return cached; - } - - // ============================================================================ - - private String name; - private int precision; - private int scale; - - DataType(String datatype) { - parseDataType(datatype); - } - - private void parseDataType(String datatype) { - datatype = datatype.trim().toLowerCase(); - datatype = replaceLegacy(datatype); - - Matcher m = TYPE_PATTERN.matcher(datatype); - if (m.matches() == false) - throw new IllegalArgumentException("bad data type -- " + datatype + ", does not match " + TYPE_PATTERN); - - name = replaceLegacy(m.group(1)); - precision = -1; - scale = -1; - - String leftover = m.group(2); - if (leftover != null) { - String[] parts = leftover.split("\\s*,\\s*"); - for (int i = 0; i < parts.length; i++) { - int n; - try { - n = Integer.parseInt(parts[i]); - } catch (NumberFormatException e) { - throw new IllegalArgumentException("bad data type -- " + datatype + ", precision/scale not numeric"); - } - if (i == 0) - precision = n; - else if (i == 1) - scale = n; - else - throw new IllegalArgumentException("bad data type -- " + datatype + ", too many precision/scale parts"); - } - } - - // FIXME 256 for unknown string precision - if ((name.equals("char") || name.equals("varchar")) && precision == -1) { - precision = 256; // to save memory at frontend, e.g. tableau will - // allocate memory according to this - } - - // FIXME (19,4) for unknown decimal precision - if ((name.equals("decimal") || name.equals("numeric")) && precision == -1) { - precision = 19; - scale = 4; - } - - if (isHLLC() && HLLC_PRECISIONS.contains(precision) == false) - throw new IllegalArgumentException("HLLC precision must be one of " + HLLC_PRECISIONS); - } - - private String replaceLegacy(String str) { - String replace = LEGACY_TYPE_MAP.get(str); - return replace == null ? str : replace; - } - - public int getSpaceEstimate() { - if (isTinyInt()) { - return 1; - } else if (isSmallInt()) { - return 2; - } else if (isInt()) { - return 4; - } else if (isBigInt()) { - return 8; - } else if (isFloat()) { - return 4; - } else if (isDouble()) { - return 8; - } else if (isDecimal()) { - return 8; - } else if (isHLLC()) { - return 1 << precision; - } - throw new IllegalStateException("The return type : " + name + " is not recognized;"); - } - - public boolean isIntegerFamily() { - return INTEGER_FAMILY.contains(name); - } - - public boolean isNumberFamily() { - return NUMBER_FAMILY.contains(name); - } - - public boolean isDateTimeFamily() { - return DATETIME_FAMILY.contains(name); - } - - public boolean isTinyInt() { - return name.equals("tinyint"); - } - - public boolean isSmallInt() { - return name.equals("smallint"); - } - - public boolean isInt() { - return name.equals("int"); - } - - public boolean isBigInt() { - return name.equals("bigint"); - } - - public boolean isFloat() { - return name.equals("float"); - } - - public boolean isDouble() { - return name.equals("double"); - } - - public boolean isDecimal() { - return name.equals("decimal"); - } - - public boolean isHLLC() { - return name.equals("hllc"); - } - - public String getName() { - return name; - } - - public int getPrecision() { - return precision; - } - - public int getScale() { - return scale; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result + precision; - result = prime * result + scale; - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - DataType other = (DataType) obj; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - if (precision != other.precision) - return false; - if (scale != other.scale) - return false; - return true; - } - - @Override - public String toString() { - if (precision < 0 && scale < 0) - return name; - else if (scale < 0) - return name + "(" + precision + ")"; - else - return name + "(" + precision + "," + scale + ")"; - } -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/schema/DatabaseDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/schema/DatabaseDesc.java deleted file mode 100644 index 8183264..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/schema/DatabaseDesc.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.model.schema; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; - -/** - * @author xjiang - */ -public class DatabaseDesc { - private String name; - - /** - * @return the name - */ - public String getName() { - return name.toUpperCase(); - } - - /** - * @param name - * the name to set - */ - public void setName(String name) { - this.name = name; - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - - return "DatabaseDesc [name=" + name + "]"; - } - - public static HashMap extractDatabaseOccurenceCounts(List tables) { - HashMap databaseCounts = new HashMap(); - for (TableDesc tableDesc : tables) { - String databaseName = tableDesc.getDatabase(); - Integer counter = databaseCounts.get(databaseName); - if (counter != null) - databaseCounts.put(databaseName, counter + 1); - else - databaseCounts.put(databaseName, 1); - } - return databaseCounts; - } - - public static HashSet extractDatabaseNames(List tables) { - HashSet databaseNames = new HashSet(); - for (TableDesc tableDesc : tables) { - databaseNames.add(tableDesc.getDatabase()); - } - return databaseNames; - } -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/schema/TableDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/schema/TableDesc.java deleted file mode 100644 index e10fe19..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/schema/TableDesc.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.model.schema; - -import java.util.Arrays; -import java.util.Comparator; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.kylinolap.common.persistence.ResourceStore; -import com.kylinolap.common.persistence.RootPersistentEntity; - -/** - * Table Metadata from Source. All name should be uppercase. - *

- * User: lukhan Date: 10/15/13 Time: 9:06 AM To change this template use File | - * Settings | File Templates. - */ -@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) -public class TableDesc extends RootPersistentEntity { - @JsonProperty("name") - private String name; - @JsonProperty("columns") - private ColumnDesc[] columns; - - private DatabaseDesc database; - - public ColumnDesc findColumnByName(String name) { - for (ColumnDesc c : columns) { - // return first matched column - if (name.equalsIgnoreCase(c.getName())) { - return c; - } - } - return null; - } - - public String getResourcePath() { - return ResourceStore.TABLE_RESOURCE_ROOT + "/" + name + ".json"; - } - - // ============================================================================ - - public String getName() { - return this.name; - } - - public void setName(String name) { - this.name = name; - } - - @JsonProperty("database") - public String getDatabase() { - if (database == null) { - return "DEFAULT"; - } - return database.getName(); - } - - @JsonProperty("database") - public void setDatabase(String database) { - this.database = new DatabaseDesc(); - this.database.setName(database); - } - - public ColumnDesc[] getColumns() { - return columns; - } - - public void setColumns(ColumnDesc[] columns) { - this.columns = columns; - } - - public int getMaxColumnIndex() { - int max = -1; - for (ColumnDesc col : columns) { - int idx = col.getZeroBasedIndex(); - max = Math.max(max, idx); - } - return max; - } - - public int getColumnCount() { - return getMaxColumnIndex() + 1; - } - - public void init() { - if (name != null) - name = name.toUpperCase(); - - if (getDatabase() != null) - setDatabase(getDatabase().toUpperCase()); - - if (columns != null) { - Arrays.sort(columns, new Comparator() { - @Override - public int compare(ColumnDesc col1, ColumnDesc col2) { - Integer id1 = Integer.parseInt(col1.getId()); - Integer id2 = Integer.parseInt(col2.getId()); - return id1.compareTo(id2); - } - }); - - for (ColumnDesc col : columns) { - col.init(this); - } - } - } - - @Override - public String toString() { - return "TableDesc [name=" + name + "]"; - } - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/tool/HiveSourceTableMgmt.java b/metadata/src/main/java/com/kylinolap/metadata/tool/HiveSourceTableMgmt.java index 80091e0..3829643 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/tool/HiveSourceTableMgmt.java +++ b/metadata/src/main/java/com/kylinolap/metadata/tool/HiveSourceTableMgmt.java @@ -39,8 +39,8 @@ import com.kylinolap.common.KylinConfig; import com.kylinolap.common.persistence.ResourceTool; import com.kylinolap.common.util.JsonUtil; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; /** * Management class to sync hive table metadata with command See main method for diff --git a/metadata/src/main/java/com/kylinolap/metadata/validation/SourceTableMetadataValidator.java b/metadata/src/main/java/com/kylinolap/metadata/validation/SourceTableMetadataValidator.java index deff50b..ef63df6 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/validation/SourceTableMetadataValidator.java +++ b/metadata/src/main/java/com/kylinolap/metadata/validation/SourceTableMetadataValidator.java @@ -15,7 +15,7 @@ */ package com.kylinolap.metadata.validation; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.TableDesc; /** * Validate Table metadata from source. diff --git a/metadata/src/main/java/com/kylinolap/metadata/validation/rule/FunctionRule.java b/metadata/src/main/java/com/kylinolap/metadata/validation/rule/FunctionRule.java index 4d2543e..1dc5443 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/validation/rule/FunctionRule.java +++ b/metadata/src/main/java/com/kylinolap/metadata/validation/rule/FunctionRule.java @@ -26,13 +26,13 @@ import com.kylinolap.common.KylinConfig; import com.kylinolap.metadata.MetadataManager; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.DataType; +import com.kylinolap.metadata.model.TableDesc; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.FunctionDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; -import com.kylinolap.metadata.model.cube.ParameterDesc; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.DataType; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.realization.FunctionDesc; +import com.kylinolap.metadata.model.realization.ParameterDesc; import com.kylinolap.metadata.validation.IValidatorRule; import com.kylinolap.metadata.validation.ResultLevel; import com.kylinolap.metadata.validation.ValidateContext; diff --git a/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java b/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java index a559ac7..3433393 100644 --- a/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java +++ b/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java @@ -23,8 +23,8 @@ import org.junit.Test; import com.kylinolap.common.util.LocalFileMetadataTestCase; +import com.kylinolap.metadata.model.TableDesc; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.schema.TableDesc; /** * Created with IntelliJ IDEA. User: lukhan Date: 9/24/13 Time: 2:38 PM To diff --git a/query/src/main/java/com/kylinolap/query/enumerator/CubeEnumerator.java b/query/src/main/java/com/kylinolap/query/enumerator/CubeEnumerator.java index 5768e60..a58b616 100644 --- a/query/src/main/java/com/kylinolap/query/enumerator/CubeEnumerator.java +++ b/query/src/main/java/com/kylinolap/query/enumerator/CubeEnumerator.java @@ -30,9 +30,9 @@ import org.slf4j.LoggerFactory; import com.kylinolap.metadata.model.cube.DimensionDesc; -import com.kylinolap.metadata.model.cube.FunctionDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.FunctionDesc; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.query.relnode.OLAPContext; import com.kylinolap.storage.IStorageEngine; import com.kylinolap.storage.StorageEngineFactory; diff --git a/query/src/main/java/com/kylinolap/query/enumerator/LookupTableEnumerator.java b/query/src/main/java/com/kylinolap/query/enumerator/LookupTableEnumerator.java index cf1e090..838a693 100644 --- a/query/src/main/java/com/kylinolap/query/enumerator/LookupTableEnumerator.java +++ b/query/src/main/java/com/kylinolap/query/enumerator/LookupTableEnumerator.java @@ -25,8 +25,8 @@ import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; import com.kylinolap.dict.lookup.LookupStringTable; +import com.kylinolap.metadata.model.ColumnDesc; import com.kylinolap.metadata.model.cube.DimensionDesc; -import com.kylinolap.metadata.model.schema.ColumnDesc; import com.kylinolap.query.relnode.OLAPContext; import com.kylinolap.query.schema.OLAPTable; import com.kylinolap.storage.tuple.Tuple; diff --git a/query/src/main/java/com/kylinolap/query/relnode/ColumnRowType.java b/query/src/main/java/com/kylinolap/query/relnode/ColumnRowType.java index a0dd3cf..c920f38 100644 --- a/query/src/main/java/com/kylinolap/query/relnode/ColumnRowType.java +++ b/query/src/main/java/com/kylinolap/query/relnode/ColumnRowType.java @@ -19,7 +19,7 @@ import java.util.List; import java.util.Set; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * diff --git a/query/src/main/java/com/kylinolap/query/relnode/OLAPAggregateRel.java b/query/src/main/java/com/kylinolap/query/relnode/OLAPAggregateRel.java index 33a403d..0f6ba2a 100644 --- a/query/src/main/java/com/kylinolap/query/relnode/OLAPAggregateRel.java +++ b/query/src/main/java/com/kylinolap/query/relnode/OLAPAggregateRel.java @@ -55,11 +55,11 @@ import org.eigenbase.util.Util; import com.google.common.base.Preconditions; -import com.kylinolap.metadata.model.cube.FunctionDesc; -import com.kylinolap.metadata.model.cube.ParameterDesc; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.FunctionDesc; +import com.kylinolap.metadata.model.realization.ParameterDesc; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.query.sqlfunc.HLLDistinctCountAggFunc; /** diff --git a/query/src/main/java/com/kylinolap/query/relnode/OLAPContext.java b/query/src/main/java/com/kylinolap/query/relnode/OLAPContext.java index 83dd18a..f2da184 100644 --- a/query/src/main/java/com/kylinolap/query/relnode/OLAPContext.java +++ b/query/src/main/java/com/kylinolap/query/relnode/OLAPContext.java @@ -27,10 +27,10 @@ import org.eigenbase.reltype.RelDataType; import com.kylinolap.cube.CubeInstance; +import com.kylinolap.metadata.model.JoinDesc; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.FunctionDesc; -import com.kylinolap.metadata.model.cube.JoinDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.FunctionDesc; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.query.schema.OLAPSchema; import com.kylinolap.storage.StorageContext; import com.kylinolap.storage.filter.TupleFilter; diff --git a/query/src/main/java/com/kylinolap/query/relnode/OLAPFilterRel.java b/query/src/main/java/com/kylinolap/query/relnode/OLAPFilterRel.java index 923a540..4e177e8 100644 --- a/query/src/main/java/com/kylinolap/query/relnode/OLAPFilterRel.java +++ b/query/src/main/java/com/kylinolap/query/relnode/OLAPFilterRel.java @@ -51,7 +51,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.filter.CaseTupleFilter; import com.kylinolap.storage.filter.ColumnTupleFilter; import com.kylinolap.storage.filter.CompareTupleFilter; diff --git a/query/src/main/java/com/kylinolap/query/relnode/OLAPJoinRel.java b/query/src/main/java/com/kylinolap/query/relnode/OLAPJoinRel.java index 83e7993..a0ad3cb 100644 --- a/query/src/main/java/com/kylinolap/query/relnode/OLAPJoinRel.java +++ b/query/src/main/java/com/kylinolap/query/relnode/OLAPJoinRel.java @@ -50,8 +50,8 @@ import org.eigenbase.util.ImmutableIntList; import com.google.common.base.Preconditions; -import com.kylinolap.metadata.model.cube.JoinDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.JoinDesc; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.query.schema.OLAPTable; /** diff --git a/query/src/main/java/com/kylinolap/query/relnode/OLAPProjectRel.java b/query/src/main/java/com/kylinolap/query/relnode/OLAPProjectRel.java index 5f45e3e..e4284fd 100644 --- a/query/src/main/java/com/kylinolap/query/relnode/OLAPProjectRel.java +++ b/query/src/main/java/com/kylinolap/query/relnode/OLAPProjectRel.java @@ -51,8 +51,8 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.cube.TblColRef.InnerDataTypeEnum; +import com.kylinolap.metadata.model.realization.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef.InnerDataTypeEnum; /** * diff --git a/query/src/main/java/com/kylinolap/query/relnode/OLAPSortRel.java b/query/src/main/java/com/kylinolap/query/relnode/OLAPSortRel.java index 9d71eaf..bc9e654 100644 --- a/query/src/main/java/com/kylinolap/query/relnode/OLAPSortRel.java +++ b/query/src/main/java/com/kylinolap/query/relnode/OLAPSortRel.java @@ -34,7 +34,7 @@ import com.google.common.base.Preconditions; import com.kylinolap.metadata.model.cube.MeasureDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.StorageContext; /** diff --git a/query/src/main/java/com/kylinolap/query/relnode/OLAPTableScan.java b/query/src/main/java/com/kylinolap/query/relnode/OLAPTableScan.java index 62c2fcd..8cb6e39 100644 --- a/query/src/main/java/com/kylinolap/query/relnode/OLAPTableScan.java +++ b/query/src/main/java/com/kylinolap/query/relnode/OLAPTableScan.java @@ -45,8 +45,8 @@ import org.eigenbase.reltype.RelDataTypeField; import com.google.common.base.Preconditions; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.ColumnDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.query.optrule.OLAPAggregateRule; import com.kylinolap.query.optrule.OLAPFilterRule; import com.kylinolap.query.optrule.OLAPJoinRule; diff --git a/query/src/main/java/com/kylinolap/query/routing/QueryRouter.java b/query/src/main/java/com/kylinolap/query/routing/QueryRouter.java index 7745c2a..42a9d9c 100644 --- a/query/src/main/java/com/kylinolap/query/routing/QueryRouter.java +++ b/query/src/main/java/com/kylinolap/query/routing/QueryRouter.java @@ -32,12 +32,12 @@ import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.project.ProjectManager; +import com.kylinolap.metadata.model.JoinDesc; import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.model.cube.DimensionDesc; -import com.kylinolap.metadata.model.cube.FunctionDesc; -import com.kylinolap.metadata.model.cube.JoinDesc; -import com.kylinolap.metadata.model.cube.ParameterDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.FunctionDesc; +import com.kylinolap.metadata.model.realization.ParameterDesc; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.query.relnode.OLAPContext; /** diff --git a/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java b/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java index 0bb7689..f8fb90e 100644 --- a/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java +++ b/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java @@ -27,7 +27,7 @@ import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.TableDesc; /** * @author xjiang diff --git a/query/src/main/java/com/kylinolap/query/schema/OLAPSchemaFactory.java b/query/src/main/java/com/kylinolap/query/schema/OLAPSchemaFactory.java index f3dcb8e..c074092 100644 --- a/query/src/main/java/com/kylinolap/query/schema/OLAPSchemaFactory.java +++ b/query/src/main/java/com/kylinolap/query/schema/OLAPSchemaFactory.java @@ -31,8 +31,8 @@ import com.kylinolap.common.KylinConfig; import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.cube.project.ProjectManager; -import com.kylinolap.metadata.model.schema.DatabaseDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.DatabaseDesc; +import com.kylinolap.metadata.model.TableDesc; /** * @author xjiang diff --git a/query/src/main/java/com/kylinolap/query/schema/OLAPTable.java b/query/src/main/java/com/kylinolap/query/schema/OLAPTable.java index c56c087..3120971 100644 --- a/query/src/main/java/com/kylinolap/query/schema/OLAPTable.java +++ b/query/src/main/java/com/kylinolap/query/schema/OLAPTable.java @@ -43,10 +43,10 @@ import org.eigenbase.sql.type.SqlTypeUtil; import com.kylinolap.cube.project.ProjectManager; -import com.kylinolap.metadata.model.cube.FunctionDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.realization.FunctionDesc; import com.kylinolap.query.enumerator.OLAPQuery; import com.kylinolap.query.enumerator.OLAPQuery.EnumeratorTypeEnum; import com.kylinolap.query.relnode.OLAPTableScan; diff --git a/query/src/test/java/com/kylinolap/query/test/H2Database.java b/query/src/test/java/com/kylinolap/query/test/H2Database.java index b3a1836..9545ebd 100644 --- a/query/src/test/java/com/kylinolap/query/test/H2Database.java +++ b/query/src/test/java/com/kylinolap/query/test/H2Database.java @@ -30,8 +30,8 @@ import com.kylinolap.common.KylinConfig; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; public class H2Database { private static final Logger logger = LoggerFactory.getLogger(H2Database.class); diff --git a/server/src/main/java/com/kylinolap/rest/controller/TableController.java b/server/src/main/java/com/kylinolap/rest/controller/TableController.java index 581b17a..d3e701d 100644 --- a/server/src/main/java/com/kylinolap/rest/controller/TableController.java +++ b/server/src/main/java/com/kylinolap/rest/controller/TableController.java @@ -38,8 +38,8 @@ import com.codahale.metrics.annotation.Metered; import com.kylinolap.metadata.MetadataConstances; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; import com.kylinolap.rest.request.CardinalityRequest; import com.kylinolap.rest.response.TableDescResponse; import com.kylinolap.rest.service.CubeService; diff --git a/server/src/main/java/com/kylinolap/rest/response/TableDescResponse.java b/server/src/main/java/com/kylinolap/rest/response/TableDescResponse.java index c97c30b..d5dba2d 100644 --- a/server/src/main/java/com/kylinolap/rest/response/TableDescResponse.java +++ b/server/src/main/java/com/kylinolap/rest/response/TableDescResponse.java @@ -20,7 +20,7 @@ import java.util.Map; import com.fasterxml.jackson.annotation.JsonProperty; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.TableDesc; /** * A response class to wrap TableDesc diff --git a/server/src/main/java/com/kylinolap/rest/service/CubeService.java b/server/src/main/java/com/kylinolap/rest/service/CubeService.java index 1523142..f6be2fe 100644 --- a/server/src/main/java/com/kylinolap/rest/service/CubeService.java +++ b/server/src/main/java/com/kylinolap/rest/service/CubeService.java @@ -69,9 +69,9 @@ import com.kylinolap.job.exception.JobException; import com.kylinolap.job.hadoop.cardinality.HiveColumnCardinalityJob; import com.kylinolap.metadata.MetadataConstances; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; import com.kylinolap.metadata.tool.HiveSourceTableMgmt; import com.kylinolap.rest.constant.Constant; import com.kylinolap.rest.controller.QueryController; diff --git a/storage/src/main/java/com/kylinolap/storage/IStorageEngine.java b/storage/src/main/java/com/kylinolap/storage/IStorageEngine.java index 19cae33..e1765f1 100644 --- a/storage/src/main/java/com/kylinolap/storage/IStorageEngine.java +++ b/storage/src/main/java/com/kylinolap/storage/IStorageEngine.java @@ -17,8 +17,8 @@ import java.util.Collection; -import com.kylinolap.metadata.model.cube.FunctionDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.FunctionDesc; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.filter.TupleFilter; import com.kylinolap.storage.tuple.ITupleIterator; diff --git a/storage/src/main/java/com/kylinolap/storage/StorageContext.java b/storage/src/main/java/com/kylinolap/storage/StorageContext.java index d4e01ca..f7d9396 100644 --- a/storage/src/main/java/com/kylinolap/storage/StorageContext.java +++ b/storage/src/main/java/com/kylinolap/storage/StorageContext.java @@ -24,7 +24,7 @@ import com.google.common.collect.HashBiMap; import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.metadata.model.cube.MeasureDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author xjiang diff --git a/storage/src/main/java/com/kylinolap/storage/filter/BitMapFilterEvaluator.java b/storage/src/main/java/com/kylinolap/storage/filter/BitMapFilterEvaluator.java index 88ec11a..9332f7a 100644 --- a/storage/src/main/java/com/kylinolap/storage/filter/BitMapFilterEvaluator.java +++ b/storage/src/main/java/com/kylinolap/storage/filter/BitMapFilterEvaluator.java @@ -3,7 +3,7 @@ import java.util.List; import com.kylinolap.dict.Dictionary; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; import it.uniroma3.mat.extendedset.intset.ConciseSet; diff --git a/storage/src/main/java/com/kylinolap/storage/filter/ColumnTupleFilter.java b/storage/src/main/java/com/kylinolap/storage/filter/ColumnTupleFilter.java index 6ac4db1..1ad0e5f 100644 --- a/storage/src/main/java/com/kylinolap/storage/filter/ColumnTupleFilter.java +++ b/storage/src/main/java/com/kylinolap/storage/filter/ColumnTupleFilter.java @@ -22,9 +22,9 @@ import java.util.List; import com.kylinolap.common.util.BytesUtil; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.tuple.ITuple; /** diff --git a/storage/src/main/java/com/kylinolap/storage/filter/CompareTupleFilter.java b/storage/src/main/java/com/kylinolap/storage/filter/CompareTupleFilter.java index 6463023..1c6b041 100644 --- a/storage/src/main/java/com/kylinolap/storage/filter/CompareTupleFilter.java +++ b/storage/src/main/java/com/kylinolap/storage/filter/CompareTupleFilter.java @@ -23,7 +23,7 @@ import java.util.Map; import com.kylinolap.common.util.BytesUtil; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.tuple.ITuple; /** diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/ColumnValueRange.java b/storage/src/main/java/com/kylinolap/storage/hbase/ColumnValueRange.java index 28634ad..ba042b9 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/ColumnValueRange.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/ColumnValueRange.java @@ -21,7 +21,7 @@ import com.google.common.collect.Sets; import com.kylinolap.cube.kv.RowKeyColumnOrder; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.filter.TupleFilter.FilterOperatorEnum; /** diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/ConcurrentHBaseTupleIterator.java b/storage/src/main/java/com/kylinolap/storage/hbase/ConcurrentHBaseTupleIterator.java index 38ba093..5452e50 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/ConcurrentHBaseTupleIterator.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/ConcurrentHBaseTupleIterator.java @@ -65,7 +65,7 @@ import com.kylinolap.metadata.model.cube.CubeDesc.DeriveInfo; import com.kylinolap.metadata.model.cube.HBaseColumnDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.StorageContext; import com.kylinolap.storage.filter.TupleFilter; import com.kylinolap.storage.hbase.observer.CoprocessorEnabler; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/CubeSegmentTupleIterator.java b/storage/src/main/java/com/kylinolap/storage/hbase/CubeSegmentTupleIterator.java index 70473dd..87dcb0c 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/CubeSegmentTupleIterator.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/CubeSegmentTupleIterator.java @@ -52,7 +52,7 @@ import com.kylinolap.metadata.model.cube.CubeDesc.DeriveInfo; import com.kylinolap.metadata.model.cube.HBaseColumnDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.StorageContext; import com.kylinolap.storage.filter.TupleFilter; import com.kylinolap.storage.hbase.observer.CoprocessorEnabler; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/DerivedFilterTranslator.java b/storage/src/main/java/com/kylinolap/storage/hbase/DerivedFilterTranslator.java index 422bf61..3ee9be0 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/DerivedFilterTranslator.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/DerivedFilterTranslator.java @@ -28,7 +28,7 @@ import com.kylinolap.dict.lookup.LookupStringTable; import com.kylinolap.metadata.model.cube.CubeDesc.DeriveInfo; import com.kylinolap.metadata.model.cube.CubeDesc.DeriveType; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.filter.ColumnTupleFilter; import com.kylinolap.storage.filter.CompareTupleFilter; import com.kylinolap.storage.filter.ConstantTupleFilter; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/FuzzyValueCombination.java b/storage/src/main/java/com/kylinolap/storage/hbase/FuzzyValueCombination.java index caa0026..646f8bb 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/FuzzyValueCombination.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/FuzzyValueCombination.java @@ -29,7 +29,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author yangli9 diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/HBaseKeyRange.java b/storage/src/main/java/com/kylinolap/storage/hbase/HBaseKeyRange.java index 98d634a..913ee63 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/HBaseKeyRange.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/HBaseKeyRange.java @@ -35,7 +35,7 @@ import com.kylinolap.cube.kv.RowConstants; import com.kylinolap.dict.DateStrDictionary; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java b/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java index 2f274b7..c29e8b9 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java @@ -45,11 +45,11 @@ import com.kylinolap.dict.lookup.LookupStringTable; import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.model.cube.CubeDesc.DeriveInfo; -import com.kylinolap.metadata.model.cube.FunctionDesc; import com.kylinolap.metadata.model.cube.HBaseColumnDesc; import com.kylinolap.metadata.model.cube.HBaseMappingDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.FunctionDesc; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.IStorageEngine; import com.kylinolap.storage.StorageContext; import com.kylinolap.storage.filter.ColumnTupleFilter; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/InvertedIndexStorageEngine.java b/storage/src/main/java/com/kylinolap/storage/hbase/InvertedIndexStorageEngine.java index 53a99dc..e060a55 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/InvertedIndexStorageEngine.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/InvertedIndexStorageEngine.java @@ -25,6 +25,7 @@ import java.util.NoSuchElementException; import com.kylinolap.cube.invertedindex.*; + import org.apache.hadoop.hbase.client.HConnection; import com.kylinolap.common.KylinConfig; @@ -32,9 +33,9 @@ import com.kylinolap.common.persistence.StorageException; import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeSegment; -import com.kylinolap.metadata.model.cube.FunctionDesc; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.ColumnDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.realization.FunctionDesc; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.IStorageEngine; import com.kylinolap.storage.StorageContext; import com.kylinolap.storage.filter.TupleFilter; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/SerializedHBaseTupleIterator.java b/storage/src/main/java/com/kylinolap/storage/hbase/SerializedHBaseTupleIterator.java index 14c0dc3..2b40256 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/SerializedHBaseTupleIterator.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/SerializedHBaseTupleIterator.java @@ -29,7 +29,7 @@ import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.kv.RowValueDecoder; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.StorageContext; import com.kylinolap.storage.filter.TupleFilter; import com.kylinolap.storage.tuple.ITuple; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/CoprocessorEnabler.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/CoprocessorEnabler.java index a60471b..a84e07a 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/CoprocessorEnabler.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/CoprocessorEnabler.java @@ -34,7 +34,7 @@ import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.cube.kv.RowValueDecoder; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.StorageContext; import com.kylinolap.storage.filter.TupleFilter; import com.kylinolap.storage.hbase.RegionScannerAdapter; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowFilter.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowFilter.java index 1ed12c6..77c13e9 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowFilter.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowFilter.java @@ -26,7 +26,7 @@ import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.kv.RowKeyColumnIO; import com.kylinolap.dict.Dictionary; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.filter.ColumnTupleFilter; import com.kylinolap.storage.filter.CompareTupleFilter; import com.kylinolap.storage.filter.ConstantTupleFilter; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowProjector.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowProjector.java index 46d98f4..0e6128e 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowProjector.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowProjector.java @@ -28,7 +28,7 @@ import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.cube.kv.RowKeyEncoder; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author yangli9 diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowTuple.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowTuple.java index f43becd..2bf8b31 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowTuple.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowTuple.java @@ -21,7 +21,7 @@ import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import com.kylinolap.dict.Dictionary; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.tuple.ITuple; /** diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowType.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowType.java index 7fea097..f7bf86f 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowType.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowType.java @@ -28,9 +28,9 @@ import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.cube.kv.RowConstants; import com.kylinolap.cube.kv.RowKeyColumnIO; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author yangli9 diff --git a/storage/src/main/java/com/kylinolap/storage/tuple/ITuple.java b/storage/src/main/java/com/kylinolap/storage/tuple/ITuple.java index d6bb55d..fffc726 100644 --- a/storage/src/main/java/com/kylinolap/storage/tuple/ITuple.java +++ b/storage/src/main/java/com/kylinolap/storage/tuple/ITuple.java @@ -18,7 +18,7 @@ import java.util.List; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * Tuple is a record row, contains multiple values being lookup by either field diff --git a/storage/src/main/java/com/kylinolap/storage/tuple/Tuple.java b/storage/src/main/java/com/kylinolap/storage/tuple/Tuple.java index 1d9c77d..78e0b67 100644 --- a/storage/src/main/java/com/kylinolap/storage/tuple/Tuple.java +++ b/storage/src/main/java/com/kylinolap/storage/tuple/Tuple.java @@ -25,7 +25,7 @@ import com.kylinolap.dict.DateStrDictionary; import com.kylinolap.dict.lookup.LookupStringTable; import com.kylinolap.metadata.model.cube.CubeDesc.DeriveInfo; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author xjiang diff --git a/storage/src/main/java/com/kylinolap/storage/tuple/TupleInfo.java b/storage/src/main/java/com/kylinolap/storage/tuple/TupleInfo.java index 446ab45..0c3a4e5 100644 --- a/storage/src/main/java/com/kylinolap/storage/tuple/TupleInfo.java +++ b/storage/src/main/java/com/kylinolap/storage/tuple/TupleInfo.java @@ -20,7 +20,7 @@ import java.util.List; import java.util.Map; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.tuple.Tuple.IDerivedColumnFiller; /** diff --git a/storage/src/test/java/com/kylinolap/storage/filter/BitMapFilterEvaluatorTest.java b/storage/src/test/java/com/kylinolap/storage/filter/BitMapFilterEvaluatorTest.java index 454c804..a38f8e6 100644 --- a/storage/src/test/java/com/kylinolap/storage/filter/BitMapFilterEvaluatorTest.java +++ b/storage/src/test/java/com/kylinolap/storage/filter/BitMapFilterEvaluatorTest.java @@ -10,9 +10,9 @@ import com.google.common.collect.Lists; import com.kylinolap.dict.Dictionary; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.filter.BitMapFilterEvaluator.BitMapProvider; import com.kylinolap.storage.filter.TupleFilter.FilterOperatorEnum; diff --git a/storage/src/test/java/com/kylinolap/storage/filter/FilterBaseTest.java b/storage/src/test/java/com/kylinolap/storage/filter/FilterBaseTest.java index 8082eba..bfae2d3 100644 --- a/storage/src/test/java/com/kylinolap/storage/filter/FilterBaseTest.java +++ b/storage/src/test/java/com/kylinolap/storage/filter/FilterBaseTest.java @@ -21,9 +21,9 @@ import java.util.List; import java.util.Random; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.filter.TupleFilter.FilterOperatorEnum; import com.kylinolap.storage.tuple.Tuple; import com.kylinolap.storage.tuple.TupleInfo; diff --git a/storage/src/test/java/com/kylinolap/storage/filter/FilterEvaluateTest.java b/storage/src/test/java/com/kylinolap/storage/filter/FilterEvaluateTest.java index 6d95be6..7056e20 100644 --- a/storage/src/test/java/com/kylinolap/storage/filter/FilterEvaluateTest.java +++ b/storage/src/test/java/com/kylinolap/storage/filter/FilterEvaluateTest.java @@ -23,7 +23,7 @@ import org.junit.Test; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.tuple.Tuple; /** diff --git a/storage/src/test/java/com/kylinolap/storage/filter/FilterSerializeTest.java b/storage/src/test/java/com/kylinolap/storage/filter/FilterSerializeTest.java index 80ad265..4e26ce2 100644 --- a/storage/src/test/java/com/kylinolap/storage/filter/FilterSerializeTest.java +++ b/storage/src/test/java/com/kylinolap/storage/filter/FilterSerializeTest.java @@ -21,9 +21,9 @@ import org.junit.Test; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.filter.TupleFilter.FilterOperatorEnum; /** diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/FuzzyValueCombinationTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/FuzzyValueCombinationTest.java index 87729fd..9902528 100644 --- a/storage/src/test/java/com/kylinolap/storage/hbase/FuzzyValueCombinationTest.java +++ b/storage/src/test/java/com/kylinolap/storage/hbase/FuzzyValueCombinationTest.java @@ -27,9 +27,9 @@ import org.junit.Test; import com.google.common.collect.Maps; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.TblColRef; /** * @author yangli9 diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserverTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserverTest.java index 48b7d70..3628b85 100644 --- a/storage/src/test/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserverTest.java +++ b/storage/src/test/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserverTest.java @@ -39,9 +39,9 @@ import com.google.common.collect.Lists; import com.kylinolap.cube.kv.RowConstants; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.hbase.observer.AggregationScanner; import com.kylinolap.storage.hbase.observer.SRowAggregators; import com.kylinolap.storage.hbase.observer.SRowFilter; diff --git a/storage/src/test/java/com/kylinolap/storage/test/StorageTest.java b/storage/src/test/java/com/kylinolap/storage/test/StorageTest.java index 6819dfb..1d4b4fd 100644 --- a/storage/src/test/java/com/kylinolap/storage/test/StorageTest.java +++ b/storage/src/test/java/com/kylinolap/storage/test/StorageTest.java @@ -29,11 +29,11 @@ import com.kylinolap.common.util.HBaseMetadataTestCase; import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; -import com.kylinolap.metadata.model.cube.FunctionDesc; -import com.kylinolap.metadata.model.cube.ParameterDesc; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.FunctionDesc; +import com.kylinolap.metadata.model.realization.ParameterDesc; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.IStorageEngine; import com.kylinolap.storage.StorageContext; import com.kylinolap.storage.StorageEngineFactory; From 817f62b2a09fd962bfdc489d2fa066c7c37794f6 Mon Sep 17 00:00:00 2001 From: "Li, Yang" Date: Thu, 27 Nov 2014 18:47:07 +0800 Subject: [PATCH 15/65] fix compile --- server/src/main/java/com/kylinolap/rest/service/CubeService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/main/java/com/kylinolap/rest/service/CubeService.java b/server/src/main/java/com/kylinolap/rest/service/CubeService.java index 57b0f4e..4b4eaa0 100644 --- a/server/src/main/java/com/kylinolap/rest/service/CubeService.java +++ b/server/src/main/java/com/kylinolap/rest/service/CubeService.java @@ -73,7 +73,6 @@ import com.kylinolap.metadata.model.TableDesc; import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.tool.HiveSourceTableLoader; -import com.kylinolap.metadata.tool.HiveSourceTableMgmt; import com.kylinolap.rest.constant.Constant; import com.kylinolap.rest.controller.QueryController; import com.kylinolap.rest.exception.InternalErrorException; From d003e346e9ab65ee9d90b232668ac5b770f72f8b Mon Sep 17 00:00:00 2001 From: Yang Li Date: Fri, 28 Nov 2014 03:15:42 +0000 Subject: [PATCH 16/65] initial realization --- .../kylinolap/metadata/model/realization/IDataModelRealization.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/realization/IDataModelRealization.java b/metadata/src/main/java/com/kylinolap/metadata/model/realization/IDataModelRealization.java index 8142d1d..70655fc 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/realization/IDataModelRealization.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/realization/IDataModelRealization.java @@ -1,9 +1,11 @@ package com.kylinolap.metadata.model.realization; +import java.util.Set; + public interface IDataModelRealization { /** Return a cost indicator for the realization, the lower, the better. Range from 0 - 100 typically. */ int getCost(); - + Set getSupportedColumns(); } From cfc047f82308ea2b87022addae2a8340606e3647 Mon Sep 17 00:00:00 2001 From: "Li, Yang" Date: Fri, 28 Nov 2014 15:40:43 +0800 Subject: [PATCH 17/65] add DataModel IDataModelRealization --- .../com/kylinolap/cube/CubeSegmentValidator.java | 2 +- .../com/kylinolap/job/hadoop/hbase/BulkLoadJob.java | 1 + .../com/kylinolap/metadata/model/cube/CubeDesc.java | 3 +++ .../model/realization/IDataModelRealization.java | 20 +++++++++++++++----- .../storage/hbase/ConcurrentHBaseTupleIterator.java | 2 +- .../storage/hbase/CubeSegmentTupleIterator.java | 2 +- .../kylinolap/storage/hbase/HBaseStorageEngine.java | 2 +- .../kylinolap/storage/hbase/endpoint/IIEndpoint.java | 2 ++ 8 files changed, 25 insertions(+), 9 deletions(-) diff --git a/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java b/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java index 1f3cb96..7f565d6 100644 --- a/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java +++ b/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java @@ -23,8 +23,8 @@ import com.kylinolap.cube.exception.CubeIntegrityException; import com.kylinolap.dict.DictionaryManager; -import com.kylinolap.metadata.model.cube.CubePartitionDesc.CubePartitionType; import com.kylinolap.metadata.model.cube.DimensionDesc; +import com.kylinolap.metadata.model.cube.CubePartitionDesc.CubePartitionType; import com.kylinolap.metadata.model.realization.TblColRef; /** diff --git a/job/src/main/java/com/kylinolap/job/hadoop/hbase/BulkLoadJob.java b/job/src/main/java/com/kylinolap/job/hadoop/hbase/BulkLoadJob.java index 1037c70..52546f3 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/hbase/BulkLoadJob.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/hbase/BulkLoadJob.java @@ -31,6 +31,7 @@ import com.kylinolap.job.hadoop.AbstractHadoopJob; import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.model.cube.HBaseColumnFamilyDesc; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/CubeDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/CubeDesc.java index 5538114..bbf9107 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/CubeDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/cube/CubeDesc.java @@ -47,6 +47,7 @@ import com.kylinolap.metadata.MetadataConstances; import com.kylinolap.metadata.MetadataManager; import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.DataModelDesc; import com.kylinolap.metadata.model.DataType; import com.kylinolap.metadata.model.JoinDesc; import com.kylinolap.metadata.model.TableDesc; @@ -93,6 +94,8 @@ public String toString() { @JsonProperty("name") private String name; + @JsonProperty("data_model") + private DataModelDesc model; @JsonProperty("description") private String description; @JsonProperty("fact_table") diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/realization/IDataModelRealization.java b/metadata/src/main/java/com/kylinolap/metadata/model/realization/IDataModelRealization.java index 70655fc..0602eb7 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/realization/IDataModelRealization.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/realization/IDataModelRealization.java @@ -1,11 +1,21 @@ package com.kylinolap.metadata.model.realization; -import java.util.Set; +import java.util.Collection; + +import com.kylinolap.metadata.model.JoinDesc; public interface IDataModelRealization { - /** Return a cost indicator for the realization, the lower, the better. Range from 0 - 100 typically. */ - int getCost(); - - Set getSupportedColumns(); + /** + * Given the features of a query, return an integer indicating how capable the realization + * is to answer the query. + * + * @return -1 if the realization cannot fulfill the query; + * or a number between 0-100 if the realization can answer the query, the smaller + * the number, the more efficient the realization. Especially, + * 0 - means the realization has the exact result pre-calculated, no less no more; + * 100 - means the realization will scan the full table with little or no indexing. + */ + int getCost(String factTable, Collection joins, Collection allColumns, // + Collection aggrFunctions); } diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/ConcurrentHBaseTupleIterator.java b/storage/src/main/java/com/kylinolap/storage/hbase/ConcurrentHBaseTupleIterator.java index 5452e50..3bf4240 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/ConcurrentHBaseTupleIterator.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/ConcurrentHBaseTupleIterator.java @@ -62,9 +62,9 @@ import com.kylinolap.cube.kv.RowKeyDecoder; import com.kylinolap.cube.kv.RowValueDecoder; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.CubeDesc.DeriveInfo; import com.kylinolap.metadata.model.cube.HBaseColumnDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; +import com.kylinolap.metadata.model.cube.CubeDesc.DeriveInfo; import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.StorageContext; import com.kylinolap.storage.filter.TupleFilter; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/CubeSegmentTupleIterator.java b/storage/src/main/java/com/kylinolap/storage/hbase/CubeSegmentTupleIterator.java index 87dcb0c..71d6878 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/CubeSegmentTupleIterator.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/CubeSegmentTupleIterator.java @@ -49,9 +49,9 @@ import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.cube.kv.RowKeyDecoder; import com.kylinolap.cube.kv.RowValueDecoder; -import com.kylinolap.metadata.model.cube.CubeDesc.DeriveInfo; import com.kylinolap.metadata.model.cube.HBaseColumnDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; +import com.kylinolap.metadata.model.cube.CubeDesc.DeriveInfo; import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.StorageContext; import com.kylinolap.storage.filter.TupleFilter; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java b/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java index c29e8b9..4a10f8b 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java @@ -44,10 +44,10 @@ import com.kylinolap.cube.kv.RowValueDecoder; import com.kylinolap.dict.lookup.LookupStringTable; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.CubeDesc.DeriveInfo; import com.kylinolap.metadata.model.cube.HBaseColumnDesc; import com.kylinolap.metadata.model.cube.HBaseMappingDesc; import com.kylinolap.metadata.model.cube.MeasureDesc; +import com.kylinolap.metadata.model.cube.CubeDesc.DeriveInfo; import com.kylinolap.metadata.model.realization.FunctionDesc; import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.IStorageEngine; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java index 48bb544..08ff0bb 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java @@ -13,7 +13,9 @@ import com.kylinolap.storage.hbase.observer.SRowFilter; import com.kylinolap.storage.hbase.observer.SRowProjector; import com.kylinolap.storage.hbase.observer.SRowType; + import it.uniroma3.mat.extendedset.intset.ConciseSet; + import org.apache.commons.io.IOUtils; import org.apache.hadoop.hbase.Coprocessor; import org.apache.hadoop.hbase.CoprocessorEnvironment; From 27444148d82e7d6b19ca5bd84c255eee70d74804 Mon Sep 17 00:00:00 2001 From: "Li, Yang" Date: Fri, 28 Nov 2014 15:55:13 +0800 Subject: [PATCH 18/65] fix compile --- job/src/test/java/com/kylinolap/job/DeployUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/job/src/test/java/com/kylinolap/job/DeployUtil.java b/job/src/test/java/com/kylinolap/job/DeployUtil.java index 80774b5..8463d9e 100644 --- a/job/src/test/java/com/kylinolap/job/DeployUtil.java +++ b/job/src/test/java/com/kylinolap/job/DeployUtil.java @@ -25,8 +25,8 @@ import com.kylinolap.job.hadoop.hive.SqlHiveDataTypeMapping; import com.kylinolap.job.tools.LZOSupportnessChecker; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; public class DeployUtil { @SuppressWarnings("unused") From b01de3fad322953aa529be5946c650bf0537987b Mon Sep 17 00:00:00 2001 From: honma Date: Tue, 25 Nov 2014 15:38:48 +0800 Subject: [PATCH 19/65] optimize fetching result at endpoint side --- .../com/kylinolap/cube/invertedindex/Slice.java | 65 +++++++++++----------- .../storage/hbase/endpoint/IIEndpoint.java | 21 +++---- 2 files changed, 42 insertions(+), 44 deletions(-) diff --git a/cube/src/main/java/com/kylinolap/cube/invertedindex/Slice.java b/cube/src/main/java/com/kylinolap/cube/invertedindex/Slice.java index 3550286..2843cee 100644 --- a/cube/src/main/java/com/kylinolap/cube/invertedindex/Slice.java +++ b/cube/src/main/java/com/kylinolap/cube/invertedindex/Slice.java @@ -68,41 +68,44 @@ public ColumnValueContainer getColumnValueContainer(int col) { return containers[col]; } - private Iterator iteratorWithBitmap(final ConciseSet bitmap) { - - return new Iterator() { - int i = 0; - int iteratedCount = 0; - int resultSize = bitmap.size(); - - TableRecordBytes rec = info.createTableRecord(); - ImmutableBytesWritable temp = new ImmutableBytesWritable(); - - @Override - public boolean hasNext() { - return iteratedCount < resultSize; - } - - @Override - public TableRecordBytes next() { - while (!bitmap.contains(i) && i < nRecords - 1) { - i++; + public Iterator iterateWithBitmap(final ConciseSet resultBitMap) { + if (resultBitMap == null) { + return this.iterator(); + } else { + return new Iterator() { + int i = 0; + int iteratedCount = 0; + int resultSize = resultBitMap.size(); + + TableRecordBytes rec = info.createTableRecord(); + ImmutableBytesWritable temp = new ImmutableBytesWritable(); + + @Override + public boolean hasNext() { + return iteratedCount < resultSize; } - for (int col = 0; col < nColumns; col++) { - containers[col].getValueAt(i, temp); - rec.setValueBytes(col, temp); - } - iteratedCount++; - return rec; - } + @Override + public TableRecordBytes next() { + while (!resultBitMap.contains(i) && i < nRecords - 1) { + i++; + } + for (int col = 0; col < nColumns; col++) { + containers[col].getValueAt(i, temp); + rec.setValueBytes(col, temp); + } + iteratedCount++; + + return rec; + } - @Override - public void remove() { - throw new UnsupportedOperationException(); - } + @Override + public void remove() { + throw new UnsupportedOperationException(); + } - }; + }; + } } @Override diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java index 08ff0bb..5e1ab24 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java @@ -30,6 +30,7 @@ import java.io.IOException; import java.nio.ByteBuffer; +import java.util.Iterator; /** * Created by honma on 11/7/14. @@ -88,20 +89,14 @@ public void getRows(RpcController controller, IIProtos.IIRequest request, RpcCal IIKeyValueCodec codec = new IIKeyValueCodec(tableInfo); for (Slice slice : codec.decodeKeyValue(new HbaseServerKVIterator(innerScanner))) { + ConciseSet result = null; if (filter != null) { - ConciseSet result = new BitMapFilterEvaluator(new SliceBitMapProvider(slice, type)).evaluate(filter.getFilter()); - int index = 0; - //TODO: should not use iterator mode for performance - for (TableRecordBytes recordBytes : slice) { - if (result.contains(index)) { - responseBuilder.addRows(ByteString.copyFrom(recordBytes.getBytes())); - } - index++; - } - } else { - for (TableRecordBytes recordBytes : slice) { - responseBuilder.addRows(ByteString.copyFrom(recordBytes.getBytes())); - } + result = new BitMapFilterEvaluator(new SliceBitMapProvider(slice, type)).evaluate(filter.getFilter()); + } + + Iterator iterator = slice.iterateWithBitmap(result); + while (iterator.hasNext()) { + responseBuilder.addRows(ByteString.copyFrom(iterator.next().getBytes())); } } From fc43429cfaad575eb243f6f151ec24daaed924c2 Mon Sep 17 00:00:00 2001 From: honma Date: Wed, 26 Nov 2014 11:23:42 +0800 Subject: [PATCH 20/65] refactor: renaming --- .../kylinolap/job/coprocessor/IIEndpointTest.java | 13 +- .../storage/hbase/HBaseStorageEngine.java | 4 +- .../storage/hbase/endpoint/IIEndpoint.java | 27 +- .../hbase/endpoint/SliceBitMapProvider.java | 7 +- .../hbase/observer/AggregateRegionObserver.java | 8 +- .../storage/hbase/observer/AggregationCache.java | 6 +- .../storage/hbase/observer/AggregationScanner.java | 10 +- .../storage/hbase/observer/CoprocessorEnabler.java | 16 +- .../hbase/observer/ObserverAggregators.java | 259 ++++++++ .../storage/hbase/observer/ObserverFilter.java | 201 ++++++ .../storage/hbase/observer/ObserverProjector.java | 175 ++++++ .../storage/hbase/observer/ObserverRowType.java | 141 +++++ .../storage/hbase/observer/ObserverTuple.java | 96 +++ .../storage/hbase/observer/SRowAggregators.java | 259 -------- .../storage/hbase/observer/SRowFilter.java | 203 ------ .../storage/hbase/observer/SRowProjector.java | 175 ------ .../storage/hbase/observer/SRowTuple.java | 96 --- .../kylinolap/storage/hbase/observer/SRowType.java | 141 ----- .../observer/AggregateRegionObserverTest.java | 681 ++++++++++----------- .../storage/hbase/observer/RowAggregatorsTest.java | 9 +- .../storage/hbase/observer/RowProjectorTest.java | 9 +- .../storage/hbase/observer/RowTypeTest.java | 7 +- 22 files changed, 1264 insertions(+), 1279 deletions(-) create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverAggregators.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverFilter.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverProjector.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverRowType.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverTuple.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowAggregators.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowFilter.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowProjector.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowTuple.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowType.java diff --git a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java index c9de57d..0d8b55a 100644 --- a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java +++ b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java @@ -23,9 +23,8 @@ import com.kylinolap.storage.filter.TupleFilter; import com.kylinolap.storage.hbase.endpoint.IIEndpoint; import com.kylinolap.storage.hbase.endpoint.generated.IIProtos; -import com.kylinolap.storage.hbase.observer.SRowFilter; -import com.kylinolap.storage.hbase.observer.SRowType; - +import com.kylinolap.storage.hbase.observer.ObserverFilter; +import com.kylinolap.storage.hbase.observer.ObserverRowType; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.*; @@ -139,9 +138,9 @@ public static void tearDownAfterClass() throws Exception { private IIProtos.IIRequest prepareRequest(TupleFilter rootFilter) throws IOException { long baseCuboidId = Cuboid.getBaseCuboidId(this.cube.getDescriptor()); - SRowType type = SRowType.fromCuboid(this.seg, Cuboid.findById(cube.getDescriptor(), baseCuboidId)); + ObserverRowType type = ObserverRowType.fromCuboid(this.seg, Cuboid.findById(cube.getDescriptor(), baseCuboidId)); - SRowFilter filter = SRowFilter.fromFilter(this.seg, rootFilter); + ObserverFilter filter = ObserverFilter.fromFilter(this.seg, rootFilter); //SRowProjector projector = SRowProjector.fromColumns(segment, cuboid, groupBy); //SRowAggregators aggrs = SRowAggregators.fromValueDecoders(rowValueDecoders); @@ -150,8 +149,8 @@ public static void tearDownAfterClass() throws Exception { TableRecordInfoDigest recordInfo = new TableRecordInfo(seg); IIProtos.IIRequest request = IIProtos.IIRequest.newBuilder(). setTableInfo(ByteString.copyFrom(TableRecordInfoDigest.serialize(recordInfo))). - setSRowType(ByteString.copyFrom(SRowType.serialize(type))). - setSRowFilter(ByteString.copyFrom(SRowFilter.serialize(filter))). + setSRowType(ByteString.copyFrom(ObserverRowType.serialize(type))). + setSRowFilter(ByteString.copyFrom(ObserverFilter.serialize(filter))). build(); return request; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java b/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java index 4a10f8b..628153f 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java @@ -120,7 +120,7 @@ public ITupleIterator search(Collection dimensions, TupleFilter filte List scans = buildScanRanges(flatFilter, dimensionsD); // check involved measures, build value decoder for each each family:column - List valueDecoders = translateAggregation(cubeDesc.getHBaseMapping(), metrics, scans, context); + List valueDecoders = translateAggregation(cubeDesc.getHBaseMapping(), metrics, context); setThreshold(dimensionsD, valueDecoders, context); // set cautious threshold to prevent out of memory setCoprocessor(groupsCopD, valueDecoders, context); // enable coprocessor if beneficial @@ -309,7 +309,7 @@ private TupleFilter translateDerivedInCompare(CompareTupleFilter compf, Set translateAggregation(HBaseMappingDesc hbaseMapping, Collection metrics, // - List scans, StorageContext context) { + StorageContext context) { Map codecMap = Maps.newHashMap(); for (FunctionDesc aggrFunc : metrics) { Collection hbCols = hbaseMapping.findHBaseColumnByFunction(aggrFunc); diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java index 5e1ab24..af9f033 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java @@ -5,15 +5,12 @@ import com.google.protobuf.RpcController; import com.google.protobuf.Service; import com.kylinolap.cube.invertedindex.*; -import com.kylinolap.cube.kv.RowValueDecoder; -import com.kylinolap.metadata.model.cube.HBaseColumnDesc; import com.kylinolap.storage.filter.BitMapFilterEvaluator; import com.kylinolap.storage.hbase.endpoint.generated.IIProtos; -import com.kylinolap.storage.hbase.observer.SRowAggregators; -import com.kylinolap.storage.hbase.observer.SRowFilter; -import com.kylinolap.storage.hbase.observer.SRowProjector; -import com.kylinolap.storage.hbase.observer.SRowType; - +import com.kylinolap.storage.hbase.observer.ObserverAggregators; +import com.kylinolap.storage.hbase.observer.ObserverFilter; +import com.kylinolap.storage.hbase.observer.ObserverProjector; +import com.kylinolap.storage.hbase.observer.ObserverRowType; import it.uniroma3.mat.extendedset.intset.ConciseSet; import org.apache.commons.io.IOUtils; @@ -53,22 +50,22 @@ private Scan buildScan() { @Override public void getRows(RpcController controller, IIProtos.IIRequest request, RpcCallback done) { - SRowType type = null; - SRowProjector projector = null; - SRowAggregators aggregators = null; - SRowFilter filter = null; + ObserverRowType type = null; + ObserverProjector projector = null; + ObserverAggregators aggregators = null; + ObserverFilter filter = null; if (request.hasSRowType()) { - type = SRowType.deserialize(request.getSRowType().toByteArray()); + type = ObserverRowType.deserialize(request.getSRowType().toByteArray()); } if (request.hasSRowProjector()) { - projector = SRowProjector.deserialize(request.getSRowProjector().toByteArray()); + projector = ObserverProjector.deserialize(request.getSRowProjector().toByteArray()); } if (request.hasSRowAggregator()) { - aggregators = SRowAggregators.deserialize(request.getSRowAggregator().toByteArray()); + aggregators = ObserverAggregators.deserialize(request.getSRowAggregator().toByteArray()); } if (request.hasSRowFilter()) { - filter = SRowFilter.deserialize(request.getSRowFilter().toByteArray()); + filter = ObserverFilter.deserialize(request.getSRowFilter().toByteArray()); } diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/SliceBitMapProvider.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/SliceBitMapProvider.java index a0f3683..9b8a256 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/SliceBitMapProvider.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/SliceBitMapProvider.java @@ -3,8 +3,7 @@ import com.kylinolap.cube.invertedindex.Slice; import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.filter.BitMapFilterEvaluator; -import com.kylinolap.storage.hbase.observer.SRowType; - +import com.kylinolap.storage.hbase.observer.ObserverRowType; import it.uniroma3.mat.extendedset.intset.ConciseSet; /** @@ -15,9 +14,9 @@ public class SliceBitMapProvider implements BitMapFilterEvaluator.BitMapProvider { private Slice slice; - private SRowType type; + private ObserverRowType type; - public SliceBitMapProvider(Slice slice, SRowType type) { + public SliceBitMapProvider(Slice slice, ObserverRowType type) { this.slice = slice; this.type = type; } diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserver.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserver.java index c03cebb..20011be 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserver.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserver.java @@ -67,16 +67,16 @@ private RegionScanner doPostScannerObserver(final ObserverContext aggBufMap; - private final SRowAggregators aggregators; + private final ObserverAggregators aggregators; transient int rowMemBytes; - public AggregationCache(SRowAggregators aggregators, int estSize) { + public AggregationCache(ObserverAggregators aggregators) { this.aggregators = aggregators; this.aggBufMap = Maps.newTreeMap(); } diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregationScanner.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregationScanner.java index f1ee09f..1a566a1 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregationScanner.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregationScanner.java @@ -25,7 +25,7 @@ import org.apache.hadoop.hbase.regionserver.RegionScanner; import com.kylinolap.cube.measure.MeasureAggregator; -import com.kylinolap.storage.hbase.observer.SRowProjector.AggrKey; +import com.kylinolap.storage.hbase.observer.ObserverProjector.AggrKey; /** * @author yangli9 @@ -35,7 +35,7 @@ private RegionScanner outerScanner; - public AggregationScanner(SRowType type, SRowFilter filter, SRowProjector groupBy, SRowAggregators aggrs, RegionScanner innerScanner) throws IOException { + public AggregationScanner(ObserverRowType type, ObserverFilter filter, ObserverProjector groupBy, ObserverAggregators aggrs, RegionScanner innerScanner) throws IOException { AggregateRegionObserver.LOG.info("Kylin Coprocessor start"); @@ -50,11 +50,11 @@ public AggregationScanner(SRowType type, SRowFilter filter, SRowProjector groupB } @SuppressWarnings("rawtypes") - AggregationCache buildAggrCache(final RegionScanner innerScanner, SRowType type, SRowProjector projector, SRowAggregators aggregators, SRowFilter filter, Stats stats) throws IOException { + AggregationCache buildAggrCache(final RegionScanner innerScanner, ObserverRowType type, ObserverProjector projector, ObserverAggregators aggregators, ObserverFilter filter, Stats stats) throws IOException { - AggregationCache aggCache = new AggregationCache(aggregators, 0); + AggregationCache aggCache = new AggregationCache(aggregators); - SRowTuple tuple = new SRowTuple(type); + ObserverTuple tuple = new ObserverTuple(type); boolean hasMore = true; List results = new ArrayList(); while (hasMore) { diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/CoprocessorEnabler.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/CoprocessorEnabler.java index 741095a..84b6b21 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/CoprocessorEnabler.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/CoprocessorEnabler.java @@ -59,10 +59,10 @@ public static ResultScanner scanWithCoprocessorIfBeneficial(CubeSegment segment, return table.getScanner(scan); } - SRowType type = SRowType.fromCuboid(segment, cuboid); - SRowFilter filter = SRowFilter.fromFilter(segment, tupleFiler); - SRowProjector projector = SRowProjector.fromColumns(segment, cuboid, groupBy); - SRowAggregators aggrs = SRowAggregators.fromValueDecoders(rowValueDecoders); + ObserverRowType type = ObserverRowType.fromCuboid(segment, cuboid); + ObserverFilter filter = ObserverFilter.fromFilter(segment, tupleFiler); + ObserverProjector projector = ObserverProjector.fromColumns(segment, cuboid, groupBy); + ObserverAggregators aggrs = ObserverAggregators.fromValueDecoders(rowValueDecoders); if (DEBUG_LOCAL_COPROCESSOR) { RegionScanner innerScanner = new RegionScannerAdapter(table.getScanner(scan)); @@ -70,10 +70,10 @@ public static ResultScanner scanWithCoprocessorIfBeneficial(CubeSegment segment, return new ResultScannerAdapter(aggrScanner); } else { scan.setAttribute(AggregateRegionObserver.COPROCESSOR_ENABLE, new byte[] { 0x01 }); - scan.setAttribute(AggregateRegionObserver.TYPE, SRowType.serialize(type)); - scan.setAttribute(AggregateRegionObserver.PROJECTOR, SRowProjector.serialize(projector)); - scan.setAttribute(AggregateRegionObserver.AGGREGATORS, SRowAggregators.serialize(aggrs)); - scan.setAttribute(AggregateRegionObserver.FILTER, SRowFilter.serialize(filter)); + scan.setAttribute(AggregateRegionObserver.TYPE, ObserverRowType.serialize(type)); + scan.setAttribute(AggregateRegionObserver.PROJECTOR, ObserverProjector.serialize(projector)); + scan.setAttribute(AggregateRegionObserver.AGGREGATORS, ObserverAggregators.serialize(aggrs)); + scan.setAttribute(AggregateRegionObserver.FILTER, ObserverFilter.serialize(filter)); return table.getScanner(scan); } } diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverAggregators.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverAggregators.java new file mode 100644 index 0000000..1302f98 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverAggregators.java @@ -0,0 +1,259 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.observer; + +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.List; + +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.util.Bytes; + +import com.kylinolap.common.util.BytesSerializer; +import com.kylinolap.common.util.BytesUtil; +import com.kylinolap.cube.kv.RowConstants; +import com.kylinolap.cube.kv.RowValueDecoder; +import com.kylinolap.cube.measure.MeasureAggregator; +import com.kylinolap.cube.measure.MeasureCodec; +import com.kylinolap.metadata.model.cube.HBaseColumnDesc; +import com.kylinolap.metadata.model.cube.MeasureDesc; + +/** + * @author yangli9 + */ +@SuppressWarnings({ "rawtypes", "unchecked" }) +public class ObserverAggregators { + + public static ObserverAggregators fromValueDecoders(Collection rowValueDecoders) { + + // each decoder represents one HBase column + HCol[] hcols = new HCol[rowValueDecoders.size()]; + int i = 0; + for (RowValueDecoder rowValueDecoder : rowValueDecoders) { + hcols[i++] = buildHCol(rowValueDecoder.getHBaseColumn()); + } + + ObserverAggregators aggrs = new ObserverAggregators(hcols); + return aggrs; + + } + + private static HCol buildHCol(HBaseColumnDesc desc) { + byte[] family = Bytes.toBytes(desc.getColumnFamilyName()); + byte[] qualifier = Bytes.toBytes(desc.getQualifier()); + MeasureDesc[] measures = desc.getMeasures(); + + String[] funcNames = new String[measures.length]; + String[] dataTypes = new String[measures.length]; + + for (int i = 0; i < measures.length; i++) { + funcNames[i] = measures[i].getFunction().getExpression(); + dataTypes[i] = measures[i].getFunction().getReturnType(); + } + + return new HCol(family, qualifier, funcNames, dataTypes); + } + + public static byte[] serialize(ObserverAggregators o) { + ByteBuffer buf = ByteBuffer.allocate(CoprocessorEnabler.SERIALIZE_BUFFER_SIZE); + serializer.serialize(o, buf); + byte[] result = new byte[buf.position()]; + System.arraycopy(buf.array(), 0, result, 0, buf.position()); + return result; + } + + public static ObserverAggregators deserialize(byte[] bytes) { + return serializer.deserialize(ByteBuffer.wrap(bytes)); + } + + private static final Serializer serializer = new Serializer(); + + private static class Serializer implements BytesSerializer { + + @Override + public void serialize(ObserverAggregators value, ByteBuffer out) { + BytesUtil.writeVInt(value.nHCols, out); + for (int i = 0; i < value.nHCols; i++) { + HCol col = value.hcols[i]; + BytesUtil.writeByteArray(col.family, out); + BytesUtil.writeByteArray(col.qualifier, out); + BytesUtil.writeAsciiStringArray(col.funcNames, out); + BytesUtil.writeAsciiStringArray(col.dataTypes, out); + } + } + + @Override + public ObserverAggregators deserialize(ByteBuffer in) { + int nHCols = BytesUtil.readVInt(in); + HCol[] hcols = new HCol[nHCols]; + for (int i = 0; i < nHCols; i++) { + byte[] family = BytesUtil.readByteArray(in); + byte[] qualifier = BytesUtil.readByteArray(in); + String[] funcNames = BytesUtil.readAsciiStringArray(in); + String[] dataTypes = BytesUtil.readAsciiStringArray(in); + hcols[i] = new HCol(family, qualifier, funcNames, dataTypes); + } + return new ObserverAggregators(hcols); + } + + } + + // ============================================================================ + + final HCol[] hcols; + final int nHCols; + final ByteBuffer[] hColValues; + final int nTotalMeasures; + + public ObserverAggregators(HCol[] _hcols) { + this.hcols = sort(_hcols); + this.nHCols = hcols.length; + this.hColValues = new ByteBuffer[nHCols]; + + int nTotalMeasures = 0; + for (HCol col : hcols) + nTotalMeasures += col.nMeasures; + this.nTotalMeasures = nTotalMeasures; + } + + private HCol[] sort(HCol[] hcols) { + HCol[] copy = Arrays.copyOf(hcols, hcols.length); + Arrays.sort(copy, new Comparator() { + @Override + public int compare(HCol o1, HCol o2) { + int comp = Bytes.compareTo(o1.family, o2.family); + if (comp != 0) + return comp; + comp = Bytes.compareTo(o1.qualifier, o2.qualifier); + return comp; + } + }); + return copy; + } + + public MeasureAggregator[] createBuffer() { + MeasureAggregator[] aggrs = new MeasureAggregator[nTotalMeasures]; + int i = 0; + for (HCol col : hcols) { + for (int j = 0; j < col.nMeasures; j++) + aggrs[i++] = MeasureAggregator.create(col.funcNames[j], col.dataTypes[j]); + } + return aggrs; + } + + public void aggregate(MeasureAggregator[] measureAggrs, List rowCells) { + int i = 0; + for (int ci = 0; ci < nHCols; ci++) { + HCol col = hcols[ci]; + Cell cell = findCell(col, rowCells); + + if (cell == null) { + i += col.nMeasures; + continue; + } + + ByteBuffer input = ByteBuffer.wrap(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()); + + col.measureCodec.decode(input, col.measureValues); + for (int j = 0; j < col.nMeasures; j++) + measureAggrs[i++].aggregate(col.measureValues[j]); + } + } + + private Cell findCell(HCol col, List cells) { + // cells are ordered by timestamp asc, thus search from back, first hit + // is the latest version + for (int i = cells.size() - 1; i >= 0; i--) { + Cell cell = cells.get(i); + if (match(col, cell)) { + return cell; + } + } + return null; + } + + public static boolean match(HCol col, Cell cell) { + return Bytes.compareTo(col.family, 0, col.family.length, cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()) == 0 && Bytes.compareTo(col.qualifier, 0, col.qualifier.length, cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()) == 0; + } + + public int getHColsNum() { + return nHCols; + } + + public byte[][] getHColFamilies() { + byte[][] result = new byte[nHCols][]; + for (int i = 0; i < nHCols; i++) + result[i] = hcols[i].family; + return result; + } + + public byte[][] getHColQualifiers() { + byte[][] result = new byte[nHCols][]; + for (int i = 0; i < nHCols; i++) + result[i] = hcols[i].qualifier; + return result; + } + + public ByteBuffer[] getHColValues(MeasureAggregator[] aggrs) { + int i = 0; + for (int ci = 0; ci < nHCols; ci++) { + HCol col = hcols[ci]; + for (int j = 0; j < col.nMeasures; j++) + col.measureValues[j] = aggrs[i++].getState(); + + col.measureBuf.clear(); + col.measureCodec.encode(col.measureValues, col.measureBuf); + hColValues[ci] = col.measureBuf; + } + return hColValues; + } + + // ============================================================================ + + public static class HCol { + final byte[] family; + final byte[] qualifier; + final String[] funcNames; + final String[] dataTypes; + final int nMeasures; + + final MeasureCodec measureCodec; + final Object[] measureValues; + final ByteBuffer measureBuf; + + public HCol(byte[] bFamily, byte[] bQualifier, String[] funcNames, String[] dataTypes) { + this.family = bFamily; + this.qualifier = bQualifier; + this.funcNames = funcNames; + this.dataTypes = dataTypes; + this.nMeasures = funcNames.length; + assert funcNames.length == dataTypes.length; + + this.measureCodec = new MeasureCodec(dataTypes); + this.measureValues = new Object[nMeasures]; + this.measureBuf = ByteBuffer.allocate(RowConstants.ROWVALUE_BUFFER_SIZE); + } + + @Override + public String toString() { + return "HCol [bFamily=" + Bytes.toString(family) + ", bQualifier=" + Bytes.toString(qualifier) + ", nMeasures=" + nMeasures + "]"; + } + } + +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverFilter.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverFilter.java new file mode 100644 index 0000000..d74cf20 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverFilter.java @@ -0,0 +1,201 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.observer; + +import java.util.Collection; +import java.util.Set; + +import org.apache.hadoop.hbase.util.Bytes; + +import com.google.common.collect.Sets; +import com.kylinolap.common.util.BytesUtil; +import com.kylinolap.cube.CubeSegment; +import com.kylinolap.cube.kv.RowKeyColumnIO; +import com.kylinolap.dict.Dictionary; +import com.kylinolap.metadata.model.realization.TblColRef; +import com.kylinolap.storage.filter.ColumnTupleFilter; +import com.kylinolap.storage.filter.CompareTupleFilter; +import com.kylinolap.storage.filter.ConstantTupleFilter; +import com.kylinolap.storage.filter.TupleFilter; +import com.kylinolap.storage.filter.TupleFilter.FilterOperatorEnum; +import com.kylinolap.storage.filter.TupleFilterSerializer; +import com.kylinolap.storage.filter.TupleFilterSerializer.Decorator; +import com.kylinolap.storage.tuple.ITuple; + +/** + * @author yangli9 + */ +public class ObserverFilter { + + public static ObserverFilter fromFilter(final CubeSegment seg, TupleFilter rootFilter) { + // translate constants into dictionary IDs via a serialize copy + byte[] bytes = TupleFilterSerializer.serialize(rootFilter, new Decorator() { + RowKeyColumnIO columnIO = new RowKeyColumnIO(seg); + + @Override + public TupleFilter onSerialize(TupleFilter filter) { + if (filter == null) + return filter; + + if (filter.getOperator() == FilterOperatorEnum.NOT && TupleFilter.isEvaluableRecursively(filter) == false) + return ConstantTupleFilter.TRUE; + + if ((filter instanceof CompareTupleFilter) == false) + return filter; + + if (TupleFilter.isEvaluableRecursively(filter) == false) + return ConstantTupleFilter.TRUE; + + // extract ColumnFilter & ConstantFilter + CompareTupleFilter compf = (CompareTupleFilter) filter; + TblColRef col = compf.getColumn(); + if (col == null) { + return filter; + } + String nullString = nullString(col); + Collection constValues = compf.getValues(); + if (constValues == null || constValues.isEmpty()) { + compf.setNullString(nullString); // maybe ISNULL + return filter; + } + + TupleFilter result; + CompareTupleFilter newComp = new CompareTupleFilter(compf.getOperator()); + newComp.setNullString(nullString); + newComp.addChild(new ColumnTupleFilter(col)); + String v; + String firstValue = constValues.iterator().next(); + + // translate constant into rowkey ID + switch (newComp.getOperator()) { + case EQ: + case IN: + Set newValues = Sets.newHashSet(); + for (String value : constValues) { + v = translate(col, value, 0); + if (nullString.equals(v) == false) + newValues.add(v); + } + if (newValues.isEmpty()) { + result = ConstantTupleFilter.FALSE; + } else { + newComp.addChild(new ConstantTupleFilter(newValues)); + result = newComp; + } + break; + case NEQ: + v = translate(col, firstValue, 0); + if (nullString.equals(v)) { + result = ConstantTupleFilter.TRUE; + } else { + newComp.addChild(new ConstantTupleFilter(v)); + result = newComp; + } + break; + case LT: + v = translate(col, firstValue, 1); + if (nullString.equals(v)) { + result = ConstantTupleFilter.TRUE; + } else { + newComp.addChild(new ConstantTupleFilter(v)); + result = newComp; + } + break; + case LTE: + v = translate(col, firstValue, -1); + if (nullString.equals(v)) { + result = ConstantTupleFilter.FALSE; + } else { + newComp.addChild(new ConstantTupleFilter(v)); + result = newComp; + } + break; + case GT: + v = translate(col, firstValue, -1); + if (nullString.equals(v)) { + result = ConstantTupleFilter.TRUE; + } else { + newComp.addChild(new ConstantTupleFilter(v)); + result = newComp; + } + break; + case GTE: + v = translate(col, firstValue, 1); + if (nullString.equals(v)) { + result = ConstantTupleFilter.FALSE; + } else { + newComp.addChild(new ConstantTupleFilter(v)); + result = newComp; + } + break; + default: + throw new IllegalStateException("Cannot handle operator " + newComp.getOperator()); + } + return result; + } + + private String nullString(TblColRef column) { + byte[] id = new byte[columnIO.getColumnLength(column)]; + for (int i = 0; i < id.length; i++) { + id[i] = Dictionary.NULL; + } + return Dictionary.dictIdToString(id, 0, id.length); + } + + private String translate(TblColRef column, String v, int roundingFlag) { + byte[] value = Bytes.toBytes(v); + byte[] id = new byte[columnIO.getColumnLength(column)]; + columnIO.writeColumn(column, value, value.length, roundingFlag, Dictionary.NULL, id, 0); + return Dictionary.dictIdToString(id, 0, id.length); + } + + }); + TupleFilter copy = TupleFilterSerializer.deserialize(bytes); + return new ObserverFilter(copy); + } + + public static byte[] serialize(ObserverFilter o) { + return (o.filter == null) ? BytesUtil.EMPTY_BYTE_ARRAY : TupleFilterSerializer.serialize(o.filter); + } + + public static ObserverFilter deserialize(byte[] filterBytes) { + TupleFilter filter = (filterBytes == null || filterBytes.length == 0) // + ? null // + : TupleFilterSerializer.deserialize(filterBytes); + return new ObserverFilter(filter); + } + + // ============================================================================ + + public TupleFilter getFilter() { + return filter; + } + + private final TupleFilter filter; + + public ObserverFilter(TupleFilter filter) { + this.filter = filter; + } + + public boolean evaluate(ITuple tuple) { + if (filter == null) + return true; + else + return filter.evaluate(tuple); + } + +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverProjector.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverProjector.java new file mode 100644 index 0000000..145c26b --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverProjector.java @@ -0,0 +1,175 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.observer; + +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import org.apache.hadoop.hbase.Cell; + +import com.kylinolap.common.util.BytesSerializer; +import com.kylinolap.common.util.BytesUtil; +import com.kylinolap.cube.CubeSegment; +import com.kylinolap.cube.cuboid.Cuboid; +import com.kylinolap.cube.kv.RowKeyEncoder; +import com.kylinolap.metadata.model.realization.TblColRef; + +/** + * @author yangli9 + */ +public class ObserverProjector { + + public static ObserverProjector fromColumns(final CubeSegment cubeSegment, final Cuboid cuboid, final Collection dimensionColumns) { + + RowKeyEncoder rowKeyMaskEncoder = new RowKeyEncoder(cubeSegment, cuboid) { + @Override + protected int fillHeader(byte[] bytes, byte[][] values) { + Arrays.fill(bytes, 0, this.headerLength, (byte) 0xff); + return this.headerLength; + } + + @Override + protected void fillColumnValue(TblColRef column, int columnLen, byte[] value, int valueLen, byte[] outputValue, int outputValueOffset) { + byte bits = dimensionColumns.contains(column) ? (byte) 0xff : 0x00; + Arrays.fill(outputValue, outputValueOffset, outputValueOffset + columnLen, bits); + } + }; + + byte[] mask = rowKeyMaskEncoder.encode(new byte[cuboid.getColumns().size()][]); + return new ObserverProjector(mask); + } + + public static byte[] serialize(ObserverProjector o) { + ByteBuffer buf = ByteBuffer.allocate(CoprocessorEnabler.SERIALIZE_BUFFER_SIZE); + serializer.serialize(o, buf); + byte[] result = new byte[buf.position()]; + System.arraycopy(buf.array(), 0, result, 0, buf.position()); + return result; + } + + public static ObserverProjector deserialize(byte[] bytes) { + return serializer.deserialize(ByteBuffer.wrap(bytes)); + } + + private static final Serializer serializer = new Serializer(); + + private static class Serializer implements BytesSerializer { + + @Override + public void serialize(ObserverProjector value, ByteBuffer out) { + BytesUtil.writeByteArray(value.groupByMask, out); + } + + @Override + public ObserverProjector deserialize(ByteBuffer in) { + byte[] mask = BytesUtil.readByteArray(in); + return new ObserverProjector(mask); + } + } + + // ============================================================================ + + final byte[] groupByMask; // mask out columns that are not needed (by group by) + final AggrKey aggrKey = new AggrKey(); + + public ObserverProjector(byte[] groupByMask) { + this.groupByMask = groupByMask; + } + + public AggrKey getRowKey(List rowCells) { + int length = groupByMask.length; + Cell cell = rowCells.get(0); + assert length == cell.getRowLength(); + + aggrKey.set(cell.getRowArray(), cell.getRowOffset()); + return aggrKey; + } + + public class AggrKey implements Comparable { + byte[] data; + int offset; + + public byte[] get() { + return data; + } + + public int offset() { + return offset; + } + + public int length() { + return groupByMask.length; + } + + void set(byte[] data, int offset) { + this.data = data; + this.offset = offset; + } + + public AggrKey copy() { + AggrKey copy = new AggrKey(); + copy.set(new byte[length()], 0); + System.arraycopy(this.data, this.offset, copy.data, copy.offset, length()); + return copy; + } + + @Override + public int hashCode() { + int hash = 1; + for (int i = 0, j = offset, n = length(); i < n; i++, j++) { + if (groupByMask[i] != 0) + hash = (31 * hash) + (int) data[j]; + } + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + AggrKey other = (AggrKey) obj; + if (this.length() != other.length()) + return false; + + return compareTo(other) == 0; + } + + @Override + public int compareTo(AggrKey o) { + int comp = this.length() - o.length(); + if (comp != 0) + return comp; + + int n = this.length(); + for (int i = 0, j = offset, k = o.offset; i < n; i++, j++, k++) { + if (groupByMask[i] != 0) { + comp = BytesUtil.compareByteUnsigned(this.data[j], o.data[k]); + if (comp != 0) + return comp; + } + } + return 0; + } + } + +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverRowType.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverRowType.java new file mode 100644 index 0000000..a493509 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverRowType.java @@ -0,0 +1,141 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.observer; + +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import com.google.common.collect.Maps; +import com.kylinolap.common.util.BytesSerializer; +import com.kylinolap.common.util.BytesUtil; +import com.kylinolap.cube.CubeSegment; +import com.kylinolap.cube.cuboid.Cuboid; +import com.kylinolap.cube.kv.RowConstants; +import com.kylinolap.cube.kv.RowKeyColumnIO; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.TblColRef; + +/** + * @author yangli9 + */ +public class ObserverRowType { + + public static ObserverRowType fromCuboid(CubeSegment seg, Cuboid cuboid) { + List colList = cuboid.getColumns(); + TblColRef[] cols = colList.toArray(new TblColRef[colList.size()]); + RowKeyColumnIO colIO = new RowKeyColumnIO(seg); + int[] colSizes = new int[cols.length]; + for (int i = 0; i < cols.length; i++) { + colSizes[i] = colIO.getColumnLength(cols[i]); + } + return new ObserverRowType(cols, colSizes); + } + + public static byte[] serialize(ObserverRowType o) { + ByteBuffer buf = ByteBuffer.allocate(CoprocessorEnabler.SERIALIZE_BUFFER_SIZE); + serializer.serialize(o, buf); + byte[] result = new byte[buf.position()]; + System.arraycopy(buf.array(), 0, result, 0, buf.position()); + return result; + } + + public static ObserverRowType deserialize(byte[] bytes) { + return serializer.deserialize(ByteBuffer.wrap(bytes)); + } + + private static final Serializer serializer = new Serializer(); + + private static class Serializer implements BytesSerializer { + + @Override + public void serialize(ObserverRowType o, ByteBuffer out) { + int n = o.columns.length; + BytesUtil.writeVInt(o.columns.length, out); + for (int i = 0; i < n; i++) { + BytesUtil.writeAsciiString(o.columns[i].getTable(), out); + BytesUtil.writeAsciiString(o.columns[i].getName(), out); + BytesUtil.writeVInt(o.columnSizes[i], out); + } + } + + @Override + public ObserverRowType deserialize(ByteBuffer in) { + int n = BytesUtil.readVInt(in); + TblColRef[] cols = new TblColRef[n]; + int[] colSizes = new int[n]; + for (int i = 0; i < n; i++) { + String tableName = BytesUtil.readAsciiString(in); + String colName = BytesUtil.readAsciiString(in); + TableDesc table = new TableDesc(); + table.setName(tableName); + ColumnDesc col = new ColumnDesc(); + col.setTable(table); + col.setName(colName); + cols[i] = new TblColRef(col); + + int colSize = BytesUtil.readVInt(in); + colSizes[i] = colSize; + } + return new ObserverRowType(cols, colSizes); + } + } + + // ============================================================================ + + TblColRef[] columns; + int[] columnSizes; + + int[] columnOffsets; + List columnsAsList; + HashMap columnIdxMap; + + public ObserverRowType(TblColRef[] columns, int[] columnSizes) { + this.columns = columns; + this.columnSizes = columnSizes; + init(); + } + + public int getColIndexByTblColRef(TblColRef colRef) { + return columnIdxMap.get(colRef); + } + + private void init() { + int[] offsets = new int[columns.length]; + int o = RowConstants.ROWKEY_CUBOIDID_LEN; + for (int i = 0; i < columns.length; i++) { + offsets[i] = o; + o += columnSizes[i]; + } + this.columnOffsets = offsets; + + this.columnsAsList = Arrays.asList(columns); + + HashMap map = Maps.newHashMap(); + for (int i = 0; i < columns.length; i++) { + map.put(columns[i], i); + } + this.columnIdxMap = map; + } + + public int getColumnCount() { + return columns.length; + } + +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverTuple.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverTuple.java new file mode 100644 index 0000000..f7a46e2 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverTuple.java @@ -0,0 +1,96 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.observer; + +import java.util.List; + +import org.apache.hadoop.hbase.io.ImmutableBytesWritable; + +import com.kylinolap.dict.Dictionary; +import com.kylinolap.metadata.model.realization.TblColRef; +import com.kylinolap.storage.tuple.ITuple; + +/** + * A special kind of tuple that exposes column value (dictionary ID) directly on + * top of row key. + * + * @author yangli9 + */ +public class ObserverTuple implements ITuple { + + final ObserverRowType type; + + ImmutableBytesWritable rowkey; + String[] values; + + public ObserverTuple(ObserverRowType type) { + this.type = type; + this.rowkey = new ImmutableBytesWritable(); + this.values = new String[type.getColumnCount()]; + } + + public void setUnderlying(byte[] array, int offset, int length) { + rowkey.set(array, offset, length); + for (int i = 0; i < values.length; i++) { + values[i] = null; + } + } + + @Override + public List getAllColumns() { + return type.columnsAsList; + } + + @Override + public Object[] getAllValues() { + int n = type.getColumnCount(); + for (int i = 0; i < n; i++) { + getValueAt(i); + } + return values; + } + + private String getValueAt(int i) { + int n = type.getColumnCount(); + if (i < 0 || i >= n) + return null; + + if (values[i] == null) { + values[i] = Dictionary.dictIdToString(rowkey.get(), rowkey.getOffset() + type.columnOffsets[i], type.columnSizes[i]); + } + + return values[i]; + } + + + @Override + public Object getValue(TblColRef col) { + int i = type.getColIndexByTblColRef(col); + return getValueAt(i); + } + + @Override + public List getAllFields() { + throw new UnsupportedOperationException(); + } + + @Override + public Object getValue(String field) { + throw new UnsupportedOperationException(); + } + +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowAggregators.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowAggregators.java deleted file mode 100644 index a817ba9..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowAggregators.java +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import java.nio.ByteBuffer; -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.List; - -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.util.Bytes; - -import com.kylinolap.common.util.BytesSerializer; -import com.kylinolap.common.util.BytesUtil; -import com.kylinolap.cube.kv.RowConstants; -import com.kylinolap.cube.kv.RowValueDecoder; -import com.kylinolap.cube.measure.MeasureAggregator; -import com.kylinolap.cube.measure.MeasureCodec; -import com.kylinolap.metadata.model.cube.HBaseColumnDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; - -/** - * @author yangli9 - */ -@SuppressWarnings({ "rawtypes", "unchecked" }) -public class SRowAggregators { - - public static SRowAggregators fromValueDecoders(Collection rowValueDecoders) { - - // each decoder represents one HBase column - HCol[] hcols = new HCol[rowValueDecoders.size()]; - int i = 0; - for (RowValueDecoder rowValueDecoder : rowValueDecoders) { - hcols[i++] = buildHCol(rowValueDecoder.getHBaseColumn()); - } - - SRowAggregators aggrs = new SRowAggregators(hcols); - return aggrs; - - } - - private static HCol buildHCol(HBaseColumnDesc desc) { - byte[] family = Bytes.toBytes(desc.getColumnFamilyName()); - byte[] qualifier = Bytes.toBytes(desc.getQualifier()); - MeasureDesc[] measures = desc.getMeasures(); - - String[] funcNames = new String[measures.length]; - String[] dataTypes = new String[measures.length]; - - for (int i = 0; i < measures.length; i++) { - funcNames[i] = measures[i].getFunction().getExpression(); - dataTypes[i] = measures[i].getFunction().getReturnType(); - } - - return new HCol(family, qualifier, funcNames, dataTypes); - } - - public static byte[] serialize(SRowAggregators o) { - ByteBuffer buf = ByteBuffer.allocate(CoprocessorEnabler.SERIALIZE_BUFFER_SIZE); - serializer.serialize(o, buf); - byte[] result = new byte[buf.position()]; - System.arraycopy(buf.array(), 0, result, 0, buf.position()); - return result; - } - - public static SRowAggregators deserialize(byte[] bytes) { - return serializer.deserialize(ByteBuffer.wrap(bytes)); - } - - private static final Serializer serializer = new Serializer(); - - private static class Serializer implements BytesSerializer { - - @Override - public void serialize(SRowAggregators value, ByteBuffer out) { - BytesUtil.writeVInt(value.nHCols, out); - for (int i = 0; i < value.nHCols; i++) { - HCol col = value.hcols[i]; - BytesUtil.writeByteArray(col.family, out); - BytesUtil.writeByteArray(col.qualifier, out); - BytesUtil.writeAsciiStringArray(col.funcNames, out); - BytesUtil.writeAsciiStringArray(col.dataTypes, out); - } - } - - @Override - public SRowAggregators deserialize(ByteBuffer in) { - int nHCols = BytesUtil.readVInt(in); - HCol[] hcols = new HCol[nHCols]; - for (int i = 0; i < nHCols; i++) { - byte[] family = BytesUtil.readByteArray(in); - byte[] qualifier = BytesUtil.readByteArray(in); - String[] funcNames = BytesUtil.readAsciiStringArray(in); - String[] dataTypes = BytesUtil.readAsciiStringArray(in); - hcols[i] = new HCol(family, qualifier, funcNames, dataTypes); - } - return new SRowAggregators(hcols); - } - - } - - // ============================================================================ - - final HCol[] hcols; - final int nHCols; - final ByteBuffer[] hColValues; - final int nTotalMeasures; - - public SRowAggregators(HCol[] _hcols) { - this.hcols = sort(_hcols); - this.nHCols = hcols.length; - this.hColValues = new ByteBuffer[nHCols]; - - int nTotalMeasures = 0; - for (HCol col : hcols) - nTotalMeasures += col.nMeasures; - this.nTotalMeasures = nTotalMeasures; - } - - private HCol[] sort(HCol[] hcols) { - HCol[] copy = Arrays.copyOf(hcols, hcols.length); - Arrays.sort(copy, new Comparator() { - @Override - public int compare(HCol o1, HCol o2) { - int comp = Bytes.compareTo(o1.family, o2.family); - if (comp != 0) - return comp; - comp = Bytes.compareTo(o1.qualifier, o2.qualifier); - return comp; - } - }); - return copy; - } - - public MeasureAggregator[] createBuffer() { - MeasureAggregator[] aggrs = new MeasureAggregator[nTotalMeasures]; - int i = 0; - for (HCol col : hcols) { - for (int j = 0; j < col.nMeasures; j++) - aggrs[i++] = MeasureAggregator.create(col.funcNames[j], col.dataTypes[j]); - } - return aggrs; - } - - public void aggregate(MeasureAggregator[] measureAggrs, List rowCells) { - int i = 0; - for (int ci = 0; ci < nHCols; ci++) { - HCol col = hcols[ci]; - Cell cell = findCell(col, rowCells); - - if (cell == null) { - i += col.nMeasures; - continue; - } - - ByteBuffer input = ByteBuffer.wrap(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()); - - col.measureCodec.decode(input, col.measureValues); - for (int j = 0; j < col.nMeasures; j++) - measureAggrs[i++].aggregate(col.measureValues[j]); - } - } - - private Cell findCell(HCol col, List cells) { - // cells are ordered by timestamp asc, thus search from back, first hit - // is the latest version - for (int i = cells.size() - 1; i >= 0; i--) { - Cell cell = cells.get(i); - if (match(col, cell)) { - return cell; - } - } - return null; - } - - public static boolean match(HCol col, Cell cell) { - return Bytes.compareTo(col.family, 0, col.family.length, cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()) == 0 && Bytes.compareTo(col.qualifier, 0, col.qualifier.length, cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()) == 0; - } - - public int getHColsNum() { - return nHCols; - } - - public byte[][] getHColFamilies() { - byte[][] result = new byte[nHCols][]; - for (int i = 0; i < nHCols; i++) - result[i] = hcols[i].family; - return result; - } - - public byte[][] getHColQualifiers() { - byte[][] result = new byte[nHCols][]; - for (int i = 0; i < nHCols; i++) - result[i] = hcols[i].qualifier; - return result; - } - - public ByteBuffer[] getHColValues(MeasureAggregator[] aggrs) { - int i = 0; - for (int ci = 0; ci < nHCols; ci++) { - HCol col = hcols[ci]; - for (int j = 0; j < col.nMeasures; j++) - col.measureValues[j] = aggrs[i++].getState(); - - col.measureBuf.clear(); - col.measureCodec.encode(col.measureValues, col.measureBuf); - hColValues[ci] = col.measureBuf; - } - return hColValues; - } - - // ============================================================================ - - public static class HCol { - final byte[] family; - final byte[] qualifier; - final String[] funcNames; - final String[] dataTypes; - final int nMeasures; - - final MeasureCodec measureCodec; - final Object[] measureValues; - final ByteBuffer measureBuf; - - public HCol(byte[] bFamily, byte[] bQualifier, String[] funcNames, String[] dataTypes) { - this.family = bFamily; - this.qualifier = bQualifier; - this.funcNames = funcNames; - this.dataTypes = dataTypes; - this.nMeasures = funcNames.length; - assert funcNames.length == dataTypes.length; - - this.measureCodec = new MeasureCodec(dataTypes); - this.measureValues = new Object[nMeasures]; - this.measureBuf = ByteBuffer.allocate(RowConstants.ROWVALUE_BUFFER_SIZE); - } - - @Override - public String toString() { - return "HCol [bFamily=" + Bytes.toString(family) + ", bQualifier=" + Bytes.toString(qualifier) + ", nMeasures=" + nMeasures + "]"; - } - } - -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowFilter.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowFilter.java deleted file mode 100644 index 3a90e97..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowFilter.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import java.util.Collection; -import java.util.Set; - -import org.apache.hadoop.hbase.util.Bytes; - -import com.google.common.collect.Sets; -import com.kylinolap.common.util.BytesUtil; -import com.kylinolap.cube.CubeSegment; -import com.kylinolap.cube.kv.RowKeyColumnIO; -import com.kylinolap.dict.Dictionary; -import com.kylinolap.metadata.model.realization.TblColRef; -import com.kylinolap.storage.filter.ColumnTupleFilter; -import com.kylinolap.storage.filter.CompareTupleFilter; -import com.kylinolap.storage.filter.ConstantTupleFilter; -import com.kylinolap.storage.filter.TupleFilter; -import com.kylinolap.storage.filter.TupleFilter.FilterOperatorEnum; -import com.kylinolap.storage.filter.TupleFilterSerializer; -import com.kylinolap.storage.filter.TupleFilterSerializer.Decorator; -import com.kylinolap.storage.tuple.ITuple; - -/** - * @author yangli9 - *

- * S for storage - */ -public class SRowFilter { - - public static SRowFilter fromFilter(final CubeSegment seg, TupleFilter rootFilter) { - // translate constants into dictionary IDs via a serialize copy - byte[] bytes = TupleFilterSerializer.serialize(rootFilter, new Decorator() { - RowKeyColumnIO columnIO = new RowKeyColumnIO(seg); - - @Override - public TupleFilter onSerialize(TupleFilter filter) { - if (filter == null) - return filter; - - if (filter.getOperator() == FilterOperatorEnum.NOT && TupleFilter.isEvaluableRecursively(filter) == false) - return ConstantTupleFilter.TRUE; - - if ((filter instanceof CompareTupleFilter) == false) - return filter; - - if (TupleFilter.isEvaluableRecursively(filter) == false) - return ConstantTupleFilter.TRUE; - - // extract ColumnFilter & ConstantFilter - CompareTupleFilter compf = (CompareTupleFilter) filter; - TblColRef col = compf.getColumn(); - if (col == null) { - return filter; - } - String nullString = nullString(col); - Collection constValues = compf.getValues(); - if (constValues == null || constValues.isEmpty()) { - compf.setNullString(nullString); // maybe ISNULL - return filter; - } - - TupleFilter result; - CompareTupleFilter newComp = new CompareTupleFilter(compf.getOperator()); - newComp.setNullString(nullString); - newComp.addChild(new ColumnTupleFilter(col)); - String v; - String firstValue = constValues.iterator().next(); - - // translate constant into rowkey ID - switch (newComp.getOperator()) { - case EQ: - case IN: - Set newValues = Sets.newHashSet(); - for (String value : constValues) { - v = translate(col, value, 0); - if (nullString.equals(v) == false) - newValues.add(v); - } - if (newValues.isEmpty()) { - result = ConstantTupleFilter.FALSE; - } else { - newComp.addChild(new ConstantTupleFilter(newValues)); - result = newComp; - } - break; - case NEQ: - v = translate(col, firstValue, 0); - if (nullString.equals(v)) { - result = ConstantTupleFilter.TRUE; - } else { - newComp.addChild(new ConstantTupleFilter(v)); - result = newComp; - } - break; - case LT: - v = translate(col, firstValue, 1); - if (nullString.equals(v)) { - result = ConstantTupleFilter.TRUE; - } else { - newComp.addChild(new ConstantTupleFilter(v)); - result = newComp; - } - break; - case LTE: - v = translate(col, firstValue, -1); - if (nullString.equals(v)) { - result = ConstantTupleFilter.FALSE; - } else { - newComp.addChild(new ConstantTupleFilter(v)); - result = newComp; - } - break; - case GT: - v = translate(col, firstValue, -1); - if (nullString.equals(v)) { - result = ConstantTupleFilter.TRUE; - } else { - newComp.addChild(new ConstantTupleFilter(v)); - result = newComp; - } - break; - case GTE: - v = translate(col, firstValue, 1); - if (nullString.equals(v)) { - result = ConstantTupleFilter.FALSE; - } else { - newComp.addChild(new ConstantTupleFilter(v)); - result = newComp; - } - break; - default: - throw new IllegalStateException("Cannot handle operator " + newComp.getOperator()); - } - return result; - } - - private String nullString(TblColRef column) { - byte[] id = new byte[columnIO.getColumnLength(column)]; - for (int i = 0; i < id.length; i++) { - id[i] = Dictionary.NULL; - } - return Dictionary.dictIdToString(id, 0, id.length); - } - - private String translate(TblColRef column, String v, int roundingFlag) { - byte[] value = Bytes.toBytes(v); - byte[] id = new byte[columnIO.getColumnLength(column)]; - columnIO.writeColumn(column, value, value.length, roundingFlag, Dictionary.NULL, id, 0); - return Dictionary.dictIdToString(id, 0, id.length); - } - - }); - TupleFilter copy = TupleFilterSerializer.deserialize(bytes); - return new SRowFilter(copy); - } - - public static byte[] serialize(SRowFilter o) { - return (o.filter == null) ? BytesUtil.EMPTY_BYTE_ARRAY : TupleFilterSerializer.serialize(o.filter); - } - - public static SRowFilter deserialize(byte[] filterBytes) { - TupleFilter filter = (filterBytes == null || filterBytes.length == 0) // - ? null // - : TupleFilterSerializer.deserialize(filterBytes); - return new SRowFilter(filter); - } - - // ============================================================================ - - public TupleFilter getFilter() { - return filter; - } - - private final TupleFilter filter; - - public SRowFilter(TupleFilter filter) { - this.filter = filter; - } - - public boolean evaluate(ITuple tuple) { - if (filter == null) - return true; - else - return filter.evaluate(tuple); - } - -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowProjector.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowProjector.java deleted file mode 100644 index e611cf4..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowProjector.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import java.nio.ByteBuffer; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import org.apache.hadoop.hbase.Cell; - -import com.kylinolap.common.util.BytesSerializer; -import com.kylinolap.common.util.BytesUtil; -import com.kylinolap.cube.CubeSegment; -import com.kylinolap.cube.cuboid.Cuboid; -import com.kylinolap.cube.kv.RowKeyEncoder; -import com.kylinolap.metadata.model.realization.TblColRef; - -/** - * @author yangli9 - */ -public class SRowProjector { - - public static SRowProjector fromColumns(final CubeSegment cubeSegment, final Cuboid cuboid, final Collection dimensionColumns) { - - RowKeyEncoder rowKeyMaskEncoder = new RowKeyEncoder(cubeSegment, cuboid) { - @Override - protected int fillHeader(byte[] bytes, byte[][] values) { - Arrays.fill(bytes, 0, this.headerLength, (byte) 0xff); - return this.headerLength; - } - - @Override - protected void fillColumnValue(TblColRef column, int columnLen, byte[] value, int valueLen, byte[] outputValue, int outputValueOffset) { - byte bits = dimensionColumns.contains(column) ? (byte) 0xff : 0x00; - Arrays.fill(outputValue, outputValueOffset, outputValueOffset + columnLen, bits); - } - }; - - byte[] mask = rowKeyMaskEncoder.encode(new byte[cuboid.getColumns().size()][]); - return new SRowProjector(mask); - } - - public static byte[] serialize(SRowProjector o) { - ByteBuffer buf = ByteBuffer.allocate(CoprocessorEnabler.SERIALIZE_BUFFER_SIZE); - serializer.serialize(o, buf); - byte[] result = new byte[buf.position()]; - System.arraycopy(buf.array(), 0, result, 0, buf.position()); - return result; - } - - public static SRowProjector deserialize(byte[] bytes) { - return serializer.deserialize(ByteBuffer.wrap(bytes)); - } - - private static final Serializer serializer = new Serializer(); - - private static class Serializer implements BytesSerializer { - - @Override - public void serialize(SRowProjector value, ByteBuffer out) { - BytesUtil.writeByteArray(value.groupByMask, out); - } - - @Override - public SRowProjector deserialize(ByteBuffer in) { - byte[] mask = BytesUtil.readByteArray(in); - return new SRowProjector(mask); - } - } - - // ============================================================================ - - final byte[] groupByMask; // mask out columns that are not needed (by group by) - final AggrKey aggrKey = new AggrKey(); - - public SRowProjector(byte[] groupByMask) { - this.groupByMask = groupByMask; - } - - public AggrKey getRowKey(List rowCells) { - int length = groupByMask.length; - Cell cell = rowCells.get(0); - assert length == cell.getRowLength(); - - aggrKey.set(cell.getRowArray(), cell.getRowOffset()); - return aggrKey; - } - - public class AggrKey implements Comparable { - byte[] data; - int offset; - - public byte[] get() { - return data; - } - - public int offset() { - return offset; - } - - public int length() { - return groupByMask.length; - } - - void set(byte[] data, int offset) { - this.data = data; - this.offset = offset; - } - - public AggrKey copy() { - AggrKey copy = new AggrKey(); - copy.set(new byte[length()], 0); - System.arraycopy(this.data, this.offset, copy.data, copy.offset, length()); - return copy; - } - - @Override - public int hashCode() { - int hash = 1; - for (int i = 0, j = offset, n = length(); i < n; i++, j++) { - if (groupByMask[i] != 0) - hash = (31 * hash) + (int) data[j]; - } - return hash; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - AggrKey other = (AggrKey) obj; - if (this.length() != other.length()) - return false; - - return compareTo(other) == 0; - } - - @Override - public int compareTo(AggrKey o) { - int comp = this.length() - o.length(); - if (comp != 0) - return comp; - - int n = this.length(); - for (int i = 0, j = offset, k = o.offset; i < n; i++, j++, k++) { - if (groupByMask[i] != 0) { - comp = BytesUtil.compareByteUnsigned(this.data[j], o.data[k]); - if (comp != 0) - return comp; - } - } - return 0; - } - } - -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowTuple.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowTuple.java deleted file mode 100644 index 0f8cccb..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowTuple.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import java.util.List; - -import org.apache.hadoop.hbase.io.ImmutableBytesWritable; - -import com.kylinolap.dict.Dictionary; -import com.kylinolap.metadata.model.realization.TblColRef; -import com.kylinolap.storage.tuple.ITuple; - -/** - * A special kind of tuple that exposes column value (dictionary ID) directly on - * top of row key. - * - * @author yangli9 - */ -public class SRowTuple implements ITuple { - - final SRowType type; - - ImmutableBytesWritable rowkey; - String[] values; - - public SRowTuple(SRowType type) { - this.type = type; - this.rowkey = new ImmutableBytesWritable(); - this.values = new String[type.getColumnCount()]; - } - - public void setUnderlying(byte[] array, int offset, int length) { - rowkey.set(array, offset, length); - for (int i = 0; i < values.length; i++) { - values[i] = null; - } - } - - @Override - public List getAllColumns() { - return type.columnsAsList; - } - - @Override - public Object[] getAllValues() { - int n = type.getColumnCount(); - for (int i = 0; i < n; i++) { - getValueAt(i); - } - return values; - } - - private String getValueAt(int i) { - int n = type.getColumnCount(); - if (i < 0 || i >= n) - return null; - - if (values[i] == null) { - values[i] = Dictionary.dictIdToString(rowkey.get(), rowkey.getOffset() + type.columnOffsets[i], type.columnSizes[i]); - } - - return values[i]; - } - - - @Override - public Object getValue(TblColRef col) { - int i = type.getColIndexByTblColRef(col); - return getValueAt(i); - } - - @Override - public List getAllFields() { - throw new UnsupportedOperationException(); - } - - @Override - public Object getValue(String field) { - throw new UnsupportedOperationException(); - } - -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowType.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowType.java deleted file mode 100644 index 749ff14..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/SRowType.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import java.nio.ByteBuffer; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; - -import com.google.common.collect.Maps; -import com.kylinolap.common.util.BytesSerializer; -import com.kylinolap.common.util.BytesUtil; -import com.kylinolap.cube.CubeSegment; -import com.kylinolap.cube.cuboid.Cuboid; -import com.kylinolap.cube.kv.RowConstants; -import com.kylinolap.cube.kv.RowKeyColumnIO; -import com.kylinolap.metadata.model.ColumnDesc; -import com.kylinolap.metadata.model.TableDesc; -import com.kylinolap.metadata.model.realization.TblColRef; - -/** - * @author yangli9 - */ -public class SRowType { - - public static SRowType fromCuboid(CubeSegment seg, Cuboid cuboid) { - List colList = cuboid.getColumns(); - TblColRef[] cols = colList.toArray(new TblColRef[colList.size()]); - RowKeyColumnIO colIO = new RowKeyColumnIO(seg); - int[] colSizes = new int[cols.length]; - for (int i = 0; i < cols.length; i++) { - colSizes[i] = colIO.getColumnLength(cols[i]); - } - return new SRowType(cols, colSizes); - } - - public static byte[] serialize(SRowType o) { - ByteBuffer buf = ByteBuffer.allocate(CoprocessorEnabler.SERIALIZE_BUFFER_SIZE); - serializer.serialize(o, buf); - byte[] result = new byte[buf.position()]; - System.arraycopy(buf.array(), 0, result, 0, buf.position()); - return result; - } - - public static SRowType deserialize(byte[] bytes) { - return serializer.deserialize(ByteBuffer.wrap(bytes)); - } - - private static final Serializer serializer = new Serializer(); - - private static class Serializer implements BytesSerializer { - - @Override - public void serialize(SRowType o, ByteBuffer out) { - int n = o.columns.length; - BytesUtil.writeVInt(o.columns.length, out); - for (int i = 0; i < n; i++) { - BytesUtil.writeAsciiString(o.columns[i].getTable(), out); - BytesUtil.writeAsciiString(o.columns[i].getName(), out); - BytesUtil.writeVInt(o.columnSizes[i], out); - } - } - - @Override - public SRowType deserialize(ByteBuffer in) { - int n = BytesUtil.readVInt(in); - TblColRef[] cols = new TblColRef[n]; - int[] colSizes = new int[n]; - for (int i = 0; i < n; i++) { - String tableName = BytesUtil.readAsciiString(in); - String colName = BytesUtil.readAsciiString(in); - TableDesc table = new TableDesc(); - table.setName(tableName); - ColumnDesc col = new ColumnDesc(); - col.setTable(table); - col.setName(colName); - cols[i] = new TblColRef(col); - - int colSize = BytesUtil.readVInt(in); - colSizes[i] = colSize; - } - return new SRowType(cols, colSizes); - } - } - - // ============================================================================ - - TblColRef[] columns; - int[] columnSizes; - - int[] columnOffsets; - List columnsAsList; - HashMap columnIdxMap; - - public SRowType(TblColRef[] columns, int[] columnSizes) { - this.columns = columns; - this.columnSizes = columnSizes; - init(); - } - - public int getColIndexByTblColRef(TblColRef colRef) { - return columnIdxMap.get(colRef); - } - - private void init() { - int[] offsets = new int[columns.length]; - int o = RowConstants.ROWKEY_CUBOIDID_LEN; - for (int i = 0; i < columns.length; i++) { - offsets[i] = o; - o += columnSizes[i]; - } - this.columnOffsets = offsets; - - this.columnsAsList = Arrays.asList(columns); - - HashMap map = Maps.newHashMap(); - for (int i = 0; i < columns.length; i++) { - map.put(columns[i], i); - } - this.columnIdxMap = map; - } - - public int getColumnCount() { - return columns.length; - } - -} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserverTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserverTest.java index 3628b85..8415b4d 100644 --- a/storage/src/test/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserverTest.java +++ b/storage/src/test/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserverTest.java @@ -1,343 +1,338 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import static org.junit.Assert.*; - -import java.io.IOException; -import java.math.BigDecimal; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; - -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.HConstants; -import org.apache.hadoop.hbase.HRegionInfo; -import org.apache.hadoop.hbase.KeyValue; -import org.apache.hadoop.hbase.KeyValue.Type; -import org.apache.hadoop.hbase.regionserver.RegionScanner; -import org.apache.hadoop.hbase.util.Bytes; -import org.apache.hadoop.io.LongWritable; -import org.junit.Before; -import org.junit.Test; - -import com.google.common.collect.Lists; -import com.kylinolap.cube.kv.RowConstants; -import com.kylinolap.metadata.model.ColumnDesc; -import com.kylinolap.metadata.model.TableDesc; -import com.kylinolap.metadata.model.realization.TblColRef; -import com.kylinolap.storage.hbase.observer.AggregationScanner; -import com.kylinolap.storage.hbase.observer.SRowAggregators; -import com.kylinolap.storage.hbase.observer.SRowFilter; -import com.kylinolap.storage.hbase.observer.SRowProjector; -import com.kylinolap.storage.hbase.observer.SRowType; -import com.kylinolap.storage.hbase.observer.SRowAggregators.HCol; - -/** - * @author yangli9 - */ -public class AggregateRegionObserverTest { - ByteBuffer buf = ByteBuffer.allocate(RowConstants.ROWVALUE_BUFFER_SIZE); - - byte[] mask = new byte[] { (byte) 0xff, (byte) 0xff, 0, 0 }; - byte[] k1 = new byte[] { 0x01, 0x01, 0, 0x01 }; - byte[] k2 = new byte[] { 0x01, 0x01, 0, 0x02 }; - byte[] k3 = new byte[] { 0x02, 0x02, 0, 0x03 }; - byte[] k4 = new byte[] { 0x02, 0x02, 0, 0x04 }; - - ArrayList cellsInput = Lists.newArrayList(); - - byte[] family = Bytes.toBytes("f"); - byte[] q1 = Bytes.toBytes("q1"); - byte[] q2 = Bytes.toBytes("q2"); - - HCol c1 = new HCol(family, q1, new String[] { "SUM", "COUNT" }, new String[] { "decimal", "long" }); - HCol c2 = new HCol(family, q2, new String[] { "SUM" }, new String[] { "decimal" }); - - @Before - public void setup() { - cellsInput.add(newCell(k1, c1, "10.5", 1)); - cellsInput.add(newCell(k2, c1, "11.5", 2)); - cellsInput.add(newCell(k3, c1, "12.5", 3)); - cellsInput.add(newCell(k4, c1, "13.5", 4)); - - cellsInput.add(newCell(k1, c2, "21.5")); - cellsInput.add(newCell(k2, c2, "22.5")); - cellsInput.add(newCell(k3, c2, "23.5")); - cellsInput.add(newCell(k4, c2, "24.5")); - - } - - private Cell newCell(byte[] key, HCol col, String decimal) { - return newCell(key, col, decimal, Integer.MIN_VALUE); - } - - private Cell newCell(byte[] key, HCol col, String decimal, int number) { - Object[] values = number == Integer.MIN_VALUE ? // - new Object[] { new BigDecimal(decimal) } // - : new Object[] { new BigDecimal(decimal), new LongWritable(number) }; - buf.clear(); - col.measureCodec.encode(values, buf); - - Cell keyValue = new KeyValue(key, 0, key.length, // - col.family, 0, col.family.length, // - col.qualifier, 0, col.qualifier.length, // - HConstants.LATEST_TIMESTAMP, Type.Put, // - buf.array(), 0, buf.position()); - - return keyValue; - } - - @Test - public void test() throws IOException { - - SRowType rowType = newRowType(); - SRowProjector projector = new SRowProjector(mask); - SRowAggregators aggregators = new SRowAggregators(new HCol[] { c1, c2 }); - SRowFilter filter = SRowFilter.deserialize(null); // a default, - // always-true, - // filter - HashSet expectedResult = new HashSet(); - - expectedResult.add("\\x02\\x02\\x00\\x00, f:q1, [26.0, 7]"); - expectedResult.add("\\x02\\x02\\x00\\x00, f:q2, [48.0]"); - expectedResult.add("\\x01\\x01\\x00\\x00, f:q1, [22.0, 3]"); - expectedResult.add("\\x01\\x01\\x00\\x00, f:q2, [44.0]"); - - MockupRegionScanner innerScanner = new MockupRegionScanner(cellsInput); - - RegionScanner aggrScanner = new AggregationScanner(rowType, filter, projector, aggregators, innerScanner); - ArrayList result = Lists.newArrayList(); - boolean hasMore = true; - while (hasMore) { - result.clear(); - hasMore = aggrScanner.next(result); - if (result.isEmpty()) - continue; - - Cell cell = result.get(0); - HCol hcol = null; - if (SRowAggregators.match(c1, cell)) { - hcol = c1; - } else if (SRowAggregators.match(c2, cell)) { - hcol = c2; - } else - fail(); - - hcol.measureCodec.decode(ByteBuffer.wrap(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()), hcol.measureValues); - - String rowKey = toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(), mask); - String col = Bytes.toString(hcol.family) + ":" + Bytes.toString(hcol.qualifier); - String values = Arrays.toString(hcol.measureValues); - - System.out.println(rowKey); - System.out.println(col); - System.out.println(values); - - assertTrue(expectedResult.contains(rowKey + ", " + col + ", " + values)); - } - aggrScanner.close(); - } - - @Test - public void testNoMeasure() throws IOException { - - SRowType rowType = newRowType(); - SRowProjector projector = new SRowProjector(mask); - SRowAggregators aggregators = new SRowAggregators(new HCol[] {}); - SRowFilter filter = SRowFilter.deserialize(null); // a default, - // always-true, - // filter - HashSet expectedResult = new HashSet(); - - expectedResult.add("\\x02\\x02\\x00\\x00"); - expectedResult.add("\\x01\\x01\\x00\\x00"); - - MockupRegionScanner innerScanner = new MockupRegionScanner(cellsInput); - - RegionScanner aggrScanner = new AggregationScanner(rowType, filter, projector, aggregators, innerScanner); - ArrayList result = Lists.newArrayList(); - boolean hasMore = true; - while (hasMore) { - result.clear(); - hasMore = aggrScanner.next(result); - if (result.isEmpty()) - continue; - - Cell cell = result.get(0); - - String rowKey = toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(), mask); - - assertTrue(expectedResult.contains(rowKey)); - } - aggrScanner.close(); - } - - private String toString(byte[] array, int offset, short length, byte[] mask) { - StringBuilder result = new StringBuilder(); - for (int i = 0; i < length; i++) { - int ch = array[offset + i] & 0xFF & mask[i]; - result.append(String.format("\\x%02X", ch)); - } - return result.toString(); - } - - private SRowType newRowType() { - TableDesc t = new TableDesc(); - t.setName("TABLE"); - TblColRef[] cols = new TblColRef[] { newCol("A", t), newCol("B", t), newCol("C", t), newCol("D", t) }; - int[] sizes = new int[] { 1, 1, 1, 1 }; - return new SRowType(cols, sizes); - } - - private TblColRef newCol(String name, TableDesc t) { - ColumnDesc col = new ColumnDesc(); - col.setName(name); - col.setTable(t); - return new TblColRef(col); - } - - public static class MockupRegionScanner implements RegionScanner { - List input; - int i = 0; - - public MockupRegionScanner(List cellInputs) { - this.input = cellInputs; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.hadoop.hbase.regionserver.InternalScanner#next(java.util - * .List) - */ - @Override - public boolean next(List results) throws IOException { - return nextRaw(results); - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.hadoop.hbase.regionserver.InternalScanner#next(java.util - * .List, int) - */ - @Override - public boolean next(List result, int limit) throws IOException { - return next(result); - } - - /* - * (non-Javadoc) - * - * @see org.apache.hadoop.hbase.regionserver.InternalScanner#close() - */ - @Override - public void close() throws IOException { - - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.hadoop.hbase.regionserver.RegionScanner#getRegionInfo() - */ - @Override - public HRegionInfo getRegionInfo() { - return null; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.hadoop.hbase.regionserver.RegionScanner#isFilterDone() - */ - @Override - public boolean isFilterDone() throws IOException { - return false; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.hadoop.hbase.regionserver.RegionScanner#reseek(byte[]) - */ - @Override - public boolean reseek(byte[] row) throws IOException { - return false; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.hadoop.hbase.regionserver.RegionScanner#getMaxResultSize() - */ - @Override - public long getMaxResultSize() { - return 0; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.hadoop.hbase.regionserver.RegionScanner#getMvccReadPoint() - */ - @Override - public long getMvccReadPoint() { - return 0; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.hadoop.hbase.regionserver.RegionScanner#nextRaw(java.util - * .List) - */ - @Override - public boolean nextRaw(List result) throws IOException { - if (i < input.size()) { - result.add(input.get(i)); - i++; - } - return i < input.size(); - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.hadoop.hbase.regionserver.RegionScanner#nextRaw(java.util - * .List, int) - */ - @Override - public boolean nextRaw(List result, int limit) throws IOException { - return nextRaw(result); - } - - } - -} +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.observer; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.math.BigDecimal; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; + +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.HRegionInfo; +import org.apache.hadoop.hbase.KeyValue; +import org.apache.hadoop.hbase.KeyValue.Type; +import org.apache.hadoop.hbase.regionserver.RegionScanner; +import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.io.LongWritable; +import org.junit.Before; +import org.junit.Test; + +import com.google.common.collect.Lists; +import com.kylinolap.cube.kv.RowConstants; +import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.schema.ColumnDesc; +import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.storage.hbase.observer.ObserverAggregators.HCol; + +/** + * @author yangli9 + */ +public class AggregateRegionObserverTest { + ByteBuffer buf = ByteBuffer.allocate(RowConstants.ROWVALUE_BUFFER_SIZE); + + byte[] mask = new byte[] { (byte) 0xff, (byte) 0xff, 0, 0 }; + byte[] k1 = new byte[] { 0x01, 0x01, 0, 0x01 }; + byte[] k2 = new byte[] { 0x01, 0x01, 0, 0x02 }; + byte[] k3 = new byte[] { 0x02, 0x02, 0, 0x03 }; + byte[] k4 = new byte[] { 0x02, 0x02, 0, 0x04 }; + + ArrayList cellsInput = Lists.newArrayList(); + + byte[] family = Bytes.toBytes("f"); + byte[] q1 = Bytes.toBytes("q1"); + byte[] q2 = Bytes.toBytes("q2"); + + HCol c1 = new HCol(family, q1, new String[] { "SUM", "COUNT" }, new String[] { "decimal", "long" }); + HCol c2 = new HCol(family, q2, new String[] { "SUM" }, new String[] { "decimal" }); + + @Before + public void setup() { + cellsInput.add(newCell(k1, c1, "10.5", 1)); + cellsInput.add(newCell(k2, c1, "11.5", 2)); + cellsInput.add(newCell(k3, c1, "12.5", 3)); + cellsInput.add(newCell(k4, c1, "13.5", 4)); + + cellsInput.add(newCell(k1, c2, "21.5")); + cellsInput.add(newCell(k2, c2, "22.5")); + cellsInput.add(newCell(k3, c2, "23.5")); + cellsInput.add(newCell(k4, c2, "24.5")); + + } + + private Cell newCell(byte[] key, HCol col, String decimal) { + return newCell(key, col, decimal, Integer.MIN_VALUE); + } + + private Cell newCell(byte[] key, HCol col, String decimal, int number) { + Object[] values = number == Integer.MIN_VALUE ? // + new Object[] { new BigDecimal(decimal) } // + : new Object[] { new BigDecimal(decimal), new LongWritable(number) }; + buf.clear(); + col.measureCodec.encode(values, buf); + + Cell keyValue = new KeyValue(key, 0, key.length, // + col.family, 0, col.family.length, // + col.qualifier, 0, col.qualifier.length, // + HConstants.LATEST_TIMESTAMP, Type.Put, // + buf.array(), 0, buf.position()); + + return keyValue; + } + + @Test + public void test() throws IOException { + + ObserverRowType rowType = newRowType(); + ObserverProjector projector = new ObserverProjector(mask); + ObserverAggregators aggregators = new ObserverAggregators(new HCol[] { c1, c2 }); + ObserverFilter filter = ObserverFilter.deserialize(null); // a default, + // always-true, + // filter + HashSet expectedResult = new HashSet(); + + expectedResult.add("\\x02\\x02\\x00\\x00, f:q1, [26.0, 7]"); + expectedResult.add("\\x02\\x02\\x00\\x00, f:q2, [48.0]"); + expectedResult.add("\\x01\\x01\\x00\\x00, f:q1, [22.0, 3]"); + expectedResult.add("\\x01\\x01\\x00\\x00, f:q2, [44.0]"); + + MockupRegionScanner innerScanner = new MockupRegionScanner(cellsInput); + + RegionScanner aggrScanner = new AggregationScanner(rowType, filter, projector, aggregators, innerScanner); + ArrayList result = Lists.newArrayList(); + boolean hasMore = true; + while (hasMore) { + result.clear(); + hasMore = aggrScanner.next(result); + if (result.isEmpty()) + continue; + + Cell cell = result.get(0); + HCol hcol = null; + if (ObserverAggregators.match(c1, cell)) { + hcol = c1; + } else if (ObserverAggregators.match(c2, cell)) { + hcol = c2; + } else + fail(); + + hcol.measureCodec.decode(ByteBuffer.wrap(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()), hcol.measureValues); + + String rowKey = toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(), mask); + String col = Bytes.toString(hcol.family) + ":" + Bytes.toString(hcol.qualifier); + String values = Arrays.toString(hcol.measureValues); + + System.out.println(rowKey); + System.out.println(col); + System.out.println(values); + + assertTrue(expectedResult.contains(rowKey + ", " + col + ", " + values)); + } + aggrScanner.close(); + } + + @Test + public void testNoMeasure() throws IOException { + + ObserverRowType rowType = newRowType(); + ObserverProjector projector = new ObserverProjector(mask); + ObserverAggregators aggregators = new ObserverAggregators(new HCol[] {}); + ObserverFilter filter = ObserverFilter.deserialize(null); // a default, + // always-true, + // filter + HashSet expectedResult = new HashSet(); + + expectedResult.add("\\x02\\x02\\x00\\x00"); + expectedResult.add("\\x01\\x01\\x00\\x00"); + + MockupRegionScanner innerScanner = new MockupRegionScanner(cellsInput); + + RegionScanner aggrScanner = new AggregationScanner(rowType, filter, projector, aggregators, innerScanner); + ArrayList result = Lists.newArrayList(); + boolean hasMore = true; + while (hasMore) { + result.clear(); + hasMore = aggrScanner.next(result); + if (result.isEmpty()) + continue; + + Cell cell = result.get(0); + + String rowKey = toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(), mask); + + assertTrue(expectedResult.contains(rowKey)); + } + aggrScanner.close(); + } + + private String toString(byte[] array, int offset, short length, byte[] mask) { + StringBuilder result = new StringBuilder(); + for (int i = 0; i < length; i++) { + int ch = array[offset + i] & 0xFF & mask[i]; + result.append(String.format("\\x%02X", ch)); + } + return result.toString(); + } + + private ObserverRowType newRowType() { + TableDesc t = new TableDesc(); + t.setName("TABLE"); + TblColRef[] cols = new TblColRef[] { newCol("A", t), newCol("B", t), newCol("C", t), newCol("D", t) }; + int[] sizes = new int[] { 1, 1, 1, 1 }; + return new ObserverRowType(cols, sizes); + } + + private TblColRef newCol(String name, TableDesc t) { + ColumnDesc col = new ColumnDesc(); + col.setName(name); + col.setTable(t); + return new TblColRef(col); + } + + public static class MockupRegionScanner implements RegionScanner { + List input; + int i = 0; + + public MockupRegionScanner(List cellInputs) { + this.input = cellInputs; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.hbase.regionserver.InternalScanner#next(java.util + * .List) + */ + @Override + public boolean next(List results) throws IOException { + return nextRaw(results); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.hbase.regionserver.InternalScanner#next(java.util + * .List, int) + */ + @Override + public boolean next(List result, int limit) throws IOException { + return next(result); + } + + /* + * (non-Javadoc) + * + * @see org.apache.hadoop.hbase.regionserver.InternalScanner#close() + */ + @Override + public void close() throws IOException { + + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.hbase.regionserver.RegionScanner#getRegionInfo() + */ + @Override + public HRegionInfo getRegionInfo() { + return null; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.hbase.regionserver.RegionScanner#isFilterDone() + */ + @Override + public boolean isFilterDone() throws IOException { + return false; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.hbase.regionserver.RegionScanner#reseek(byte[]) + */ + @Override + public boolean reseek(byte[] row) throws IOException { + return false; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.hbase.regionserver.RegionScanner#getMaxResultSize() + */ + @Override + public long getMaxResultSize() { + return 0; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.hbase.regionserver.RegionScanner#getMvccReadPoint() + */ + @Override + public long getMvccReadPoint() { + return 0; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.hbase.regionserver.RegionScanner#nextRaw(java.util + * .List) + */ + @Override + public boolean nextRaw(List result) throws IOException { + if (i < input.size()) { + result.add(input.get(i)); + i++; + } + return i < input.size(); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.hbase.regionserver.RegionScanner#nextRaw(java.util + * .List, int) + */ + @Override + public boolean nextRaw(List result, int limit) throws IOException { + return nextRaw(result); + } + + } + +} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowAggregatorsTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowAggregatorsTest.java index 3ce39ac..33cb98b 100644 --- a/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowAggregatorsTest.java +++ b/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowAggregatorsTest.java @@ -23,8 +23,7 @@ import org.apache.hadoop.hbase.util.Bytes; import org.junit.Test; -import com.kylinolap.storage.hbase.observer.SRowAggregators; -import com.kylinolap.storage.hbase.observer.SRowAggregators.HCol; +import com.kylinolap.storage.hbase.observer.ObserverAggregators.HCol; /** * @author yangli9 @@ -37,10 +36,10 @@ public void testSerialize() { HCol[] hcols = new HCol[] { // newHCol("f", "c1", new String[] { "SUM", "COUNT" }, new String[] { "decimal", "long" }), // newHCol("f", "c2", new String[] { "SUM", "SUM" }, new String[] { "long", "long" }) }; - SRowAggregators sample = new SRowAggregators(hcols); + ObserverAggregators sample = new ObserverAggregators(hcols); - byte[] bytes = SRowAggregators.serialize(sample); - SRowAggregators copy = SRowAggregators.deserialize(bytes); + byte[] bytes = ObserverAggregators.serialize(sample); + ObserverAggregators copy = ObserverAggregators.deserialize(bytes); assertTrue(sample.nHCols == copy.nHCols); assertTrue(sample.nTotalMeasures == copy.nTotalMeasures); diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowProjectorTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowProjectorTest.java index d79daad..a1a8f1f 100644 --- a/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowProjectorTest.java +++ b/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowProjectorTest.java @@ -28,8 +28,7 @@ import org.junit.Test; import com.google.common.collect.Lists; -import com.kylinolap.storage.hbase.observer.SRowProjector; -import com.kylinolap.storage.hbase.observer.SRowProjector.AggrKey; +import com.kylinolap.storage.hbase.observer.ObserverProjector.AggrKey; /** * @author yangli9 @@ -38,13 +37,13 @@ public class RowProjectorTest { byte[] mask = new byte[] { (byte) 0xff, 0x00, 0x00, (byte) 0xff }; - SRowProjector sample = new SRowProjector(mask); + ObserverProjector sample = new ObserverProjector(mask); @Test public void testSerialize() { - byte[] bytes = SRowProjector.serialize(sample); - SRowProjector copy = SRowProjector.deserialize(bytes); + byte[] bytes = ObserverProjector.serialize(sample); + ObserverProjector copy = ObserverProjector.deserialize(bytes); assertTrue(Arrays.equals(sample.groupByMask, copy.groupByMask)); } diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowTypeTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowTypeTest.java index e8f30c2..927fdde 100644 --- a/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowTypeTest.java +++ b/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowTypeTest.java @@ -29,7 +29,6 @@ import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.storage.hbase.observer.SRowType; /** * @author yangli9 @@ -55,9 +54,9 @@ public void testSerialize() { long baseCuboidId = Cuboid.getBaseCuboidId(cubeDesc); Cuboid cuboid = Cuboid.findById(cubeDesc, baseCuboidId); - SRowType rowType = SRowType.fromCuboid(cube.getLatestReadySegment(), cuboid); - byte[] bytes = SRowType.serialize(rowType); - SRowType copy = SRowType.deserialize(bytes); + ObserverRowType rowType = ObserverRowType.fromCuboid(cube.getLatestReadySegment(), cuboid); + byte[] bytes = ObserverRowType.serialize(rowType); + ObserverRowType copy = ObserverRowType.deserialize(bytes); assertTrue(Arrays.equals(rowType.columns, copy.columns)); assertTrue(Arrays.equals(rowType.columnSizes, copy.columnSizes)); From 18e28ea0427e2d9978c38d80f68107bd531c05d0 Mon Sep 17 00:00:00 2001 From: honma Date: Wed, 26 Nov 2014 14:27:58 +0800 Subject: [PATCH 21/65] refactor: add coprocessor package --- .../kylinolap/job/tools/DeployCoprocessorCLI.java | 2 +- .../kylinolap/job/coprocessor/IIEndpointTest.java | 12 +- .../com/kylinolap/query/test/CombinationTest.java | 7 +- .../com/kylinolap/query/test/KylinQueryTest.java | 2 +- .../kylinolap/rest/controller/CubeController.java | 6 +- .../hbase/ConcurrentHBaseTupleIterator.java | 4 +- .../storage/hbase/CubeSegmentTupleIterator.java | 4 +- .../storage/hbase/HBaseStorageEngine.java | 4 +- .../hbase/coprocessor/CoprocessorConstants.java | 8 + .../hbase/coprocessor/CoprocessorFilter.java | 201 +++ .../coprocessor/endpoint/EndpointRowType.java | 142 ++ .../endpoint/HbaseServerKVIterator.java | 81 + .../hbase/coprocessor/endpoint/IIEndpoint.java | 137 ++ .../coprocessor/endpoint/IIResponseAdapter.java | 7 + .../coprocessor/endpoint/SliceBitMapProvider.java | 38 + .../endpoint/example/ExampleEndpoint.java | 146 ++ .../endpoint/example/generated/ExampleProtos.java | 1150 ++++++++++++++ .../endpoint/example/generated/NodeProtos.java | 940 ++++++++++++ .../coprocessor/endpoint/generated/IIProtos.java | 1623 ++++++++++++++++++++ .../hbase/coprocessor/endpoint/protobuf/II.proto | 26 + .../hbase/coprocessor/endpoint/protobuf/Node.proto | 28 + .../coprocessor/endpoint/protobuf/example.proto | 37 + .../observer/AggregateRegionObserver.java | 97 ++ .../coprocessor/observer/AggregationCache.java | 194 +++ .../coprocessor/observer/AggregationScanner.java | 158 ++ .../coprocessor/observer/ObserverAggregators.java | 260 ++++ .../coprocessor/observer/ObserverEnabler.java | 173 +++ .../coprocessor/observer/ObserverProjector.java | 176 +++ .../coprocessor/observer/ObserverRowType.java | 142 ++ .../hbase/coprocessor/observer/ObserverTuple.java | 96 ++ .../hbase/endpoint/HbaseServerKVIterator.java | 81 - .../storage/hbase/endpoint/IIEndpoint.java | 137 -- .../storage/hbase/endpoint/IIResponseAdapter.java | 7 - .../hbase/endpoint/SliceBitMapProvider.java | 38 - .../hbase/endpoint/example/ExampleEndpoint.java | 146 -- .../endpoint/example/generated/ExampleProtos.java | 1148 -------------- .../endpoint/example/generated/NodeProtos.java | 938 ----------- .../storage/hbase/endpoint/generated/IIProtos.java | 1621 ------------------- .../hbase/observer/AggregateRegionObserver.java | 96 -- .../storage/hbase/observer/AggregationCache.java | 195 --- .../storage/hbase/observer/AggregationScanner.java | 158 -- .../storage/hbase/observer/CoprocessorEnabler.java | 173 --- .../hbase/observer/ObserverAggregators.java | 259 ---- .../storage/hbase/observer/ObserverFilter.java | 201 --- .../storage/hbase/observer/ObserverProjector.java | 175 --- .../storage/hbase/observer/ObserverRowType.java | 141 -- .../storage/hbase/observer/ObserverTuple.java | 96 -- .../com/kylinolap/storage/hbase/protobuf/II.proto | 26 - .../kylinolap/storage/hbase/protobuf/Node.proto | 28 - .../kylinolap/storage/hbase/protobuf/example.proto | 37 - .../storage/hbase/InvertedIndexHBaseTest.java | 8 - .../coprocessor/endpoint/ExampleEndpointTest.java | 97 ++ .../hbase/coprocessor/endpoint/ProtobufTest.java | 41 + .../observer/AggregateRegionObserverTest.java | 338 ++++ .../coprocessor/observer/RowAggregatorsTest.java | 63 + .../coprocessor/observer/RowProjectorTest.java | 88 ++ .../hbase/coprocessor/observer/RowTypeTest.java | 65 + .../hbase/endpoint/ExampleEndpointTest.java | 97 -- .../storage/hbase/endpoint/ProtobufTest.java | 41 - .../observer/AggregateRegionObserverTest.java | 338 ---- .../storage/hbase/observer/RowAggregatorsTest.java | 62 - .../storage/hbase/observer/RowProjectorTest.java | 87 -- .../storage/hbase/observer/RowTypeTest.java | 64 - 63 files changed, 6572 insertions(+), 6419 deletions(-) create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorConstants.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorFilter.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointRowType.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/HbaseServerKVIterator.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/IIEndpoint.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/IIResponseAdapter.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/SliceBitMapProvider.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/example/ExampleEndpoint.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/example/generated/ExampleProtos.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/example/generated/NodeProtos.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/generated/IIProtos.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/protobuf/II.proto create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/protobuf/Node.proto create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/protobuf/example.proto create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserver.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationCache.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationScanner.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverAggregators.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverEnabler.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverProjector.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverRowType.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverTuple.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/endpoint/HbaseServerKVIterator.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIResponseAdapter.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/endpoint/SliceBitMapProvider.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/ExampleEndpoint.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/generated/ExampleProtos.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/generated/NodeProtos.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/endpoint/generated/IIProtos.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserver.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregationCache.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregationScanner.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/CoprocessorEnabler.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverAggregators.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverFilter.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverProjector.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverRowType.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverTuple.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/protobuf/II.proto delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/protobuf/Node.proto delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/protobuf/example.proto create mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/ExampleEndpointTest.java create mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/ProtobufTest.java create mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserverTest.java create mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowAggregatorsTest.java create mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowProjectorTest.java create mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowTypeTest.java delete mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/endpoint/ExampleEndpointTest.java delete mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/endpoint/ProtobufTest.java delete mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserverTest.java delete mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/observer/RowAggregatorsTest.java delete mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/observer/RowProjectorTest.java delete mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/observer/RowTypeTest.java diff --git a/job/src/main/java/com/kylinolap/job/tools/DeployCoprocessorCLI.java b/job/src/main/java/com/kylinolap/job/tools/DeployCoprocessorCLI.java index 5721d67..d84b4fc 100644 --- a/job/src/main/java/com/kylinolap/job/tools/DeployCoprocessorCLI.java +++ b/job/src/main/java/com/kylinolap/job/tools/DeployCoprocessorCLI.java @@ -57,7 +57,7 @@ private static final Logger logger = LoggerFactory.getLogger(DeployCoprocessorCLI.class); - public static final String AGGR_COPROCESSOR_CLS_NAME = "com.kylinolap.storage.hbase.observer.AggregateRegionObserver"; + public static final String AGGR_COPROCESSOR_CLS_NAME = "com.kylinolap.storage.hbase.coprocessor.observer.AggregateRegionObserver"; public static void main(String[] args) throws IOException { KylinConfig kylinConfig = KylinConfig.getInstanceFromEnv(); diff --git a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java index 0d8b55a..a97e1b0 100644 --- a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java +++ b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java @@ -21,10 +21,10 @@ import com.kylinolap.storage.filter.CompareTupleFilter; import com.kylinolap.storage.filter.ConstantTupleFilter; import com.kylinolap.storage.filter.TupleFilter; -import com.kylinolap.storage.hbase.endpoint.IIEndpoint; -import com.kylinolap.storage.hbase.endpoint.generated.IIProtos; -import com.kylinolap.storage.hbase.observer.ObserverFilter; -import com.kylinolap.storage.hbase.observer.ObserverRowType; +import com.kylinolap.storage.hbase.coprocessor.endpoint.IIEndpoint; +import com.kylinolap.storage.hbase.coprocessor.endpoint.generated.IIProtos; +import com.kylinolap.storage.hbase.coprocessor.CoprocessorFilter; +import com.kylinolap.storage.hbase.coprocessor.observer.ObserverRowType; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.*; @@ -140,7 +140,7 @@ public static void tearDownAfterClass() throws Exception { long baseCuboidId = Cuboid.getBaseCuboidId(this.cube.getDescriptor()); ObserverRowType type = ObserverRowType.fromCuboid(this.seg, Cuboid.findById(cube.getDescriptor(), baseCuboidId)); - ObserverFilter filter = ObserverFilter.fromFilter(this.seg, rootFilter); + CoprocessorFilter filter = CoprocessorFilter.fromFilter(this.seg, rootFilter); //SRowProjector projector = SRowProjector.fromColumns(segment, cuboid, groupBy); //SRowAggregators aggrs = SRowAggregators.fromValueDecoders(rowValueDecoders); @@ -150,7 +150,7 @@ public static void tearDownAfterClass() throws Exception { IIProtos.IIRequest request = IIProtos.IIRequest.newBuilder(). setTableInfo(ByteString.copyFrom(TableRecordInfoDigest.serialize(recordInfo))). setSRowType(ByteString.copyFrom(ObserverRowType.serialize(type))). - setSRowFilter(ByteString.copyFrom(ObserverFilter.serialize(filter))). + setSRowFilter(ByteString.copyFrom(CoprocessorFilter.serialize(filter))). build(); return request; diff --git a/query/src/test/java/com/kylinolap/query/test/CombinationTest.java b/query/src/test/java/com/kylinolap/query/test/CombinationTest.java index 988ff51..d94f0f4 100644 --- a/query/src/test/java/com/kylinolap/query/test/CombinationTest.java +++ b/query/src/test/java/com/kylinolap/query/test/CombinationTest.java @@ -4,13 +4,12 @@ import java.util.Arrays; import java.util.Collection; +import com.kylinolap.storage.hbase.coprocessor.observer.ObserverEnabler; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import com.kylinolap.storage.hbase.observer.CoprocessorEnabler; - /** * Created by honma on 7/2/14. */ @@ -45,9 +44,9 @@ public CombinationTest(String joinType, String coprocessorToggle) throws Excepti KylinQueryTest.preferCubeOf(joinType); if (coprocessorToggle.equals("on")) { - CoprocessorEnabler.forceCoprocessorOn(); + ObserverEnabler.forceCoprocessorOn(); } else if (coprocessorToggle.equals("off")) { - CoprocessorEnabler.forceCoprocessorOff(); + ObserverEnabler.forceCoprocessorOff(); } else if (coprocessorToggle.equals("unset")) { // unset } diff --git a/query/src/test/java/com/kylinolap/query/test/KylinQueryTest.java b/query/src/test/java/com/kylinolap/query/test/KylinQueryTest.java index 237e593..729dbb1 100644 --- a/query/src/test/java/com/kylinolap/query/test/KylinQueryTest.java +++ b/query/src/test/java/com/kylinolap/query/test/KylinQueryTest.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.Properties; +import com.kylinolap.storage.hbase.coprocessor.observer.ObserverEnabler; import org.apache.commons.lang3.StringUtils; import org.dbunit.database.DatabaseConnection; import org.dbunit.database.IDatabaseConnection; @@ -38,7 +39,6 @@ import com.kylinolap.query.enumerator.OLAPQuery; import com.kylinolap.query.relnode.OLAPContext; import com.kylinolap.query.schema.OLAPSchemaFactory; -import com.kylinolap.storage.hbase.observer.CoprocessorEnabler; public class KylinQueryTest extends KylinTestBase { diff --git a/server/src/main/java/com/kylinolap/rest/controller/CubeController.java b/server/src/main/java/com/kylinolap/rest/controller/CubeController.java index 839d36b..06cf4c5 100644 --- a/server/src/main/java/com/kylinolap/rest/controller/CubeController.java +++ b/server/src/main/java/com/kylinolap/rest/controller/CubeController.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.UUID; +import com.kylinolap.storage.hbase.coprocessor.observer.ObserverEnabler; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,7 +60,6 @@ import com.kylinolap.rest.response.HBaseResponse; import com.kylinolap.rest.service.CubeService; import com.kylinolap.rest.service.JobService; -import com.kylinolap.storage.hbase.observer.CoprocessorEnabler; /** * CubeController is defined as Restful API entrance for UI. @@ -156,8 +156,8 @@ public CubeInstance updateCubeCost(@PathVariable String cubeName, @RequestParam( @ResponseBody public Map updateCubeCoprocessor(@PathVariable String cubeName, @RequestParam(value = "force") String force) { try { - CoprocessorEnabler.updateCubeOverride(cubeName, force); - return CoprocessorEnabler.getCubeOverrides(); + ObserverEnabler.updateCubeOverride(cubeName, force); + return ObserverEnabler.getCubeOverrides(); } catch (Exception e) { String message = "Failed to update cube coprocessor: " + cubeName + " : " + force; logger.error(message, e); diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/ConcurrentHBaseTupleIterator.java b/storage/src/main/java/com/kylinolap/storage/hbase/ConcurrentHBaseTupleIterator.java index 4b98ee1..b6e164b 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/ConcurrentHBaseTupleIterator.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/ConcurrentHBaseTupleIterator.java @@ -33,6 +33,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; +import com.kylinolap.storage.hbase.coprocessor.observer.ObserverEnabler; import org.apache.hadoop.hbase.client.HConnection; import org.apache.hadoop.hbase.client.HTableInterface; import org.apache.hadoop.hbase.client.Result; @@ -68,7 +69,6 @@ import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.StorageContext; import com.kylinolap.storage.filter.TupleFilter; -import com.kylinolap.storage.hbase.observer.CoprocessorEnabler; import com.kylinolap.storage.tuple.ITupleIterator; import com.kylinolap.storage.tuple.Tuple; import com.kylinolap.storage.tuple.Tuple.IDerivedColumnFiller; @@ -289,7 +289,7 @@ public Long call() throws Exception { try { Scan scan = buildScan(keyRange); applyFuzzyFilter(scan, keyRange); - scanner = CoprocessorEnabler.scanWithCoprocessorIfBeneficial(cubeSeg, keyRange.getCuboid(), filter, groupBy, rowValueDecoders, context, table, scan); + scanner = ObserverEnabler.scanWithCoprocessorIfBeneficial(cubeSeg, keyRange.getCuboid(), filter, groupBy, rowValueDecoders, context, table, scan); iter = scanner.iterator(); } catch (Throwable t) { String msg = MessageFormat.format("Error when scan from lower key {1} to upper key {2} on table {0}.", tableName, Bytes.toString(keyRange.getStartKey()), Bytes.toString(keyRange.getStopKey())); diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/CubeSegmentTupleIterator.java b/storage/src/main/java/com/kylinolap/storage/hbase/CubeSegmentTupleIterator.java index 58647c7..bbea782 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/CubeSegmentTupleIterator.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/CubeSegmentTupleIterator.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.Map.Entry; +import com.kylinolap.storage.hbase.coprocessor.observer.ObserverEnabler; import org.apache.hadoop.hbase.client.HConnection; import org.apache.hadoop.hbase.client.HTableInterface; import org.apache.hadoop.hbase.client.Result; @@ -55,7 +56,6 @@ import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.StorageContext; import com.kylinolap.storage.filter.TupleFilter; -import com.kylinolap.storage.hbase.observer.CoprocessorEnabler; import com.kylinolap.storage.tuple.ITupleIterator; import com.kylinolap.storage.tuple.Tuple; import com.kylinolap.storage.tuple.Tuple.IDerivedColumnFiller; @@ -213,7 +213,7 @@ private void scanNextRange() { applyFuzzyFilter(scan, keyRange); logScan(keyRange); - scanner = CoprocessorEnabler.scanWithCoprocessorIfBeneficial(cubeSeg, keyRange.getCuboid(), filter, groupBy, rowValueDecoders, context, table, scan); + scanner = ObserverEnabler.scanWithCoprocessorIfBeneficial(cubeSeg, keyRange.getCuboid(), filter, groupBy, rowValueDecoders, context, table, scan); iter = scanner.iterator(); } catch (Throwable t) { diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java b/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java index 628153f..a103d3b 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.Set; +import com.kylinolap.storage.hbase.coprocessor.observer.ObserverEnabler; import org.apache.hadoop.hbase.client.HConnection; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Pair; @@ -57,7 +58,6 @@ import com.kylinolap.storage.filter.LogicalTupleFilter; import com.kylinolap.storage.filter.TupleFilter; import com.kylinolap.storage.filter.TupleFilter.FilterOperatorEnum; -import com.kylinolap.storage.hbase.observer.CoprocessorEnabler; import com.kylinolap.storage.tuple.ITupleIterator; /** @@ -595,7 +595,7 @@ private void setLimit(TupleFilter filter, StorageContext context) { } private void setCoprocessor(Set groupsCopD, List valueDecoders, StorageContext context) { - CoprocessorEnabler.enableCoprocessorIfBeneficial(cubeInstance, groupsCopD, valueDecoders, context); + ObserverEnabler.enableCoprocessorIfBeneficial(cubeInstance, groupsCopD, valueDecoders, context); } } diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorConstants.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorConstants.java new file mode 100644 index 0000000..77dc4a5 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorConstants.java @@ -0,0 +1,8 @@ +package com.kylinolap.storage.hbase.coprocessor; + +/** + * Created by Hongbin Ma(Binmahone) on 11/26/14. + */ +public class CoprocessorConstants { + public static final int SERIALIZE_BUFFER_SIZE = 65536; +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorFilter.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorFilter.java new file mode 100644 index 0000000..71875db --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorFilter.java @@ -0,0 +1,201 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.coprocessor; + +import java.util.Collection; +import java.util.Set; + +import org.apache.hadoop.hbase.util.Bytes; + +import com.google.common.collect.Sets; +import com.kylinolap.common.util.BytesUtil; +import com.kylinolap.cube.CubeSegment; +import com.kylinolap.cube.kv.RowKeyColumnIO; +import com.kylinolap.dict.Dictionary; +import com.kylinolap.metadata.model.realization.TblColRef; +import com.kylinolap.storage.filter.ColumnTupleFilter; +import com.kylinolap.storage.filter.CompareTupleFilter; +import com.kylinolap.storage.filter.ConstantTupleFilter; +import com.kylinolap.storage.filter.TupleFilter; +import com.kylinolap.storage.filter.TupleFilter.FilterOperatorEnum; +import com.kylinolap.storage.filter.TupleFilterSerializer; +import com.kylinolap.storage.filter.TupleFilterSerializer.Decorator; +import com.kylinolap.storage.tuple.ITuple; + +/** + * @author yangli9 + */ +public class CoprocessorFilter { + + public static CoprocessorFilter fromFilter(final CubeSegment seg, TupleFilter rootFilter) { + // translate constants into dictionary IDs via a serialize copy + byte[] bytes = TupleFilterSerializer.serialize(rootFilter, new Decorator() { + RowKeyColumnIO columnIO = new RowKeyColumnIO(seg); + + @Override + public TupleFilter onSerialize(TupleFilter filter) { + if (filter == null) + return filter; + + if (filter.getOperator() == FilterOperatorEnum.NOT && TupleFilter.isEvaluableRecursively(filter) == false) + return ConstantTupleFilter.TRUE; + + if ((filter instanceof CompareTupleFilter) == false) + return filter; + + if (TupleFilter.isEvaluableRecursively(filter) == false) + return ConstantTupleFilter.TRUE; + + // extract ColumnFilter & ConstantFilter + CompareTupleFilter compf = (CompareTupleFilter) filter; + TblColRef col = compf.getColumn(); + if (col == null) { + return filter; + } + String nullString = nullString(col); + Collection constValues = compf.getValues(); + if (constValues == null || constValues.isEmpty()) { + compf.setNullString(nullString); // maybe ISNULL + return filter; + } + + TupleFilter result; + CompareTupleFilter newComp = new CompareTupleFilter(compf.getOperator()); + newComp.setNullString(nullString); + newComp.addChild(new ColumnTupleFilter(col)); + String v; + String firstValue = constValues.iterator().next(); + + // translate constant into rowkey ID + switch (newComp.getOperator()) { + case EQ: + case IN: + Set newValues = Sets.newHashSet(); + for (String value : constValues) { + v = translate(col, value, 0); + if (nullString.equals(v) == false) + newValues.add(v); + } + if (newValues.isEmpty()) { + result = ConstantTupleFilter.FALSE; + } else { + newComp.addChild(new ConstantTupleFilter(newValues)); + result = newComp; + } + break; + case NEQ: + v = translate(col, firstValue, 0); + if (nullString.equals(v)) { + result = ConstantTupleFilter.TRUE; + } else { + newComp.addChild(new ConstantTupleFilter(v)); + result = newComp; + } + break; + case LT: + v = translate(col, firstValue, 1); + if (nullString.equals(v)) { + result = ConstantTupleFilter.TRUE; + } else { + newComp.addChild(new ConstantTupleFilter(v)); + result = newComp; + } + break; + case LTE: + v = translate(col, firstValue, -1); + if (nullString.equals(v)) { + result = ConstantTupleFilter.FALSE; + } else { + newComp.addChild(new ConstantTupleFilter(v)); + result = newComp; + } + break; + case GT: + v = translate(col, firstValue, -1); + if (nullString.equals(v)) { + result = ConstantTupleFilter.TRUE; + } else { + newComp.addChild(new ConstantTupleFilter(v)); + result = newComp; + } + break; + case GTE: + v = translate(col, firstValue, 1); + if (nullString.equals(v)) { + result = ConstantTupleFilter.FALSE; + } else { + newComp.addChild(new ConstantTupleFilter(v)); + result = newComp; + } + break; + default: + throw new IllegalStateException("Cannot handle operator " + newComp.getOperator()); + } + return result; + } + + private String nullString(TblColRef column) { + byte[] id = new byte[columnIO.getColumnLength(column)]; + for (int i = 0; i < id.length; i++) { + id[i] = Dictionary.NULL; + } + return Dictionary.dictIdToString(id, 0, id.length); + } + + private String translate(TblColRef column, String v, int roundingFlag) { + byte[] value = Bytes.toBytes(v); + byte[] id = new byte[columnIO.getColumnLength(column)]; + columnIO.writeColumn(column, value, value.length, roundingFlag, Dictionary.NULL, id, 0); + return Dictionary.dictIdToString(id, 0, id.length); + } + + }); + TupleFilter copy = TupleFilterSerializer.deserialize(bytes); + return new CoprocessorFilter(copy); + } + + public static byte[] serialize(CoprocessorFilter o) { + return (o.filter == null) ? BytesUtil.EMPTY_BYTE_ARRAY : TupleFilterSerializer.serialize(o.filter); + } + + public static CoprocessorFilter deserialize(byte[] filterBytes) { + TupleFilter filter = (filterBytes == null || filterBytes.length == 0) // + ? null // + : TupleFilterSerializer.deserialize(filterBytes); + return new CoprocessorFilter(filter); + } + + // ============================================================================ + + public TupleFilter getFilter() { + return filter; + } + + private final TupleFilter filter; + + public CoprocessorFilter(TupleFilter filter) { + this.filter = filter; + } + + public boolean evaluate(ITuple tuple) { + if (filter == null) + return true; + else + return filter.evaluate(tuple); + } + +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointRowType.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointRowType.java new file mode 100644 index 0000000..be40807 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointRowType.java @@ -0,0 +1,142 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.coprocessor.endpoint; + +import com.google.common.collect.Maps; +import com.kylinolap.common.util.BytesSerializer; +import com.kylinolap.common.util.BytesUtil; +import com.kylinolap.cube.CubeSegment; +import com.kylinolap.cube.cuboid.Cuboid; +import com.kylinolap.cube.kv.RowConstants; +import com.kylinolap.cube.kv.RowKeyColumnIO; +import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.schema.ColumnDesc; +import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.storage.hbase.coprocessor.CoprocessorConstants; + +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +/** + * @author honma + */ +public class EndpointRowType { + + public static EndpointRowType fromCuboid(CubeSegment seg, Cuboid cuboid) { + List colList = cuboid.getColumns(); + TblColRef[] cols = colList.toArray(new TblColRef[colList.size()]); + RowKeyColumnIO colIO = new RowKeyColumnIO(seg); + int[] colSizes = new int[cols.length]; + for (int i = 0; i < cols.length; i++) { + colSizes[i] = colIO.getColumnLength(cols[i]); + } + return new EndpointRowType(cols, colSizes); + } + + public static byte[] serialize(EndpointRowType o) { + ByteBuffer buf = ByteBuffer.allocate(CoprocessorConstants.SERIALIZE_BUFFER_SIZE); + serializer.serialize(o, buf); + byte[] result = new byte[buf.position()]; + System.arraycopy(buf.array(), 0, result, 0, buf.position()); + return result; + } + + public static EndpointRowType deserialize(byte[] bytes) { + return serializer.deserialize(ByteBuffer.wrap(bytes)); + } + + private static final Serializer serializer = new Serializer(); + + private static class Serializer implements BytesSerializer { + + @Override + public void serialize(EndpointRowType o, ByteBuffer out) { + int n = o.columns.length; + BytesUtil.writeVInt(o.columns.length, out); + for (int i = 0; i < n; i++) { + BytesUtil.writeAsciiString(o.columns[i].getTable(), out); + BytesUtil.writeAsciiString(o.columns[i].getName(), out); + BytesUtil.writeVInt(o.columnSizes[i], out); + } + } + + @Override + public EndpointRowType deserialize(ByteBuffer in) { + int n = BytesUtil.readVInt(in); + TblColRef[] cols = new TblColRef[n]; + int[] colSizes = new int[n]; + for (int i = 0; i < n; i++) { + String tableName = BytesUtil.readAsciiString(in); + String colName = BytesUtil.readAsciiString(in); + TableDesc table = new TableDesc(); + table.setName(tableName); + ColumnDesc col = new ColumnDesc(); + col.setTable(table); + col.setName(colName); + cols[i] = new TblColRef(col); + + int colSize = BytesUtil.readVInt(in); + colSizes[i] = colSize; + } + return new EndpointRowType(cols, colSizes); + } + } + + // ============================================================================ + + TblColRef[] columns; + int[] columnSizes; + + int[] columnOffsets; + List columnsAsList; + HashMap columnIdxMap; + + public EndpointRowType(TblColRef[] columns, int[] columnSizes) { + this.columns = columns; + this.columnSizes = columnSizes; + init(); + } + + public int getColIndexByTblColRef(TblColRef colRef) { + return columnIdxMap.get(colRef); + } + + private void init() { + int[] offsets = new int[columns.length]; + int o = RowConstants.ROWKEY_CUBOIDID_LEN; + for (int i = 0; i < columns.length; i++) { + offsets[i] = o; + o += columnSizes[i]; + } + this.columnOffsets = offsets; + + this.columnsAsList = Arrays.asList(columns); + + HashMap map = Maps.newHashMap(); + for (int i = 0; i < columns.length; i++) { + map.put(columns[i], i); + } + this.columnIdxMap = map; + } + + public int getColumnCount() { + return columns.length; + } + +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/HbaseServerKVIterator.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/HbaseServerKVIterator.java new file mode 100644 index 0000000..a457dba --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/HbaseServerKVIterator.java @@ -0,0 +1,81 @@ +package com.kylinolap.storage.hbase.coprocessor.endpoint; + +import com.kylinolap.common.util.BytesUtil; +import org.apache.commons.io.IOUtils; +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.io.ImmutableBytesWritable; +import org.apache.hadoop.hbase.regionserver.RegionScanner; +import org.apache.hadoop.hbase.util.Pair; + +import java.io.Closeable; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * Created by honma on 11/10/14. + */ +public class HbaseServerKVIterator implements Iterable>, Closeable { + + private RegionScanner innerScaner; + + List results = new ArrayList(); + + public HbaseServerKVIterator(RegionScanner innerScaner) { + this.innerScaner = innerScaner; + } + + @Override + public void close() throws IOException { + IOUtils.closeQuietly(this.innerScaner); + } + + @Override + public Iterator> iterator() { + return new Iterator>() { + + ImmutableBytesWritable key = new ImmutableBytesWritable(); + ImmutableBytesWritable value = new ImmutableBytesWritable(); + Pair pair = new Pair<>(key, value); + + private boolean hasMore = true; + + @Override + public boolean hasNext() { + return hasMore; + } + + + @Override + public Pair next() { + if (hasNext()) { + try { + hasMore = innerScaner.nextRaw(results); + } catch (IOException e) { + throw new RuntimeException(e); + } + + if (results.size() < 1) + throw new IllegalStateException("Hbase row contains less than 1 cell"); + + Cell c = results.get(0); + key.set(c.getRowArray(), c.getRowOffset(), c.getRowLength()); + value.set(c.getValueArray(), c.getValueOffset(), c.getValueLength()); + + results.clear(); + return pair; + } else { + return null; + } + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } + +} + diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/IIEndpoint.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/IIEndpoint.java new file mode 100644 index 0000000..db4d4ec --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/IIEndpoint.java @@ -0,0 +1,137 @@ +package com.kylinolap.storage.hbase.coprocessor.endpoint; + +import com.google.protobuf.ByteString; +import com.google.protobuf.RpcCallback; +import com.google.protobuf.RpcController; +import com.google.protobuf.Service; +import com.kylinolap.cube.invertedindex.*; +import com.kylinolap.storage.filter.BitMapFilterEvaluator; +import com.kylinolap.storage.hbase.coprocessor.endpoint.generated.IIProtos; +import com.kylinolap.storage.hbase.coprocessor.CoprocessorFilter; +import com.kylinolap.storage.hbase.coprocessor.observer.ObserverAggregators; +import com.kylinolap.storage.hbase.coprocessor.observer.ObserverProjector; +import com.kylinolap.storage.hbase.coprocessor.observer.ObserverRowType; +import it.uniroma3.mat.extendedset.intset.ConciseSet; + +import org.apache.commons.io.IOUtils; +import org.apache.hadoop.hbase.Coprocessor; +import org.apache.hadoop.hbase.CoprocessorEnvironment; +import org.apache.hadoop.hbase.client.Scan; +import org.apache.hadoop.hbase.coprocessor.CoprocessorException; +import org.apache.hadoop.hbase.coprocessor.CoprocessorService; +import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; +import org.apache.hadoop.hbase.protobuf.ResponseConverter; +import org.apache.hadoop.hbase.regionserver.HRegion; +import org.apache.hadoop.hbase.regionserver.RegionScanner; +import org.apache.hadoop.hbase.util.Bytes; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Iterator; + +/** + * Created by honma on 11/7/14. + */ +public class IIEndpoint extends IIProtos.RowsService + implements Coprocessor, CoprocessorService { + + private RegionCoprocessorEnvironment env; + + public IIEndpoint() { + } + + private Scan buildScan() { + Scan scan = new Scan(); + scan.addColumn(Bytes.toBytes("f"), Bytes.toBytes("c")); + + return scan; + } + + @Override + public void getRows(RpcController controller, IIProtos.IIRequest request, RpcCallback done) { + + ObserverRowType type = null; + ObserverProjector projector = null; + ObserverAggregators aggregators = null; + CoprocessorFilter filter = null; + + if (request.hasSRowType()) { + type = ObserverRowType.deserialize(request.getSRowType().toByteArray()); + } + if (request.hasSRowProjector()) { + projector = ObserverProjector.deserialize(request.getSRowProjector().toByteArray()); + } + if (request.hasSRowAggregator()) { + aggregators = ObserverAggregators.deserialize(request.getSRowAggregator().toByteArray()); + } + if (request.hasSRowFilter()) { + filter = CoprocessorFilter.deserialize(request.getSRowFilter().toByteArray()); + } + + + IIProtos.IIResponse response = null; + RegionScanner innerScanner = null; + HRegion region = null; + try { + ByteBuffer byteBuffer = request.getTableInfo().asReadOnlyByteBuffer(); + TableRecordInfoDigest tableInfo = TableRecordInfoDigest.deserialize(byteBuffer); + + region = env.getRegion(); + innerScanner = region.getScanner(buildScan()); + region.startRegionOperation(); + + + synchronized (innerScanner) { + IIProtos.IIResponse.Builder responseBuilder = IIProtos.IIResponse.newBuilder(); + + IIKeyValueCodec codec = new IIKeyValueCodec(tableInfo); + for (Slice slice : codec.decodeKeyValue(new HbaseServerKVIterator(innerScanner))) { + ConciseSet result = null; + if (filter != null) { + result = new BitMapFilterEvaluator(new SliceBitMapProvider(slice, type)).evaluate(filter.getFilter()); + } + + Iterator iterator = slice.iterateWithBitmap(result); + while (iterator.hasNext()) { + responseBuilder.addRows(ByteString.copyFrom(iterator.next().getBytes())); + } + } + + response = responseBuilder.build(); + } + + } catch (IOException ioe) { + ResponseConverter.setControllerException(controller, ioe); + } finally { + IOUtils.closeQuietly(innerScanner); + if (region != null) { + try { + region.closeRegionOperation(); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + } + + done.run(response); + } + + @Override + public void start(CoprocessorEnvironment env) throws IOException { + if (env instanceof RegionCoprocessorEnvironment) { + this.env = (RegionCoprocessorEnvironment) env; + } else { + throw new CoprocessorException("Must be loaded on a table region!"); + } + } + + @Override + public void stop(CoprocessorEnvironment env) throws IOException { + } + + @Override + public Service getService() { + return this; + } +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/IIResponseAdapter.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/IIResponseAdapter.java new file mode 100644 index 0000000..aa589db --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/IIResponseAdapter.java @@ -0,0 +1,7 @@ +package com.kylinolap.storage.hbase.coprocessor.endpoint; + +/** + * Created by honma on 11/10/14. + */ +public class IIResponseAdapter { +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/SliceBitMapProvider.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/SliceBitMapProvider.java new file mode 100644 index 0000000..296004b --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/SliceBitMapProvider.java @@ -0,0 +1,38 @@ +package com.kylinolap.storage.hbase.coprocessor.endpoint; + +import com.kylinolap.cube.invertedindex.Slice; +import com.kylinolap.metadata.model.realization.TblColRef; +import com.kylinolap.storage.filter.BitMapFilterEvaluator; +import com.kylinolap.storage.hbase.coprocessor.observer.ObserverRowType; +import it.uniroma3.mat.extendedset.intset.ConciseSet; + +/** + * Created by Hongbin Ma(Binmahone) on 11/24/14. + *

+ * an adapter + */ +public class SliceBitMapProvider implements BitMapFilterEvaluator.BitMapProvider { + + private Slice slice; + private ObserverRowType type; + + public SliceBitMapProvider(Slice slice, ObserverRowType type) { + this.slice = slice; + this.type = type; + } + + @Override + public ConciseSet getBitMap(TblColRef col, int valueId) { + return slice.getColumnValueContainer(type.getColIndexByTblColRef(col)).getBitMap(valueId); + } + + @Override + public int getRecordCount() { + return this.slice.getRecordCount(); + } + + @Override + public int getMaxValueId(TblColRef col) { + return slice.getColumnValueContainer(type.getColIndexByTblColRef(col)).getMaxValueId(); + } +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/example/ExampleEndpoint.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/example/ExampleEndpoint.java new file mode 100644 index 0000000..7b337a3 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/example/ExampleEndpoint.java @@ -0,0 +1,146 @@ +package com.kylinolap.storage.hbase.coprocessor.endpoint.example; + +import com.google.protobuf.RpcCallback; +import com.google.protobuf.RpcController; +import com.google.protobuf.Service; +import com.kylinolap.storage.hbase.coprocessor.endpoint.example.generated.ExampleProtos; +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.CellUtil; +import org.apache.hadoop.hbase.Coprocessor; +import org.apache.hadoop.hbase.CoprocessorEnvironment; +import org.apache.hadoop.hbase.client.Scan; +import org.apache.hadoop.hbase.coprocessor.CoprocessorException; +import org.apache.hadoop.hbase.coprocessor.CoprocessorService; +import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; +import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter; +import org.apache.hadoop.hbase.protobuf.ResponseConverter; +import org.apache.hadoop.hbase.regionserver.InternalScanner; +import org.apache.hadoop.hbase.util.Bytes; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by honma on 11/3/14. + */ + +public class ExampleEndpoint extends ExampleProtos.RowCountService + implements Coprocessor, CoprocessorService { + private RegionCoprocessorEnvironment env; + + public ExampleEndpoint() { + } + + /** + * Just returns a reference to this object, which implements the RowCounterService interface. + */ + @Override + public Service getService() { + return this; + } + + /** + * Returns a count of the rows in the region where this coprocessor is loaded. + */ + @Override + public void getRowCount(RpcController controller, ExampleProtos.CountRequest request, + RpcCallback done) { + Scan scan = new Scan(); + scan.setFilter(new FirstKeyOnlyFilter()); + ExampleProtos.CountResponse response = null; + InternalScanner scanner = null; + try { + scanner = env.getRegion().getScanner(scan); + List results = new ArrayList(); + boolean hasMore = false; + byte[] lastRow = null; + long count = 0; + do { + hasMore = scanner.next(results); + for (Cell kv : results) { + byte[] currentRow = CellUtil.cloneRow(kv); + if (lastRow == null || !Bytes.equals(lastRow, currentRow)) { + lastRow = currentRow; + count++; + } + } + results.clear(); + } while (hasMore); + + response = ExampleProtos.CountResponse.newBuilder() + .setCount(count).build(); + } catch (IOException ioe) { + ResponseConverter.setControllerException(controller, ioe); + } finally { + if (scanner != null) { + try { + scanner.close(); + } catch (IOException ignored) { + } + } + } + done.run(response); + } + + /** + * Returns a count of all KeyValues in the region where this coprocessor is loaded. + */ + @Override + public void getKeyValueCount(RpcController controller, ExampleProtos.CountRequest request, + RpcCallback done) { + ExampleProtos.CountResponse response = null; + InternalScanner scanner = null; + try { + scanner = env.getRegion().getScanner(new Scan()); + List results = new ArrayList(); + boolean hasMore = false; + long count = 0; + do { + hasMore = scanner.next(results); + for (Cell kv : results) { + count++; + } + results.clear(); + } while (hasMore); + + response = ExampleProtos.CountResponse.newBuilder() + .setCount(count).build(); + } catch (IOException ioe) { + ResponseConverter.setControllerException(controller, ioe); + } finally { + if (scanner != null) { + try { + scanner.close(); + } catch (IOException ignored) { + } + } + } + done.run(response); + } + + /** + * Stores a reference to the coprocessor environment provided by the + * {@link org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost} from the region where this + * coprocessor is loaded. Since this is a coprocessor endpoint, it always expects to be loaded + * on a table region, so always expects this to be an instance of + * {@link RegionCoprocessorEnvironment}. + * + * @param env the environment provided by the coprocessor host + * @throws IOException if the provided environment is not an instance of + * {@code RegionCoprocessorEnvironment} + */ + @Override + public void start(CoprocessorEnvironment env) throws IOException { + if (env instanceof RegionCoprocessorEnvironment) { + this.env = (RegionCoprocessorEnvironment) env; + } else { + throw new CoprocessorException("Must be loaded on a table region!"); + } + } + + @Override + public void stop(CoprocessorEnvironment env) throws IOException { + // nothing to do + } +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/example/generated/ExampleProtos.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/example/generated/ExampleProtos.java new file mode 100644 index 0000000..1c1ac2f --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/example/generated/ExampleProtos.java @@ -0,0 +1,1150 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: example.proto + +package com.kylinolap.storage.hbase.coprocessor.endpoint.example.generated; + +import com.google.protobuf.AbstractMessage; + +public final class ExampleProtos { + private ExampleProtos() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface CountRequestOrBuilder + extends com.google.protobuf.MessageOrBuilder { + } + /** + * Protobuf type {@code CountRequest} + */ + public static final class CountRequest extends + com.google.protobuf.GeneratedMessage + implements CountRequestOrBuilder { + // Use CountRequest.newBuilder() to construct. + private CountRequest(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private CountRequest(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final CountRequest defaultInstance; + public static CountRequest getDefaultInstance() { + return defaultInstance; + } + + public CountRequest getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CountRequest( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return ExampleProtos.internal_static_CountRequest_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return ExampleProtos.internal_static_CountRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + ExampleProtos.CountRequest.class, ExampleProtos.CountRequest.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public CountRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CountRequest(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private void initFields() { + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof ExampleProtos.CountRequest)) { + return super.equals(obj); + } + ExampleProtos.CountRequest other = (ExampleProtos.CountRequest) obj; + + boolean result = true; + result = result && + getUnknownFields().equals(other.getUnknownFields()); + return result; + } + + private int memoizedHashCode = 0; + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptorForType().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static ExampleProtos.CountRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static ExampleProtos.CountRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static ExampleProtos.CountRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static ExampleProtos.CountRequest parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static ExampleProtos.CountRequest parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static ExampleProtos.CountRequest parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static ExampleProtos.CountRequest parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static ExampleProtos.CountRequest parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static ExampleProtos.CountRequest parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static ExampleProtos.CountRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(ExampleProtos.CountRequest prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code CountRequest} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements ExampleProtos.CountRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return ExampleProtos.internal_static_CountRequest_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return ExampleProtos.internal_static_CountRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + ExampleProtos.CountRequest.class, ExampleProtos.CountRequest.Builder.class); + } + + // Construct using com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return ExampleProtos.internal_static_CountRequest_descriptor; + } + + public ExampleProtos.CountRequest getDefaultInstanceForType() { + return ExampleProtos.CountRequest.getDefaultInstance(); + } + + public ExampleProtos.CountRequest build() { + ExampleProtos.CountRequest result = buildPartial(); + if (!result.isInitialized()) { + throw AbstractMessage.Builder.newUninitializedMessageException(result); + } + return result; + } + + public ExampleProtos.CountRequest buildPartial() { + ExampleProtos.CountRequest result = new ExampleProtos.CountRequest(this); + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof ExampleProtos.CountRequest) { + return mergeFrom((ExampleProtos.CountRequest)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(ExampleProtos.CountRequest other) { + if (other == ExampleProtos.CountRequest.getDefaultInstance()) return this; + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + ExampleProtos.CountRequest parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (ExampleProtos.CountRequest) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + // @@protoc_insertion_point(builder_scope:CountRequest) + } + + static { + defaultInstance = new CountRequest(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:CountRequest) + } + + public interface CountResponseOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // required int64 count = 1 [default = 0]; + /** + * required int64 count = 1 [default = 0]; + */ + boolean hasCount(); + /** + * required int64 count = 1 [default = 0]; + */ + long getCount(); + } + /** + * Protobuf type {@code CountResponse} + */ + public static final class CountResponse extends + com.google.protobuf.GeneratedMessage + implements CountResponseOrBuilder { + // Use CountResponse.newBuilder() to construct. + private CountResponse(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private CountResponse(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final CountResponse defaultInstance; + public static CountResponse getDefaultInstance() { + return defaultInstance; + } + + public CountResponse getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CountResponse( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + count_ = input.readInt64(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return ExampleProtos.internal_static_CountResponse_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return ExampleProtos.internal_static_CountResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + ExampleProtos.CountResponse.class, ExampleProtos.CountResponse.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public CountResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CountResponse(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // required int64 count = 1 [default = 0]; + public static final int COUNT_FIELD_NUMBER = 1; + private long count_; + /** + * required int64 count = 1 [default = 0]; + */ + public boolean hasCount() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required int64 count = 1 [default = 0]; + */ + public long getCount() { + return count_; + } + + private void initFields() { + count_ = 0L; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + if (!hasCount()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeInt64(1, count_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(1, count_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof ExampleProtos.CountResponse)) { + return super.equals(obj); + } + ExampleProtos.CountResponse other = (ExampleProtos.CountResponse) obj; + + boolean result = true; + result = result && (hasCount() == other.hasCount()); + if (hasCount()) { + result = result && (getCount() + == other.getCount()); + } + result = result && + getUnknownFields().equals(other.getUnknownFields()); + return result; + } + + private int memoizedHashCode = 0; + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptorForType().hashCode(); + if (hasCount()) { + hash = (37 * hash) + COUNT_FIELD_NUMBER; + hash = (53 * hash) + hashLong(getCount()); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static ExampleProtos.CountResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static ExampleProtos.CountResponse parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static ExampleProtos.CountResponse parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static ExampleProtos.CountResponse parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static ExampleProtos.CountResponse parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static ExampleProtos.CountResponse parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static ExampleProtos.CountResponse parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static ExampleProtos.CountResponse parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static ExampleProtos.CountResponse parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static ExampleProtos.CountResponse parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(ExampleProtos.CountResponse prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code CountResponse} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements ExampleProtos.CountResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return ExampleProtos.internal_static_CountResponse_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return ExampleProtos.internal_static_CountResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + ExampleProtos.CountResponse.class, ExampleProtos.CountResponse.Builder.class); + } + + // Construct using com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + count_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return ExampleProtos.internal_static_CountResponse_descriptor; + } + + public ExampleProtos.CountResponse getDefaultInstanceForType() { + return ExampleProtos.CountResponse.getDefaultInstance(); + } + + public ExampleProtos.CountResponse build() { + ExampleProtos.CountResponse result = buildPartial(); + if (!result.isInitialized()) { + throw AbstractMessage.Builder.newUninitializedMessageException(result); + } + return result; + } + + public ExampleProtos.CountResponse buildPartial() { + ExampleProtos.CountResponse result = new ExampleProtos.CountResponse(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.count_ = count_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof ExampleProtos.CountResponse) { + return mergeFrom((ExampleProtos.CountResponse)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(ExampleProtos.CountResponse other) { + if (other == ExampleProtos.CountResponse.getDefaultInstance()) return this; + if (other.hasCount()) { + setCount(other.getCount()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasCount()) { + + return false; + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + ExampleProtos.CountResponse parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (ExampleProtos.CountResponse) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // required int64 count = 1 [default = 0]; + private long count_ ; + /** + * required int64 count = 1 [default = 0]; + */ + public boolean hasCount() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required int64 count = 1 [default = 0]; + */ + public long getCount() { + return count_; + } + /** + * required int64 count = 1 [default = 0]; + */ + public Builder setCount(long value) { + bitField0_ |= 0x00000001; + count_ = value; + onChanged(); + return this; + } + /** + * required int64 count = 1 [default = 0]; + */ + public Builder clearCount() { + bitField0_ = (bitField0_ & ~0x00000001); + count_ = 0L; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:CountResponse) + } + + static { + defaultInstance = new CountResponse(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:CountResponse) + } + + /** + * Protobuf service {@code RowCountService} + */ + public static abstract class RowCountService + implements com.google.protobuf.Service { + protected RowCountService() {} + + public interface Interface { + /** + * rpc getRowCount(.CountRequest) returns (.CountResponse); + */ + public abstract void getRowCount( + com.google.protobuf.RpcController controller, + ExampleProtos.CountRequest request, + com.google.protobuf.RpcCallback done); + + /** + * rpc getKeyValueCount(.CountRequest) returns (.CountResponse); + */ + public abstract void getKeyValueCount( + com.google.protobuf.RpcController controller, + ExampleProtos.CountRequest request, + com.google.protobuf.RpcCallback done); + + } + + public static com.google.protobuf.Service newReflectiveService( + final Interface impl) { + return new RowCountService() { + @java.lang.Override + public void getRowCount( + com.google.protobuf.RpcController controller, + ExampleProtos.CountRequest request, + com.google.protobuf.RpcCallback done) { + impl.getRowCount(controller, request, done); + } + + @java.lang.Override + public void getKeyValueCount( + com.google.protobuf.RpcController controller, + ExampleProtos.CountRequest request, + com.google.protobuf.RpcCallback done) { + impl.getKeyValueCount(controller, request, done); + } + + }; + } + + public static com.google.protobuf.BlockingService + newReflectiveBlockingService(final BlockingInterface impl) { + return new com.google.protobuf.BlockingService() { + public final com.google.protobuf.Descriptors.ServiceDescriptor + getDescriptorForType() { + return getDescriptor(); + } + + public final com.google.protobuf.Message callBlockingMethod( + com.google.protobuf.Descriptors.MethodDescriptor method, + com.google.protobuf.RpcController controller, + com.google.protobuf.Message request) + throws com.google.protobuf.ServiceException { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.callBlockingMethod() given method descriptor for " + + "wrong service type."); + } + switch(method.getIndex()) { + case 0: + return impl.getRowCount(controller, (ExampleProtos.CountRequest)request); + case 1: + return impl.getKeyValueCount(controller, (ExampleProtos.CountRequest)request); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public final com.google.protobuf.Message + getRequestPrototype( + com.google.protobuf.Descriptors.MethodDescriptor method) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.getRequestPrototype() given method " + + "descriptor for wrong service type."); + } + switch(method.getIndex()) { + case 0: + return ExampleProtos.CountRequest.getDefaultInstance(); + case 1: + return ExampleProtos.CountRequest.getDefaultInstance(); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public final com.google.protobuf.Message + getResponsePrototype( + com.google.protobuf.Descriptors.MethodDescriptor method) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.getResponsePrototype() given method " + + "descriptor for wrong service type."); + } + switch(method.getIndex()) { + case 0: + return ExampleProtos.CountResponse.getDefaultInstance(); + case 1: + return ExampleProtos.CountResponse.getDefaultInstance(); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + }; + } + + /** + * rpc getRowCount(.CountRequest) returns (.CountResponse); + */ + public abstract void getRowCount( + com.google.protobuf.RpcController controller, + ExampleProtos.CountRequest request, + com.google.protobuf.RpcCallback done); + + /** + * rpc getKeyValueCount(.CountRequest) returns (.CountResponse); + */ + public abstract void getKeyValueCount( + com.google.protobuf.RpcController controller, + ExampleProtos.CountRequest request, + com.google.protobuf.RpcCallback done); + + public static final + com.google.protobuf.Descriptors.ServiceDescriptor + getDescriptor() { + return ExampleProtos.getDescriptor().getServices().get(0); + } + public final com.google.protobuf.Descriptors.ServiceDescriptor + getDescriptorForType() { + return getDescriptor(); + } + + public final void callMethod( + com.google.protobuf.Descriptors.MethodDescriptor method, + com.google.protobuf.RpcController controller, + com.google.protobuf.Message request, + com.google.protobuf.RpcCallback< + com.google.protobuf.Message> done) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.callMethod() given method descriptor for wrong " + + "service type."); + } + switch(method.getIndex()) { + case 0: + this.getRowCount(controller, (ExampleProtos.CountRequest)request, + com.google.protobuf.RpcUtil.specializeCallback( + done)); + return; + case 1: + this.getKeyValueCount(controller, (ExampleProtos.CountRequest)request, + com.google.protobuf.RpcUtil.specializeCallback( + done)); + return; + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public final com.google.protobuf.Message + getRequestPrototype( + com.google.protobuf.Descriptors.MethodDescriptor method) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.getRequestPrototype() given method " + + "descriptor for wrong service type."); + } + switch(method.getIndex()) { + case 0: + return ExampleProtos.CountRequest.getDefaultInstance(); + case 1: + return ExampleProtos.CountRequest.getDefaultInstance(); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public final com.google.protobuf.Message + getResponsePrototype( + com.google.protobuf.Descriptors.MethodDescriptor method) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.getResponsePrototype() given method " + + "descriptor for wrong service type."); + } + switch(method.getIndex()) { + case 0: + return ExampleProtos.CountResponse.getDefaultInstance(); + case 1: + return ExampleProtos.CountResponse.getDefaultInstance(); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public static Stub newStub( + com.google.protobuf.RpcChannel channel) { + return new Stub(channel); + } + + public static final class Stub extends ExampleProtos.RowCountService implements Interface { + private Stub(com.google.protobuf.RpcChannel channel) { + this.channel = channel; + } + + private final com.google.protobuf.RpcChannel channel; + + public com.google.protobuf.RpcChannel getChannel() { + return channel; + } + + public void getRowCount( + com.google.protobuf.RpcController controller, + ExampleProtos.CountRequest request, + com.google.protobuf.RpcCallback done) { + channel.callMethod( + getDescriptor().getMethods().get(0), + controller, + request, + ExampleProtos.CountResponse.getDefaultInstance(), + com.google.protobuf.RpcUtil.generalizeCallback( + done, + ExampleProtos.CountResponse.class, + ExampleProtos.CountResponse.getDefaultInstance())); + } + + public void getKeyValueCount( + com.google.protobuf.RpcController controller, + ExampleProtos.CountRequest request, + com.google.protobuf.RpcCallback done) { + channel.callMethod( + getDescriptor().getMethods().get(1), + controller, + request, + ExampleProtos.CountResponse.getDefaultInstance(), + com.google.protobuf.RpcUtil.generalizeCallback( + done, + ExampleProtos.CountResponse.class, + ExampleProtos.CountResponse.getDefaultInstance())); + } + } + + public static BlockingInterface newBlockingStub( + com.google.protobuf.BlockingRpcChannel channel) { + return new BlockingStub(channel); + } + + public interface BlockingInterface { + public ExampleProtos.CountResponse getRowCount( + com.google.protobuf.RpcController controller, + ExampleProtos.CountRequest request) + throws com.google.protobuf.ServiceException; + + public ExampleProtos.CountResponse getKeyValueCount( + com.google.protobuf.RpcController controller, + ExampleProtos.CountRequest request) + throws com.google.protobuf.ServiceException; + } + + private static final class BlockingStub implements BlockingInterface { + private BlockingStub(com.google.protobuf.BlockingRpcChannel channel) { + this.channel = channel; + } + + private final com.google.protobuf.BlockingRpcChannel channel; + + public ExampleProtos.CountResponse getRowCount( + com.google.protobuf.RpcController controller, + ExampleProtos.CountRequest request) + throws com.google.protobuf.ServiceException { + return (ExampleProtos.CountResponse) channel.callBlockingMethod( + getDescriptor().getMethods().get(0), + controller, + request, + ExampleProtos.CountResponse.getDefaultInstance()); + } + + + public ExampleProtos.CountResponse getKeyValueCount( + com.google.protobuf.RpcController controller, + ExampleProtos.CountRequest request) + throws com.google.protobuf.ServiceException { + return (ExampleProtos.CountResponse) channel.callBlockingMethod( + getDescriptor().getMethods().get(1), + controller, + request, + ExampleProtos.CountResponse.getDefaultInstance()); + } + + } + + // @@protoc_insertion_point(class_scope:RowCountService) + } + + private static com.google.protobuf.Descriptors.Descriptor + internal_static_CountRequest_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_CountRequest_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_CountResponse_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_CountResponse_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\rexample.proto\"\016\n\014CountRequest\"!\n\rCount" + + "Response\022\020\n\005count\030\001 \002(\003:\00102r\n\017RowCountSe" + + "rvice\022,\n\013getRowCount\022\r.CountRequest\032\016.Co" + + "untResponse\0221\n\020getKeyValueCount\022\r.CountR" + + "equest\032\016.CountResponseBR\n9com.kylinolap." + + "storage.hbase.coprocessor.example.genera" + + "tedB\rExampleProtosH\001\210\001\001\240\001\001" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + internal_static_CountRequest_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_CountRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_CountRequest_descriptor, + new java.lang.String[] { }); + internal_static_CountResponse_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_CountResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_CountResponse_descriptor, + new java.lang.String[] { "Count", }); + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/example/generated/NodeProtos.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/example/generated/NodeProtos.java new file mode 100644 index 0000000..c03edc4 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/example/generated/NodeProtos.java @@ -0,0 +1,940 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: Node.proto + +package com.kylinolap.storage.hbase.coprocessor.endpoint.example.generated; + +import com.google.protobuf.AbstractMessage; + +public final class NodeProtos { + private NodeProtos() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface NodeOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // required string name = 1; + /** + * required string name = 1; + */ + boolean hasName(); + /** + * required string name = 1; + */ + java.lang.String getName(); + /** + * required string name = 1; + */ + com.google.protobuf.ByteString + getNameBytes(); + + // optional .Node left = 2; + /** + * optional .Node left = 2; + */ + boolean hasLeft(); + /** + * optional .Node left = 2; + */ + NodeProtos.Node getLeft(); + /** + * optional .Node left = 2; + */ + NodeProtos.NodeOrBuilder getLeftOrBuilder(); + + // optional .Node right = 3; + /** + * optional .Node right = 3; + */ + boolean hasRight(); + /** + * optional .Node right = 3; + */ + NodeProtos.Node getRight(); + /** + * optional .Node right = 3; + */ + NodeProtos.NodeOrBuilder getRightOrBuilder(); + } + /** + * Protobuf type {@code Node} + */ + public static final class Node extends + com.google.protobuf.GeneratedMessage + implements NodeOrBuilder { + // Use Node.newBuilder() to construct. + private Node(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Node(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Node defaultInstance; + public static Node getDefaultInstance() { + return defaultInstance; + } + + public Node getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Node( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + name_ = input.readBytes(); + break; + } + case 18: { + NodeProtos.Node.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + subBuilder = left_.toBuilder(); + } + left_ = input.readMessage(NodeProtos.Node.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(left_); + left_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + case 26: { + NodeProtos.Node.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + subBuilder = right_.toBuilder(); + } + right_ = input.readMessage(NodeProtos.Node.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(right_); + right_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return NodeProtos.internal_static_Node_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return NodeProtos.internal_static_Node_fieldAccessorTable + .ensureFieldAccessorsInitialized( + NodeProtos.Node.class, NodeProtos.Node.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Node parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Node(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // required string name = 1; + public static final int NAME_FIELD_NUMBER = 1; + private java.lang.Object name_; + /** + * required string name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required string name = 1; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + * required string name = 1; + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional .Node left = 2; + public static final int LEFT_FIELD_NUMBER = 2; + private NodeProtos.Node left_; + /** + * optional .Node left = 2; + */ + public boolean hasLeft() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .Node left = 2; + */ + public NodeProtos.Node getLeft() { + return left_; + } + /** + * optional .Node left = 2; + */ + public NodeProtos.NodeOrBuilder getLeftOrBuilder() { + return left_; + } + + // optional .Node right = 3; + public static final int RIGHT_FIELD_NUMBER = 3; + private NodeProtos.Node right_; + /** + * optional .Node right = 3; + */ + public boolean hasRight() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .Node right = 3; + */ + public NodeProtos.Node getRight() { + return right_; + } + /** + * optional .Node right = 3; + */ + public NodeProtos.NodeOrBuilder getRightOrBuilder() { + return right_; + } + + private void initFields() { + name_ = ""; + left_ = NodeProtos.Node.getDefaultInstance(); + right_ = NodeProtos.Node.getDefaultInstance(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + if (!hasName()) { + memoizedIsInitialized = 0; + return false; + } + if (hasLeft()) { + if (!getLeft().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasRight()) { + if (!getRight().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeMessage(2, left_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeMessage(3, right_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, left_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, right_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static NodeProtos.Node parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static NodeProtos.Node parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static NodeProtos.Node parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static NodeProtos.Node parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static NodeProtos.Node parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static NodeProtos.Node parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static NodeProtos.Node parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static NodeProtos.Node parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static NodeProtos.Node parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static NodeProtos.Node parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(NodeProtos.Node prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Node} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements NodeProtos.NodeOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return NodeProtos.internal_static_Node_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return NodeProtos.internal_static_Node_fieldAccessorTable + .ensureFieldAccessorsInitialized( + NodeProtos.Node.class, NodeProtos.Node.Builder.class); + } + + // Construct using com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getLeftFieldBuilder(); + getRightFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + if (leftBuilder_ == null) { + left_ = NodeProtos.Node.getDefaultInstance(); + } else { + leftBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + if (rightBuilder_ == null) { + right_ = NodeProtos.Node.getDefaultInstance(); + } else { + rightBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return NodeProtos.internal_static_Node_descriptor; + } + + public NodeProtos.Node getDefaultInstanceForType() { + return NodeProtos.Node.getDefaultInstance(); + } + + public NodeProtos.Node build() { + NodeProtos.Node result = buildPartial(); + if (!result.isInitialized()) { + throw AbstractMessage.Builder.newUninitializedMessageException(result); + } + return result; + } + + public NodeProtos.Node buildPartial() { + NodeProtos.Node result = new NodeProtos.Node(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.name_ = name_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + if (leftBuilder_ == null) { + result.left_ = left_; + } else { + result.left_ = leftBuilder_.build(); + } + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + if (rightBuilder_ == null) { + result.right_ = right_; + } else { + result.right_ = rightBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof NodeProtos.Node) { + return mergeFrom((NodeProtos.Node)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(NodeProtos.Node other) { + if (other == NodeProtos.Node.getDefaultInstance()) return this; + if (other.hasName()) { + bitField0_ |= 0x00000001; + name_ = other.name_; + onChanged(); + } + if (other.hasLeft()) { + mergeLeft(other.getLeft()); + } + if (other.hasRight()) { + mergeRight(other.getRight()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasName()) { + + return false; + } + if (hasLeft()) { + if (!getLeft().isInitialized()) { + + return false; + } + } + if (hasRight()) { + if (!getRight().isInitialized()) { + + return false; + } + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + NodeProtos.Node parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (NodeProtos.Node) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // required string name = 1; + private java.lang.Object name_ = ""; + /** + * required string name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required string name = 1; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + java.lang.String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + name_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string name = 1; + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * required string name = 1; + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + /** + * required string name = 1; + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000001); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * required string name = 1; + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + + // optional .Node left = 2; + private NodeProtos.Node left_ = NodeProtos.Node.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + NodeProtos.Node, NodeProtos.Node.Builder, NodeProtos.NodeOrBuilder> leftBuilder_; + /** + * optional .Node left = 2; + */ + public boolean hasLeft() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .Node left = 2; + */ + public NodeProtos.Node getLeft() { + if (leftBuilder_ == null) { + return left_; + } else { + return leftBuilder_.getMessage(); + } + } + /** + * optional .Node left = 2; + */ + public Builder setLeft(NodeProtos.Node value) { + if (leftBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + left_ = value; + onChanged(); + } else { + leftBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .Node left = 2; + */ + public Builder setLeft( + NodeProtos.Node.Builder builderForValue) { + if (leftBuilder_ == null) { + left_ = builderForValue.build(); + onChanged(); + } else { + leftBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .Node left = 2; + */ + public Builder mergeLeft(NodeProtos.Node value) { + if (leftBuilder_ == null) { + if (((bitField0_ & 0x00000002) == 0x00000002) && + left_ != NodeProtos.Node.getDefaultInstance()) { + left_ = + NodeProtos.Node.newBuilder(left_).mergeFrom(value).buildPartial(); + } else { + left_ = value; + } + onChanged(); + } else { + leftBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .Node left = 2; + */ + public Builder clearLeft() { + if (leftBuilder_ == null) { + left_ = NodeProtos.Node.getDefaultInstance(); + onChanged(); + } else { + leftBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + * optional .Node left = 2; + */ + public NodeProtos.Node.Builder getLeftBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getLeftFieldBuilder().getBuilder(); + } + /** + * optional .Node left = 2; + */ + public NodeProtos.NodeOrBuilder getLeftOrBuilder() { + if (leftBuilder_ != null) { + return leftBuilder_.getMessageOrBuilder(); + } else { + return left_; + } + } + /** + * optional .Node left = 2; + */ + private com.google.protobuf.SingleFieldBuilder< + NodeProtos.Node, NodeProtos.Node.Builder, NodeProtos.NodeOrBuilder> + getLeftFieldBuilder() { + if (leftBuilder_ == null) { + leftBuilder_ = new com.google.protobuf.SingleFieldBuilder< + NodeProtos.Node, NodeProtos.Node.Builder, NodeProtos.NodeOrBuilder>( + left_, + getParentForChildren(), + isClean()); + left_ = null; + } + return leftBuilder_; + } + + // optional .Node right = 3; + private NodeProtos.Node right_ = NodeProtos.Node.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + NodeProtos.Node, NodeProtos.Node.Builder, NodeProtos.NodeOrBuilder> rightBuilder_; + /** + * optional .Node right = 3; + */ + public boolean hasRight() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .Node right = 3; + */ + public NodeProtos.Node getRight() { + if (rightBuilder_ == null) { + return right_; + } else { + return rightBuilder_.getMessage(); + } + } + /** + * optional .Node right = 3; + */ + public Builder setRight(NodeProtos.Node value) { + if (rightBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + right_ = value; + onChanged(); + } else { + rightBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .Node right = 3; + */ + public Builder setRight( + NodeProtos.Node.Builder builderForValue) { + if (rightBuilder_ == null) { + right_ = builderForValue.build(); + onChanged(); + } else { + rightBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .Node right = 3; + */ + public Builder mergeRight(NodeProtos.Node value) { + if (rightBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004) && + right_ != NodeProtos.Node.getDefaultInstance()) { + right_ = + NodeProtos.Node.newBuilder(right_).mergeFrom(value).buildPartial(); + } else { + right_ = value; + } + onChanged(); + } else { + rightBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .Node right = 3; + */ + public Builder clearRight() { + if (rightBuilder_ == null) { + right_ = NodeProtos.Node.getDefaultInstance(); + onChanged(); + } else { + rightBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + * optional .Node right = 3; + */ + public NodeProtos.Node.Builder getRightBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getRightFieldBuilder().getBuilder(); + } + /** + * optional .Node right = 3; + */ + public NodeProtos.NodeOrBuilder getRightOrBuilder() { + if (rightBuilder_ != null) { + return rightBuilder_.getMessageOrBuilder(); + } else { + return right_; + } + } + /** + * optional .Node right = 3; + */ + private com.google.protobuf.SingleFieldBuilder< + NodeProtos.Node, NodeProtos.Node.Builder, NodeProtos.NodeOrBuilder> + getRightFieldBuilder() { + if (rightBuilder_ == null) { + rightBuilder_ = new com.google.protobuf.SingleFieldBuilder< + NodeProtos.Node, NodeProtos.Node.Builder, NodeProtos.NodeOrBuilder>( + right_, + getParentForChildren(), + isClean()); + right_ = null; + } + return rightBuilder_; + } + + // @@protoc_insertion_point(builder_scope:Node) + } + + static { + defaultInstance = new Node(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:Node) + } + + private static com.google.protobuf.Descriptors.Descriptor + internal_static_Node_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_Node_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\nNode.proto\"?\n\004Node\022\014\n\004name\030\001 \002(\t\022\023\n\004le" + + "ft\030\002 \001(\0132\005.Node\022\024\n\005right\030\003 \001(\0132\005.NodeBG\n" + + "9com.kylinolap.storage.hbase.coprocessor" + + ".example.generatedB\nNodeProtos" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + internal_static_Node_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Node_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_Node_descriptor, + new java.lang.String[] { "Name", "Left", "Right", }); + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/generated/IIProtos.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/generated/IIProtos.java new file mode 100644 index 0000000..b804bcd --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/generated/IIProtos.java @@ -0,0 +1,1623 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: storage/src/main/java/com/kylinolap/storage/hbase/protobuf/II.proto + +package com.kylinolap.storage.hbase.coprocessor.endpoint.generated; + +import com.google.protobuf.AbstractMessage; + +public final class IIProtos { + private IIProtos() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface IIRequestOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // required bytes tableInfo = 1; + /** + * required bytes tableInfo = 1; + */ + boolean hasTableInfo(); + /** + * required bytes tableInfo = 1; + */ + com.google.protobuf.ByteString getTableInfo(); + + // required bytes sRowType = 2; + /** + * required bytes sRowType = 2; + */ + boolean hasSRowType(); + /** + * required bytes sRowType = 2; + */ + com.google.protobuf.ByteString getSRowType(); + + // optional bytes sRowFilter = 3; + /** + * optional bytes sRowFilter = 3; + */ + boolean hasSRowFilter(); + /** + * optional bytes sRowFilter = 3; + */ + com.google.protobuf.ByteString getSRowFilter(); + + // optional bytes sRowProjector = 4; + /** + * optional bytes sRowProjector = 4; + */ + boolean hasSRowProjector(); + /** + * optional bytes sRowProjector = 4; + */ + com.google.protobuf.ByteString getSRowProjector(); + + // optional bytes sRowAggregator = 5; + /** + * optional bytes sRowAggregator = 5; + */ + boolean hasSRowAggregator(); + /** + * optional bytes sRowAggregator = 5; + */ + com.google.protobuf.ByteString getSRowAggregator(); + } + /** + * Protobuf type {@code IIRequest} + */ + public static final class IIRequest extends + com.google.protobuf.GeneratedMessage + implements IIRequestOrBuilder { + // Use IIRequest.newBuilder() to construct. + private IIRequest(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private IIRequest(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final IIRequest defaultInstance; + public static IIRequest getDefaultInstance() { + return defaultInstance; + } + + public IIRequest getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private IIRequest( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + tableInfo_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + sRowType_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + sRowFilter_ = input.readBytes(); + break; + } + case 34: { + bitField0_ |= 0x00000008; + sRowProjector_ = input.readBytes(); + break; + } + case 42: { + bitField0_ |= 0x00000010; + sRowAggregator_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return IIProtos.internal_static_IIRequest_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return IIProtos.internal_static_IIRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + IIProtos.IIRequest.class, IIProtos.IIRequest.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public IIRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new IIRequest(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // required bytes tableInfo = 1; + public static final int TABLEINFO_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString tableInfo_; + /** + * required bytes tableInfo = 1; + */ + public boolean hasTableInfo() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required bytes tableInfo = 1; + */ + public com.google.protobuf.ByteString getTableInfo() { + return tableInfo_; + } + + // required bytes sRowType = 2; + public static final int SROWTYPE_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString sRowType_; + /** + * required bytes sRowType = 2; + */ + public boolean hasSRowType() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * required bytes sRowType = 2; + */ + public com.google.protobuf.ByteString getSRowType() { + return sRowType_; + } + + // optional bytes sRowFilter = 3; + public static final int SROWFILTER_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString sRowFilter_; + /** + * optional bytes sRowFilter = 3; + */ + public boolean hasSRowFilter() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes sRowFilter = 3; + */ + public com.google.protobuf.ByteString getSRowFilter() { + return sRowFilter_; + } + + // optional bytes sRowProjector = 4; + public static final int SROWPROJECTOR_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString sRowProjector_; + /** + * optional bytes sRowProjector = 4; + */ + public boolean hasSRowProjector() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes sRowProjector = 4; + */ + public com.google.protobuf.ByteString getSRowProjector() { + return sRowProjector_; + } + + // optional bytes sRowAggregator = 5; + public static final int SROWAGGREGATOR_FIELD_NUMBER = 5; + private com.google.protobuf.ByteString sRowAggregator_; + /** + * optional bytes sRowAggregator = 5; + */ + public boolean hasSRowAggregator() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional bytes sRowAggregator = 5; + */ + public com.google.protobuf.ByteString getSRowAggregator() { + return sRowAggregator_; + } + + private void initFields() { + tableInfo_ = com.google.protobuf.ByteString.EMPTY; + sRowType_ = com.google.protobuf.ByteString.EMPTY; + sRowFilter_ = com.google.protobuf.ByteString.EMPTY; + sRowProjector_ = com.google.protobuf.ByteString.EMPTY; + sRowAggregator_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + if (!hasTableInfo()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasSRowType()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, tableInfo_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, sRowType_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, sRowFilter_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, sRowProjector_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeBytes(5, sRowAggregator_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, tableInfo_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, sRowType_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, sRowFilter_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, sRowProjector_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(5, sRowAggregator_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof IIProtos.IIRequest)) { + return super.equals(obj); + } + IIProtos.IIRequest other = (IIProtos.IIRequest) obj; + + boolean result = true; + result = result && (hasTableInfo() == other.hasTableInfo()); + if (hasTableInfo()) { + result = result && getTableInfo() + .equals(other.getTableInfo()); + } + result = result && (hasSRowType() == other.hasSRowType()); + if (hasSRowType()) { + result = result && getSRowType() + .equals(other.getSRowType()); + } + result = result && (hasSRowFilter() == other.hasSRowFilter()); + if (hasSRowFilter()) { + result = result && getSRowFilter() + .equals(other.getSRowFilter()); + } + result = result && (hasSRowProjector() == other.hasSRowProjector()); + if (hasSRowProjector()) { + result = result && getSRowProjector() + .equals(other.getSRowProjector()); + } + result = result && (hasSRowAggregator() == other.hasSRowAggregator()); + if (hasSRowAggregator()) { + result = result && getSRowAggregator() + .equals(other.getSRowAggregator()); + } + result = result && + getUnknownFields().equals(other.getUnknownFields()); + return result; + } + + private int memoizedHashCode = 0; + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptorForType().hashCode(); + if (hasTableInfo()) { + hash = (37 * hash) + TABLEINFO_FIELD_NUMBER; + hash = (53 * hash) + getTableInfo().hashCode(); + } + if (hasSRowType()) { + hash = (37 * hash) + SROWTYPE_FIELD_NUMBER; + hash = (53 * hash) + getSRowType().hashCode(); + } + if (hasSRowFilter()) { + hash = (37 * hash) + SROWFILTER_FIELD_NUMBER; + hash = (53 * hash) + getSRowFilter().hashCode(); + } + if (hasSRowProjector()) { + hash = (37 * hash) + SROWPROJECTOR_FIELD_NUMBER; + hash = (53 * hash) + getSRowProjector().hashCode(); + } + if (hasSRowAggregator()) { + hash = (37 * hash) + SROWAGGREGATOR_FIELD_NUMBER; + hash = (53 * hash) + getSRowAggregator().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static IIProtos.IIRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static IIProtos.IIRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static IIProtos.IIRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static IIProtos.IIRequest parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static IIProtos.IIRequest parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static IIProtos.IIRequest parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static IIProtos.IIRequest parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static IIProtos.IIRequest parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static IIProtos.IIRequest parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static IIProtos.IIRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(IIProtos.IIRequest prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code IIRequest} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements IIProtos.IIRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return IIProtos.internal_static_IIRequest_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return IIProtos.internal_static_IIRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + IIProtos.IIRequest.class, IIProtos.IIRequest.Builder.class); + } + + // Construct using com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + tableInfo_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + sRowType_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + sRowFilter_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + sRowProjector_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + sRowAggregator_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return IIProtos.internal_static_IIRequest_descriptor; + } + + public IIProtos.IIRequest getDefaultInstanceForType() { + return IIProtos.IIRequest.getDefaultInstance(); + } + + public IIProtos.IIRequest build() { + IIProtos.IIRequest result = buildPartial(); + if (!result.isInitialized()) { + throw AbstractMessage.Builder.newUninitializedMessageException(result); + } + return result; + } + + public IIProtos.IIRequest buildPartial() { + IIProtos.IIRequest result = new IIProtos.IIRequest(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.tableInfo_ = tableInfo_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.sRowType_ = sRowType_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.sRowFilter_ = sRowFilter_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.sRowProjector_ = sRowProjector_; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000010; + } + result.sRowAggregator_ = sRowAggregator_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof IIProtos.IIRequest) { + return mergeFrom((IIProtos.IIRequest)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(IIProtos.IIRequest other) { + if (other == IIProtos.IIRequest.getDefaultInstance()) return this; + if (other.hasTableInfo()) { + setTableInfo(other.getTableInfo()); + } + if (other.hasSRowType()) { + setSRowType(other.getSRowType()); + } + if (other.hasSRowFilter()) { + setSRowFilter(other.getSRowFilter()); + } + if (other.hasSRowProjector()) { + setSRowProjector(other.getSRowProjector()); + } + if (other.hasSRowAggregator()) { + setSRowAggregator(other.getSRowAggregator()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasTableInfo()) { + + return false; + } + if (!hasSRowType()) { + + return false; + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + IIProtos.IIRequest parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (IIProtos.IIRequest) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // required bytes tableInfo = 1; + private com.google.protobuf.ByteString tableInfo_ = com.google.protobuf.ByteString.EMPTY; + /** + * required bytes tableInfo = 1; + */ + public boolean hasTableInfo() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required bytes tableInfo = 1; + */ + public com.google.protobuf.ByteString getTableInfo() { + return tableInfo_; + } + /** + * required bytes tableInfo = 1; + */ + public Builder setTableInfo(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + tableInfo_ = value; + onChanged(); + return this; + } + /** + * required bytes tableInfo = 1; + */ + public Builder clearTableInfo() { + bitField0_ = (bitField0_ & ~0x00000001); + tableInfo_ = getDefaultInstance().getTableInfo(); + onChanged(); + return this; + } + + // required bytes sRowType = 2; + private com.google.protobuf.ByteString sRowType_ = com.google.protobuf.ByteString.EMPTY; + /** + * required bytes sRowType = 2; + */ + public boolean hasSRowType() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * required bytes sRowType = 2; + */ + public com.google.protobuf.ByteString getSRowType() { + return sRowType_; + } + /** + * required bytes sRowType = 2; + */ + public Builder setSRowType(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + sRowType_ = value; + onChanged(); + return this; + } + /** + * required bytes sRowType = 2; + */ + public Builder clearSRowType() { + bitField0_ = (bitField0_ & ~0x00000002); + sRowType_ = getDefaultInstance().getSRowType(); + onChanged(); + return this; + } + + // optional bytes sRowFilter = 3; + private com.google.protobuf.ByteString sRowFilter_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes sRowFilter = 3; + */ + public boolean hasSRowFilter() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes sRowFilter = 3; + */ + public com.google.protobuf.ByteString getSRowFilter() { + return sRowFilter_; + } + /** + * optional bytes sRowFilter = 3; + */ + public Builder setSRowFilter(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + sRowFilter_ = value; + onChanged(); + return this; + } + /** + * optional bytes sRowFilter = 3; + */ + public Builder clearSRowFilter() { + bitField0_ = (bitField0_ & ~0x00000004); + sRowFilter_ = getDefaultInstance().getSRowFilter(); + onChanged(); + return this; + } + + // optional bytes sRowProjector = 4; + private com.google.protobuf.ByteString sRowProjector_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes sRowProjector = 4; + */ + public boolean hasSRowProjector() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes sRowProjector = 4; + */ + public com.google.protobuf.ByteString getSRowProjector() { + return sRowProjector_; + } + /** + * optional bytes sRowProjector = 4; + */ + public Builder setSRowProjector(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + sRowProjector_ = value; + onChanged(); + return this; + } + /** + * optional bytes sRowProjector = 4; + */ + public Builder clearSRowProjector() { + bitField0_ = (bitField0_ & ~0x00000008); + sRowProjector_ = getDefaultInstance().getSRowProjector(); + onChanged(); + return this; + } + + // optional bytes sRowAggregator = 5; + private com.google.protobuf.ByteString sRowAggregator_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes sRowAggregator = 5; + */ + public boolean hasSRowAggregator() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional bytes sRowAggregator = 5; + */ + public com.google.protobuf.ByteString getSRowAggregator() { + return sRowAggregator_; + } + /** + * optional bytes sRowAggregator = 5; + */ + public Builder setSRowAggregator(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + sRowAggregator_ = value; + onChanged(); + return this; + } + /** + * optional bytes sRowAggregator = 5; + */ + public Builder clearSRowAggregator() { + bitField0_ = (bitField0_ & ~0x00000010); + sRowAggregator_ = getDefaultInstance().getSRowAggregator(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:IIRequest) + } + + static { + defaultInstance = new IIRequest(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:IIRequest) + } + + public interface IIResponseOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // repeated bytes rows = 1; + /** + * repeated bytes rows = 1; + */ + java.util.List getRowsList(); + /** + * repeated bytes rows = 1; + */ + int getRowsCount(); + /** + * repeated bytes rows = 1; + */ + com.google.protobuf.ByteString getRows(int index); + } + /** + * Protobuf type {@code IIResponse} + */ + public static final class IIResponse extends + com.google.protobuf.GeneratedMessage + implements IIResponseOrBuilder { + // Use IIResponse.newBuilder() to construct. + private IIResponse(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private IIResponse(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final IIResponse defaultInstance; + public static IIResponse getDefaultInstance() { + return defaultInstance; + } + + public IIResponse getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private IIResponse( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + rows_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + rows_.add(input.readBytes()); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + rows_ = java.util.Collections.unmodifiableList(rows_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return IIProtos.internal_static_IIResponse_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return IIProtos.internal_static_IIResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + IIProtos.IIResponse.class, IIProtos.IIResponse.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public IIResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new IIResponse(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + // repeated bytes rows = 1; + public static final int ROWS_FIELD_NUMBER = 1; + private java.util.List rows_; + /** + * repeated bytes rows = 1; + */ + public java.util.List + getRowsList() { + return rows_; + } + /** + * repeated bytes rows = 1; + */ + public int getRowsCount() { + return rows_.size(); + } + /** + * repeated bytes rows = 1; + */ + public com.google.protobuf.ByteString getRows(int index) { + return rows_.get(index); + } + + private void initFields() { + rows_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + for (int i = 0; i < rows_.size(); i++) { + output.writeBytes(1, rows_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + { + int dataSize = 0; + for (int i = 0; i < rows_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeBytesSizeNoTag(rows_.get(i)); + } + size += dataSize; + size += 1 * getRowsList().size(); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof IIProtos.IIResponse)) { + return super.equals(obj); + } + IIProtos.IIResponse other = (IIProtos.IIResponse) obj; + + boolean result = true; + result = result && getRowsList() + .equals(other.getRowsList()); + result = result && + getUnknownFields().equals(other.getUnknownFields()); + return result; + } + + private int memoizedHashCode = 0; + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptorForType().hashCode(); + if (getRowsCount() > 0) { + hash = (37 * hash) + ROWS_FIELD_NUMBER; + hash = (53 * hash) + getRowsList().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static IIProtos.IIResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static IIProtos.IIResponse parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static IIProtos.IIResponse parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static IIProtos.IIResponse parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static IIProtos.IIResponse parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static IIProtos.IIResponse parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static IIProtos.IIResponse parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static IIProtos.IIResponse parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static IIProtos.IIResponse parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static IIProtos.IIResponse parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(IIProtos.IIResponse prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code IIResponse} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements IIProtos.IIResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return IIProtos.internal_static_IIResponse_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return IIProtos.internal_static_IIResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + IIProtos.IIResponse.class, IIProtos.IIResponse.Builder.class); + } + + // Construct using com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + rows_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return IIProtos.internal_static_IIResponse_descriptor; + } + + public IIProtos.IIResponse getDefaultInstanceForType() { + return IIProtos.IIResponse.getDefaultInstance(); + } + + public IIProtos.IIResponse build() { + IIProtos.IIResponse result = buildPartial(); + if (!result.isInitialized()) { + throw AbstractMessage.Builder.newUninitializedMessageException(result); + } + return result; + } + + public IIProtos.IIResponse buildPartial() { + IIProtos.IIResponse result = new IIProtos.IIResponse(this); + int from_bitField0_ = bitField0_; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + rows_ = java.util.Collections.unmodifiableList(rows_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.rows_ = rows_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof IIProtos.IIResponse) { + return mergeFrom((IIProtos.IIResponse)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(IIProtos.IIResponse other) { + if (other == IIProtos.IIResponse.getDefaultInstance()) return this; + if (!other.rows_.isEmpty()) { + if (rows_.isEmpty()) { + rows_ = other.rows_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureRowsIsMutable(); + rows_.addAll(other.rows_); + } + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + IIProtos.IIResponse parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (IIProtos.IIResponse) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // repeated bytes rows = 1; + private java.util.List rows_ = java.util.Collections.emptyList(); + private void ensureRowsIsMutable() { + if (!((bitField0_ & 0x00000001) == 0x00000001)) { + rows_ = new java.util.ArrayList(rows_); + bitField0_ |= 0x00000001; + } + } + /** + * repeated bytes rows = 1; + */ + public java.util.List + getRowsList() { + return java.util.Collections.unmodifiableList(rows_); + } + /** + * repeated bytes rows = 1; + */ + public int getRowsCount() { + return rows_.size(); + } + /** + * repeated bytes rows = 1; + */ + public com.google.protobuf.ByteString getRows(int index) { + return rows_.get(index); + } + /** + * repeated bytes rows = 1; + */ + public Builder setRows( + int index, com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureRowsIsMutable(); + rows_.set(index, value); + onChanged(); + return this; + } + /** + * repeated bytes rows = 1; + */ + public Builder addRows(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureRowsIsMutable(); + rows_.add(value); + onChanged(); + return this; + } + /** + * repeated bytes rows = 1; + */ + public Builder addAllRows( + java.lang.Iterable values) { + ensureRowsIsMutable(); + super.addAll(values, rows_); + onChanged(); + return this; + } + /** + * repeated bytes rows = 1; + */ + public Builder clearRows() { + rows_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:IIResponse) + } + + static { + defaultInstance = new IIResponse(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:IIResponse) + } + + /** + * Protobuf service {@code RowsService} + */ + public static abstract class RowsService + implements com.google.protobuf.Service { + protected RowsService() {} + + public interface Interface { + /** + * rpc getRows(.IIRequest) returns (.IIResponse); + */ + public abstract void getRows( + com.google.protobuf.RpcController controller, + IIProtos.IIRequest request, + com.google.protobuf.RpcCallback done); + + } + + public static com.google.protobuf.Service newReflectiveService( + final Interface impl) { + return new RowsService() { + @java.lang.Override + public void getRows( + com.google.protobuf.RpcController controller, + IIProtos.IIRequest request, + com.google.protobuf.RpcCallback done) { + impl.getRows(controller, request, done); + } + + }; + } + + public static com.google.protobuf.BlockingService + newReflectiveBlockingService(final BlockingInterface impl) { + return new com.google.protobuf.BlockingService() { + public final com.google.protobuf.Descriptors.ServiceDescriptor + getDescriptorForType() { + return getDescriptor(); + } + + public final com.google.protobuf.Message callBlockingMethod( + com.google.protobuf.Descriptors.MethodDescriptor method, + com.google.protobuf.RpcController controller, + com.google.protobuf.Message request) + throws com.google.protobuf.ServiceException { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.callBlockingMethod() given method descriptor for " + + "wrong service type."); + } + switch(method.getIndex()) { + case 0: + return impl.getRows(controller, (IIProtos.IIRequest)request); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public final com.google.protobuf.Message + getRequestPrototype( + com.google.protobuf.Descriptors.MethodDescriptor method) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.getRequestPrototype() given method " + + "descriptor for wrong service type."); + } + switch(method.getIndex()) { + case 0: + return IIProtos.IIRequest.getDefaultInstance(); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public final com.google.protobuf.Message + getResponsePrototype( + com.google.protobuf.Descriptors.MethodDescriptor method) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.getResponsePrototype() given method " + + "descriptor for wrong service type."); + } + switch(method.getIndex()) { + case 0: + return IIProtos.IIResponse.getDefaultInstance(); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + }; + } + + /** + * rpc getRows(.IIRequest) returns (.IIResponse); + */ + public abstract void getRows( + com.google.protobuf.RpcController controller, + IIProtos.IIRequest request, + com.google.protobuf.RpcCallback done); + + public static final + com.google.protobuf.Descriptors.ServiceDescriptor + getDescriptor() { + return IIProtos.getDescriptor().getServices().get(0); + } + public final com.google.protobuf.Descriptors.ServiceDescriptor + getDescriptorForType() { + return getDescriptor(); + } + + public final void callMethod( + com.google.protobuf.Descriptors.MethodDescriptor method, + com.google.protobuf.RpcController controller, + com.google.protobuf.Message request, + com.google.protobuf.RpcCallback< + com.google.protobuf.Message> done) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.callMethod() given method descriptor for wrong " + + "service type."); + } + switch(method.getIndex()) { + case 0: + this.getRows(controller, (IIProtos.IIRequest)request, + com.google.protobuf.RpcUtil.specializeCallback( + done)); + return; + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public final com.google.protobuf.Message + getRequestPrototype( + com.google.protobuf.Descriptors.MethodDescriptor method) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.getRequestPrototype() given method " + + "descriptor for wrong service type."); + } + switch(method.getIndex()) { + case 0: + return IIProtos.IIRequest.getDefaultInstance(); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public final com.google.protobuf.Message + getResponsePrototype( + com.google.protobuf.Descriptors.MethodDescriptor method) { + if (method.getService() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "Service.getResponsePrototype() given method " + + "descriptor for wrong service type."); + } + switch(method.getIndex()) { + case 0: + return IIProtos.IIResponse.getDefaultInstance(); + default: + throw new java.lang.AssertionError("Can't get here."); + } + } + + public static Stub newStub( + com.google.protobuf.RpcChannel channel) { + return new Stub(channel); + } + + public static final class Stub extends IIProtos.RowsService implements Interface { + private Stub(com.google.protobuf.RpcChannel channel) { + this.channel = channel; + } + + private final com.google.protobuf.RpcChannel channel; + + public com.google.protobuf.RpcChannel getChannel() { + return channel; + } + + public void getRows( + com.google.protobuf.RpcController controller, + IIProtos.IIRequest request, + com.google.protobuf.RpcCallback done) { + channel.callMethod( + getDescriptor().getMethods().get(0), + controller, + request, + IIProtos.IIResponse.getDefaultInstance(), + com.google.protobuf.RpcUtil.generalizeCallback( + done, + IIProtos.IIResponse.class, + IIProtos.IIResponse.getDefaultInstance())); + } + } + + public static BlockingInterface newBlockingStub( + com.google.protobuf.BlockingRpcChannel channel) { + return new BlockingStub(channel); + } + + public interface BlockingInterface { + public IIProtos.IIResponse getRows( + com.google.protobuf.RpcController controller, + IIProtos.IIRequest request) + throws com.google.protobuf.ServiceException; + } + + private static final class BlockingStub implements BlockingInterface { + private BlockingStub(com.google.protobuf.BlockingRpcChannel channel) { + this.channel = channel; + } + + private final com.google.protobuf.BlockingRpcChannel channel; + + public IIProtos.IIResponse getRows( + com.google.protobuf.RpcController controller, + IIProtos.IIRequest request) + throws com.google.protobuf.ServiceException { + return (IIProtos.IIResponse) channel.callBlockingMethod( + getDescriptor().getMethods().get(0), + controller, + request, + IIProtos.IIResponse.getDefaultInstance()); + } + + } + + // @@protoc_insertion_point(class_scope:RowsService) + } + + private static com.google.protobuf.Descriptors.Descriptor + internal_static_IIRequest_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_IIRequest_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_IIResponse_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_IIResponse_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\nCstorage/src/main/java/com/kylinolap/st" + + "orage/hbase/protobuf/II.proto\"s\n\tIIReque" + + "st\022\021\n\ttableInfo\030\001 \002(\014\022\020\n\010sRowType\030\002 \002(\014\022" + + "\022\n\nsRowFilter\030\003 \001(\014\022\025\n\rsRowProjector\030\004 \001" + + "(\014\022\026\n\016sRowAggregator\030\005 \001(\014\"\032\n\nIIResponse" + + "\022\014\n\004rows\030\001 \003(\01421\n\013RowsService\022\"\n\007getRows" + + "\022\n.IIRequest\032\013.IIResponseBB\n.com.kylinol" + + "ap.storage.hbase.endpoint.generatedB\010IIP" + + "rotosH\001\210\001\001\240\001\001" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + internal_static_IIRequest_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_IIRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_IIRequest_descriptor, + new java.lang.String[] { "TableInfo", "SRowType", "SRowFilter", "SRowProjector", "SRowAggregator", }); + internal_static_IIResponse_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_IIResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_IIResponse_descriptor, + new java.lang.String[] { "Rows", }); + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/protobuf/II.proto b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/protobuf/II.proto new file mode 100644 index 0000000..b3faeee --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/protobuf/II.proto @@ -0,0 +1,26 @@ + +// usage: +// protoc --java_out=./storage/src/main/java ./storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/protobuf/II.proto + +option java_package = "com.kylinolap.storage.hbase.endpoint.generated"; +option java_outer_classname = "IIProtos"; +option java_generic_services = true; +option java_generate_equals_and_hash = true; +option optimize_for = SPEED; + +message IIRequest { + required bytes tableInfo = 1; + required bytes sRowType = 2; + optional bytes sRowFilter = 3; + optional bytes sRowProjector = 4; + optional bytes sRowAggregator = 5; +} + +message IIResponse { + repeated bytes rows = 1; +} + +service RowsService { + rpc getRows(IIRequest) + returns (IIResponse); +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/protobuf/Node.proto b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/protobuf/Node.proto new file mode 100644 index 0000000..8f32385 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/protobuf/Node.proto @@ -0,0 +1,28 @@ +/** + * 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. + */ + +option java_package = "com.kylinolap.storage.hbase.coprocessor.example.generated"; +option java_outer_classname = "NodeProtos"; + +message Node +{ + required string name = 1; + optional Node left = 2; + optional Node right =3; +} + diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/protobuf/example.proto b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/protobuf/example.proto new file mode 100644 index 0000000..2d38b6d --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/protobuf/example.proto @@ -0,0 +1,37 @@ +/** + * 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. + */ + +option java_package = "com.kylinolap.storage.hbase.coprocessor.example.generated"; +option java_outer_classname = "ExampleProtos"; +option java_generic_services = true; +option java_generate_equals_and_hash = true; +option optimize_for = SPEED; + +message CountRequest { +} + +message CountResponse { + required int64 count = 1 [default = 0]; +} + +service RowCountService { + rpc getRowCount(CountRequest) + returns (CountResponse); + rpc getKeyValueCount(CountRequest) + returns (CountResponse); +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserver.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserver.java new file mode 100644 index 0000000..2ee8642 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserver.java @@ -0,0 +1,97 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.coprocessor.observer; + +import java.io.IOException; + +import com.kylinolap.storage.hbase.coprocessor.CoprocessorFilter; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hbase.client.Scan; +import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver; +import org.apache.hadoop.hbase.coprocessor.ObserverContext; +import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; +import org.apache.hadoop.hbase.regionserver.HRegion; +import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost; +import org.apache.hadoop.hbase.regionserver.RegionScanner; + +/** + * @author yangli9 + */ +public class AggregateRegionObserver extends BaseRegionObserver { + + // HBase uses common logging (vs. Kylin uses slf4j) + static final Log LOG = LogFactory.getLog(AggregateRegionObserver.class); + + static final String COPROCESSOR_ENABLE = "_Coprocessor_Enable"; + static final String TYPE = "_Type"; + static final String PROJECTOR = "_Projector"; + static final String AGGREGATORS = "_Aggregators"; + static final String FILTER = "_Filter"; + + @Override + public final RegionScanner postScannerOpen(final ObserverContext ctxt, final Scan scan, final RegionScanner innerScanner) throws IOException { + + boolean copAbortOnError = ctxt.getEnvironment().getConfiguration().getBoolean(RegionCoprocessorHost.ABORT_ON_ERROR_KEY, RegionCoprocessorHost.DEFAULT_ABORT_ON_ERROR); + + // never throw out exception that could abort region server + if (copAbortOnError) { + try { + return doPostScannerObserver(ctxt, scan, innerScanner); + } catch (Throwable e) { + LOG.error("Kylin Coprocessor Error", e); + return innerScanner; + } + } else { + return doPostScannerObserver(ctxt, scan, innerScanner); + } + } + + private RegionScanner doPostScannerObserver(final ObserverContext ctxt, final Scan scan, final RegionScanner innerScanner) throws IOException { + byte[] coprocessorEnableBytes = scan.getAttribute(COPROCESSOR_ENABLE); + if (coprocessorEnableBytes == null || coprocessorEnableBytes.length == 0 || coprocessorEnableBytes[0] == 0) { + return innerScanner; + } + + byte[] typeBytes = scan.getAttribute(TYPE); + ObserverRowType type = ObserverRowType.deserialize(typeBytes); + + byte[] projectorBytes = scan.getAttribute(PROJECTOR); + ObserverProjector projector = ObserverProjector.deserialize(projectorBytes); + + byte[] aggregatorBytes = scan.getAttribute(AGGREGATORS); + ObserverAggregators aggregators = ObserverAggregators.deserialize(aggregatorBytes); + + byte[] filterBytes = scan.getAttribute(FILTER); + CoprocessorFilter filter = CoprocessorFilter.deserialize(filterBytes); + + // start/end region operation & sync on scanner is suggested by the + // javadoc of RegionScanner.nextRaw() + // FIXME: will the lock still work when a iterator is returned? is it safe? Is readonly attribute helping here? by mhb + HRegion region = ctxt.getEnvironment().getRegion(); + region.startRegionOperation(); + try { + synchronized (innerScanner) { + return new AggregationScanner(type, filter, projector, aggregators, innerScanner); + } + } finally { + region.closeRegionOperation(); + } + + } + +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationCache.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationCache.java new file mode 100644 index 0000000..580f1e9 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationCache.java @@ -0,0 +1,194 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.coprocessor.observer; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Iterator; +import java.util.List; +import java.util.Map.Entry; +import java.util.SortedMap; + +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.HRegionInfo; +import org.apache.hadoop.hbase.KeyValue; +import org.apache.hadoop.hbase.KeyValue.Type; +import org.apache.hadoop.hbase.regionserver.RegionScanner; + +import com.google.common.collect.Maps; +import com.kylinolap.cube.measure.MeasureAggregator; + +/** + * @author yangli9 + * + */ +@SuppressWarnings("rawtypes") +public class AggregationCache { + + static final int MEMORY_USAGE_CAP = 500 * 1024 * 1024; // 500 MB + + private final SortedMap aggBufMap; + private final ObserverAggregators aggregators; + + transient int rowMemBytes; + + public AggregationCache(ObserverAggregators aggregators) { + this.aggregators = aggregators; + this.aggBufMap = Maps.newTreeMap(); + } + + public MeasureAggregator[] getBuffer(ObserverProjector.AggrKey aggkey) { + MeasureAggregator[] aggBuf = aggBufMap.get(aggkey); + if (aggBuf == null) { + aggBuf = aggregators.createBuffer(); + aggBufMap.put(aggkey.copy(), aggBuf); + } + return aggBuf; + } + + public RegionScanner getScanner(RegionScanner innerScanner) { + return new AggregationRegionScanner(innerScanner); + } + + public long getSize() { + return aggBufMap.size(); + } + + public void checkMemoryUsage() { + // about memory calculation, + // http://seniorjava.wordpress.com/2013/09/01/java-objects-memory-size-reference/ + if (rowMemBytes <= 0) { + if (aggBufMap.size() > 0) { + rowMemBytes = 0; + MeasureAggregator[] measureAggregators = aggBufMap.get(aggBufMap.firstKey()); + for (MeasureAggregator agg : measureAggregators) { + rowMemBytes += agg.getMemBytes(); + } + } + } + int size = aggBufMap.size(); + int memUsage = (40 + rowMemBytes) * size; + if (memUsage > MEMORY_USAGE_CAP) { + throw new RuntimeException("Kylin coprocess memory usage goes beyond cap, (40 + " + rowMemBytes + ") * " + size + " > " + MEMORY_USAGE_CAP + ". Abord coprocessor."); + } + } + + private class AggregationRegionScanner implements RegionScanner { + + private final RegionScanner innerScanner; + private final Iterator> iterator; + + public AggregationRegionScanner(RegionScanner innerScanner) { + this.innerScanner = innerScanner; + this.iterator = aggBufMap.entrySet().iterator(); + } + + @Override + public boolean next(List results) throws IOException { + // AggregateRegionObserver.LOG.info("Kylin Scanner next()"); + boolean hasMore = false; + if (iterator.hasNext()) { + Entry entry = iterator.next(); + makeCells(entry, results); + hasMore = iterator.hasNext(); + } + // AggregateRegionObserver.LOG.info("Kylin Scanner next() done"); + return hasMore; + } + + private void makeCells(Entry entry, List results) { + byte[][] families = aggregators.getHColFamilies(); + byte[][] qualifiers = aggregators.getHColQualifiers(); + int nHCols = aggregators.getHColsNum(); + + ObserverProjector.AggrKey rowKey = entry.getKey(); + MeasureAggregator[] aggBuf = entry.getValue(); + ByteBuffer[] rowValues = aggregators.getHColValues(aggBuf); + + if (nHCols == 0) { + Cell keyValue = new KeyValue(rowKey.get(), rowKey.offset(), rowKey.length(), // + null, 0, 0, // + null, 0, 0, // + HConstants.LATEST_TIMESTAMP, Type.Put, // + null, 0, 0); + results.add(keyValue); + } else { + for (int i = 0; i < nHCols; i++) { + Cell keyValue = new KeyValue(rowKey.get(), rowKey.offset(), rowKey.length(), // + families[i], 0, families[i].length, // + qualifiers[i], 0, qualifiers[i].length, // + HConstants.LATEST_TIMESTAMP, Type.Put, // + rowValues[i].array(), 0, rowValues[i].position()); + results.add(keyValue); + } + } + } + + @Override + public boolean next(List result, int limit) throws IOException { + return next(result); + } + + @Override + public boolean nextRaw(List result) throws IOException { + return next(result); + } + + @Override + public boolean nextRaw(List result, int limit) throws IOException { + return next(result); + } + + @Override + public void close() throws IOException { + // AggregateRegionObserver.LOG.info("Kylin Scanner close()"); + innerScanner.close(); + // AggregateRegionObserver.LOG.info("Kylin Scanner close() done"); + } + + @Override + public HRegionInfo getRegionInfo() { + // AggregateRegionObserver.LOG.info("Kylin Scanner getRegionInfo()"); + return innerScanner.getRegionInfo(); + } + + @Override + public long getMaxResultSize() { + // AggregateRegionObserver.LOG.info("Kylin Scanner getMaxResultSize()"); + return Long.MAX_VALUE; + } + + @Override + public boolean isFilterDone() throws IOException { + // AggregateRegionObserver.LOG.info("Kylin Scanner isFilterDone()"); + return false; + } + + @Override + public boolean reseek(byte[] row) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public long getMvccReadPoint() { + // AggregateRegionObserver.LOG.info("Kylin Scanner getMvccReadPoint()"); + return Long.MAX_VALUE; + } + } + +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationScanner.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationScanner.java new file mode 100644 index 0000000..cb1e01d --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationScanner.java @@ -0,0 +1,158 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.coprocessor.observer; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import com.kylinolap.storage.hbase.coprocessor.CoprocessorFilter; +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.HRegionInfo; +import org.apache.hadoop.hbase.regionserver.RegionScanner; + +import com.kylinolap.cube.measure.MeasureAggregator; + +/** + * @author yangli9 + * + */ +public class AggregationScanner implements RegionScanner { + + private RegionScanner outerScanner; + + public AggregationScanner(ObserverRowType type, CoprocessorFilter filter, ObserverProjector groupBy, ObserverAggregators aggrs, RegionScanner innerScanner) throws IOException { + + AggregateRegionObserver.LOG.info("Kylin Coprocessor start"); + + AggregationCache aggCache; + Stats stats = new Stats(); + + aggCache = buildAggrCache(innerScanner, type, groupBy, aggrs, filter, stats); + stats.countOutputRow(aggCache.getSize()); + this.outerScanner = aggCache.getScanner(innerScanner); + + AggregateRegionObserver.LOG.info("Kylin Coprocessor aggregation done: " + stats); + } + + @SuppressWarnings("rawtypes") + AggregationCache buildAggrCache(final RegionScanner innerScanner, ObserverRowType type, ObserverProjector projector, ObserverAggregators aggregators, CoprocessorFilter filter, Stats stats) throws IOException { + + AggregationCache aggCache = new AggregationCache(aggregators); + + ObserverTuple tuple = new ObserverTuple(type); + boolean hasMore = true; + List results = new ArrayList(); + while (hasMore) { + results.clear(); + hasMore = innerScanner.nextRaw(results); + if (results.isEmpty()) + continue; + + if (stats != null) + stats.countInputRow(results); + + Cell cell = results.get(0); + tuple.setUnderlying(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength()); + if (filter != null && filter.evaluate(tuple) == false) + continue; + + ObserverProjector.AggrKey aggKey = projector.getRowKey(results); + MeasureAggregator[] bufs = aggCache.getBuffer(aggKey); + aggregators.aggregate(bufs, results); + + aggCache.checkMemoryUsage(); + } + return aggCache; + } + + @Override + public boolean next(List results) throws IOException { + return outerScanner.next(results); + } + + @Override + public boolean next(List result, int limit) throws IOException { + return outerScanner.next(result, limit); + } + + @Override + public boolean nextRaw(List result) throws IOException { + return outerScanner.nextRaw(result); + } + + @Override + public boolean nextRaw(List result, int limit) throws IOException { + return outerScanner.nextRaw(result, limit); + } + + @Override + public void close() throws IOException { + outerScanner.close(); + } + + @Override + public HRegionInfo getRegionInfo() { + return outerScanner.getRegionInfo(); + } + + @Override + public boolean isFilterDone() throws IOException { + return outerScanner.isFilterDone(); + } + + @Override + public boolean reseek(byte[] row) throws IOException { + return outerScanner.reseek(row); + } + + @Override + public long getMaxResultSize() { + return outerScanner.getMaxResultSize(); + } + + @Override + public long getMvccReadPoint() { + return outerScanner.getMvccReadPoint(); + } + + private static class Stats { + long inputRows = 0; + long inputBytes = 0; + long outputRows = 0; + + // have no outputBytes because that requires actual serialize all the + // aggregator buffers + + public void countInputRow(List row) { + inputRows++; + inputBytes += row.get(0).getRowLength(); + for (int i = 0, n = row.size(); i < n; i++) { + inputBytes += row.get(i).getValueLength(); + } + } + + public void countOutputRow(long rowCount) { + outputRows += rowCount; + } + + public String toString() { + double percent = (double) outputRows / inputRows * 100; + return Math.round(percent) + "% = " + outputRows + " (out rows) / " + inputRows + " (in rows); in bytes = " + inputBytes + "; est. out bytes = " + Math.round(inputBytes * percent / 100); + } + } +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverAggregators.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverAggregators.java new file mode 100644 index 0000000..fb25f46 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverAggregators.java @@ -0,0 +1,260 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.coprocessor.observer; + +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.List; + +import com.kylinolap.storage.hbase.coprocessor.CoprocessorConstants; +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.util.Bytes; + +import com.kylinolap.common.util.BytesSerializer; +import com.kylinolap.common.util.BytesUtil; +import com.kylinolap.cube.kv.RowConstants; +import com.kylinolap.cube.kv.RowValueDecoder; +import com.kylinolap.cube.measure.MeasureAggregator; +import com.kylinolap.cube.measure.MeasureCodec; +import com.kylinolap.metadata.model.cube.HBaseColumnDesc; +import com.kylinolap.metadata.model.cube.MeasureDesc; + +/** + * @author yangli9 + */ +@SuppressWarnings({ "rawtypes", "unchecked" }) +public class ObserverAggregators { + + public static ObserverAggregators fromValueDecoders(Collection rowValueDecoders) { + + // each decoder represents one HBase column + HCol[] hcols = new HCol[rowValueDecoders.size()]; + int i = 0; + for (RowValueDecoder rowValueDecoder : rowValueDecoders) { + hcols[i++] = buildHCol(rowValueDecoder.getHBaseColumn()); + } + + ObserverAggregators aggrs = new ObserverAggregators(hcols); + return aggrs; + + } + + private static HCol buildHCol(HBaseColumnDesc desc) { + byte[] family = Bytes.toBytes(desc.getColumnFamilyName()); + byte[] qualifier = Bytes.toBytes(desc.getQualifier()); + MeasureDesc[] measures = desc.getMeasures(); + + String[] funcNames = new String[measures.length]; + String[] dataTypes = new String[measures.length]; + + for (int i = 0; i < measures.length; i++) { + funcNames[i] = measures[i].getFunction().getExpression(); + dataTypes[i] = measures[i].getFunction().getReturnType(); + } + + return new HCol(family, qualifier, funcNames, dataTypes); + } + + public static byte[] serialize(ObserverAggregators o) { + ByteBuffer buf = ByteBuffer.allocate(CoprocessorConstants.SERIALIZE_BUFFER_SIZE); + serializer.serialize(o, buf); + byte[] result = new byte[buf.position()]; + System.arraycopy(buf.array(), 0, result, 0, buf.position()); + return result; + } + + public static ObserverAggregators deserialize(byte[] bytes) { + return serializer.deserialize(ByteBuffer.wrap(bytes)); + } + + private static final Serializer serializer = new Serializer(); + + private static class Serializer implements BytesSerializer { + + @Override + public void serialize(ObserverAggregators value, ByteBuffer out) { + BytesUtil.writeVInt(value.nHCols, out); + for (int i = 0; i < value.nHCols; i++) { + HCol col = value.hcols[i]; + BytesUtil.writeByteArray(col.family, out); + BytesUtil.writeByteArray(col.qualifier, out); + BytesUtil.writeAsciiStringArray(col.funcNames, out); + BytesUtil.writeAsciiStringArray(col.dataTypes, out); + } + } + + @Override + public ObserverAggregators deserialize(ByteBuffer in) { + int nHCols = BytesUtil.readVInt(in); + HCol[] hcols = new HCol[nHCols]; + for (int i = 0; i < nHCols; i++) { + byte[] family = BytesUtil.readByteArray(in); + byte[] qualifier = BytesUtil.readByteArray(in); + String[] funcNames = BytesUtil.readAsciiStringArray(in); + String[] dataTypes = BytesUtil.readAsciiStringArray(in); + hcols[i] = new HCol(family, qualifier, funcNames, dataTypes); + } + return new ObserverAggregators(hcols); + } + + } + + // ============================================================================ + + final HCol[] hcols; + final int nHCols; + final ByteBuffer[] hColValues; + final int nTotalMeasures; + + public ObserverAggregators(HCol[] _hcols) { + this.hcols = sort(_hcols); + this.nHCols = hcols.length; + this.hColValues = new ByteBuffer[nHCols]; + + int nTotalMeasures = 0; + for (HCol col : hcols) + nTotalMeasures += col.nMeasures; + this.nTotalMeasures = nTotalMeasures; + } + + private HCol[] sort(HCol[] hcols) { + HCol[] copy = Arrays.copyOf(hcols, hcols.length); + Arrays.sort(copy, new Comparator() { + @Override + public int compare(HCol o1, HCol o2) { + int comp = Bytes.compareTo(o1.family, o2.family); + if (comp != 0) + return comp; + comp = Bytes.compareTo(o1.qualifier, o2.qualifier); + return comp; + } + }); + return copy; + } + + public MeasureAggregator[] createBuffer() { + MeasureAggregator[] aggrs = new MeasureAggregator[nTotalMeasures]; + int i = 0; + for (HCol col : hcols) { + for (int j = 0; j < col.nMeasures; j++) + aggrs[i++] = MeasureAggregator.create(col.funcNames[j], col.dataTypes[j]); + } + return aggrs; + } + + public void aggregate(MeasureAggregator[] measureAggrs, List rowCells) { + int i = 0; + for (int ci = 0; ci < nHCols; ci++) { + HCol col = hcols[ci]; + Cell cell = findCell(col, rowCells); + + if (cell == null) { + i += col.nMeasures; + continue; + } + + ByteBuffer input = ByteBuffer.wrap(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()); + + col.measureCodec.decode(input, col.measureValues); + for (int j = 0; j < col.nMeasures; j++) + measureAggrs[i++].aggregate(col.measureValues[j]); + } + } + + private Cell findCell(HCol col, List cells) { + // cells are ordered by timestamp asc, thus search from back, first hit + // is the latest version + for (int i = cells.size() - 1; i >= 0; i--) { + Cell cell = cells.get(i); + if (match(col, cell)) { + return cell; + } + } + return null; + } + + public static boolean match(HCol col, Cell cell) { + return Bytes.compareTo(col.family, 0, col.family.length, cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()) == 0 && Bytes.compareTo(col.qualifier, 0, col.qualifier.length, cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()) == 0; + } + + public int getHColsNum() { + return nHCols; + } + + public byte[][] getHColFamilies() { + byte[][] result = new byte[nHCols][]; + for (int i = 0; i < nHCols; i++) + result[i] = hcols[i].family; + return result; + } + + public byte[][] getHColQualifiers() { + byte[][] result = new byte[nHCols][]; + for (int i = 0; i < nHCols; i++) + result[i] = hcols[i].qualifier; + return result; + } + + public ByteBuffer[] getHColValues(MeasureAggregator[] aggrs) { + int i = 0; + for (int ci = 0; ci < nHCols; ci++) { + HCol col = hcols[ci]; + for (int j = 0; j < col.nMeasures; j++) + col.measureValues[j] = aggrs[i++].getState(); + + col.measureBuf.clear(); + col.measureCodec.encode(col.measureValues, col.measureBuf); + hColValues[ci] = col.measureBuf; + } + return hColValues; + } + + // ============================================================================ + + public static class HCol { + final byte[] family; + final byte[] qualifier; + final String[] funcNames; + final String[] dataTypes; + final int nMeasures; + + final MeasureCodec measureCodec; + final Object[] measureValues; + final ByteBuffer measureBuf; + + public HCol(byte[] bFamily, byte[] bQualifier, String[] funcNames, String[] dataTypes) { + this.family = bFamily; + this.qualifier = bQualifier; + this.funcNames = funcNames; + this.dataTypes = dataTypes; + this.nMeasures = funcNames.length; + assert funcNames.length == dataTypes.length; + + this.measureCodec = new MeasureCodec(dataTypes); + this.measureValues = new Object[nMeasures]; + this.measureBuf = ByteBuffer.allocate(RowConstants.ROWVALUE_BUFFER_SIZE); + } + + @Override + public String toString() { + return "HCol [bFamily=" + Bytes.toString(family) + ", bQualifier=" + Bytes.toString(qualifier) + ", nMeasures=" + nMeasures + "]"; + } + } + +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverEnabler.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverEnabler.java new file mode 100644 index 0000000..6293e92 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverEnabler.java @@ -0,0 +1,173 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.coprocessor.observer; + +import java.io.IOException; +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +import com.kylinolap.storage.hbase.coprocessor.CoprocessorFilter; +import org.apache.hadoop.hbase.client.HTableInterface; +import org.apache.hadoop.hbase.client.ResultScanner; +import org.apache.hadoop.hbase.client.Scan; +import org.apache.hadoop.hbase.regionserver.RegionScanner; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import com.kylinolap.cube.CubeInstance; +import com.kylinolap.cube.CubeSegment; +import com.kylinolap.cube.cuboid.Cuboid; +import com.kylinolap.cube.kv.RowValueDecoder; +import com.kylinolap.metadata.model.realization.TblColRef; +import com.kylinolap.storage.StorageContext; +import com.kylinolap.storage.filter.TupleFilter; +import com.kylinolap.storage.hbase.RegionScannerAdapter; +import com.kylinolap.storage.hbase.ResultScannerAdapter; + +/** + * @author yangli9 + */ +public class ObserverEnabler { + + private static final Logger logger = LoggerFactory.getLogger(ObserverEnabler.class); + + static final String FORCE_COPROCESSOR = "forceCoprocessor"; + static final boolean DEBUG_LOCAL_COPROCESSOR = false; + static final Map CUBE_OVERRIDES = Maps.newConcurrentMap(); + + public static ResultScanner scanWithCoprocessorIfBeneficial(CubeSegment segment, Cuboid cuboid, TupleFilter tupleFiler, // + Collection groupBy, Collection rowValueDecoders, StorageContext context, HTableInterface table, Scan scan) throws IOException { + + if (context.isCoprocessorEnabled() == false) { + return table.getScanner(scan); + } + + ObserverRowType type = ObserverRowType.fromCuboid(segment, cuboid); + CoprocessorFilter filter = CoprocessorFilter.fromFilter(segment, tupleFiler); + ObserverProjector projector = ObserverProjector.fromColumns(segment, cuboid, groupBy); + ObserverAggregators aggrs = ObserverAggregators.fromValueDecoders(rowValueDecoders); + + if (DEBUG_LOCAL_COPROCESSOR) { + RegionScanner innerScanner = new RegionScannerAdapter(table.getScanner(scan)); + AggregationScanner aggrScanner = new AggregationScanner(type, filter, projector, aggrs, innerScanner); + return new ResultScannerAdapter(aggrScanner); + } else { + scan.setAttribute(AggregateRegionObserver.COPROCESSOR_ENABLE, new byte[] { 0x01 }); + scan.setAttribute(AggregateRegionObserver.TYPE, ObserverRowType.serialize(type)); + scan.setAttribute(AggregateRegionObserver.PROJECTOR, ObserverProjector.serialize(projector)); + scan.setAttribute(AggregateRegionObserver.AGGREGATORS, ObserverAggregators.serialize(aggrs)); + scan.setAttribute(AggregateRegionObserver.FILTER, CoprocessorFilter.serialize(filter)); + return table.getScanner(scan); + } + } + + public static void enableCoprocessorIfBeneficial(CubeInstance cube, Collection groupBy, Collection rowValueDecoders, StorageContext context) { + if (isCoprocessorBeneficial(cube, groupBy, rowValueDecoders, context)) { + context.enableCoprocessor(); + } + } + + private static boolean isCoprocessorBeneficial(CubeInstance cube, Collection groupBy, Collection rowValueDecoders, StorageContext context) { + + if (context.isAvoidAggregation()) { + logger.info("Coprocessor is disabled because context tells to avoid aggregation"); + return false; + } + + String forceFlag = System.getProperty(FORCE_COPROCESSOR); + if (forceFlag != null) { + return Boolean.parseBoolean(forceFlag); + } + + Boolean cubeOverride = CUBE_OVERRIDES.get(cube.getName()); + if (cubeOverride != null) { + return cubeOverride.booleanValue(); + } + + if (RowValueDecoder.hasMemHungryCountDistinct(rowValueDecoders)) { + logger.info("Coprocessor is disabled because there is memory hungry count distinct"); + return false; + } + + if (context.isExactAggregation()) { + logger.info("Coprocessor is disabled because exactAggregation is true"); + return false; + } + + Cuboid cuboid = context.getCuboid(); + Set toAggr = Sets.newHashSet(cuboid.getAggregationColumns()); + toAggr.removeAll(groupBy); + if (toAggr.isEmpty()) { + logger.info("Coprocessor is disabled because no additional columns to aggregate"); + return false; + } + + logger.info("Coprocessor is enabled to aggregate " + toAggr + ", returning " + groupBy); + return true; + } + + @SuppressWarnings("unused") + private static int getBitsToScan(byte[] startKey, byte[] stopKey) { + // find the first bit difference from the beginning + int totalBits = startKey.length * 8; + int bitsToScan = totalBits; + for (int i = 0; i < totalBits; i++) { + int byteIdx = i / 8; + int bitIdx = 7 - i % 8; + byte bitMask = (byte) (1 << bitIdx); + if ((startKey[byteIdx] & bitMask) == (stopKey[byteIdx] & bitMask)) + bitsToScan--; + else + break; + } + return bitsToScan; + } + + public static void forceCoprocessorOn() { + System.setProperty(FORCE_COPROCESSOR, "true"); + } + + public static void forceCoprocessorOff() { + System.setProperty(FORCE_COPROCESSOR, "false"); + } + + public static String getForceCoprocessor() { + return System.getProperty(FORCE_COPROCESSOR); + } + + public static void forceCoprocessorUnset() { + System.clearProperty(FORCE_COPROCESSOR); + } + + public static void updateCubeOverride(String cubeName, String force) { + if ("null".equalsIgnoreCase(force) || "default".equalsIgnoreCase(force)) { + CUBE_OVERRIDES.remove(cubeName); + } else if ("true".equalsIgnoreCase(force)) { + CUBE_OVERRIDES.put(cubeName, Boolean.TRUE); + } else if ("false".equalsIgnoreCase(force)) { + CUBE_OVERRIDES.put(cubeName, Boolean.FALSE); + } + } + + public static Map getCubeOverrides() { + return CUBE_OVERRIDES; + } + +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverProjector.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverProjector.java new file mode 100644 index 0000000..9d9a6ea --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverProjector.java @@ -0,0 +1,176 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.coprocessor.observer; + +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import com.kylinolap.storage.hbase.coprocessor.CoprocessorConstants; +import org.apache.hadoop.hbase.Cell; + +import com.kylinolap.common.util.BytesSerializer; +import com.kylinolap.common.util.BytesUtil; +import com.kylinolap.cube.CubeSegment; +import com.kylinolap.cube.cuboid.Cuboid; +import com.kylinolap.cube.kv.RowKeyEncoder; +import com.kylinolap.metadata.model.realization.TblColRef; + +/** + * @author yangli9 + */ +public class ObserverProjector { + + public static ObserverProjector fromColumns(final CubeSegment cubeSegment, final Cuboid cuboid, final Collection dimensionColumns) { + + RowKeyEncoder rowKeyMaskEncoder = new RowKeyEncoder(cubeSegment, cuboid) { + @Override + protected int fillHeader(byte[] bytes, byte[][] values) { + Arrays.fill(bytes, 0, this.headerLength, (byte) 0xff); + return this.headerLength; + } + + @Override + protected void fillColumnValue(TblColRef column, int columnLen, byte[] value, int valueLen, byte[] outputValue, int outputValueOffset) { + byte bits = dimensionColumns.contains(column) ? (byte) 0xff : 0x00; + Arrays.fill(outputValue, outputValueOffset, outputValueOffset + columnLen, bits); + } + }; + + byte[] mask = rowKeyMaskEncoder.encode(new byte[cuboid.getColumns().size()][]); + return new ObserverProjector(mask); + } + + public static byte[] serialize(ObserverProjector o) { + ByteBuffer buf = ByteBuffer.allocate(CoprocessorConstants.SERIALIZE_BUFFER_SIZE); + serializer.serialize(o, buf); + byte[] result = new byte[buf.position()]; + System.arraycopy(buf.array(), 0, result, 0, buf.position()); + return result; + } + + public static ObserverProjector deserialize(byte[] bytes) { + return serializer.deserialize(ByteBuffer.wrap(bytes)); + } + + private static final Serializer serializer = new Serializer(); + + private static class Serializer implements BytesSerializer { + + @Override + public void serialize(ObserverProjector value, ByteBuffer out) { + BytesUtil.writeByteArray(value.groupByMask, out); + } + + @Override + public ObserverProjector deserialize(ByteBuffer in) { + byte[] mask = BytesUtil.readByteArray(in); + return new ObserverProjector(mask); + } + } + + // ============================================================================ + + final byte[] groupByMask; // mask out columns that are not needed (by group by) + final AggrKey aggrKey = new AggrKey(); + + public ObserverProjector(byte[] groupByMask) { + this.groupByMask = groupByMask; + } + + public AggrKey getRowKey(List rowCells) { + int length = groupByMask.length; + Cell cell = rowCells.get(0); + assert length == cell.getRowLength(); + + aggrKey.set(cell.getRowArray(), cell.getRowOffset()); + return aggrKey; + } + + public class AggrKey implements Comparable { + byte[] data; + int offset; + + public byte[] get() { + return data; + } + + public int offset() { + return offset; + } + + public int length() { + return groupByMask.length; + } + + void set(byte[] data, int offset) { + this.data = data; + this.offset = offset; + } + + public AggrKey copy() { + AggrKey copy = new AggrKey(); + copy.set(new byte[length()], 0); + System.arraycopy(this.data, this.offset, copy.data, copy.offset, length()); + return copy; + } + + @Override + public int hashCode() { + int hash = 1; + for (int i = 0, j = offset, n = length(); i < n; i++, j++) { + if (groupByMask[i] != 0) + hash = (31 * hash) + (int) data[j]; + } + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + AggrKey other = (AggrKey) obj; + if (this.length() != other.length()) + return false; + + return compareTo(other) == 0; + } + + @Override + public int compareTo(AggrKey o) { + int comp = this.length() - o.length(); + if (comp != 0) + return comp; + + int n = this.length(); + for (int i = 0, j = offset, k = o.offset; i < n; i++, j++, k++) { + if (groupByMask[i] != 0) { + comp = BytesUtil.compareByteUnsigned(this.data[j], o.data[k]); + if (comp != 0) + return comp; + } + } + return 0; + } + } + +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverRowType.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverRowType.java new file mode 100644 index 0000000..abdf73d --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverRowType.java @@ -0,0 +1,142 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.coprocessor.observer; + +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import com.google.common.collect.Maps; +import com.kylinolap.common.util.BytesSerializer; +import com.kylinolap.common.util.BytesUtil; +import com.kylinolap.cube.CubeSegment; +import com.kylinolap.cube.cuboid.Cuboid; +import com.kylinolap.cube.kv.RowConstants; +import com.kylinolap.cube.kv.RowKeyColumnIO; +import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.schema.ColumnDesc; +import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.storage.hbase.coprocessor.CoprocessorConstants; + +/** + * @author yangli9 + */ +public class ObserverRowType { + + public static ObserverRowType fromCuboid(CubeSegment seg, Cuboid cuboid) { + List colList = cuboid.getColumns(); + TblColRef[] cols = colList.toArray(new TblColRef[colList.size()]); + RowKeyColumnIO colIO = new RowKeyColumnIO(seg); + int[] colSizes = new int[cols.length]; + for (int i = 0; i < cols.length; i++) { + colSizes[i] = colIO.getColumnLength(cols[i]); + } + return new ObserverRowType(cols, colSizes); + } + + public static byte[] serialize(ObserverRowType o) { + ByteBuffer buf = ByteBuffer.allocate(CoprocessorConstants.SERIALIZE_BUFFER_SIZE); + serializer.serialize(o, buf); + byte[] result = new byte[buf.position()]; + System.arraycopy(buf.array(), 0, result, 0, buf.position()); + return result; + } + + public static ObserverRowType deserialize(byte[] bytes) { + return serializer.deserialize(ByteBuffer.wrap(bytes)); + } + + private static final Serializer serializer = new Serializer(); + + private static class Serializer implements BytesSerializer { + + @Override + public void serialize(ObserverRowType o, ByteBuffer out) { + int n = o.columns.length; + BytesUtil.writeVInt(o.columns.length, out); + for (int i = 0; i < n; i++) { + BytesUtil.writeAsciiString(o.columns[i].getTable(), out); + BytesUtil.writeAsciiString(o.columns[i].getName(), out); + BytesUtil.writeVInt(o.columnSizes[i], out); + } + } + + @Override + public ObserverRowType deserialize(ByteBuffer in) { + int n = BytesUtil.readVInt(in); + TblColRef[] cols = new TblColRef[n]; + int[] colSizes = new int[n]; + for (int i = 0; i < n; i++) { + String tableName = BytesUtil.readAsciiString(in); + String colName = BytesUtil.readAsciiString(in); + TableDesc table = new TableDesc(); + table.setName(tableName); + ColumnDesc col = new ColumnDesc(); + col.setTable(table); + col.setName(colName); + cols[i] = new TblColRef(col); + + int colSize = BytesUtil.readVInt(in); + colSizes[i] = colSize; + } + return new ObserverRowType(cols, colSizes); + } + } + + // ============================================================================ + + TblColRef[] columns; + int[] columnSizes; + + int[] columnOffsets; + List columnsAsList; + HashMap columnIdxMap; + + public ObserverRowType(TblColRef[] columns, int[] columnSizes) { + this.columns = columns; + this.columnSizes = columnSizes; + init(); + } + + public int getColIndexByTblColRef(TblColRef colRef) { + return columnIdxMap.get(colRef); + } + + private void init() { + int[] offsets = new int[columns.length]; + int o = RowConstants.ROWKEY_CUBOIDID_LEN; + for (int i = 0; i < columns.length; i++) { + offsets[i] = o; + o += columnSizes[i]; + } + this.columnOffsets = offsets; + + this.columnsAsList = Arrays.asList(columns); + + HashMap map = Maps.newHashMap(); + for (int i = 0; i < columns.length; i++) { + map.put(columns[i], i); + } + this.columnIdxMap = map; + } + + public int getColumnCount() { + return columns.length; + } + +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverTuple.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverTuple.java new file mode 100644 index 0000000..58dbc66 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverTuple.java @@ -0,0 +1,96 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.coprocessor.observer; + +import java.util.List; + +import org.apache.hadoop.hbase.io.ImmutableBytesWritable; + +import com.kylinolap.dict.Dictionary; +import com.kylinolap.metadata.model.realization.TblColRef; +import com.kylinolap.storage.tuple.ITuple; + +/** + * A special kind of tuple that exposes column value (dictionary ID) directly on + * top of row key. + * + * @author yangli9 + */ +public class ObserverTuple implements ITuple { + + final ObserverRowType type; + + ImmutableBytesWritable rowkey; + String[] values; + + public ObserverTuple(ObserverRowType type) { + this.type = type; + this.rowkey = new ImmutableBytesWritable(); + this.values = new String[type.getColumnCount()]; + } + + public void setUnderlying(byte[] array, int offset, int length) { + rowkey.set(array, offset, length); + for (int i = 0; i < values.length; i++) { + values[i] = null; + } + } + + @Override + public List getAllColumns() { + return type.columnsAsList; + } + + @Override + public Object[] getAllValues() { + int n = type.getColumnCount(); + for (int i = 0; i < n; i++) { + getValueAt(i); + } + return values; + } + + private String getValueAt(int i) { + int n = type.getColumnCount(); + if (i < 0 || i >= n) + return null; + + if (values[i] == null) { + values[i] = Dictionary.dictIdToString(rowkey.get(), rowkey.getOffset() + type.columnOffsets[i], type.columnSizes[i]); + } + + return values[i]; + } + + + @Override + public Object getValue(TblColRef col) { + int i = type.getColIndexByTblColRef(col); + return getValueAt(i); + } + + @Override + public List getAllFields() { + throw new UnsupportedOperationException(); + } + + @Override + public Object getValue(String field) { + throw new UnsupportedOperationException(); + } + +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/HbaseServerKVIterator.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/HbaseServerKVIterator.java deleted file mode 100644 index 5853006..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/HbaseServerKVIterator.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.kylinolap.storage.hbase.endpoint; - -import com.kylinolap.common.util.BytesUtil; -import org.apache.commons.io.IOUtils; -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.io.ImmutableBytesWritable; -import org.apache.hadoop.hbase.regionserver.RegionScanner; -import org.apache.hadoop.hbase.util.Pair; - -import java.io.Closeable; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * Created by honma on 11/10/14. - */ -public class HbaseServerKVIterator implements Iterable>, Closeable { - - private RegionScanner innerScaner; - - List results = new ArrayList(); - - public HbaseServerKVIterator(RegionScanner innerScaner) { - this.innerScaner = innerScaner; - } - - @Override - public void close() throws IOException { - IOUtils.closeQuietly(this.innerScaner); - } - - @Override - public Iterator> iterator() { - return new Iterator>() { - - ImmutableBytesWritable key = new ImmutableBytesWritable(); - ImmutableBytesWritable value = new ImmutableBytesWritable(); - Pair pair = new Pair<>(key, value); - - private boolean hasMore = true; - - @Override - public boolean hasNext() { - return hasMore; - } - - - @Override - public Pair next() { - if (hasNext()) { - try { - hasMore = innerScaner.nextRaw(results); - } catch (IOException e) { - throw new RuntimeException(e); - } - - if (results.size() < 1) - throw new IllegalStateException("Hbase row contains less than 1 cell"); - - Cell c = results.get(0); - key.set(c.getRowArray(), c.getRowOffset(), c.getRowLength()); - value.set(c.getValueArray(), c.getValueOffset(), c.getValueLength()); - - results.clear(); - return pair; - } else { - return null; - } - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - }; - } - -} - diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java deleted file mode 100644 index af9f033..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIEndpoint.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.kylinolap.storage.hbase.endpoint; - -import com.google.protobuf.ByteString; -import com.google.protobuf.RpcCallback; -import com.google.protobuf.RpcController; -import com.google.protobuf.Service; -import com.kylinolap.cube.invertedindex.*; -import com.kylinolap.storage.filter.BitMapFilterEvaluator; -import com.kylinolap.storage.hbase.endpoint.generated.IIProtos; -import com.kylinolap.storage.hbase.observer.ObserverAggregators; -import com.kylinolap.storage.hbase.observer.ObserverFilter; -import com.kylinolap.storage.hbase.observer.ObserverProjector; -import com.kylinolap.storage.hbase.observer.ObserverRowType; -import it.uniroma3.mat.extendedset.intset.ConciseSet; - -import org.apache.commons.io.IOUtils; -import org.apache.hadoop.hbase.Coprocessor; -import org.apache.hadoop.hbase.CoprocessorEnvironment; -import org.apache.hadoop.hbase.client.Scan; -import org.apache.hadoop.hbase.coprocessor.CoprocessorException; -import org.apache.hadoop.hbase.coprocessor.CoprocessorService; -import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; -import org.apache.hadoop.hbase.protobuf.ResponseConverter; -import org.apache.hadoop.hbase.regionserver.HRegion; -import org.apache.hadoop.hbase.regionserver.RegionScanner; -import org.apache.hadoop.hbase.util.Bytes; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.Iterator; - -/** - * Created by honma on 11/7/14. - */ -public class IIEndpoint extends IIProtos.RowsService - implements Coprocessor, CoprocessorService { - - private RegionCoprocessorEnvironment env; - - public IIEndpoint() { - } - - private Scan buildScan() { - Scan scan = new Scan(); - scan.addColumn(Bytes.toBytes("f"), Bytes.toBytes("c")); - - return scan; - } - - @Override - public void getRows(RpcController controller, IIProtos.IIRequest request, RpcCallback done) { - - ObserverRowType type = null; - ObserverProjector projector = null; - ObserverAggregators aggregators = null; - ObserverFilter filter = null; - - if (request.hasSRowType()) { - type = ObserverRowType.deserialize(request.getSRowType().toByteArray()); - } - if (request.hasSRowProjector()) { - projector = ObserverProjector.deserialize(request.getSRowProjector().toByteArray()); - } - if (request.hasSRowAggregator()) { - aggregators = ObserverAggregators.deserialize(request.getSRowAggregator().toByteArray()); - } - if (request.hasSRowFilter()) { - filter = ObserverFilter.deserialize(request.getSRowFilter().toByteArray()); - } - - - IIProtos.IIResponse response = null; - RegionScanner innerScanner = null; - HRegion region = null; - try { - ByteBuffer byteBuffer = request.getTableInfo().asReadOnlyByteBuffer(); - TableRecordInfoDigest tableInfo = TableRecordInfoDigest.deserialize(byteBuffer); - - region = env.getRegion(); - innerScanner = region.getScanner(buildScan()); - region.startRegionOperation(); - - - synchronized (innerScanner) { - IIProtos.IIResponse.Builder responseBuilder = IIProtos.IIResponse.newBuilder(); - - IIKeyValueCodec codec = new IIKeyValueCodec(tableInfo); - for (Slice slice : codec.decodeKeyValue(new HbaseServerKVIterator(innerScanner))) { - ConciseSet result = null; - if (filter != null) { - result = new BitMapFilterEvaluator(new SliceBitMapProvider(slice, type)).evaluate(filter.getFilter()); - } - - Iterator iterator = slice.iterateWithBitmap(result); - while (iterator.hasNext()) { - responseBuilder.addRows(ByteString.copyFrom(iterator.next().getBytes())); - } - } - - response = responseBuilder.build(); - } - - } catch (IOException ioe) { - ResponseConverter.setControllerException(controller, ioe); - } finally { - IOUtils.closeQuietly(innerScanner); - if (region != null) { - try { - region.closeRegionOperation(); - } catch (IOException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - } - - done.run(response); - } - - @Override - public void start(CoprocessorEnvironment env) throws IOException { - if (env instanceof RegionCoprocessorEnvironment) { - this.env = (RegionCoprocessorEnvironment) env; - } else { - throw new CoprocessorException("Must be loaded on a table region!"); - } - } - - @Override - public void stop(CoprocessorEnvironment env) throws IOException { - } - - @Override - public Service getService() { - return this; - } -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIResponseAdapter.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIResponseAdapter.java deleted file mode 100644 index 541981e..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/IIResponseAdapter.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.kylinolap.storage.hbase.endpoint; - -/** - * Created by honma on 11/10/14. - */ -public class IIResponseAdapter { -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/SliceBitMapProvider.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/SliceBitMapProvider.java deleted file mode 100644 index 9b8a256..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/SliceBitMapProvider.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.kylinolap.storage.hbase.endpoint; - -import com.kylinolap.cube.invertedindex.Slice; -import com.kylinolap.metadata.model.realization.TblColRef; -import com.kylinolap.storage.filter.BitMapFilterEvaluator; -import com.kylinolap.storage.hbase.observer.ObserverRowType; -import it.uniroma3.mat.extendedset.intset.ConciseSet; - -/** - * Created by Hongbin Ma(Binmahone) on 11/24/14. - *

- * an adapter - */ -public class SliceBitMapProvider implements BitMapFilterEvaluator.BitMapProvider { - - private Slice slice; - private ObserverRowType type; - - public SliceBitMapProvider(Slice slice, ObserverRowType type) { - this.slice = slice; - this.type = type; - } - - @Override - public ConciseSet getBitMap(TblColRef col, int valueId) { - return slice.getColumnValueContainer(type.getColIndexByTblColRef(col)).getBitMap(valueId); - } - - @Override - public int getRecordCount() { - return this.slice.getRecordCount(); - } - - @Override - public int getMaxValueId(TblColRef col) { - return slice.getColumnValueContainer(type.getColIndexByTblColRef(col)).getMaxValueId(); - } -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/ExampleEndpoint.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/ExampleEndpoint.java deleted file mode 100644 index 1131a9b..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/ExampleEndpoint.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.kylinolap.storage.hbase.endpoint.example; - -import com.google.protobuf.RpcCallback; -import com.google.protobuf.RpcController; -import com.google.protobuf.Service; -import com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos; -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.CellUtil; -import org.apache.hadoop.hbase.Coprocessor; -import org.apache.hadoop.hbase.CoprocessorEnvironment; -import org.apache.hadoop.hbase.client.Scan; -import org.apache.hadoop.hbase.coprocessor.CoprocessorException; -import org.apache.hadoop.hbase.coprocessor.CoprocessorService; -import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; -import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter; -import org.apache.hadoop.hbase.protobuf.ResponseConverter; -import org.apache.hadoop.hbase.regionserver.InternalScanner; -import org.apache.hadoop.hbase.util.Bytes; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -/** - * Created by honma on 11/3/14. - */ - -public class ExampleEndpoint extends ExampleProtos.RowCountService - implements Coprocessor, CoprocessorService { - private RegionCoprocessorEnvironment env; - - public ExampleEndpoint() { - } - - /** - * Just returns a reference to this object, which implements the RowCounterService interface. - */ - @Override - public Service getService() { - return this; - } - - /** - * Returns a count of the rows in the region where this coprocessor is loaded. - */ - @Override - public void getRowCount(RpcController controller, ExampleProtos.CountRequest request, - RpcCallback done) { - Scan scan = new Scan(); - scan.setFilter(new FirstKeyOnlyFilter()); - ExampleProtos.CountResponse response = null; - InternalScanner scanner = null; - try { - scanner = env.getRegion().getScanner(scan); - List results = new ArrayList(); - boolean hasMore = false; - byte[] lastRow = null; - long count = 0; - do { - hasMore = scanner.next(results); - for (Cell kv : results) { - byte[] currentRow = CellUtil.cloneRow(kv); - if (lastRow == null || !Bytes.equals(lastRow, currentRow)) { - lastRow = currentRow; - count++; - } - } - results.clear(); - } while (hasMore); - - response = ExampleProtos.CountResponse.newBuilder() - .setCount(count).build(); - } catch (IOException ioe) { - ResponseConverter.setControllerException(controller, ioe); - } finally { - if (scanner != null) { - try { - scanner.close(); - } catch (IOException ignored) { - } - } - } - done.run(response); - } - - /** - * Returns a count of all KeyValues in the region where this coprocessor is loaded. - */ - @Override - public void getKeyValueCount(RpcController controller, ExampleProtos.CountRequest request, - RpcCallback done) { - ExampleProtos.CountResponse response = null; - InternalScanner scanner = null; - try { - scanner = env.getRegion().getScanner(new Scan()); - List results = new ArrayList(); - boolean hasMore = false; - long count = 0; - do { - hasMore = scanner.next(results); - for (Cell kv : results) { - count++; - } - results.clear(); - } while (hasMore); - - response = ExampleProtos.CountResponse.newBuilder() - .setCount(count).build(); - } catch (IOException ioe) { - ResponseConverter.setControllerException(controller, ioe); - } finally { - if (scanner != null) { - try { - scanner.close(); - } catch (IOException ignored) { - } - } - } - done.run(response); - } - - /** - * Stores a reference to the coprocessor environment provided by the - * {@link org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost} from the region where this - * coprocessor is loaded. Since this is a coprocessor endpoint, it always expects to be loaded - * on a table region, so always expects this to be an instance of - * {@link RegionCoprocessorEnvironment}. - * - * @param env the environment provided by the coprocessor host - * @throws IOException if the provided environment is not an instance of - * {@code RegionCoprocessorEnvironment} - */ - @Override - public void start(CoprocessorEnvironment env) throws IOException { - if (env instanceof RegionCoprocessorEnvironment) { - this.env = (RegionCoprocessorEnvironment) env; - } else { - throw new CoprocessorException("Must be loaded on a table region!"); - } - } - - @Override - public void stop(CoprocessorEnvironment env) throws IOException { - // nothing to do - } -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/generated/ExampleProtos.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/generated/ExampleProtos.java deleted file mode 100644 index b0e3458..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/generated/ExampleProtos.java +++ /dev/null @@ -1,1148 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: example.proto - -package com.kylinolap.storage.hbase.endpoint.example.generated; - -public final class ExampleProtos { - private ExampleProtos() {} - public static void registerAllExtensions( - com.google.protobuf.ExtensionRegistry registry) { - } - public interface CountRequestOrBuilder - extends com.google.protobuf.MessageOrBuilder { - } - /** - * Protobuf type {@code CountRequest} - */ - public static final class CountRequest extends - com.google.protobuf.GeneratedMessage - implements CountRequestOrBuilder { - // Use CountRequest.newBuilder() to construct. - private CountRequest(com.google.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - private CountRequest(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } - - private static final CountRequest defaultInstance; - public static CountRequest getDefaultInstance() { - return defaultInstance; - } - - public CountRequest getDefaultInstanceForType() { - return defaultInstance; - } - - private final com.google.protobuf.UnknownFieldSet unknownFields; - @java.lang.Override - public final com.google.protobuf.UnknownFieldSet - getUnknownFields() { - return this.unknownFields; - } - private CountRequest( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - initFields(); - com.google.protobuf.UnknownFieldSet.Builder unknownFields = - com.google.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, - extensionRegistry, tag)) { - done = true; - } - break; - } - } - } - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException( - e.getMessage()).setUnfinishedMessage(this); - } finally { - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountRequest_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountRequest_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.class, com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.Builder.class); - } - - public static com.google.protobuf.Parser PARSER = - new com.google.protobuf.AbstractParser() { - public CountRequest parsePartialFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return new CountRequest(input, extensionRegistry); - } - }; - - @java.lang.Override - public com.google.protobuf.Parser getParserForType() { - return PARSER; - } - - private void initFields() { - } - private byte memoizedIsInitialized = -1; - public final boolean isInitialized() { - byte isInitialized = memoizedIsInitialized; - if (isInitialized != -1) return isInitialized == 1; - - memoizedIsInitialized = 1; - return true; - } - - public void writeTo(com.google.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - getUnknownFields().writeTo(output); - } - - private int memoizedSerializedSize = -1; - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) return size; - - size = 0; - size += getUnknownFields().getSerializedSize(); - memoizedSerializedSize = size; - return size; - } - - private static final long serialVersionUID = 0L; - @java.lang.Override - protected java.lang.Object writeReplace() - throws java.io.ObjectStreamException { - return super.writeReplace(); - } - - @java.lang.Override - public boolean equals(final java.lang.Object obj) { - if (obj == this) { - return true; - } - if (!(obj instanceof com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest)) { - return super.equals(obj); - } - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest other = (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest) obj; - - boolean result = true; - result = result && - getUnknownFields().equals(other.getUnknownFields()); - return result; - } - - private int memoizedHashCode = 0; - @java.lang.Override - public int hashCode() { - if (memoizedHashCode != 0) { - return memoizedHashCode; - } - int hash = 41; - hash = (19 * hash) + getDescriptorForType().hashCode(); - hash = (29 * hash) + getUnknownFields().hashCode(); - memoizedHashCode = hash; - return hash; - } - - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseFrom( - com.google.protobuf.ByteString data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseFrom( - com.google.protobuf.ByteString data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseFrom(byte[] data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseFrom( - byte[] data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseDelimitedFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseFrom( - com.google.protobuf.CodedInputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parseFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static Builder newBuilder() { return Builder.create(); } - public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest prototype) { - return newBuilder().mergeFrom(prototype); - } - public Builder toBuilder() { return newBuilder(this); } - - @java.lang.Override - protected Builder newBuilderForType( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - Builder builder = new Builder(parent); - return builder; - } - /** - * Protobuf type {@code CountRequest} - */ - public static final class Builder extends - com.google.protobuf.GeneratedMessage.Builder - implements com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequestOrBuilder { - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountRequest_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountRequest_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.class, com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.Builder.class); - } - - // Construct using com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountRequest.newBuilder() - private Builder() { - maybeForceBuilderInitialization(); - } - - private Builder( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - super(parent); - maybeForceBuilderInitialization(); - } - private void maybeForceBuilderInitialization() { - if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { - } - } - private static Builder create() { - return new Builder(); - } - - public Builder clear() { - super.clear(); - return this; - } - - public Builder clone() { - return create().mergeFrom(buildPartial()); - } - - public com.google.protobuf.Descriptors.Descriptor - getDescriptorForType() { - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountRequest_descriptor; - } - - public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest getDefaultInstanceForType() { - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.getDefaultInstance(); - } - - public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest build() { - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest buildPartial() { - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest result = new com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest(this); - onBuilt(); - return result; - } - - public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest) { - return mergeFrom((com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest)other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest other) { - if (other == com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.getDefaultInstance()) return this; - this.mergeUnknownFields(other.getUnknownFields()); - return this; - } - - public final boolean isInitialized() { - return true; - } - - public Builder mergeFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest parsedMessage = null; - try { - parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest) e.getUnfinishedMessage(); - throw e; - } finally { - if (parsedMessage != null) { - mergeFrom(parsedMessage); - } - } - return this; - } - - // @@protoc_insertion_point(builder_scope:CountRequest) - } - - static { - defaultInstance = new CountRequest(true); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:CountRequest) - } - - public interface CountResponseOrBuilder - extends com.google.protobuf.MessageOrBuilder { - - // required int64 count = 1 [default = 0]; - /** - * required int64 count = 1 [default = 0]; - */ - boolean hasCount(); - /** - * required int64 count = 1 [default = 0]; - */ - long getCount(); - } - /** - * Protobuf type {@code CountResponse} - */ - public static final class CountResponse extends - com.google.protobuf.GeneratedMessage - implements CountResponseOrBuilder { - // Use CountResponse.newBuilder() to construct. - private CountResponse(com.google.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - private CountResponse(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } - - private static final CountResponse defaultInstance; - public static CountResponse getDefaultInstance() { - return defaultInstance; - } - - public CountResponse getDefaultInstanceForType() { - return defaultInstance; - } - - private final com.google.protobuf.UnknownFieldSet unknownFields; - @java.lang.Override - public final com.google.protobuf.UnknownFieldSet - getUnknownFields() { - return this.unknownFields; - } - private CountResponse( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - initFields(); - int mutable_bitField0_ = 0; - com.google.protobuf.UnknownFieldSet.Builder unknownFields = - com.google.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, - extensionRegistry, tag)) { - done = true; - } - break; - } - case 8: { - bitField0_ |= 0x00000001; - count_ = input.readInt64(); - break; - } - } - } - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException( - e.getMessage()).setUnfinishedMessage(this); - } finally { - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountResponse_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountResponse_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.class, com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.Builder.class); - } - - public static com.google.protobuf.Parser PARSER = - new com.google.protobuf.AbstractParser() { - public CountResponse parsePartialFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return new CountResponse(input, extensionRegistry); - } - }; - - @java.lang.Override - public com.google.protobuf.Parser getParserForType() { - return PARSER; - } - - private int bitField0_; - // required int64 count = 1 [default = 0]; - public static final int COUNT_FIELD_NUMBER = 1; - private long count_; - /** - * required int64 count = 1 [default = 0]; - */ - public boolean hasCount() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * required int64 count = 1 [default = 0]; - */ - public long getCount() { - return count_; - } - - private void initFields() { - count_ = 0L; - } - private byte memoizedIsInitialized = -1; - public final boolean isInitialized() { - byte isInitialized = memoizedIsInitialized; - if (isInitialized != -1) return isInitialized == 1; - - if (!hasCount()) { - memoizedIsInitialized = 0; - return false; - } - memoizedIsInitialized = 1; - return true; - } - - public void writeTo(com.google.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - if (((bitField0_ & 0x00000001) == 0x00000001)) { - output.writeInt64(1, count_); - } - getUnknownFields().writeTo(output); - } - - private int memoizedSerializedSize = -1; - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) return size; - - size = 0; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - size += com.google.protobuf.CodedOutputStream - .computeInt64Size(1, count_); - } - size += getUnknownFields().getSerializedSize(); - memoizedSerializedSize = size; - return size; - } - - private static final long serialVersionUID = 0L; - @java.lang.Override - protected java.lang.Object writeReplace() - throws java.io.ObjectStreamException { - return super.writeReplace(); - } - - @java.lang.Override - public boolean equals(final java.lang.Object obj) { - if (obj == this) { - return true; - } - if (!(obj instanceof com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse)) { - return super.equals(obj); - } - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse other = (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse) obj; - - boolean result = true; - result = result && (hasCount() == other.hasCount()); - if (hasCount()) { - result = result && (getCount() - == other.getCount()); - } - result = result && - getUnknownFields().equals(other.getUnknownFields()); - return result; - } - - private int memoizedHashCode = 0; - @java.lang.Override - public int hashCode() { - if (memoizedHashCode != 0) { - return memoizedHashCode; - } - int hash = 41; - hash = (19 * hash) + getDescriptorForType().hashCode(); - if (hasCount()) { - hash = (37 * hash) + COUNT_FIELD_NUMBER; - hash = (53 * hash) + hashLong(getCount()); - } - hash = (29 * hash) + getUnknownFields().hashCode(); - memoizedHashCode = hash; - return hash; - } - - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseFrom( - com.google.protobuf.ByteString data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseFrom( - com.google.protobuf.ByteString data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseFrom(byte[] data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseFrom( - byte[] data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseDelimitedFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseFrom( - com.google.protobuf.CodedInputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parseFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static Builder newBuilder() { return Builder.create(); } - public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse prototype) { - return newBuilder().mergeFrom(prototype); - } - public Builder toBuilder() { return newBuilder(this); } - - @java.lang.Override - protected Builder newBuilderForType( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - Builder builder = new Builder(parent); - return builder; - } - /** - * Protobuf type {@code CountResponse} - */ - public static final class Builder extends - com.google.protobuf.GeneratedMessage.Builder - implements com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponseOrBuilder { - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountResponse_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountResponse_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.class, com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.Builder.class); - } - - // Construct using com.kylinolap.storage.hbase.coprocessor.example.generated.ExampleProtos.CountResponse.newBuilder() - private Builder() { - maybeForceBuilderInitialization(); - } - - private Builder( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - super(parent); - maybeForceBuilderInitialization(); - } - private void maybeForceBuilderInitialization() { - if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { - } - } - private static Builder create() { - return new Builder(); - } - - public Builder clear() { - super.clear(); - count_ = 0L; - bitField0_ = (bitField0_ & ~0x00000001); - return this; - } - - public Builder clone() { - return create().mergeFrom(buildPartial()); - } - - public com.google.protobuf.Descriptors.Descriptor - getDescriptorForType() { - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.internal_static_CountResponse_descriptor; - } - - public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse getDefaultInstanceForType() { - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance(); - } - - public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse build() { - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse buildPartial() { - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse result = new com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse(this); - int from_bitField0_ = bitField0_; - int to_bitField0_ = 0; - if (((from_bitField0_ & 0x00000001) == 0x00000001)) { - to_bitField0_ |= 0x00000001; - } - result.count_ = count_; - result.bitField0_ = to_bitField0_; - onBuilt(); - return result; - } - - public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse) { - return mergeFrom((com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse)other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse other) { - if (other == com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance()) return this; - if (other.hasCount()) { - setCount(other.getCount()); - } - this.mergeUnknownFields(other.getUnknownFields()); - return this; - } - - public final boolean isInitialized() { - if (!hasCount()) { - - return false; - } - return true; - } - - public Builder mergeFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse parsedMessage = null; - try { - parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse) e.getUnfinishedMessage(); - throw e; - } finally { - if (parsedMessage != null) { - mergeFrom(parsedMessage); - } - } - return this; - } - private int bitField0_; - - // required int64 count = 1 [default = 0]; - private long count_ ; - /** - * required int64 count = 1 [default = 0]; - */ - public boolean hasCount() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * required int64 count = 1 [default = 0]; - */ - public long getCount() { - return count_; - } - /** - * required int64 count = 1 [default = 0]; - */ - public Builder setCount(long value) { - bitField0_ |= 0x00000001; - count_ = value; - onChanged(); - return this; - } - /** - * required int64 count = 1 [default = 0]; - */ - public Builder clearCount() { - bitField0_ = (bitField0_ & ~0x00000001); - count_ = 0L; - onChanged(); - return this; - } - - // @@protoc_insertion_point(builder_scope:CountResponse) - } - - static { - defaultInstance = new CountResponse(true); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:CountResponse) - } - - /** - * Protobuf service {@code RowCountService} - */ - public static abstract class RowCountService - implements com.google.protobuf.Service { - protected RowCountService() {} - - public interface Interface { - /** - * rpc getRowCount(.CountRequest) returns (.CountResponse); - */ - public abstract void getRowCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request, - com.google.protobuf.RpcCallback done); - - /** - * rpc getKeyValueCount(.CountRequest) returns (.CountResponse); - */ - public abstract void getKeyValueCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request, - com.google.protobuf.RpcCallback done); - - } - - public static com.google.protobuf.Service newReflectiveService( - final Interface impl) { - return new RowCountService() { - @java.lang.Override - public void getRowCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request, - com.google.protobuf.RpcCallback done) { - impl.getRowCount(controller, request, done); - } - - @java.lang.Override - public void getKeyValueCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request, - com.google.protobuf.RpcCallback done) { - impl.getKeyValueCount(controller, request, done); - } - - }; - } - - public static com.google.protobuf.BlockingService - newReflectiveBlockingService(final BlockingInterface impl) { - return new com.google.protobuf.BlockingService() { - public final com.google.protobuf.Descriptors.ServiceDescriptor - getDescriptorForType() { - return getDescriptor(); - } - - public final com.google.protobuf.Message callBlockingMethod( - com.google.protobuf.Descriptors.MethodDescriptor method, - com.google.protobuf.RpcController controller, - com.google.protobuf.Message request) - throws com.google.protobuf.ServiceException { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.callBlockingMethod() given method descriptor for " + - "wrong service type."); - } - switch(method.getIndex()) { - case 0: - return impl.getRowCount(controller, (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest)request); - case 1: - return impl.getKeyValueCount(controller, (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest)request); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public final com.google.protobuf.Message - getRequestPrototype( - com.google.protobuf.Descriptors.MethodDescriptor method) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.getRequestPrototype() given method " + - "descriptor for wrong service type."); - } - switch(method.getIndex()) { - case 0: - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.getDefaultInstance(); - case 1: - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.getDefaultInstance(); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public final com.google.protobuf.Message - getResponsePrototype( - com.google.protobuf.Descriptors.MethodDescriptor method) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.getResponsePrototype() given method " + - "descriptor for wrong service type."); - } - switch(method.getIndex()) { - case 0: - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance(); - case 1: - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance(); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - }; - } - - /** - * rpc getRowCount(.CountRequest) returns (.CountResponse); - */ - public abstract void getRowCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request, - com.google.protobuf.RpcCallback done); - - /** - * rpc getKeyValueCount(.CountRequest) returns (.CountResponse); - */ - public abstract void getKeyValueCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request, - com.google.protobuf.RpcCallback done); - - public static final - com.google.protobuf.Descriptors.ServiceDescriptor - getDescriptor() { - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.getDescriptor().getServices().get(0); - } - public final com.google.protobuf.Descriptors.ServiceDescriptor - getDescriptorForType() { - return getDescriptor(); - } - - public final void callMethod( - com.google.protobuf.Descriptors.MethodDescriptor method, - com.google.protobuf.RpcController controller, - com.google.protobuf.Message request, - com.google.protobuf.RpcCallback< - com.google.protobuf.Message> done) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.callMethod() given method descriptor for wrong " + - "service type."); - } - switch(method.getIndex()) { - case 0: - this.getRowCount(controller, (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest)request, - com.google.protobuf.RpcUtil.specializeCallback( - done)); - return; - case 1: - this.getKeyValueCount(controller, (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest)request, - com.google.protobuf.RpcUtil.specializeCallback( - done)); - return; - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public final com.google.protobuf.Message - getRequestPrototype( - com.google.protobuf.Descriptors.MethodDescriptor method) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.getRequestPrototype() given method " + - "descriptor for wrong service type."); - } - switch(method.getIndex()) { - case 0: - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.getDefaultInstance(); - case 1: - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest.getDefaultInstance(); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public final com.google.protobuf.Message - getResponsePrototype( - com.google.protobuf.Descriptors.MethodDescriptor method) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.getResponsePrototype() given method " + - "descriptor for wrong service type."); - } - switch(method.getIndex()) { - case 0: - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance(); - case 1: - return com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance(); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public static Stub newStub( - com.google.protobuf.RpcChannel channel) { - return new Stub(channel); - } - - public static final class Stub extends com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.RowCountService implements Interface { - private Stub(com.google.protobuf.RpcChannel channel) { - this.channel = channel; - } - - private final com.google.protobuf.RpcChannel channel; - - public com.google.protobuf.RpcChannel getChannel() { - return channel; - } - - public void getRowCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request, - com.google.protobuf.RpcCallback done) { - channel.callMethod( - getDescriptor().getMethods().get(0), - controller, - request, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance(), - com.google.protobuf.RpcUtil.generalizeCallback( - done, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.class, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance())); - } - - public void getKeyValueCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request, - com.google.protobuf.RpcCallback done) { - channel.callMethod( - getDescriptor().getMethods().get(1), - controller, - request, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance(), - com.google.protobuf.RpcUtil.generalizeCallback( - done, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.class, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance())); - } - } - - public static BlockingInterface newBlockingStub( - com.google.protobuf.BlockingRpcChannel channel) { - return new BlockingStub(channel); - } - - public interface BlockingInterface { - public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse getRowCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request) - throws com.google.protobuf.ServiceException; - - public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse getKeyValueCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request) - throws com.google.protobuf.ServiceException; - } - - private static final class BlockingStub implements BlockingInterface { - private BlockingStub(com.google.protobuf.BlockingRpcChannel channel) { - this.channel = channel; - } - - private final com.google.protobuf.BlockingRpcChannel channel; - - public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse getRowCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request) - throws com.google.protobuf.ServiceException { - return (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse) channel.callBlockingMethod( - getDescriptor().getMethods().get(0), - controller, - request, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance()); - } - - - public com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse getKeyValueCount( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountRequest request) - throws com.google.protobuf.ServiceException { - return (com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse) channel.callBlockingMethod( - getDescriptor().getMethods().get(1), - controller, - request, - com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos.CountResponse.getDefaultInstance()); - } - - } - - // @@protoc_insertion_point(class_scope:RowCountService) - } - - private static com.google.protobuf.Descriptors.Descriptor - internal_static_CountRequest_descriptor; - private static - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_CountRequest_fieldAccessorTable; - private static com.google.protobuf.Descriptors.Descriptor - internal_static_CountResponse_descriptor; - private static - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_CountResponse_fieldAccessorTable; - - public static com.google.protobuf.Descriptors.FileDescriptor - getDescriptor() { - return descriptor; - } - private static com.google.protobuf.Descriptors.FileDescriptor - descriptor; - static { - java.lang.String[] descriptorData = { - "\n\rexample.proto\"\016\n\014CountRequest\"!\n\rCount" + - "Response\022\020\n\005count\030\001 \002(\003:\00102r\n\017RowCountSe" + - "rvice\022,\n\013getRowCount\022\r.CountRequest\032\016.Co" + - "untResponse\0221\n\020getKeyValueCount\022\r.CountR" + - "equest\032\016.CountResponseBR\n9com.kylinolap." + - "storage.hbase.coprocessor.example.genera" + - "tedB\rExampleProtosH\001\210\001\001\240\001\001" - }; - com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = - new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { - public com.google.protobuf.ExtensionRegistry assignDescriptors( - com.google.protobuf.Descriptors.FileDescriptor root) { - descriptor = root; - internal_static_CountRequest_descriptor = - getDescriptor().getMessageTypes().get(0); - internal_static_CountRequest_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_CountRequest_descriptor, - new java.lang.String[] { }); - internal_static_CountResponse_descriptor = - getDescriptor().getMessageTypes().get(1); - internal_static_CountResponse_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_CountResponse_descriptor, - new java.lang.String[] { "Count", }); - return null; - } - }; - com.google.protobuf.Descriptors.FileDescriptor - .internalBuildGeneratedFileFrom(descriptorData, - new com.google.protobuf.Descriptors.FileDescriptor[] { - }, assigner); - } - - // @@protoc_insertion_point(outer_class_scope) -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/generated/NodeProtos.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/generated/NodeProtos.java deleted file mode 100644 index 923fd8f..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/example/generated/NodeProtos.java +++ /dev/null @@ -1,938 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: Node.proto - -package com.kylinolap.storage.hbase.endpoint.example.generated; - -public final class NodeProtos { - private NodeProtos() {} - public static void registerAllExtensions( - com.google.protobuf.ExtensionRegistry registry) { - } - public interface NodeOrBuilder - extends com.google.protobuf.MessageOrBuilder { - - // required string name = 1; - /** - * required string name = 1; - */ - boolean hasName(); - /** - * required string name = 1; - */ - java.lang.String getName(); - /** - * required string name = 1; - */ - com.google.protobuf.ByteString - getNameBytes(); - - // optional .Node left = 2; - /** - * optional .Node left = 2; - */ - boolean hasLeft(); - /** - * optional .Node left = 2; - */ - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node getLeft(); - /** - * optional .Node left = 2; - */ - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder getLeftOrBuilder(); - - // optional .Node right = 3; - /** - * optional .Node right = 3; - */ - boolean hasRight(); - /** - * optional .Node right = 3; - */ - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node getRight(); - /** - * optional .Node right = 3; - */ - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder getRightOrBuilder(); - } - /** - * Protobuf type {@code Node} - */ - public static final class Node extends - com.google.protobuf.GeneratedMessage - implements NodeOrBuilder { - // Use Node.newBuilder() to construct. - private Node(com.google.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - private Node(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } - - private static final Node defaultInstance; - public static Node getDefaultInstance() { - return defaultInstance; - } - - public Node getDefaultInstanceForType() { - return defaultInstance; - } - - private final com.google.protobuf.UnknownFieldSet unknownFields; - @java.lang.Override - public final com.google.protobuf.UnknownFieldSet - getUnknownFields() { - return this.unknownFields; - } - private Node( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - initFields(); - int mutable_bitField0_ = 0; - com.google.protobuf.UnknownFieldSet.Builder unknownFields = - com.google.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, - extensionRegistry, tag)) { - done = true; - } - break; - } - case 10: { - bitField0_ |= 0x00000001; - name_ = input.readBytes(); - break; - } - case 18: { - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder subBuilder = null; - if (((bitField0_ & 0x00000002) == 0x00000002)) { - subBuilder = left_.toBuilder(); - } - left_ = input.readMessage(com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.PARSER, extensionRegistry); - if (subBuilder != null) { - subBuilder.mergeFrom(left_); - left_ = subBuilder.buildPartial(); - } - bitField0_ |= 0x00000002; - break; - } - case 26: { - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder subBuilder = null; - if (((bitField0_ & 0x00000004) == 0x00000004)) { - subBuilder = right_.toBuilder(); - } - right_ = input.readMessage(com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.PARSER, extensionRegistry); - if (subBuilder != null) { - subBuilder.mergeFrom(right_); - right_ = subBuilder.buildPartial(); - } - bitField0_ |= 0x00000004; - break; - } - } - } - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException( - e.getMessage()).setUnfinishedMessage(this); - } finally { - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.internal_static_Node_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.internal_static_Node_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.class, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder.class); - } - - public static com.google.protobuf.Parser PARSER = - new com.google.protobuf.AbstractParser() { - public Node parsePartialFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return new Node(input, extensionRegistry); - } - }; - - @java.lang.Override - public com.google.protobuf.Parser getParserForType() { - return PARSER; - } - - private int bitField0_; - // required string name = 1; - public static final int NAME_FIELD_NUMBER = 1; - private java.lang.Object name_; - /** - * required string name = 1; - */ - public boolean hasName() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * required string name = 1; - */ - public java.lang.String getName() { - java.lang.Object ref = name_; - if (ref instanceof java.lang.String) { - return (java.lang.String) ref; - } else { - com.google.protobuf.ByteString bs = - (com.google.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - if (bs.isValidUtf8()) { - name_ = s; - } - return s; - } - } - /** - * required string name = 1; - */ - public com.google.protobuf.ByteString - getNameBytes() { - java.lang.Object ref = name_; - if (ref instanceof java.lang.String) { - com.google.protobuf.ByteString b = - com.google.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - name_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } - } - - // optional .Node left = 2; - public static final int LEFT_FIELD_NUMBER = 2; - private com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node left_; - /** - * optional .Node left = 2; - */ - public boolean hasLeft() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - /** - * optional .Node left = 2; - */ - public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node getLeft() { - return left_; - } - /** - * optional .Node left = 2; - */ - public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder getLeftOrBuilder() { - return left_; - } - - // optional .Node right = 3; - public static final int RIGHT_FIELD_NUMBER = 3; - private com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node right_; - /** - * optional .Node right = 3; - */ - public boolean hasRight() { - return ((bitField0_ & 0x00000004) == 0x00000004); - } - /** - * optional .Node right = 3; - */ - public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node getRight() { - return right_; - } - /** - * optional .Node right = 3; - */ - public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder getRightOrBuilder() { - return right_; - } - - private void initFields() { - name_ = ""; - left_ = com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance(); - right_ = com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance(); - } - private byte memoizedIsInitialized = -1; - public final boolean isInitialized() { - byte isInitialized = memoizedIsInitialized; - if (isInitialized != -1) return isInitialized == 1; - - if (!hasName()) { - memoizedIsInitialized = 0; - return false; - } - if (hasLeft()) { - if (!getLeft().isInitialized()) { - memoizedIsInitialized = 0; - return false; - } - } - if (hasRight()) { - if (!getRight().isInitialized()) { - memoizedIsInitialized = 0; - return false; - } - } - memoizedIsInitialized = 1; - return true; - } - - public void writeTo(com.google.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - if (((bitField0_ & 0x00000001) == 0x00000001)) { - output.writeBytes(1, getNameBytes()); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - output.writeMessage(2, left_); - } - if (((bitField0_ & 0x00000004) == 0x00000004)) { - output.writeMessage(3, right_); - } - getUnknownFields().writeTo(output); - } - - private int memoizedSerializedSize = -1; - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) return size; - - size = 0; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - size += com.google.protobuf.CodedOutputStream - .computeBytesSize(1, getNameBytes()); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - size += com.google.protobuf.CodedOutputStream - .computeMessageSize(2, left_); - } - if (((bitField0_ & 0x00000004) == 0x00000004)) { - size += com.google.protobuf.CodedOutputStream - .computeMessageSize(3, right_); - } - size += getUnknownFields().getSerializedSize(); - memoizedSerializedSize = size; - return size; - } - - private static final long serialVersionUID = 0L; - @java.lang.Override - protected java.lang.Object writeReplace() - throws java.io.ObjectStreamException { - return super.writeReplace(); - } - - public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseFrom( - com.google.protobuf.ByteString data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseFrom( - com.google.protobuf.ByteString data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseFrom(byte[] data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseFrom( - byte[] data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseDelimitedFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseFrom( - com.google.protobuf.CodedInputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parseFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static Builder newBuilder() { return Builder.create(); } - public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node prototype) { - return newBuilder().mergeFrom(prototype); - } - public Builder toBuilder() { return newBuilder(this); } - - @java.lang.Override - protected Builder newBuilderForType( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - Builder builder = new Builder(parent); - return builder; - } - /** - * Protobuf type {@code Node} - */ - public static final class Builder extends - com.google.protobuf.GeneratedMessage.Builder - implements com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder { - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.internal_static_Node_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.internal_static_Node_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.class, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder.class); - } - - // Construct using com.kylinolap.storage.hbase.coprocessor.example.generated.NodeProtos.Node.newBuilder() - private Builder() { - maybeForceBuilderInitialization(); - } - - private Builder( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - super(parent); - maybeForceBuilderInitialization(); - } - private void maybeForceBuilderInitialization() { - if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { - getLeftFieldBuilder(); - getRightFieldBuilder(); - } - } - private static Builder create() { - return new Builder(); - } - - public Builder clear() { - super.clear(); - name_ = ""; - bitField0_ = (bitField0_ & ~0x00000001); - if (leftBuilder_ == null) { - left_ = com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance(); - } else { - leftBuilder_.clear(); - } - bitField0_ = (bitField0_ & ~0x00000002); - if (rightBuilder_ == null) { - right_ = com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance(); - } else { - rightBuilder_.clear(); - } - bitField0_ = (bitField0_ & ~0x00000004); - return this; - } - - public Builder clone() { - return create().mergeFrom(buildPartial()); - } - - public com.google.protobuf.Descriptors.Descriptor - getDescriptorForType() { - return com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.internal_static_Node_descriptor; - } - - public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node getDefaultInstanceForType() { - return com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance(); - } - - public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node build() { - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node buildPartial() { - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node result = new com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node(this); - int from_bitField0_ = bitField0_; - int to_bitField0_ = 0; - if (((from_bitField0_ & 0x00000001) == 0x00000001)) { - to_bitField0_ |= 0x00000001; - } - result.name_ = name_; - if (((from_bitField0_ & 0x00000002) == 0x00000002)) { - to_bitField0_ |= 0x00000002; - } - if (leftBuilder_ == null) { - result.left_ = left_; - } else { - result.left_ = leftBuilder_.build(); - } - if (((from_bitField0_ & 0x00000004) == 0x00000004)) { - to_bitField0_ |= 0x00000004; - } - if (rightBuilder_ == null) { - result.right_ = right_; - } else { - result.right_ = rightBuilder_.build(); - } - result.bitField0_ = to_bitField0_; - onBuilt(); - return result; - } - - public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node) { - return mergeFrom((com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node)other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node other) { - if (other == com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance()) return this; - if (other.hasName()) { - bitField0_ |= 0x00000001; - name_ = other.name_; - onChanged(); - } - if (other.hasLeft()) { - mergeLeft(other.getLeft()); - } - if (other.hasRight()) { - mergeRight(other.getRight()); - } - this.mergeUnknownFields(other.getUnknownFields()); - return this; - } - - public final boolean isInitialized() { - if (!hasName()) { - - return false; - } - if (hasLeft()) { - if (!getLeft().isInitialized()) { - - return false; - } - } - if (hasRight()) { - if (!getRight().isInitialized()) { - - return false; - } - } - return true; - } - - public Builder mergeFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node parsedMessage = null; - try { - parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node) e.getUnfinishedMessage(); - throw e; - } finally { - if (parsedMessage != null) { - mergeFrom(parsedMessage); - } - } - return this; - } - private int bitField0_; - - // required string name = 1; - private java.lang.Object name_ = ""; - /** - * required string name = 1; - */ - public boolean hasName() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * required string name = 1; - */ - public java.lang.String getName() { - java.lang.Object ref = name_; - if (!(ref instanceof java.lang.String)) { - java.lang.String s = ((com.google.protobuf.ByteString) ref) - .toStringUtf8(); - name_ = s; - return s; - } else { - return (java.lang.String) ref; - } - } - /** - * required string name = 1; - */ - public com.google.protobuf.ByteString - getNameBytes() { - java.lang.Object ref = name_; - if (ref instanceof String) { - com.google.protobuf.ByteString b = - com.google.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - name_ = b; - return b; - } else { - return (com.google.protobuf.ByteString) ref; - } - } - /** - * required string name = 1; - */ - public Builder setName( - java.lang.String value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000001; - name_ = value; - onChanged(); - return this; - } - /** - * required string name = 1; - */ - public Builder clearName() { - bitField0_ = (bitField0_ & ~0x00000001); - name_ = getDefaultInstance().getName(); - onChanged(); - return this; - } - /** - * required string name = 1; - */ - public Builder setNameBytes( - com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000001; - name_ = value; - onChanged(); - return this; - } - - // optional .Node left = 2; - private com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node left_ = com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance(); - private com.google.protobuf.SingleFieldBuilder< - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder> leftBuilder_; - /** - * optional .Node left = 2; - */ - public boolean hasLeft() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - /** - * optional .Node left = 2; - */ - public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node getLeft() { - if (leftBuilder_ == null) { - return left_; - } else { - return leftBuilder_.getMessage(); - } - } - /** - * optional .Node left = 2; - */ - public Builder setLeft(com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node value) { - if (leftBuilder_ == null) { - if (value == null) { - throw new NullPointerException(); - } - left_ = value; - onChanged(); - } else { - leftBuilder_.setMessage(value); - } - bitField0_ |= 0x00000002; - return this; - } - /** - * optional .Node left = 2; - */ - public Builder setLeft( - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder builderForValue) { - if (leftBuilder_ == null) { - left_ = builderForValue.build(); - onChanged(); - } else { - leftBuilder_.setMessage(builderForValue.build()); - } - bitField0_ |= 0x00000002; - return this; - } - /** - * optional .Node left = 2; - */ - public Builder mergeLeft(com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node value) { - if (leftBuilder_ == null) { - if (((bitField0_ & 0x00000002) == 0x00000002) && - left_ != com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance()) { - left_ = - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.newBuilder(left_).mergeFrom(value).buildPartial(); - } else { - left_ = value; - } - onChanged(); - } else { - leftBuilder_.mergeFrom(value); - } - bitField0_ |= 0x00000002; - return this; - } - /** - * optional .Node left = 2; - */ - public Builder clearLeft() { - if (leftBuilder_ == null) { - left_ = com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance(); - onChanged(); - } else { - leftBuilder_.clear(); - } - bitField0_ = (bitField0_ & ~0x00000002); - return this; - } - /** - * optional .Node left = 2; - */ - public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder getLeftBuilder() { - bitField0_ |= 0x00000002; - onChanged(); - return getLeftFieldBuilder().getBuilder(); - } - /** - * optional .Node left = 2; - */ - public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder getLeftOrBuilder() { - if (leftBuilder_ != null) { - return leftBuilder_.getMessageOrBuilder(); - } else { - return left_; - } - } - /** - * optional .Node left = 2; - */ - private com.google.protobuf.SingleFieldBuilder< - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder> - getLeftFieldBuilder() { - if (leftBuilder_ == null) { - leftBuilder_ = new com.google.protobuf.SingleFieldBuilder< - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder>( - left_, - getParentForChildren(), - isClean()); - left_ = null; - } - return leftBuilder_; - } - - // optional .Node right = 3; - private com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node right_ = com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance(); - private com.google.protobuf.SingleFieldBuilder< - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder> rightBuilder_; - /** - * optional .Node right = 3; - */ - public boolean hasRight() { - return ((bitField0_ & 0x00000004) == 0x00000004); - } - /** - * optional .Node right = 3; - */ - public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node getRight() { - if (rightBuilder_ == null) { - return right_; - } else { - return rightBuilder_.getMessage(); - } - } - /** - * optional .Node right = 3; - */ - public Builder setRight(com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node value) { - if (rightBuilder_ == null) { - if (value == null) { - throw new NullPointerException(); - } - right_ = value; - onChanged(); - } else { - rightBuilder_.setMessage(value); - } - bitField0_ |= 0x00000004; - return this; - } - /** - * optional .Node right = 3; - */ - public Builder setRight( - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder builderForValue) { - if (rightBuilder_ == null) { - right_ = builderForValue.build(); - onChanged(); - } else { - rightBuilder_.setMessage(builderForValue.build()); - } - bitField0_ |= 0x00000004; - return this; - } - /** - * optional .Node right = 3; - */ - public Builder mergeRight(com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node value) { - if (rightBuilder_ == null) { - if (((bitField0_ & 0x00000004) == 0x00000004) && - right_ != com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance()) { - right_ = - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.newBuilder(right_).mergeFrom(value).buildPartial(); - } else { - right_ = value; - } - onChanged(); - } else { - rightBuilder_.mergeFrom(value); - } - bitField0_ |= 0x00000004; - return this; - } - /** - * optional .Node right = 3; - */ - public Builder clearRight() { - if (rightBuilder_ == null) { - right_ = com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.getDefaultInstance(); - onChanged(); - } else { - rightBuilder_.clear(); - } - bitField0_ = (bitField0_ & ~0x00000004); - return this; - } - /** - * optional .Node right = 3; - */ - public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder getRightBuilder() { - bitField0_ |= 0x00000004; - onChanged(); - return getRightFieldBuilder().getBuilder(); - } - /** - * optional .Node right = 3; - */ - public com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder getRightOrBuilder() { - if (rightBuilder_ != null) { - return rightBuilder_.getMessageOrBuilder(); - } else { - return right_; - } - } - /** - * optional .Node right = 3; - */ - private com.google.protobuf.SingleFieldBuilder< - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder> - getRightFieldBuilder() { - if (rightBuilder_ == null) { - rightBuilder_ = new com.google.protobuf.SingleFieldBuilder< - com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.Node.Builder, com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos.NodeOrBuilder>( - right_, - getParentForChildren(), - isClean()); - right_ = null; - } - return rightBuilder_; - } - - // @@protoc_insertion_point(builder_scope:Node) - } - - static { - defaultInstance = new Node(true); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:Node) - } - - private static com.google.protobuf.Descriptors.Descriptor - internal_static_Node_descriptor; - private static - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_Node_fieldAccessorTable; - - public static com.google.protobuf.Descriptors.FileDescriptor - getDescriptor() { - return descriptor; - } - private static com.google.protobuf.Descriptors.FileDescriptor - descriptor; - static { - java.lang.String[] descriptorData = { - "\n\nNode.proto\"?\n\004Node\022\014\n\004name\030\001 \002(\t\022\023\n\004le" + - "ft\030\002 \001(\0132\005.Node\022\024\n\005right\030\003 \001(\0132\005.NodeBG\n" + - "9com.kylinolap.storage.hbase.coprocessor" + - ".example.generatedB\nNodeProtos" - }; - com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = - new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { - public com.google.protobuf.ExtensionRegistry assignDescriptors( - com.google.protobuf.Descriptors.FileDescriptor root) { - descriptor = root; - internal_static_Node_descriptor = - getDescriptor().getMessageTypes().get(0); - internal_static_Node_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_Node_descriptor, - new java.lang.String[] { "Name", "Left", "Right", }); - return null; - } - }; - com.google.protobuf.Descriptors.FileDescriptor - .internalBuildGeneratedFileFrom(descriptorData, - new com.google.protobuf.Descriptors.FileDescriptor[] { - }, assigner); - } - - // @@protoc_insertion_point(outer_class_scope) -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/generated/IIProtos.java b/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/generated/IIProtos.java deleted file mode 100644 index 765dc2e..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/endpoint/generated/IIProtos.java +++ /dev/null @@ -1,1621 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: storage/src/main/java/com/kylinolap/storage/hbase/protobuf/II.proto - -package com.kylinolap.storage.hbase.endpoint.generated; - -public final class IIProtos { - private IIProtos() {} - public static void registerAllExtensions( - com.google.protobuf.ExtensionRegistry registry) { - } - public interface IIRequestOrBuilder - extends com.google.protobuf.MessageOrBuilder { - - // required bytes tableInfo = 1; - /** - * required bytes tableInfo = 1; - */ - boolean hasTableInfo(); - /** - * required bytes tableInfo = 1; - */ - com.google.protobuf.ByteString getTableInfo(); - - // required bytes sRowType = 2; - /** - * required bytes sRowType = 2; - */ - boolean hasSRowType(); - /** - * required bytes sRowType = 2; - */ - com.google.protobuf.ByteString getSRowType(); - - // optional bytes sRowFilter = 3; - /** - * optional bytes sRowFilter = 3; - */ - boolean hasSRowFilter(); - /** - * optional bytes sRowFilter = 3; - */ - com.google.protobuf.ByteString getSRowFilter(); - - // optional bytes sRowProjector = 4; - /** - * optional bytes sRowProjector = 4; - */ - boolean hasSRowProjector(); - /** - * optional bytes sRowProjector = 4; - */ - com.google.protobuf.ByteString getSRowProjector(); - - // optional bytes sRowAggregator = 5; - /** - * optional bytes sRowAggregator = 5; - */ - boolean hasSRowAggregator(); - /** - * optional bytes sRowAggregator = 5; - */ - com.google.protobuf.ByteString getSRowAggregator(); - } - /** - * Protobuf type {@code IIRequest} - */ - public static final class IIRequest extends - com.google.protobuf.GeneratedMessage - implements IIRequestOrBuilder { - // Use IIRequest.newBuilder() to construct. - private IIRequest(com.google.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - private IIRequest(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } - - private static final IIRequest defaultInstance; - public static IIRequest getDefaultInstance() { - return defaultInstance; - } - - public IIRequest getDefaultInstanceForType() { - return defaultInstance; - } - - private final com.google.protobuf.UnknownFieldSet unknownFields; - @java.lang.Override - public final com.google.protobuf.UnknownFieldSet - getUnknownFields() { - return this.unknownFields; - } - private IIRequest( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - initFields(); - int mutable_bitField0_ = 0; - com.google.protobuf.UnknownFieldSet.Builder unknownFields = - com.google.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, - extensionRegistry, tag)) { - done = true; - } - break; - } - case 10: { - bitField0_ |= 0x00000001; - tableInfo_ = input.readBytes(); - break; - } - case 18: { - bitField0_ |= 0x00000002; - sRowType_ = input.readBytes(); - break; - } - case 26: { - bitField0_ |= 0x00000004; - sRowFilter_ = input.readBytes(); - break; - } - case 34: { - bitField0_ |= 0x00000008; - sRowProjector_ = input.readBytes(); - break; - } - case 42: { - bitField0_ |= 0x00000010; - sRowAggregator_ = input.readBytes(); - break; - } - } - } - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException( - e.getMessage()).setUnfinishedMessage(this); - } finally { - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIRequest_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIRequest_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.class, com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.Builder.class); - } - - public static com.google.protobuf.Parser PARSER = - new com.google.protobuf.AbstractParser() { - public IIRequest parsePartialFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return new IIRequest(input, extensionRegistry); - } - }; - - @java.lang.Override - public com.google.protobuf.Parser getParserForType() { - return PARSER; - } - - private int bitField0_; - // required bytes tableInfo = 1; - public static final int TABLEINFO_FIELD_NUMBER = 1; - private com.google.protobuf.ByteString tableInfo_; - /** - * required bytes tableInfo = 1; - */ - public boolean hasTableInfo() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * required bytes tableInfo = 1; - */ - public com.google.protobuf.ByteString getTableInfo() { - return tableInfo_; - } - - // required bytes sRowType = 2; - public static final int SROWTYPE_FIELD_NUMBER = 2; - private com.google.protobuf.ByteString sRowType_; - /** - * required bytes sRowType = 2; - */ - public boolean hasSRowType() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - /** - * required bytes sRowType = 2; - */ - public com.google.protobuf.ByteString getSRowType() { - return sRowType_; - } - - // optional bytes sRowFilter = 3; - public static final int SROWFILTER_FIELD_NUMBER = 3; - private com.google.protobuf.ByteString sRowFilter_; - /** - * optional bytes sRowFilter = 3; - */ - public boolean hasSRowFilter() { - return ((bitField0_ & 0x00000004) == 0x00000004); - } - /** - * optional bytes sRowFilter = 3; - */ - public com.google.protobuf.ByteString getSRowFilter() { - return sRowFilter_; - } - - // optional bytes sRowProjector = 4; - public static final int SROWPROJECTOR_FIELD_NUMBER = 4; - private com.google.protobuf.ByteString sRowProjector_; - /** - * optional bytes sRowProjector = 4; - */ - public boolean hasSRowProjector() { - return ((bitField0_ & 0x00000008) == 0x00000008); - } - /** - * optional bytes sRowProjector = 4; - */ - public com.google.protobuf.ByteString getSRowProjector() { - return sRowProjector_; - } - - // optional bytes sRowAggregator = 5; - public static final int SROWAGGREGATOR_FIELD_NUMBER = 5; - private com.google.protobuf.ByteString sRowAggregator_; - /** - * optional bytes sRowAggregator = 5; - */ - public boolean hasSRowAggregator() { - return ((bitField0_ & 0x00000010) == 0x00000010); - } - /** - * optional bytes sRowAggregator = 5; - */ - public com.google.protobuf.ByteString getSRowAggregator() { - return sRowAggregator_; - } - - private void initFields() { - tableInfo_ = com.google.protobuf.ByteString.EMPTY; - sRowType_ = com.google.protobuf.ByteString.EMPTY; - sRowFilter_ = com.google.protobuf.ByteString.EMPTY; - sRowProjector_ = com.google.protobuf.ByteString.EMPTY; - sRowAggregator_ = com.google.protobuf.ByteString.EMPTY; - } - private byte memoizedIsInitialized = -1; - public final boolean isInitialized() { - byte isInitialized = memoizedIsInitialized; - if (isInitialized != -1) return isInitialized == 1; - - if (!hasTableInfo()) { - memoizedIsInitialized = 0; - return false; - } - if (!hasSRowType()) { - memoizedIsInitialized = 0; - return false; - } - memoizedIsInitialized = 1; - return true; - } - - public void writeTo(com.google.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - if (((bitField0_ & 0x00000001) == 0x00000001)) { - output.writeBytes(1, tableInfo_); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - output.writeBytes(2, sRowType_); - } - if (((bitField0_ & 0x00000004) == 0x00000004)) { - output.writeBytes(3, sRowFilter_); - } - if (((bitField0_ & 0x00000008) == 0x00000008)) { - output.writeBytes(4, sRowProjector_); - } - if (((bitField0_ & 0x00000010) == 0x00000010)) { - output.writeBytes(5, sRowAggregator_); - } - getUnknownFields().writeTo(output); - } - - private int memoizedSerializedSize = -1; - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) return size; - - size = 0; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - size += com.google.protobuf.CodedOutputStream - .computeBytesSize(1, tableInfo_); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - size += com.google.protobuf.CodedOutputStream - .computeBytesSize(2, sRowType_); - } - if (((bitField0_ & 0x00000004) == 0x00000004)) { - size += com.google.protobuf.CodedOutputStream - .computeBytesSize(3, sRowFilter_); - } - if (((bitField0_ & 0x00000008) == 0x00000008)) { - size += com.google.protobuf.CodedOutputStream - .computeBytesSize(4, sRowProjector_); - } - if (((bitField0_ & 0x00000010) == 0x00000010)) { - size += com.google.protobuf.CodedOutputStream - .computeBytesSize(5, sRowAggregator_); - } - size += getUnknownFields().getSerializedSize(); - memoizedSerializedSize = size; - return size; - } - - private static final long serialVersionUID = 0L; - @java.lang.Override - protected java.lang.Object writeReplace() - throws java.io.ObjectStreamException { - return super.writeReplace(); - } - - @java.lang.Override - public boolean equals(final java.lang.Object obj) { - if (obj == this) { - return true; - } - if (!(obj instanceof com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest)) { - return super.equals(obj); - } - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest other = (com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest) obj; - - boolean result = true; - result = result && (hasTableInfo() == other.hasTableInfo()); - if (hasTableInfo()) { - result = result && getTableInfo() - .equals(other.getTableInfo()); - } - result = result && (hasSRowType() == other.hasSRowType()); - if (hasSRowType()) { - result = result && getSRowType() - .equals(other.getSRowType()); - } - result = result && (hasSRowFilter() == other.hasSRowFilter()); - if (hasSRowFilter()) { - result = result && getSRowFilter() - .equals(other.getSRowFilter()); - } - result = result && (hasSRowProjector() == other.hasSRowProjector()); - if (hasSRowProjector()) { - result = result && getSRowProjector() - .equals(other.getSRowProjector()); - } - result = result && (hasSRowAggregator() == other.hasSRowAggregator()); - if (hasSRowAggregator()) { - result = result && getSRowAggregator() - .equals(other.getSRowAggregator()); - } - result = result && - getUnknownFields().equals(other.getUnknownFields()); - return result; - } - - private int memoizedHashCode = 0; - @java.lang.Override - public int hashCode() { - if (memoizedHashCode != 0) { - return memoizedHashCode; - } - int hash = 41; - hash = (19 * hash) + getDescriptorForType().hashCode(); - if (hasTableInfo()) { - hash = (37 * hash) + TABLEINFO_FIELD_NUMBER; - hash = (53 * hash) + getTableInfo().hashCode(); - } - if (hasSRowType()) { - hash = (37 * hash) + SROWTYPE_FIELD_NUMBER; - hash = (53 * hash) + getSRowType().hashCode(); - } - if (hasSRowFilter()) { - hash = (37 * hash) + SROWFILTER_FIELD_NUMBER; - hash = (53 * hash) + getSRowFilter().hashCode(); - } - if (hasSRowProjector()) { - hash = (37 * hash) + SROWPROJECTOR_FIELD_NUMBER; - hash = (53 * hash) + getSRowProjector().hashCode(); - } - if (hasSRowAggregator()) { - hash = (37 * hash) + SROWAGGREGATOR_FIELD_NUMBER; - hash = (53 * hash) + getSRowAggregator().hashCode(); - } - hash = (29 * hash) + getUnknownFields().hashCode(); - memoizedHashCode = hash; - return hash; - } - - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseFrom( - com.google.protobuf.ByteString data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseFrom( - com.google.protobuf.ByteString data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseFrom(byte[] data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseFrom( - byte[] data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input); - } - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseDelimitedFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseFrom( - com.google.protobuf.CodedInputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parseFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static Builder newBuilder() { return Builder.create(); } - public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest prototype) { - return newBuilder().mergeFrom(prototype); - } - public Builder toBuilder() { return newBuilder(this); } - - @java.lang.Override - protected Builder newBuilderForType( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - Builder builder = new Builder(parent); - return builder; - } - /** - * Protobuf type {@code IIRequest} - */ - public static final class Builder extends - com.google.protobuf.GeneratedMessage.Builder - implements com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequestOrBuilder { - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIRequest_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIRequest_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.class, com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.Builder.class); - } - - // Construct using com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.newBuilder() - private Builder() { - maybeForceBuilderInitialization(); - } - - private Builder( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - super(parent); - maybeForceBuilderInitialization(); - } - private void maybeForceBuilderInitialization() { - if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { - } - } - private static Builder create() { - return new Builder(); - } - - public Builder clear() { - super.clear(); - tableInfo_ = com.google.protobuf.ByteString.EMPTY; - bitField0_ = (bitField0_ & ~0x00000001); - sRowType_ = com.google.protobuf.ByteString.EMPTY; - bitField0_ = (bitField0_ & ~0x00000002); - sRowFilter_ = com.google.protobuf.ByteString.EMPTY; - bitField0_ = (bitField0_ & ~0x00000004); - sRowProjector_ = com.google.protobuf.ByteString.EMPTY; - bitField0_ = (bitField0_ & ~0x00000008); - sRowAggregator_ = com.google.protobuf.ByteString.EMPTY; - bitField0_ = (bitField0_ & ~0x00000010); - return this; - } - - public Builder clone() { - return create().mergeFrom(buildPartial()); - } - - public com.google.protobuf.Descriptors.Descriptor - getDescriptorForType() { - return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIRequest_descriptor; - } - - public com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest getDefaultInstanceForType() { - return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.getDefaultInstance(); - } - - public com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest build() { - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - public com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest buildPartial() { - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest result = new com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest(this); - int from_bitField0_ = bitField0_; - int to_bitField0_ = 0; - if (((from_bitField0_ & 0x00000001) == 0x00000001)) { - to_bitField0_ |= 0x00000001; - } - result.tableInfo_ = tableInfo_; - if (((from_bitField0_ & 0x00000002) == 0x00000002)) { - to_bitField0_ |= 0x00000002; - } - result.sRowType_ = sRowType_; - if (((from_bitField0_ & 0x00000004) == 0x00000004)) { - to_bitField0_ |= 0x00000004; - } - result.sRowFilter_ = sRowFilter_; - if (((from_bitField0_ & 0x00000008) == 0x00000008)) { - to_bitField0_ |= 0x00000008; - } - result.sRowProjector_ = sRowProjector_; - if (((from_bitField0_ & 0x00000010) == 0x00000010)) { - to_bitField0_ |= 0x00000010; - } - result.sRowAggregator_ = sRowAggregator_; - result.bitField0_ = to_bitField0_; - onBuilt(); - return result; - } - - public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest) { - return mergeFrom((com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest)other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest other) { - if (other == com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.getDefaultInstance()) return this; - if (other.hasTableInfo()) { - setTableInfo(other.getTableInfo()); - } - if (other.hasSRowType()) { - setSRowType(other.getSRowType()); - } - if (other.hasSRowFilter()) { - setSRowFilter(other.getSRowFilter()); - } - if (other.hasSRowProjector()) { - setSRowProjector(other.getSRowProjector()); - } - if (other.hasSRowAggregator()) { - setSRowAggregator(other.getSRowAggregator()); - } - this.mergeUnknownFields(other.getUnknownFields()); - return this; - } - - public final boolean isInitialized() { - if (!hasTableInfo()) { - - return false; - } - if (!hasSRowType()) { - - return false; - } - return true; - } - - public Builder mergeFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest parsedMessage = null; - try { - parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest) e.getUnfinishedMessage(); - throw e; - } finally { - if (parsedMessage != null) { - mergeFrom(parsedMessage); - } - } - return this; - } - private int bitField0_; - - // required bytes tableInfo = 1; - private com.google.protobuf.ByteString tableInfo_ = com.google.protobuf.ByteString.EMPTY; - /** - * required bytes tableInfo = 1; - */ - public boolean hasTableInfo() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * required bytes tableInfo = 1; - */ - public com.google.protobuf.ByteString getTableInfo() { - return tableInfo_; - } - /** - * required bytes tableInfo = 1; - */ - public Builder setTableInfo(com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000001; - tableInfo_ = value; - onChanged(); - return this; - } - /** - * required bytes tableInfo = 1; - */ - public Builder clearTableInfo() { - bitField0_ = (bitField0_ & ~0x00000001); - tableInfo_ = getDefaultInstance().getTableInfo(); - onChanged(); - return this; - } - - // required bytes sRowType = 2; - private com.google.protobuf.ByteString sRowType_ = com.google.protobuf.ByteString.EMPTY; - /** - * required bytes sRowType = 2; - */ - public boolean hasSRowType() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - /** - * required bytes sRowType = 2; - */ - public com.google.protobuf.ByteString getSRowType() { - return sRowType_; - } - /** - * required bytes sRowType = 2; - */ - public Builder setSRowType(com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000002; - sRowType_ = value; - onChanged(); - return this; - } - /** - * required bytes sRowType = 2; - */ - public Builder clearSRowType() { - bitField0_ = (bitField0_ & ~0x00000002); - sRowType_ = getDefaultInstance().getSRowType(); - onChanged(); - return this; - } - - // optional bytes sRowFilter = 3; - private com.google.protobuf.ByteString sRowFilter_ = com.google.protobuf.ByteString.EMPTY; - /** - * optional bytes sRowFilter = 3; - */ - public boolean hasSRowFilter() { - return ((bitField0_ & 0x00000004) == 0x00000004); - } - /** - * optional bytes sRowFilter = 3; - */ - public com.google.protobuf.ByteString getSRowFilter() { - return sRowFilter_; - } - /** - * optional bytes sRowFilter = 3; - */ - public Builder setSRowFilter(com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000004; - sRowFilter_ = value; - onChanged(); - return this; - } - /** - * optional bytes sRowFilter = 3; - */ - public Builder clearSRowFilter() { - bitField0_ = (bitField0_ & ~0x00000004); - sRowFilter_ = getDefaultInstance().getSRowFilter(); - onChanged(); - return this; - } - - // optional bytes sRowProjector = 4; - private com.google.protobuf.ByteString sRowProjector_ = com.google.protobuf.ByteString.EMPTY; - /** - * optional bytes sRowProjector = 4; - */ - public boolean hasSRowProjector() { - return ((bitField0_ & 0x00000008) == 0x00000008); - } - /** - * optional bytes sRowProjector = 4; - */ - public com.google.protobuf.ByteString getSRowProjector() { - return sRowProjector_; - } - /** - * optional bytes sRowProjector = 4; - */ - public Builder setSRowProjector(com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000008; - sRowProjector_ = value; - onChanged(); - return this; - } - /** - * optional bytes sRowProjector = 4; - */ - public Builder clearSRowProjector() { - bitField0_ = (bitField0_ & ~0x00000008); - sRowProjector_ = getDefaultInstance().getSRowProjector(); - onChanged(); - return this; - } - - // optional bytes sRowAggregator = 5; - private com.google.protobuf.ByteString sRowAggregator_ = com.google.protobuf.ByteString.EMPTY; - /** - * optional bytes sRowAggregator = 5; - */ - public boolean hasSRowAggregator() { - return ((bitField0_ & 0x00000010) == 0x00000010); - } - /** - * optional bytes sRowAggregator = 5; - */ - public com.google.protobuf.ByteString getSRowAggregator() { - return sRowAggregator_; - } - /** - * optional bytes sRowAggregator = 5; - */ - public Builder setSRowAggregator(com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000010; - sRowAggregator_ = value; - onChanged(); - return this; - } - /** - * optional bytes sRowAggregator = 5; - */ - public Builder clearSRowAggregator() { - bitField0_ = (bitField0_ & ~0x00000010); - sRowAggregator_ = getDefaultInstance().getSRowAggregator(); - onChanged(); - return this; - } - - // @@protoc_insertion_point(builder_scope:IIRequest) - } - - static { - defaultInstance = new IIRequest(true); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:IIRequest) - } - - public interface IIResponseOrBuilder - extends com.google.protobuf.MessageOrBuilder { - - // repeated bytes rows = 1; - /** - * repeated bytes rows = 1; - */ - java.util.List getRowsList(); - /** - * repeated bytes rows = 1; - */ - int getRowsCount(); - /** - * repeated bytes rows = 1; - */ - com.google.protobuf.ByteString getRows(int index); - } - /** - * Protobuf type {@code IIResponse} - */ - public static final class IIResponse extends - com.google.protobuf.GeneratedMessage - implements IIResponseOrBuilder { - // Use IIResponse.newBuilder() to construct. - private IIResponse(com.google.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - private IIResponse(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } - - private static final IIResponse defaultInstance; - public static IIResponse getDefaultInstance() { - return defaultInstance; - } - - public IIResponse getDefaultInstanceForType() { - return defaultInstance; - } - - private final com.google.protobuf.UnknownFieldSet unknownFields; - @java.lang.Override - public final com.google.protobuf.UnknownFieldSet - getUnknownFields() { - return this.unknownFields; - } - private IIResponse( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - initFields(); - int mutable_bitField0_ = 0; - com.google.protobuf.UnknownFieldSet.Builder unknownFields = - com.google.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, - extensionRegistry, tag)) { - done = true; - } - break; - } - case 10: { - if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) { - rows_ = new java.util.ArrayList(); - mutable_bitField0_ |= 0x00000001; - } - rows_.add(input.readBytes()); - break; - } - } - } - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException( - e.getMessage()).setUnfinishedMessage(this); - } finally { - if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) { - rows_ = java.util.Collections.unmodifiableList(rows_); - } - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIResponse_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIResponse_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.class, com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.Builder.class); - } - - public static com.google.protobuf.Parser PARSER = - new com.google.protobuf.AbstractParser() { - public IIResponse parsePartialFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return new IIResponse(input, extensionRegistry); - } - }; - - @java.lang.Override - public com.google.protobuf.Parser getParserForType() { - return PARSER; - } - - // repeated bytes rows = 1; - public static final int ROWS_FIELD_NUMBER = 1; - private java.util.List rows_; - /** - * repeated bytes rows = 1; - */ - public java.util.List - getRowsList() { - return rows_; - } - /** - * repeated bytes rows = 1; - */ - public int getRowsCount() { - return rows_.size(); - } - /** - * repeated bytes rows = 1; - */ - public com.google.protobuf.ByteString getRows(int index) { - return rows_.get(index); - } - - private void initFields() { - rows_ = java.util.Collections.emptyList(); - } - private byte memoizedIsInitialized = -1; - public final boolean isInitialized() { - byte isInitialized = memoizedIsInitialized; - if (isInitialized != -1) return isInitialized == 1; - - memoizedIsInitialized = 1; - return true; - } - - public void writeTo(com.google.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - for (int i = 0; i < rows_.size(); i++) { - output.writeBytes(1, rows_.get(i)); - } - getUnknownFields().writeTo(output); - } - - private int memoizedSerializedSize = -1; - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) return size; - - size = 0; - { - int dataSize = 0; - for (int i = 0; i < rows_.size(); i++) { - dataSize += com.google.protobuf.CodedOutputStream - .computeBytesSizeNoTag(rows_.get(i)); - } - size += dataSize; - size += 1 * getRowsList().size(); - } - size += getUnknownFields().getSerializedSize(); - memoizedSerializedSize = size; - return size; - } - - private static final long serialVersionUID = 0L; - @java.lang.Override - protected java.lang.Object writeReplace() - throws java.io.ObjectStreamException { - return super.writeReplace(); - } - - @java.lang.Override - public boolean equals(final java.lang.Object obj) { - if (obj == this) { - return true; - } - if (!(obj instanceof com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse)) { - return super.equals(obj); - } - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse other = (com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse) obj; - - boolean result = true; - result = result && getRowsList() - .equals(other.getRowsList()); - result = result && - getUnknownFields().equals(other.getUnknownFields()); - return result; - } - - private int memoizedHashCode = 0; - @java.lang.Override - public int hashCode() { - if (memoizedHashCode != 0) { - return memoizedHashCode; - } - int hash = 41; - hash = (19 * hash) + getDescriptorForType().hashCode(); - if (getRowsCount() > 0) { - hash = (37 * hash) + ROWS_FIELD_NUMBER; - hash = (53 * hash) + getRowsList().hashCode(); - } - hash = (29 * hash) + getUnknownFields().hashCode(); - memoizedHashCode = hash; - return hash; - } - - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseFrom( - com.google.protobuf.ByteString data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseFrom( - com.google.protobuf.ByteString data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseFrom(byte[] data) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseFrom( - byte[] data, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input); - } - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseDelimitedFrom( - java.io.InputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input, extensionRegistry); - } - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseFrom( - com.google.protobuf.CodedInputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parseFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static Builder newBuilder() { return Builder.create(); } - public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse prototype) { - return newBuilder().mergeFrom(prototype); - } - public Builder toBuilder() { return newBuilder(this); } - - @java.lang.Override - protected Builder newBuilderForType( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - Builder builder = new Builder(parent); - return builder; - } - /** - * Protobuf type {@code IIResponse} - */ - public static final class Builder extends - com.google.protobuf.GeneratedMessage.Builder - implements com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponseOrBuilder { - public static final com.google.protobuf.Descriptors.Descriptor - getDescriptor() { - return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIResponse_descriptor; - } - - protected com.google.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIResponse_fieldAccessorTable - .ensureFieldAccessorsInitialized( - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.class, com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.Builder.class); - } - - // Construct using com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.newBuilder() - private Builder() { - maybeForceBuilderInitialization(); - } - - private Builder( - com.google.protobuf.GeneratedMessage.BuilderParent parent) { - super(parent); - maybeForceBuilderInitialization(); - } - private void maybeForceBuilderInitialization() { - if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { - } - } - private static Builder create() { - return new Builder(); - } - - public Builder clear() { - super.clear(); - rows_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000001); - return this; - } - - public Builder clone() { - return create().mergeFrom(buildPartial()); - } - - public com.google.protobuf.Descriptors.Descriptor - getDescriptorForType() { - return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.internal_static_IIResponse_descriptor; - } - - public com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse getDefaultInstanceForType() { - return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.getDefaultInstance(); - } - - public com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse build() { - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - public com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse buildPartial() { - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse result = new com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse(this); - int from_bitField0_ = bitField0_; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - rows_ = java.util.Collections.unmodifiableList(rows_); - bitField0_ = (bitField0_ & ~0x00000001); - } - result.rows_ = rows_; - onBuilt(); - return result; - } - - public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse) { - return mergeFrom((com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse)other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse other) { - if (other == com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.getDefaultInstance()) return this; - if (!other.rows_.isEmpty()) { - if (rows_.isEmpty()) { - rows_ = other.rows_; - bitField0_ = (bitField0_ & ~0x00000001); - } else { - ensureRowsIsMutable(); - rows_.addAll(other.rows_); - } - onChanged(); - } - this.mergeUnknownFields(other.getUnknownFields()); - return this; - } - - public final boolean isInitialized() { - return true; - } - - public Builder mergeFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse parsedMessage = null; - try { - parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse) e.getUnfinishedMessage(); - throw e; - } finally { - if (parsedMessage != null) { - mergeFrom(parsedMessage); - } - } - return this; - } - private int bitField0_; - - // repeated bytes rows = 1; - private java.util.List rows_ = java.util.Collections.emptyList(); - private void ensureRowsIsMutable() { - if (!((bitField0_ & 0x00000001) == 0x00000001)) { - rows_ = new java.util.ArrayList(rows_); - bitField0_ |= 0x00000001; - } - } - /** - * repeated bytes rows = 1; - */ - public java.util.List - getRowsList() { - return java.util.Collections.unmodifiableList(rows_); - } - /** - * repeated bytes rows = 1; - */ - public int getRowsCount() { - return rows_.size(); - } - /** - * repeated bytes rows = 1; - */ - public com.google.protobuf.ByteString getRows(int index) { - return rows_.get(index); - } - /** - * repeated bytes rows = 1; - */ - public Builder setRows( - int index, com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - ensureRowsIsMutable(); - rows_.set(index, value); - onChanged(); - return this; - } - /** - * repeated bytes rows = 1; - */ - public Builder addRows(com.google.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - ensureRowsIsMutable(); - rows_.add(value); - onChanged(); - return this; - } - /** - * repeated bytes rows = 1; - */ - public Builder addAllRows( - java.lang.Iterable values) { - ensureRowsIsMutable(); - super.addAll(values, rows_); - onChanged(); - return this; - } - /** - * repeated bytes rows = 1; - */ - public Builder clearRows() { - rows_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000001); - onChanged(); - return this; - } - - // @@protoc_insertion_point(builder_scope:IIResponse) - } - - static { - defaultInstance = new IIResponse(true); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:IIResponse) - } - - /** - * Protobuf service {@code RowsService} - */ - public static abstract class RowsService - implements com.google.protobuf.Service { - protected RowsService() {} - - public interface Interface { - /** - * rpc getRows(.IIRequest) returns (.IIResponse); - */ - public abstract void getRows( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest request, - com.google.protobuf.RpcCallback done); - - } - - public static com.google.protobuf.Service newReflectiveService( - final Interface impl) { - return new RowsService() { - @java.lang.Override - public void getRows( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest request, - com.google.protobuf.RpcCallback done) { - impl.getRows(controller, request, done); - } - - }; - } - - public static com.google.protobuf.BlockingService - newReflectiveBlockingService(final BlockingInterface impl) { - return new com.google.protobuf.BlockingService() { - public final com.google.protobuf.Descriptors.ServiceDescriptor - getDescriptorForType() { - return getDescriptor(); - } - - public final com.google.protobuf.Message callBlockingMethod( - com.google.protobuf.Descriptors.MethodDescriptor method, - com.google.protobuf.RpcController controller, - com.google.protobuf.Message request) - throws com.google.protobuf.ServiceException { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.callBlockingMethod() given method descriptor for " + - "wrong service type."); - } - switch(method.getIndex()) { - case 0: - return impl.getRows(controller, (com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest)request); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public final com.google.protobuf.Message - getRequestPrototype( - com.google.protobuf.Descriptors.MethodDescriptor method) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.getRequestPrototype() given method " + - "descriptor for wrong service type."); - } - switch(method.getIndex()) { - case 0: - return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.getDefaultInstance(); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public final com.google.protobuf.Message - getResponsePrototype( - com.google.protobuf.Descriptors.MethodDescriptor method) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.getResponsePrototype() given method " + - "descriptor for wrong service type."); - } - switch(method.getIndex()) { - case 0: - return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.getDefaultInstance(); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - }; - } - - /** - * rpc getRows(.IIRequest) returns (.IIResponse); - */ - public abstract void getRows( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest request, - com.google.protobuf.RpcCallback done); - - public static final - com.google.protobuf.Descriptors.ServiceDescriptor - getDescriptor() { - return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.getDescriptor().getServices().get(0); - } - public final com.google.protobuf.Descriptors.ServiceDescriptor - getDescriptorForType() { - return getDescriptor(); - } - - public final void callMethod( - com.google.protobuf.Descriptors.MethodDescriptor method, - com.google.protobuf.RpcController controller, - com.google.protobuf.Message request, - com.google.protobuf.RpcCallback< - com.google.protobuf.Message> done) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.callMethod() given method descriptor for wrong " + - "service type."); - } - switch(method.getIndex()) { - case 0: - this.getRows(controller, (com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest)request, - com.google.protobuf.RpcUtil.specializeCallback( - done)); - return; - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public final com.google.protobuf.Message - getRequestPrototype( - com.google.protobuf.Descriptors.MethodDescriptor method) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.getRequestPrototype() given method " + - "descriptor for wrong service type."); - } - switch(method.getIndex()) { - case 0: - return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest.getDefaultInstance(); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public final com.google.protobuf.Message - getResponsePrototype( - com.google.protobuf.Descriptors.MethodDescriptor method) { - if (method.getService() != getDescriptor()) { - throw new java.lang.IllegalArgumentException( - "Service.getResponsePrototype() given method " + - "descriptor for wrong service type."); - } - switch(method.getIndex()) { - case 0: - return com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.getDefaultInstance(); - default: - throw new java.lang.AssertionError("Can't get here."); - } - } - - public static Stub newStub( - com.google.protobuf.RpcChannel channel) { - return new Stub(channel); - } - - public static final class Stub extends com.kylinolap.storage.hbase.endpoint.generated.IIProtos.RowsService implements Interface { - private Stub(com.google.protobuf.RpcChannel channel) { - this.channel = channel; - } - - private final com.google.protobuf.RpcChannel channel; - - public com.google.protobuf.RpcChannel getChannel() { - return channel; - } - - public void getRows( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest request, - com.google.protobuf.RpcCallback done) { - channel.callMethod( - getDescriptor().getMethods().get(0), - controller, - request, - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.getDefaultInstance(), - com.google.protobuf.RpcUtil.generalizeCallback( - done, - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.class, - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.getDefaultInstance())); - } - } - - public static BlockingInterface newBlockingStub( - com.google.protobuf.BlockingRpcChannel channel) { - return new BlockingStub(channel); - } - - public interface BlockingInterface { - public com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse getRows( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest request) - throws com.google.protobuf.ServiceException; - } - - private static final class BlockingStub implements BlockingInterface { - private BlockingStub(com.google.protobuf.BlockingRpcChannel channel) { - this.channel = channel; - } - - private final com.google.protobuf.BlockingRpcChannel channel; - - public com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse getRows( - com.google.protobuf.RpcController controller, - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIRequest request) - throws com.google.protobuf.ServiceException { - return (com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse) channel.callBlockingMethod( - getDescriptor().getMethods().get(0), - controller, - request, - com.kylinolap.storage.hbase.endpoint.generated.IIProtos.IIResponse.getDefaultInstance()); - } - - } - - // @@protoc_insertion_point(class_scope:RowsService) - } - - private static com.google.protobuf.Descriptors.Descriptor - internal_static_IIRequest_descriptor; - private static - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_IIRequest_fieldAccessorTable; - private static com.google.protobuf.Descriptors.Descriptor - internal_static_IIResponse_descriptor; - private static - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_IIResponse_fieldAccessorTable; - - public static com.google.protobuf.Descriptors.FileDescriptor - getDescriptor() { - return descriptor; - } - private static com.google.protobuf.Descriptors.FileDescriptor - descriptor; - static { - java.lang.String[] descriptorData = { - "\nCstorage/src/main/java/com/kylinolap/st" + - "orage/hbase/protobuf/II.proto\"s\n\tIIReque" + - "st\022\021\n\ttableInfo\030\001 \002(\014\022\020\n\010sRowType\030\002 \002(\014\022" + - "\022\n\nsRowFilter\030\003 \001(\014\022\025\n\rsRowProjector\030\004 \001" + - "(\014\022\026\n\016sRowAggregator\030\005 \001(\014\"\032\n\nIIResponse" + - "\022\014\n\004rows\030\001 \003(\01421\n\013RowsService\022\"\n\007getRows" + - "\022\n.IIRequest\032\013.IIResponseBB\n.com.kylinol" + - "ap.storage.hbase.endpoint.generatedB\010IIP" + - "rotosH\001\210\001\001\240\001\001" - }; - com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = - new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { - public com.google.protobuf.ExtensionRegistry assignDescriptors( - com.google.protobuf.Descriptors.FileDescriptor root) { - descriptor = root; - internal_static_IIRequest_descriptor = - getDescriptor().getMessageTypes().get(0); - internal_static_IIRequest_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_IIRequest_descriptor, - new java.lang.String[] { "TableInfo", "SRowType", "SRowFilter", "SRowProjector", "SRowAggregator", }); - internal_static_IIResponse_descriptor = - getDescriptor().getMessageTypes().get(1); - internal_static_IIResponse_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_IIResponse_descriptor, - new java.lang.String[] { "Rows", }); - return null; - } - }; - com.google.protobuf.Descriptors.FileDescriptor - .internalBuildGeneratedFileFrom(descriptorData, - new com.google.protobuf.Descriptors.FileDescriptor[] { - }, assigner); - } - - // @@protoc_insertion_point(outer_class_scope) -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserver.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserver.java deleted file mode 100644 index 20011be..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserver.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import java.io.IOException; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.hadoop.hbase.client.Scan; -import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver; -import org.apache.hadoop.hbase.coprocessor.ObserverContext; -import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; -import org.apache.hadoop.hbase.regionserver.HRegion; -import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost; -import org.apache.hadoop.hbase.regionserver.RegionScanner; - -/** - * @author yangli9 - */ -public class AggregateRegionObserver extends BaseRegionObserver { - - // HBase uses common logging (vs. Kylin uses slf4j) - static final Log LOG = LogFactory.getLog(AggregateRegionObserver.class); - - static final String COPROCESSOR_ENABLE = "_Coprocessor_Enable"; - static final String TYPE = "_Type"; - static final String PROJECTOR = "_Projector"; - static final String AGGREGATORS = "_Aggregators"; - static final String FILTER = "_Filter"; - - @Override - public final RegionScanner postScannerOpen(final ObserverContext ctxt, final Scan scan, final RegionScanner innerScanner) throws IOException { - - boolean copAbortOnError = ctxt.getEnvironment().getConfiguration().getBoolean(RegionCoprocessorHost.ABORT_ON_ERROR_KEY, RegionCoprocessorHost.DEFAULT_ABORT_ON_ERROR); - - // never throw out exception that could abort region server - if (copAbortOnError) { - try { - return doPostScannerObserver(ctxt, scan, innerScanner); - } catch (Throwable e) { - LOG.error("Kylin Coprocessor Error", e); - return innerScanner; - } - } else { - return doPostScannerObserver(ctxt, scan, innerScanner); - } - } - - private RegionScanner doPostScannerObserver(final ObserverContext ctxt, final Scan scan, final RegionScanner innerScanner) throws IOException { - byte[] coprocessorEnableBytes = scan.getAttribute(COPROCESSOR_ENABLE); - if (coprocessorEnableBytes == null || coprocessorEnableBytes.length == 0 || coprocessorEnableBytes[0] == 0) { - return innerScanner; - } - - byte[] typeBytes = scan.getAttribute(TYPE); - ObserverRowType type = ObserverRowType.deserialize(typeBytes); - - byte[] projectorBytes = scan.getAttribute(PROJECTOR); - ObserverProjector projector = ObserverProjector.deserialize(projectorBytes); - - byte[] aggregatorBytes = scan.getAttribute(AGGREGATORS); - ObserverAggregators aggregators = ObserverAggregators.deserialize(aggregatorBytes); - - byte[] filterBytes = scan.getAttribute(FILTER); - ObserverFilter filter = ObserverFilter.deserialize(filterBytes); - - // start/end region operation & sync on scanner is suggested by the - // javadoc of RegionScanner.nextRaw() - // FIXME: will the lock still work when a iterator is returned? is it safe? Is readonly attribute helping here? by mhb - HRegion region = ctxt.getEnvironment().getRegion(); - region.startRegionOperation(); - try { - synchronized (innerScanner) { - return new AggregationScanner(type, filter, projector, aggregators, innerScanner); - } - } finally { - region.closeRegionOperation(); - } - - } - -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregationCache.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregationCache.java deleted file mode 100644 index f5e743d..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregationCache.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.Iterator; -import java.util.List; -import java.util.Map.Entry; -import java.util.SortedMap; - -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.HConstants; -import org.apache.hadoop.hbase.HRegionInfo; -import org.apache.hadoop.hbase.KeyValue; -import org.apache.hadoop.hbase.KeyValue.Type; -import org.apache.hadoop.hbase.regionserver.RegionScanner; - -import com.google.common.collect.Maps; -import com.kylinolap.cube.measure.MeasureAggregator; -import com.kylinolap.storage.hbase.observer.ObserverProjector.AggrKey; - -/** - * @author yangli9 - * - */ -@SuppressWarnings("rawtypes") -public class AggregationCache { - - static final int MEMORY_USAGE_CAP = 500 * 1024 * 1024; // 500 MB - - private final SortedMap aggBufMap; - private final ObserverAggregators aggregators; - - transient int rowMemBytes; - - public AggregationCache(ObserverAggregators aggregators) { - this.aggregators = aggregators; - this.aggBufMap = Maps.newTreeMap(); - } - - public MeasureAggregator[] getBuffer(AggrKey aggkey) { - MeasureAggregator[] aggBuf = aggBufMap.get(aggkey); - if (aggBuf == null) { - aggBuf = aggregators.createBuffer(); - aggBufMap.put(aggkey.copy(), aggBuf); - } - return aggBuf; - } - - public RegionScanner getScanner(RegionScanner innerScanner) { - return new AggregationRegionScanner(innerScanner); - } - - public long getSize() { - return aggBufMap.size(); - } - - public void checkMemoryUsage() { - // about memory calculation, - // http://seniorjava.wordpress.com/2013/09/01/java-objects-memory-size-reference/ - if (rowMemBytes <= 0) { - if (aggBufMap.size() > 0) { - rowMemBytes = 0; - MeasureAggregator[] measureAggregators = aggBufMap.get(aggBufMap.firstKey()); - for (MeasureAggregator agg : measureAggregators) { - rowMemBytes += agg.getMemBytes(); - } - } - } - int size = aggBufMap.size(); - int memUsage = (40 + rowMemBytes) * size; - if (memUsage > MEMORY_USAGE_CAP) { - throw new RuntimeException("Kylin coprocess memory usage goes beyond cap, (40 + " + rowMemBytes + ") * " + size + " > " + MEMORY_USAGE_CAP + ". Abord coprocessor."); - } - } - - private class AggregationRegionScanner implements RegionScanner { - - private final RegionScanner innerScanner; - private final Iterator> iterator; - - public AggregationRegionScanner(RegionScanner innerScanner) { - this.innerScanner = innerScanner; - this.iterator = aggBufMap.entrySet().iterator(); - } - - @Override - public boolean next(List results) throws IOException { - // AggregateRegionObserver.LOG.info("Kylin Scanner next()"); - boolean hasMore = false; - if (iterator.hasNext()) { - Entry entry = iterator.next(); - makeCells(entry, results); - hasMore = iterator.hasNext(); - } - // AggregateRegionObserver.LOG.info("Kylin Scanner next() done"); - return hasMore; - } - - private void makeCells(Entry entry, List results) { - byte[][] families = aggregators.getHColFamilies(); - byte[][] qualifiers = aggregators.getHColQualifiers(); - int nHCols = aggregators.getHColsNum(); - - AggrKey rowKey = entry.getKey(); - MeasureAggregator[] aggBuf = entry.getValue(); - ByteBuffer[] rowValues = aggregators.getHColValues(aggBuf); - - if (nHCols == 0) { - Cell keyValue = new KeyValue(rowKey.get(), rowKey.offset(), rowKey.length(), // - null, 0, 0, // - null, 0, 0, // - HConstants.LATEST_TIMESTAMP, Type.Put, // - null, 0, 0); - results.add(keyValue); - } else { - for (int i = 0; i < nHCols; i++) { - Cell keyValue = new KeyValue(rowKey.get(), rowKey.offset(), rowKey.length(), // - families[i], 0, families[i].length, // - qualifiers[i], 0, qualifiers[i].length, // - HConstants.LATEST_TIMESTAMP, Type.Put, // - rowValues[i].array(), 0, rowValues[i].position()); - results.add(keyValue); - } - } - } - - @Override - public boolean next(List result, int limit) throws IOException { - return next(result); - } - - @Override - public boolean nextRaw(List result) throws IOException { - return next(result); - } - - @Override - public boolean nextRaw(List result, int limit) throws IOException { - return next(result); - } - - @Override - public void close() throws IOException { - // AggregateRegionObserver.LOG.info("Kylin Scanner close()"); - innerScanner.close(); - // AggregateRegionObserver.LOG.info("Kylin Scanner close() done"); - } - - @Override - public HRegionInfo getRegionInfo() { - // AggregateRegionObserver.LOG.info("Kylin Scanner getRegionInfo()"); - return innerScanner.getRegionInfo(); - } - - @Override - public long getMaxResultSize() { - // AggregateRegionObserver.LOG.info("Kylin Scanner getMaxResultSize()"); - return Long.MAX_VALUE; - } - - @Override - public boolean isFilterDone() throws IOException { - // AggregateRegionObserver.LOG.info("Kylin Scanner isFilterDone()"); - return false; - } - - @Override - public boolean reseek(byte[] row) throws IOException { - throw new UnsupportedOperationException(); - } - - @Override - public long getMvccReadPoint() { - // AggregateRegionObserver.LOG.info("Kylin Scanner getMvccReadPoint()"); - return Long.MAX_VALUE; - } - } - -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregationScanner.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregationScanner.java deleted file mode 100644 index 1a566a1..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/AggregationScanner.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.HRegionInfo; -import org.apache.hadoop.hbase.regionserver.RegionScanner; - -import com.kylinolap.cube.measure.MeasureAggregator; -import com.kylinolap.storage.hbase.observer.ObserverProjector.AggrKey; - -/** - * @author yangli9 - * - */ -public class AggregationScanner implements RegionScanner { - - private RegionScanner outerScanner; - - public AggregationScanner(ObserverRowType type, ObserverFilter filter, ObserverProjector groupBy, ObserverAggregators aggrs, RegionScanner innerScanner) throws IOException { - - AggregateRegionObserver.LOG.info("Kylin Coprocessor start"); - - AggregationCache aggCache; - Stats stats = new Stats(); - - aggCache = buildAggrCache(innerScanner, type, groupBy, aggrs, filter, stats); - stats.countOutputRow(aggCache.getSize()); - this.outerScanner = aggCache.getScanner(innerScanner); - - AggregateRegionObserver.LOG.info("Kylin Coprocessor aggregation done: " + stats); - } - - @SuppressWarnings("rawtypes") - AggregationCache buildAggrCache(final RegionScanner innerScanner, ObserverRowType type, ObserverProjector projector, ObserverAggregators aggregators, ObserverFilter filter, Stats stats) throws IOException { - - AggregationCache aggCache = new AggregationCache(aggregators); - - ObserverTuple tuple = new ObserverTuple(type); - boolean hasMore = true; - List results = new ArrayList(); - while (hasMore) { - results.clear(); - hasMore = innerScanner.nextRaw(results); - if (results.isEmpty()) - continue; - - if (stats != null) - stats.countInputRow(results); - - Cell cell = results.get(0); - tuple.setUnderlying(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength()); - if (filter != null && filter.evaluate(tuple) == false) - continue; - - AggrKey aggKey = projector.getRowKey(results); - MeasureAggregator[] bufs = aggCache.getBuffer(aggKey); - aggregators.aggregate(bufs, results); - - aggCache.checkMemoryUsage(); - } - return aggCache; - } - - @Override - public boolean next(List results) throws IOException { - return outerScanner.next(results); - } - - @Override - public boolean next(List result, int limit) throws IOException { - return outerScanner.next(result, limit); - } - - @Override - public boolean nextRaw(List result) throws IOException { - return outerScanner.nextRaw(result); - } - - @Override - public boolean nextRaw(List result, int limit) throws IOException { - return outerScanner.nextRaw(result, limit); - } - - @Override - public void close() throws IOException { - outerScanner.close(); - } - - @Override - public HRegionInfo getRegionInfo() { - return outerScanner.getRegionInfo(); - } - - @Override - public boolean isFilterDone() throws IOException { - return outerScanner.isFilterDone(); - } - - @Override - public boolean reseek(byte[] row) throws IOException { - return outerScanner.reseek(row); - } - - @Override - public long getMaxResultSize() { - return outerScanner.getMaxResultSize(); - } - - @Override - public long getMvccReadPoint() { - return outerScanner.getMvccReadPoint(); - } - - private static class Stats { - long inputRows = 0; - long inputBytes = 0; - long outputRows = 0; - - // have no outputBytes because that requires actual serialize all the - // aggregator buffers - - public void countInputRow(List row) { - inputRows++; - inputBytes += row.get(0).getRowLength(); - for (int i = 0, n = row.size(); i < n; i++) { - inputBytes += row.get(i).getValueLength(); - } - } - - public void countOutputRow(long rowCount) { - outputRows += rowCount; - } - - public String toString() { - double percent = (double) outputRows / inputRows * 100; - return Math.round(percent) + "% = " + outputRows + " (out rows) / " + inputRows + " (in rows); in bytes = " + inputBytes + "; est. out bytes = " + Math.round(inputBytes * percent / 100); - } - } -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/CoprocessorEnabler.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/CoprocessorEnabler.java deleted file mode 100644 index 84b6b21..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/CoprocessorEnabler.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import java.io.IOException; -import java.util.Collection; -import java.util.Map; -import java.util.Set; - -import org.apache.hadoop.hbase.client.HTableInterface; -import org.apache.hadoop.hbase.client.ResultScanner; -import org.apache.hadoop.hbase.client.Scan; -import org.apache.hadoop.hbase.regionserver.RegionScanner; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import com.kylinolap.cube.CubeInstance; -import com.kylinolap.cube.CubeSegment; -import com.kylinolap.cube.cuboid.Cuboid; -import com.kylinolap.cube.kv.RowValueDecoder; -import com.kylinolap.metadata.model.realization.TblColRef; -import com.kylinolap.storage.StorageContext; -import com.kylinolap.storage.filter.TupleFilter; -import com.kylinolap.storage.hbase.RegionScannerAdapter; -import com.kylinolap.storage.hbase.ResultScannerAdapter; - -/** - * @author yangli9 - */ -public class CoprocessorEnabler { - - private static final Logger logger = LoggerFactory.getLogger(CoprocessorEnabler.class); - - static final String FORCE_COPROCESSOR = "forceCoprocessor"; - static final boolean DEBUG_LOCAL_COPROCESSOR = false; - static final int SERIALIZE_BUFFER_SIZE = 65536; - static final Map CUBE_OVERRIDES = Maps.newConcurrentMap(); - - public static ResultScanner scanWithCoprocessorIfBeneficial(CubeSegment segment, Cuboid cuboid, TupleFilter tupleFiler, // - Collection groupBy, Collection rowValueDecoders, StorageContext context, HTableInterface table, Scan scan) throws IOException { - - if (context.isCoprocessorEnabled() == false) { - return table.getScanner(scan); - } - - ObserverRowType type = ObserverRowType.fromCuboid(segment, cuboid); - ObserverFilter filter = ObserverFilter.fromFilter(segment, tupleFiler); - ObserverProjector projector = ObserverProjector.fromColumns(segment, cuboid, groupBy); - ObserverAggregators aggrs = ObserverAggregators.fromValueDecoders(rowValueDecoders); - - if (DEBUG_LOCAL_COPROCESSOR) { - RegionScanner innerScanner = new RegionScannerAdapter(table.getScanner(scan)); - AggregationScanner aggrScanner = new AggregationScanner(type, filter, projector, aggrs, innerScanner); - return new ResultScannerAdapter(aggrScanner); - } else { - scan.setAttribute(AggregateRegionObserver.COPROCESSOR_ENABLE, new byte[] { 0x01 }); - scan.setAttribute(AggregateRegionObserver.TYPE, ObserverRowType.serialize(type)); - scan.setAttribute(AggregateRegionObserver.PROJECTOR, ObserverProjector.serialize(projector)); - scan.setAttribute(AggregateRegionObserver.AGGREGATORS, ObserverAggregators.serialize(aggrs)); - scan.setAttribute(AggregateRegionObserver.FILTER, ObserverFilter.serialize(filter)); - return table.getScanner(scan); - } - } - - public static void enableCoprocessorIfBeneficial(CubeInstance cube, Collection groupBy, Collection rowValueDecoders, StorageContext context) { - if (isCoprocessorBeneficial(cube, groupBy, rowValueDecoders, context)) { - context.enableCoprocessor(); - } - } - - private static boolean isCoprocessorBeneficial(CubeInstance cube, Collection groupBy, Collection rowValueDecoders, StorageContext context) { - - if (context.isAvoidAggregation()) { - logger.info("Coprocessor is disabled because context tells to avoid aggregation"); - return false; - } - - String forceFlag = System.getProperty(FORCE_COPROCESSOR); - if (forceFlag != null) { - return Boolean.parseBoolean(forceFlag); - } - - Boolean cubeOverride = CUBE_OVERRIDES.get(cube.getName()); - if (cubeOverride != null) { - return cubeOverride.booleanValue(); - } - - if (RowValueDecoder.hasMemHungryCountDistinct(rowValueDecoders)) { - logger.info("Coprocessor is disabled because there is memory hungry count distinct"); - return false; - } - - if (context.isExactAggregation()) { - logger.info("Coprocessor is disabled because exactAggregation is true"); - return false; - } - - Cuboid cuboid = context.getCuboid(); - Set toAggr = Sets.newHashSet(cuboid.getAggregationColumns()); - toAggr.removeAll(groupBy); - if (toAggr.isEmpty()) { - logger.info("Coprocessor is disabled because no additional columns to aggregate"); - return false; - } - - logger.info("Coprocessor is enabled to aggregate " + toAggr + ", returning " + groupBy); - return true; - } - - @SuppressWarnings("unused") - private static int getBitsToScan(byte[] startKey, byte[] stopKey) { - // find the first bit difference from the beginning - int totalBits = startKey.length * 8; - int bitsToScan = totalBits; - for (int i = 0; i < totalBits; i++) { - int byteIdx = i / 8; - int bitIdx = 7 - i % 8; - byte bitMask = (byte) (1 << bitIdx); - if ((startKey[byteIdx] & bitMask) == (stopKey[byteIdx] & bitMask)) - bitsToScan--; - else - break; - } - return bitsToScan; - } - - public static void forceCoprocessorOn() { - System.setProperty(FORCE_COPROCESSOR, "true"); - } - - public static void forceCoprocessorOff() { - System.setProperty(FORCE_COPROCESSOR, "false"); - } - - public static String getForceCoprocessor() { - return System.getProperty(FORCE_COPROCESSOR); - } - - public static void forceCoprocessorUnset() { - System.clearProperty(FORCE_COPROCESSOR); - } - - public static void updateCubeOverride(String cubeName, String force) { - if ("null".equalsIgnoreCase(force) || "default".equalsIgnoreCase(force)) { - CUBE_OVERRIDES.remove(cubeName); - } else if ("true".equalsIgnoreCase(force)) { - CUBE_OVERRIDES.put(cubeName, Boolean.TRUE); - } else if ("false".equalsIgnoreCase(force)) { - CUBE_OVERRIDES.put(cubeName, Boolean.FALSE); - } - } - - public static Map getCubeOverrides() { - return CUBE_OVERRIDES; - } - -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverAggregators.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverAggregators.java deleted file mode 100644 index 1302f98..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverAggregators.java +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import java.nio.ByteBuffer; -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.List; - -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.util.Bytes; - -import com.kylinolap.common.util.BytesSerializer; -import com.kylinolap.common.util.BytesUtil; -import com.kylinolap.cube.kv.RowConstants; -import com.kylinolap.cube.kv.RowValueDecoder; -import com.kylinolap.cube.measure.MeasureAggregator; -import com.kylinolap.cube.measure.MeasureCodec; -import com.kylinolap.metadata.model.cube.HBaseColumnDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; - -/** - * @author yangli9 - */ -@SuppressWarnings({ "rawtypes", "unchecked" }) -public class ObserverAggregators { - - public static ObserverAggregators fromValueDecoders(Collection rowValueDecoders) { - - // each decoder represents one HBase column - HCol[] hcols = new HCol[rowValueDecoders.size()]; - int i = 0; - for (RowValueDecoder rowValueDecoder : rowValueDecoders) { - hcols[i++] = buildHCol(rowValueDecoder.getHBaseColumn()); - } - - ObserverAggregators aggrs = new ObserverAggregators(hcols); - return aggrs; - - } - - private static HCol buildHCol(HBaseColumnDesc desc) { - byte[] family = Bytes.toBytes(desc.getColumnFamilyName()); - byte[] qualifier = Bytes.toBytes(desc.getQualifier()); - MeasureDesc[] measures = desc.getMeasures(); - - String[] funcNames = new String[measures.length]; - String[] dataTypes = new String[measures.length]; - - for (int i = 0; i < measures.length; i++) { - funcNames[i] = measures[i].getFunction().getExpression(); - dataTypes[i] = measures[i].getFunction().getReturnType(); - } - - return new HCol(family, qualifier, funcNames, dataTypes); - } - - public static byte[] serialize(ObserverAggregators o) { - ByteBuffer buf = ByteBuffer.allocate(CoprocessorEnabler.SERIALIZE_BUFFER_SIZE); - serializer.serialize(o, buf); - byte[] result = new byte[buf.position()]; - System.arraycopy(buf.array(), 0, result, 0, buf.position()); - return result; - } - - public static ObserverAggregators deserialize(byte[] bytes) { - return serializer.deserialize(ByteBuffer.wrap(bytes)); - } - - private static final Serializer serializer = new Serializer(); - - private static class Serializer implements BytesSerializer { - - @Override - public void serialize(ObserverAggregators value, ByteBuffer out) { - BytesUtil.writeVInt(value.nHCols, out); - for (int i = 0; i < value.nHCols; i++) { - HCol col = value.hcols[i]; - BytesUtil.writeByteArray(col.family, out); - BytesUtil.writeByteArray(col.qualifier, out); - BytesUtil.writeAsciiStringArray(col.funcNames, out); - BytesUtil.writeAsciiStringArray(col.dataTypes, out); - } - } - - @Override - public ObserverAggregators deserialize(ByteBuffer in) { - int nHCols = BytesUtil.readVInt(in); - HCol[] hcols = new HCol[nHCols]; - for (int i = 0; i < nHCols; i++) { - byte[] family = BytesUtil.readByteArray(in); - byte[] qualifier = BytesUtil.readByteArray(in); - String[] funcNames = BytesUtil.readAsciiStringArray(in); - String[] dataTypes = BytesUtil.readAsciiStringArray(in); - hcols[i] = new HCol(family, qualifier, funcNames, dataTypes); - } - return new ObserverAggregators(hcols); - } - - } - - // ============================================================================ - - final HCol[] hcols; - final int nHCols; - final ByteBuffer[] hColValues; - final int nTotalMeasures; - - public ObserverAggregators(HCol[] _hcols) { - this.hcols = sort(_hcols); - this.nHCols = hcols.length; - this.hColValues = new ByteBuffer[nHCols]; - - int nTotalMeasures = 0; - for (HCol col : hcols) - nTotalMeasures += col.nMeasures; - this.nTotalMeasures = nTotalMeasures; - } - - private HCol[] sort(HCol[] hcols) { - HCol[] copy = Arrays.copyOf(hcols, hcols.length); - Arrays.sort(copy, new Comparator() { - @Override - public int compare(HCol o1, HCol o2) { - int comp = Bytes.compareTo(o1.family, o2.family); - if (comp != 0) - return comp; - comp = Bytes.compareTo(o1.qualifier, o2.qualifier); - return comp; - } - }); - return copy; - } - - public MeasureAggregator[] createBuffer() { - MeasureAggregator[] aggrs = new MeasureAggregator[nTotalMeasures]; - int i = 0; - for (HCol col : hcols) { - for (int j = 0; j < col.nMeasures; j++) - aggrs[i++] = MeasureAggregator.create(col.funcNames[j], col.dataTypes[j]); - } - return aggrs; - } - - public void aggregate(MeasureAggregator[] measureAggrs, List rowCells) { - int i = 0; - for (int ci = 0; ci < nHCols; ci++) { - HCol col = hcols[ci]; - Cell cell = findCell(col, rowCells); - - if (cell == null) { - i += col.nMeasures; - continue; - } - - ByteBuffer input = ByteBuffer.wrap(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()); - - col.measureCodec.decode(input, col.measureValues); - for (int j = 0; j < col.nMeasures; j++) - measureAggrs[i++].aggregate(col.measureValues[j]); - } - } - - private Cell findCell(HCol col, List cells) { - // cells are ordered by timestamp asc, thus search from back, first hit - // is the latest version - for (int i = cells.size() - 1; i >= 0; i--) { - Cell cell = cells.get(i); - if (match(col, cell)) { - return cell; - } - } - return null; - } - - public static boolean match(HCol col, Cell cell) { - return Bytes.compareTo(col.family, 0, col.family.length, cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()) == 0 && Bytes.compareTo(col.qualifier, 0, col.qualifier.length, cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()) == 0; - } - - public int getHColsNum() { - return nHCols; - } - - public byte[][] getHColFamilies() { - byte[][] result = new byte[nHCols][]; - for (int i = 0; i < nHCols; i++) - result[i] = hcols[i].family; - return result; - } - - public byte[][] getHColQualifiers() { - byte[][] result = new byte[nHCols][]; - for (int i = 0; i < nHCols; i++) - result[i] = hcols[i].qualifier; - return result; - } - - public ByteBuffer[] getHColValues(MeasureAggregator[] aggrs) { - int i = 0; - for (int ci = 0; ci < nHCols; ci++) { - HCol col = hcols[ci]; - for (int j = 0; j < col.nMeasures; j++) - col.measureValues[j] = aggrs[i++].getState(); - - col.measureBuf.clear(); - col.measureCodec.encode(col.measureValues, col.measureBuf); - hColValues[ci] = col.measureBuf; - } - return hColValues; - } - - // ============================================================================ - - public static class HCol { - final byte[] family; - final byte[] qualifier; - final String[] funcNames; - final String[] dataTypes; - final int nMeasures; - - final MeasureCodec measureCodec; - final Object[] measureValues; - final ByteBuffer measureBuf; - - public HCol(byte[] bFamily, byte[] bQualifier, String[] funcNames, String[] dataTypes) { - this.family = bFamily; - this.qualifier = bQualifier; - this.funcNames = funcNames; - this.dataTypes = dataTypes; - this.nMeasures = funcNames.length; - assert funcNames.length == dataTypes.length; - - this.measureCodec = new MeasureCodec(dataTypes); - this.measureValues = new Object[nMeasures]; - this.measureBuf = ByteBuffer.allocate(RowConstants.ROWVALUE_BUFFER_SIZE); - } - - @Override - public String toString() { - return "HCol [bFamily=" + Bytes.toString(family) + ", bQualifier=" + Bytes.toString(qualifier) + ", nMeasures=" + nMeasures + "]"; - } - } - -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverFilter.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverFilter.java deleted file mode 100644 index d74cf20..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverFilter.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import java.util.Collection; -import java.util.Set; - -import org.apache.hadoop.hbase.util.Bytes; - -import com.google.common.collect.Sets; -import com.kylinolap.common.util.BytesUtil; -import com.kylinolap.cube.CubeSegment; -import com.kylinolap.cube.kv.RowKeyColumnIO; -import com.kylinolap.dict.Dictionary; -import com.kylinolap.metadata.model.realization.TblColRef; -import com.kylinolap.storage.filter.ColumnTupleFilter; -import com.kylinolap.storage.filter.CompareTupleFilter; -import com.kylinolap.storage.filter.ConstantTupleFilter; -import com.kylinolap.storage.filter.TupleFilter; -import com.kylinolap.storage.filter.TupleFilter.FilterOperatorEnum; -import com.kylinolap.storage.filter.TupleFilterSerializer; -import com.kylinolap.storage.filter.TupleFilterSerializer.Decorator; -import com.kylinolap.storage.tuple.ITuple; - -/** - * @author yangli9 - */ -public class ObserverFilter { - - public static ObserverFilter fromFilter(final CubeSegment seg, TupleFilter rootFilter) { - // translate constants into dictionary IDs via a serialize copy - byte[] bytes = TupleFilterSerializer.serialize(rootFilter, new Decorator() { - RowKeyColumnIO columnIO = new RowKeyColumnIO(seg); - - @Override - public TupleFilter onSerialize(TupleFilter filter) { - if (filter == null) - return filter; - - if (filter.getOperator() == FilterOperatorEnum.NOT && TupleFilter.isEvaluableRecursively(filter) == false) - return ConstantTupleFilter.TRUE; - - if ((filter instanceof CompareTupleFilter) == false) - return filter; - - if (TupleFilter.isEvaluableRecursively(filter) == false) - return ConstantTupleFilter.TRUE; - - // extract ColumnFilter & ConstantFilter - CompareTupleFilter compf = (CompareTupleFilter) filter; - TblColRef col = compf.getColumn(); - if (col == null) { - return filter; - } - String nullString = nullString(col); - Collection constValues = compf.getValues(); - if (constValues == null || constValues.isEmpty()) { - compf.setNullString(nullString); // maybe ISNULL - return filter; - } - - TupleFilter result; - CompareTupleFilter newComp = new CompareTupleFilter(compf.getOperator()); - newComp.setNullString(nullString); - newComp.addChild(new ColumnTupleFilter(col)); - String v; - String firstValue = constValues.iterator().next(); - - // translate constant into rowkey ID - switch (newComp.getOperator()) { - case EQ: - case IN: - Set newValues = Sets.newHashSet(); - for (String value : constValues) { - v = translate(col, value, 0); - if (nullString.equals(v) == false) - newValues.add(v); - } - if (newValues.isEmpty()) { - result = ConstantTupleFilter.FALSE; - } else { - newComp.addChild(new ConstantTupleFilter(newValues)); - result = newComp; - } - break; - case NEQ: - v = translate(col, firstValue, 0); - if (nullString.equals(v)) { - result = ConstantTupleFilter.TRUE; - } else { - newComp.addChild(new ConstantTupleFilter(v)); - result = newComp; - } - break; - case LT: - v = translate(col, firstValue, 1); - if (nullString.equals(v)) { - result = ConstantTupleFilter.TRUE; - } else { - newComp.addChild(new ConstantTupleFilter(v)); - result = newComp; - } - break; - case LTE: - v = translate(col, firstValue, -1); - if (nullString.equals(v)) { - result = ConstantTupleFilter.FALSE; - } else { - newComp.addChild(new ConstantTupleFilter(v)); - result = newComp; - } - break; - case GT: - v = translate(col, firstValue, -1); - if (nullString.equals(v)) { - result = ConstantTupleFilter.TRUE; - } else { - newComp.addChild(new ConstantTupleFilter(v)); - result = newComp; - } - break; - case GTE: - v = translate(col, firstValue, 1); - if (nullString.equals(v)) { - result = ConstantTupleFilter.FALSE; - } else { - newComp.addChild(new ConstantTupleFilter(v)); - result = newComp; - } - break; - default: - throw new IllegalStateException("Cannot handle operator " + newComp.getOperator()); - } - return result; - } - - private String nullString(TblColRef column) { - byte[] id = new byte[columnIO.getColumnLength(column)]; - for (int i = 0; i < id.length; i++) { - id[i] = Dictionary.NULL; - } - return Dictionary.dictIdToString(id, 0, id.length); - } - - private String translate(TblColRef column, String v, int roundingFlag) { - byte[] value = Bytes.toBytes(v); - byte[] id = new byte[columnIO.getColumnLength(column)]; - columnIO.writeColumn(column, value, value.length, roundingFlag, Dictionary.NULL, id, 0); - return Dictionary.dictIdToString(id, 0, id.length); - } - - }); - TupleFilter copy = TupleFilterSerializer.deserialize(bytes); - return new ObserverFilter(copy); - } - - public static byte[] serialize(ObserverFilter o) { - return (o.filter == null) ? BytesUtil.EMPTY_BYTE_ARRAY : TupleFilterSerializer.serialize(o.filter); - } - - public static ObserverFilter deserialize(byte[] filterBytes) { - TupleFilter filter = (filterBytes == null || filterBytes.length == 0) // - ? null // - : TupleFilterSerializer.deserialize(filterBytes); - return new ObserverFilter(filter); - } - - // ============================================================================ - - public TupleFilter getFilter() { - return filter; - } - - private final TupleFilter filter; - - public ObserverFilter(TupleFilter filter) { - this.filter = filter; - } - - public boolean evaluate(ITuple tuple) { - if (filter == null) - return true; - else - return filter.evaluate(tuple); - } - -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverProjector.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverProjector.java deleted file mode 100644 index 145c26b..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverProjector.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import java.nio.ByteBuffer; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import org.apache.hadoop.hbase.Cell; - -import com.kylinolap.common.util.BytesSerializer; -import com.kylinolap.common.util.BytesUtil; -import com.kylinolap.cube.CubeSegment; -import com.kylinolap.cube.cuboid.Cuboid; -import com.kylinolap.cube.kv.RowKeyEncoder; -import com.kylinolap.metadata.model.realization.TblColRef; - -/** - * @author yangli9 - */ -public class ObserverProjector { - - public static ObserverProjector fromColumns(final CubeSegment cubeSegment, final Cuboid cuboid, final Collection dimensionColumns) { - - RowKeyEncoder rowKeyMaskEncoder = new RowKeyEncoder(cubeSegment, cuboid) { - @Override - protected int fillHeader(byte[] bytes, byte[][] values) { - Arrays.fill(bytes, 0, this.headerLength, (byte) 0xff); - return this.headerLength; - } - - @Override - protected void fillColumnValue(TblColRef column, int columnLen, byte[] value, int valueLen, byte[] outputValue, int outputValueOffset) { - byte bits = dimensionColumns.contains(column) ? (byte) 0xff : 0x00; - Arrays.fill(outputValue, outputValueOffset, outputValueOffset + columnLen, bits); - } - }; - - byte[] mask = rowKeyMaskEncoder.encode(new byte[cuboid.getColumns().size()][]); - return new ObserverProjector(mask); - } - - public static byte[] serialize(ObserverProjector o) { - ByteBuffer buf = ByteBuffer.allocate(CoprocessorEnabler.SERIALIZE_BUFFER_SIZE); - serializer.serialize(o, buf); - byte[] result = new byte[buf.position()]; - System.arraycopy(buf.array(), 0, result, 0, buf.position()); - return result; - } - - public static ObserverProjector deserialize(byte[] bytes) { - return serializer.deserialize(ByteBuffer.wrap(bytes)); - } - - private static final Serializer serializer = new Serializer(); - - private static class Serializer implements BytesSerializer { - - @Override - public void serialize(ObserverProjector value, ByteBuffer out) { - BytesUtil.writeByteArray(value.groupByMask, out); - } - - @Override - public ObserverProjector deserialize(ByteBuffer in) { - byte[] mask = BytesUtil.readByteArray(in); - return new ObserverProjector(mask); - } - } - - // ============================================================================ - - final byte[] groupByMask; // mask out columns that are not needed (by group by) - final AggrKey aggrKey = new AggrKey(); - - public ObserverProjector(byte[] groupByMask) { - this.groupByMask = groupByMask; - } - - public AggrKey getRowKey(List rowCells) { - int length = groupByMask.length; - Cell cell = rowCells.get(0); - assert length == cell.getRowLength(); - - aggrKey.set(cell.getRowArray(), cell.getRowOffset()); - return aggrKey; - } - - public class AggrKey implements Comparable { - byte[] data; - int offset; - - public byte[] get() { - return data; - } - - public int offset() { - return offset; - } - - public int length() { - return groupByMask.length; - } - - void set(byte[] data, int offset) { - this.data = data; - this.offset = offset; - } - - public AggrKey copy() { - AggrKey copy = new AggrKey(); - copy.set(new byte[length()], 0); - System.arraycopy(this.data, this.offset, copy.data, copy.offset, length()); - return copy; - } - - @Override - public int hashCode() { - int hash = 1; - for (int i = 0, j = offset, n = length(); i < n; i++, j++) { - if (groupByMask[i] != 0) - hash = (31 * hash) + (int) data[j]; - } - return hash; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - AggrKey other = (AggrKey) obj; - if (this.length() != other.length()) - return false; - - return compareTo(other) == 0; - } - - @Override - public int compareTo(AggrKey o) { - int comp = this.length() - o.length(); - if (comp != 0) - return comp; - - int n = this.length(); - for (int i = 0, j = offset, k = o.offset; i < n; i++, j++, k++) { - if (groupByMask[i] != 0) { - comp = BytesUtil.compareByteUnsigned(this.data[j], o.data[k]); - if (comp != 0) - return comp; - } - } - return 0; - } - } - -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverRowType.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverRowType.java deleted file mode 100644 index a493509..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverRowType.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import java.nio.ByteBuffer; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; - -import com.google.common.collect.Maps; -import com.kylinolap.common.util.BytesSerializer; -import com.kylinolap.common.util.BytesUtil; -import com.kylinolap.cube.CubeSegment; -import com.kylinolap.cube.cuboid.Cuboid; -import com.kylinolap.cube.kv.RowConstants; -import com.kylinolap.cube.kv.RowKeyColumnIO; -import com.kylinolap.metadata.model.ColumnDesc; -import com.kylinolap.metadata.model.TableDesc; -import com.kylinolap.metadata.model.realization.TblColRef; - -/** - * @author yangli9 - */ -public class ObserverRowType { - - public static ObserverRowType fromCuboid(CubeSegment seg, Cuboid cuboid) { - List colList = cuboid.getColumns(); - TblColRef[] cols = colList.toArray(new TblColRef[colList.size()]); - RowKeyColumnIO colIO = new RowKeyColumnIO(seg); - int[] colSizes = new int[cols.length]; - for (int i = 0; i < cols.length; i++) { - colSizes[i] = colIO.getColumnLength(cols[i]); - } - return new ObserverRowType(cols, colSizes); - } - - public static byte[] serialize(ObserverRowType o) { - ByteBuffer buf = ByteBuffer.allocate(CoprocessorEnabler.SERIALIZE_BUFFER_SIZE); - serializer.serialize(o, buf); - byte[] result = new byte[buf.position()]; - System.arraycopy(buf.array(), 0, result, 0, buf.position()); - return result; - } - - public static ObserverRowType deserialize(byte[] bytes) { - return serializer.deserialize(ByteBuffer.wrap(bytes)); - } - - private static final Serializer serializer = new Serializer(); - - private static class Serializer implements BytesSerializer { - - @Override - public void serialize(ObserverRowType o, ByteBuffer out) { - int n = o.columns.length; - BytesUtil.writeVInt(o.columns.length, out); - for (int i = 0; i < n; i++) { - BytesUtil.writeAsciiString(o.columns[i].getTable(), out); - BytesUtil.writeAsciiString(o.columns[i].getName(), out); - BytesUtil.writeVInt(o.columnSizes[i], out); - } - } - - @Override - public ObserverRowType deserialize(ByteBuffer in) { - int n = BytesUtil.readVInt(in); - TblColRef[] cols = new TblColRef[n]; - int[] colSizes = new int[n]; - for (int i = 0; i < n; i++) { - String tableName = BytesUtil.readAsciiString(in); - String colName = BytesUtil.readAsciiString(in); - TableDesc table = new TableDesc(); - table.setName(tableName); - ColumnDesc col = new ColumnDesc(); - col.setTable(table); - col.setName(colName); - cols[i] = new TblColRef(col); - - int colSize = BytesUtil.readVInt(in); - colSizes[i] = colSize; - } - return new ObserverRowType(cols, colSizes); - } - } - - // ============================================================================ - - TblColRef[] columns; - int[] columnSizes; - - int[] columnOffsets; - List columnsAsList; - HashMap columnIdxMap; - - public ObserverRowType(TblColRef[] columns, int[] columnSizes) { - this.columns = columns; - this.columnSizes = columnSizes; - init(); - } - - public int getColIndexByTblColRef(TblColRef colRef) { - return columnIdxMap.get(colRef); - } - - private void init() { - int[] offsets = new int[columns.length]; - int o = RowConstants.ROWKEY_CUBOIDID_LEN; - for (int i = 0; i < columns.length; i++) { - offsets[i] = o; - o += columnSizes[i]; - } - this.columnOffsets = offsets; - - this.columnsAsList = Arrays.asList(columns); - - HashMap map = Maps.newHashMap(); - for (int i = 0; i < columns.length; i++) { - map.put(columns[i], i); - } - this.columnIdxMap = map; - } - - public int getColumnCount() { - return columns.length; - } - -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverTuple.java b/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverTuple.java deleted file mode 100644 index f7a46e2..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/observer/ObserverTuple.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import java.util.List; - -import org.apache.hadoop.hbase.io.ImmutableBytesWritable; - -import com.kylinolap.dict.Dictionary; -import com.kylinolap.metadata.model.realization.TblColRef; -import com.kylinolap.storage.tuple.ITuple; - -/** - * A special kind of tuple that exposes column value (dictionary ID) directly on - * top of row key. - * - * @author yangli9 - */ -public class ObserverTuple implements ITuple { - - final ObserverRowType type; - - ImmutableBytesWritable rowkey; - String[] values; - - public ObserverTuple(ObserverRowType type) { - this.type = type; - this.rowkey = new ImmutableBytesWritable(); - this.values = new String[type.getColumnCount()]; - } - - public void setUnderlying(byte[] array, int offset, int length) { - rowkey.set(array, offset, length); - for (int i = 0; i < values.length; i++) { - values[i] = null; - } - } - - @Override - public List getAllColumns() { - return type.columnsAsList; - } - - @Override - public Object[] getAllValues() { - int n = type.getColumnCount(); - for (int i = 0; i < n; i++) { - getValueAt(i); - } - return values; - } - - private String getValueAt(int i) { - int n = type.getColumnCount(); - if (i < 0 || i >= n) - return null; - - if (values[i] == null) { - values[i] = Dictionary.dictIdToString(rowkey.get(), rowkey.getOffset() + type.columnOffsets[i], type.columnSizes[i]); - } - - return values[i]; - } - - - @Override - public Object getValue(TblColRef col) { - int i = type.getColIndexByTblColRef(col); - return getValueAt(i); - } - - @Override - public List getAllFields() { - throw new UnsupportedOperationException(); - } - - @Override - public Object getValue(String field) { - throw new UnsupportedOperationException(); - } - -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/protobuf/II.proto b/storage/src/main/java/com/kylinolap/storage/hbase/protobuf/II.proto deleted file mode 100644 index 2bc4cd4..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/protobuf/II.proto +++ /dev/null @@ -1,26 +0,0 @@ - -// usage: -// protoc --java_out=./storage/src/main/java ./storage/src/main/java/com/kylinolap/storage/hbase/protobuf/II.proto - -option java_package = "com.kylinolap.storage.hbase.endpoint.generated"; -option java_outer_classname = "IIProtos"; -option java_generic_services = true; -option java_generate_equals_and_hash = true; -option optimize_for = SPEED; - -message IIRequest { - required bytes tableInfo = 1; - required bytes sRowType = 2; - optional bytes sRowFilter = 3; - optional bytes sRowProjector = 4; - optional bytes sRowAggregator = 5; -} - -message IIResponse { - repeated bytes rows = 1; -} - -service RowsService { - rpc getRows(IIRequest) - returns (IIResponse); -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/protobuf/Node.proto b/storage/src/main/java/com/kylinolap/storage/hbase/protobuf/Node.proto deleted file mode 100644 index 8f32385..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/protobuf/Node.proto +++ /dev/null @@ -1,28 +0,0 @@ -/** - * 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. - */ - -option java_package = "com.kylinolap.storage.hbase.coprocessor.example.generated"; -option java_outer_classname = "NodeProtos"; - -message Node -{ - required string name = 1; - optional Node left = 2; - optional Node right =3; -} - diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/protobuf/example.proto b/storage/src/main/java/com/kylinolap/storage/hbase/protobuf/example.proto deleted file mode 100644 index 2d38b6d..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/protobuf/example.proto +++ /dev/null @@ -1,37 +0,0 @@ -/** - * 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. - */ - -option java_package = "com.kylinolap.storage.hbase.coprocessor.example.generated"; -option java_outer_classname = "ExampleProtos"; -option java_generic_services = true; -option java_generate_equals_and_hash = true; -option optimize_for = SPEED; - -message CountRequest { -} - -message CountResponse { - required int64 count = 1 [default = 0]; -} - -service RowCountService { - rpc getRowCount(CountRequest) - returns (CountResponse); - rpc getKeyValueCount(CountRequest) - returns (CountResponse); -} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/InvertedIndexHBaseTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/InvertedIndexHBaseTest.java index 88dea42..6fbb0bc 100644 --- a/storage/src/test/java/com/kylinolap/storage/hbase/InvertedIndexHBaseTest.java +++ b/storage/src/test/java/com/kylinolap/storage/hbase/InvertedIndexHBaseTest.java @@ -16,19 +16,11 @@ package com.kylinolap.storage.hbase; -import java.io.IOException; -import java.util.ArrayList; import java.util.List; -import java.util.Map; -import com.google.protobuf.ByteString; import com.kylinolap.cube.invertedindex.*; -import com.kylinolap.storage.hbase.endpoint.generated.IIProtos; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.client.*; -import org.apache.hadoop.hbase.client.coprocessor.Batch; -import org.apache.hadoop.hbase.ipc.BlockingRpcCallback; -import org.apache.hadoop.hbase.ipc.ServerRpcController; import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/ExampleEndpointTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/ExampleEndpointTest.java new file mode 100644 index 0000000..bb39763 --- /dev/null +++ b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/ExampleEndpointTest.java @@ -0,0 +1,97 @@ +package com.kylinolap.storage.hbase.coprocessor.endpoint; + +import com.kylinolap.storage.hbase.coprocessor.endpoint.example.ExampleEndpoint; +import com.kylinolap.storage.hbase.coprocessor.endpoint.example.generated.ExampleProtos; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.HBaseTestingUtility; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.HConnection; +import org.apache.hadoop.hbase.client.HConnectionManager; +import org.apache.hadoop.hbase.client.HTableInterface; +import org.apache.hadoop.hbase.client.Put; +import org.apache.hadoop.hbase.client.coprocessor.Batch; +import org.apache.hadoop.hbase.coprocessor.CoprocessorHost; +import org.apache.hadoop.hbase.ipc.BlockingRpcCallback; +import org.apache.hadoop.hbase.ipc.ServerRpcController; +import org.apache.hadoop.hbase.util.Bytes; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Ignore; +import org.junit.Test; + +import java.io.IOException; +import java.util.Iterator; +import java.util.Map; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNotNull; + +/** + * Created by honma on 11/3/14. + */ +@Ignore +public class ExampleEndpointTest { + private static final TableName TEST_TABLE = TableName.valueOf("testrowcounter"); + private static final byte[] TEST_FAMILY = Bytes.toBytes("f"); + private static final byte[] TEST_COLUMN = Bytes.toBytes("col"); + + private static HBaseTestingUtility TEST_UTIL = null; + private static Configuration CONF = null; + + @BeforeClass + public static void setupBeforeClass() throws Exception { + TEST_UTIL = new HBaseTestingUtility(); + CONF = TEST_UTIL.getConfiguration(); + CONF.setStrings(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, + ExampleEndpoint.class.getName()); + + TEST_UTIL.startMiniCluster(); + TEST_UTIL.createTable(TEST_TABLE, new byte[][] { TEST_FAMILY }); + + } + + @AfterClass + public static void tearDownAfterClass() throws Exception { + TEST_UTIL.shutdownMiniCluster(); + } + + @Test + public void testEndpoint() throws Throwable { + + HConnection connection = HConnectionManager.createConnection(CONF); + HTableInterface table = connection.getTable(TEST_TABLE); + + // insert some test rows + for (int i = 0; i < 5; i++) { + byte[] iBytes = Bytes.toBytes(i); + Put p = new Put(iBytes); + p.add(TEST_FAMILY, TEST_COLUMN, iBytes); + table.put(p); + } + + final ExampleProtos.CountRequest request = ExampleProtos.CountRequest.getDefaultInstance(); + Map results = table.coprocessorService(ExampleProtos.RowCountService.class, + null, null, + new Batch.Call() { + public Long call(ExampleProtos.RowCountService counter) throws IOException { + ServerRpcController controller = new ServerRpcController(); + BlockingRpcCallback rpcCallback = + new BlockingRpcCallback(); + counter.getRowCount(controller, request, rpcCallback); + ExampleProtos.CountResponse response = rpcCallback.get(); + if (controller.failedOnException()) { + throw controller.getFailedOn(); + } + return (response != null && response.hasCount()) ? response.getCount() : 0; + } + }); + // should be one region with results + assertEquals(1, results.size()); + Iterator iter = results.values().iterator(); + Long val = iter.next(); + assertNotNull(val); + assertEquals(5l, val.longValue()); + } + + +} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/ProtobufTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/ProtobufTest.java new file mode 100644 index 0000000..a835579 --- /dev/null +++ b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/ProtobufTest.java @@ -0,0 +1,41 @@ +package com.kylinolap.storage.hbase.coprocessor.endpoint; + +import com.kylinolap.storage.hbase.coprocessor.endpoint.example.generated.NodeProtos; +import org.junit.Assert; +import org.junit.Test; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +/** + * Created by honma on 11/6/14. + */ +public class ProtobufTest { + + @Test + public void testRecursive() throws IOException { + + + NodeProtos.Node node = NodeProtos.Node.newBuilder().setName("root"). + setLeft( + NodeProtos.Node.newBuilder().setName("L1 left"). + setLeft( + NodeProtos.Node.newBuilder().setName("L2 left most"))). + setRight( + NodeProtos.Node.newBuilder().setName("L1 right"). + setRight( + NodeProtos.Node.newBuilder().setName("L2 right most"))).build(); + + File a = File.createTempFile("dfsd", "fdsfsd"); + FileOutputStream outputStream = new FileOutputStream(a); + node.writeTo(outputStream); + outputStream.close(); + + FileInputStream inputStream = new FileInputStream(a); + NodeProtos.Node newNode = NodeProtos.Node.parseFrom(inputStream); + Assert.assertEquals(newNode.getLeft().getLeft().getName(), "L2 left most"); + + } +} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserverTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserverTest.java new file mode 100644 index 0000000..8415b4d --- /dev/null +++ b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserverTest.java @@ -0,0 +1,338 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.observer; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.math.BigDecimal; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; + +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.HRegionInfo; +import org.apache.hadoop.hbase.KeyValue; +import org.apache.hadoop.hbase.KeyValue.Type; +import org.apache.hadoop.hbase.regionserver.RegionScanner; +import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.io.LongWritable; +import org.junit.Before; +import org.junit.Test; + +import com.google.common.collect.Lists; +import com.kylinolap.cube.kv.RowConstants; +import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.schema.ColumnDesc; +import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.storage.hbase.observer.ObserverAggregators.HCol; + +/** + * @author yangli9 + */ +public class AggregateRegionObserverTest { + ByteBuffer buf = ByteBuffer.allocate(RowConstants.ROWVALUE_BUFFER_SIZE); + + byte[] mask = new byte[] { (byte) 0xff, (byte) 0xff, 0, 0 }; + byte[] k1 = new byte[] { 0x01, 0x01, 0, 0x01 }; + byte[] k2 = new byte[] { 0x01, 0x01, 0, 0x02 }; + byte[] k3 = new byte[] { 0x02, 0x02, 0, 0x03 }; + byte[] k4 = new byte[] { 0x02, 0x02, 0, 0x04 }; + + ArrayList cellsInput = Lists.newArrayList(); + + byte[] family = Bytes.toBytes("f"); + byte[] q1 = Bytes.toBytes("q1"); + byte[] q2 = Bytes.toBytes("q2"); + + HCol c1 = new HCol(family, q1, new String[] { "SUM", "COUNT" }, new String[] { "decimal", "long" }); + HCol c2 = new HCol(family, q2, new String[] { "SUM" }, new String[] { "decimal" }); + + @Before + public void setup() { + cellsInput.add(newCell(k1, c1, "10.5", 1)); + cellsInput.add(newCell(k2, c1, "11.5", 2)); + cellsInput.add(newCell(k3, c1, "12.5", 3)); + cellsInput.add(newCell(k4, c1, "13.5", 4)); + + cellsInput.add(newCell(k1, c2, "21.5")); + cellsInput.add(newCell(k2, c2, "22.5")); + cellsInput.add(newCell(k3, c2, "23.5")); + cellsInput.add(newCell(k4, c2, "24.5")); + + } + + private Cell newCell(byte[] key, HCol col, String decimal) { + return newCell(key, col, decimal, Integer.MIN_VALUE); + } + + private Cell newCell(byte[] key, HCol col, String decimal, int number) { + Object[] values = number == Integer.MIN_VALUE ? // + new Object[] { new BigDecimal(decimal) } // + : new Object[] { new BigDecimal(decimal), new LongWritable(number) }; + buf.clear(); + col.measureCodec.encode(values, buf); + + Cell keyValue = new KeyValue(key, 0, key.length, // + col.family, 0, col.family.length, // + col.qualifier, 0, col.qualifier.length, // + HConstants.LATEST_TIMESTAMP, Type.Put, // + buf.array(), 0, buf.position()); + + return keyValue; + } + + @Test + public void test() throws IOException { + + ObserverRowType rowType = newRowType(); + ObserverProjector projector = new ObserverProjector(mask); + ObserverAggregators aggregators = new ObserverAggregators(new HCol[] { c1, c2 }); + ObserverFilter filter = ObserverFilter.deserialize(null); // a default, + // always-true, + // filter + HashSet expectedResult = new HashSet(); + + expectedResult.add("\\x02\\x02\\x00\\x00, f:q1, [26.0, 7]"); + expectedResult.add("\\x02\\x02\\x00\\x00, f:q2, [48.0]"); + expectedResult.add("\\x01\\x01\\x00\\x00, f:q1, [22.0, 3]"); + expectedResult.add("\\x01\\x01\\x00\\x00, f:q2, [44.0]"); + + MockupRegionScanner innerScanner = new MockupRegionScanner(cellsInput); + + RegionScanner aggrScanner = new AggregationScanner(rowType, filter, projector, aggregators, innerScanner); + ArrayList result = Lists.newArrayList(); + boolean hasMore = true; + while (hasMore) { + result.clear(); + hasMore = aggrScanner.next(result); + if (result.isEmpty()) + continue; + + Cell cell = result.get(0); + HCol hcol = null; + if (ObserverAggregators.match(c1, cell)) { + hcol = c1; + } else if (ObserverAggregators.match(c2, cell)) { + hcol = c2; + } else + fail(); + + hcol.measureCodec.decode(ByteBuffer.wrap(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()), hcol.measureValues); + + String rowKey = toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(), mask); + String col = Bytes.toString(hcol.family) + ":" + Bytes.toString(hcol.qualifier); + String values = Arrays.toString(hcol.measureValues); + + System.out.println(rowKey); + System.out.println(col); + System.out.println(values); + + assertTrue(expectedResult.contains(rowKey + ", " + col + ", " + values)); + } + aggrScanner.close(); + } + + @Test + public void testNoMeasure() throws IOException { + + ObserverRowType rowType = newRowType(); + ObserverProjector projector = new ObserverProjector(mask); + ObserverAggregators aggregators = new ObserverAggregators(new HCol[] {}); + ObserverFilter filter = ObserverFilter.deserialize(null); // a default, + // always-true, + // filter + HashSet expectedResult = new HashSet(); + + expectedResult.add("\\x02\\x02\\x00\\x00"); + expectedResult.add("\\x01\\x01\\x00\\x00"); + + MockupRegionScanner innerScanner = new MockupRegionScanner(cellsInput); + + RegionScanner aggrScanner = new AggregationScanner(rowType, filter, projector, aggregators, innerScanner); + ArrayList result = Lists.newArrayList(); + boolean hasMore = true; + while (hasMore) { + result.clear(); + hasMore = aggrScanner.next(result); + if (result.isEmpty()) + continue; + + Cell cell = result.get(0); + + String rowKey = toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(), mask); + + assertTrue(expectedResult.contains(rowKey)); + } + aggrScanner.close(); + } + + private String toString(byte[] array, int offset, short length, byte[] mask) { + StringBuilder result = new StringBuilder(); + for (int i = 0; i < length; i++) { + int ch = array[offset + i] & 0xFF & mask[i]; + result.append(String.format("\\x%02X", ch)); + } + return result.toString(); + } + + private ObserverRowType newRowType() { + TableDesc t = new TableDesc(); + t.setName("TABLE"); + TblColRef[] cols = new TblColRef[] { newCol("A", t), newCol("B", t), newCol("C", t), newCol("D", t) }; + int[] sizes = new int[] { 1, 1, 1, 1 }; + return new ObserverRowType(cols, sizes); + } + + private TblColRef newCol(String name, TableDesc t) { + ColumnDesc col = new ColumnDesc(); + col.setName(name); + col.setTable(t); + return new TblColRef(col); + } + + public static class MockupRegionScanner implements RegionScanner { + List input; + int i = 0; + + public MockupRegionScanner(List cellInputs) { + this.input = cellInputs; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.hbase.regionserver.InternalScanner#next(java.util + * .List) + */ + @Override + public boolean next(List results) throws IOException { + return nextRaw(results); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.hbase.regionserver.InternalScanner#next(java.util + * .List, int) + */ + @Override + public boolean next(List result, int limit) throws IOException { + return next(result); + } + + /* + * (non-Javadoc) + * + * @see org.apache.hadoop.hbase.regionserver.InternalScanner#close() + */ + @Override + public void close() throws IOException { + + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.hbase.regionserver.RegionScanner#getRegionInfo() + */ + @Override + public HRegionInfo getRegionInfo() { + return null; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.hbase.regionserver.RegionScanner#isFilterDone() + */ + @Override + public boolean isFilterDone() throws IOException { + return false; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.hbase.regionserver.RegionScanner#reseek(byte[]) + */ + @Override + public boolean reseek(byte[] row) throws IOException { + return false; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.hbase.regionserver.RegionScanner#getMaxResultSize() + */ + @Override + public long getMaxResultSize() { + return 0; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.hbase.regionserver.RegionScanner#getMvccReadPoint() + */ + @Override + public long getMvccReadPoint() { + return 0; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.hbase.regionserver.RegionScanner#nextRaw(java.util + * .List) + */ + @Override + public boolean nextRaw(List result) throws IOException { + if (i < input.size()) { + result.add(input.get(i)); + i++; + } + return i < input.size(); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.hbase.regionserver.RegionScanner#nextRaw(java.util + * .List, int) + */ + @Override + public boolean nextRaw(List result, int limit) throws IOException { + return nextRaw(result); + } + + } + +} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowAggregatorsTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowAggregatorsTest.java new file mode 100644 index 0000000..bd3b5bc --- /dev/null +++ b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowAggregatorsTest.java @@ -0,0 +1,63 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.coprocessor.observer; + +import static org.junit.Assert.*; + +import java.util.Arrays; + +import com.kylinolap.storage.hbase.coprocessor.observer.ObserverAggregators; +import org.apache.hadoop.hbase.util.Bytes; +import org.junit.Test; + +import com.kylinolap.storage.hbase.coprocessor.observer.ObserverAggregators.HCol; + +/** + * @author yangli9 + * + */ +public class RowAggregatorsTest { + + @Test + public void testSerialize() { + HCol[] hcols = new HCol[] { // + newHCol("f", "c1", new String[] { "SUM", "COUNT" }, new String[] { "decimal", "long" }), // + newHCol("f", "c2", new String[] { "SUM", "SUM" }, new String[] { "long", "long" }) }; + ObserverAggregators sample = new ObserverAggregators(hcols); + + byte[] bytes = ObserverAggregators.serialize(sample); + ObserverAggregators copy = ObserverAggregators.deserialize(bytes); + + assertTrue(sample.nHCols == copy.nHCols); + assertTrue(sample.nTotalMeasures == copy.nTotalMeasures); + assertEquals(sample.hcols[0], copy.hcols[0]); + assertEquals(sample.hcols[1], copy.hcols[1]); + } + + private static HCol newHCol(String family, String qualifier, String[] funcNames, String[] dataTypes) { + return new HCol(Bytes.toBytes(family), Bytes.toBytes(qualifier), funcNames, dataTypes); + } + + private static void assertEquals(HCol a, HCol b) { + assertTrue(a.nMeasures == b.nMeasures); + assertTrue(Arrays.equals(a.family, b.family)); + assertTrue(Arrays.equals(a.qualifier, b.qualifier)); + assertTrue(Arrays.equals(a.funcNames, b.funcNames)); + assertTrue(Arrays.equals(a.dataTypes, b.dataTypes)); + } + +} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowProjectorTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowProjectorTest.java new file mode 100644 index 0000000..a19bc71 --- /dev/null +++ b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowProjectorTest.java @@ -0,0 +1,88 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.coprocessor.observer; + +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import com.kylinolap.storage.hbase.coprocessor.observer.ObserverProjector; +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.KeyValue; +import org.apache.hadoop.hbase.util.Bytes; +import org.junit.Test; + +import com.google.common.collect.Lists; +import com.kylinolap.storage.hbase.coprocessor.observer.ObserverProjector.AggrKey; + +/** + * @author yangli9 + * + */ +public class RowProjectorTest { + + byte[] mask = new byte[] { (byte) 0xff, 0x00, 0x00, (byte) 0xff }; + ObserverProjector sample = new ObserverProjector(mask); + + @Test + public void testSerialize() { + + byte[] bytes = ObserverProjector.serialize(sample); + ObserverProjector copy = ObserverProjector.deserialize(bytes); + + assertTrue(Arrays.equals(sample.groupByMask, copy.groupByMask)); + } + + @Test + public void testProject() { + byte[] bytes1 = new byte[] { -1, -2, -3, -4 }; + byte[] bytes2 = new byte[] { 1, 2, 3, 4 }; + byte[] bytes3 = new byte[] { 1, 99, 100, 4 }; + byte[] bytes4 = new byte[] { 1, 1, 1, 5 }; + + AggrKey rowKey = sample.getRowKey(newCellWithRowKey(bytes1)); + AggrKey rowKey2 = sample.getRowKey(newCellWithRowKey(bytes2)); + assertTrue(rowKey == rowKey2); // no extra object creation + assertTrue(Bytes.equals(rowKey.get(), rowKey.offset(), rowKey.length(), bytes2, 0, bytes2.length)); + + rowKey2 = rowKey.copy(); // explicit object creation + assertTrue(rowKey != rowKey2); + + rowKey = sample.getRowKey(newCellWithRowKey(bytes1)); + assertTrue(rowKey.hashCode() != rowKey2.hashCode()); + assertTrue(rowKey.equals(rowKey2) == false); + assertTrue(rowKey.compareTo(rowKey2) > 0); // unsigned compare + + rowKey = sample.getRowKey(newCellWithRowKey(bytes3)); + assertTrue(rowKey.hashCode() == rowKey2.hashCode()); + assertTrue(rowKey.equals(rowKey2) == true); + assertTrue(rowKey.compareTo(rowKey2) == 0); + + rowKey = sample.getRowKey(newCellWithRowKey(bytes4)); + assertTrue(rowKey.hashCode() != rowKey2.hashCode()); + assertTrue(rowKey.equals(rowKey2) == false); + assertTrue(rowKey.compareTo(rowKey2) > 0); + } + + private List newCellWithRowKey(byte[] rowkey) { + ArrayList list = Lists.newArrayList(); + list.add(new KeyValue(rowkey, null, null, null)); + return list; + } +} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowTypeTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowTypeTest.java new file mode 100644 index 0000000..bc8627e --- /dev/null +++ b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowTypeTest.java @@ -0,0 +1,65 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.coprocessor.observer; + +import static org.junit.Assert.*; + +import java.util.Arrays; + +import com.kylinolap.storage.hbase.coprocessor.observer.ObserverRowType; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.kylinolap.common.util.LocalFileMetadataTestCase; +import com.kylinolap.cube.CubeInstance; +import com.kylinolap.cube.CubeManager; +import com.kylinolap.cube.cuboid.Cuboid; +import com.kylinolap.metadata.model.cube.CubeDesc; + +/** + * @author yangli9 + * + */ +public class RowTypeTest extends LocalFileMetadataTestCase { + + @Before + public void setUp() throws Exception { + this.createTestMetadata(); + } + + @After + public void after() throws Exception { + this.cleanupTestMetadata(); + } + + @Test + public void testSerialize() { + + CubeInstance cube = CubeManager.getInstance(getTestConfig()).getCube("test_kylin_cube_without_slr_ready"); + CubeDesc cubeDesc = cube.getDescriptor(); + long baseCuboidId = Cuboid.getBaseCuboidId(cubeDesc); + Cuboid cuboid = Cuboid.findById(cubeDesc, baseCuboidId); + + ObserverRowType rowType = ObserverRowType.fromCuboid(cube.getLatestReadySegment(), cuboid); + byte[] bytes = ObserverRowType.serialize(rowType); + ObserverRowType copy = ObserverRowType.deserialize(bytes); + + assertTrue(Arrays.equals(rowType.columns, copy.columns)); + assertTrue(Arrays.equals(rowType.columnSizes, copy.columnSizes)); + } +} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/endpoint/ExampleEndpointTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/endpoint/ExampleEndpointTest.java deleted file mode 100644 index 444c4bb..0000000 --- a/storage/src/test/java/com/kylinolap/storage/hbase/endpoint/ExampleEndpointTest.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.kylinolap.storage.hbase.endpoint; - -import com.kylinolap.storage.hbase.endpoint.example.ExampleEndpoint; -import com.kylinolap.storage.hbase.endpoint.example.generated.ExampleProtos; -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.hbase.HBaseTestingUtility; -import org.apache.hadoop.hbase.TableName; -import org.apache.hadoop.hbase.client.HConnection; -import org.apache.hadoop.hbase.client.HConnectionManager; -import org.apache.hadoop.hbase.client.HTableInterface; -import org.apache.hadoop.hbase.client.Put; -import org.apache.hadoop.hbase.client.coprocessor.Batch; -import org.apache.hadoop.hbase.coprocessor.CoprocessorHost; -import org.apache.hadoop.hbase.ipc.BlockingRpcCallback; -import org.apache.hadoop.hbase.ipc.ServerRpcController; -import org.apache.hadoop.hbase.util.Bytes; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Ignore; -import org.junit.Test; - -import java.io.IOException; -import java.util.Iterator; -import java.util.Map; - -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertNotNull; - -/** - * Created by honma on 11/3/14. - */ -@Ignore -public class ExampleEndpointTest { - private static final TableName TEST_TABLE = TableName.valueOf("testrowcounter"); - private static final byte[] TEST_FAMILY = Bytes.toBytes("f"); - private static final byte[] TEST_COLUMN = Bytes.toBytes("col"); - - private static HBaseTestingUtility TEST_UTIL = null; - private static Configuration CONF = null; - - @BeforeClass - public static void setupBeforeClass() throws Exception { - TEST_UTIL = new HBaseTestingUtility(); - CONF = TEST_UTIL.getConfiguration(); - CONF.setStrings(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, - ExampleEndpoint.class.getName()); - - TEST_UTIL.startMiniCluster(); - TEST_UTIL.createTable(TEST_TABLE, new byte[][] { TEST_FAMILY }); - - } - - @AfterClass - public static void tearDownAfterClass() throws Exception { - TEST_UTIL.shutdownMiniCluster(); - } - - @Test - public void testEndpoint() throws Throwable { - - HConnection connection = HConnectionManager.createConnection(CONF); - HTableInterface table = connection.getTable(TEST_TABLE); - - // insert some test rows - for (int i = 0; i < 5; i++) { - byte[] iBytes = Bytes.toBytes(i); - Put p = new Put(iBytes); - p.add(TEST_FAMILY, TEST_COLUMN, iBytes); - table.put(p); - } - - final ExampleProtos.CountRequest request = ExampleProtos.CountRequest.getDefaultInstance(); - Map results = table.coprocessorService(ExampleProtos.RowCountService.class, - null, null, - new Batch.Call() { - public Long call(ExampleProtos.RowCountService counter) throws IOException { - ServerRpcController controller = new ServerRpcController(); - BlockingRpcCallback rpcCallback = - new BlockingRpcCallback(); - counter.getRowCount(controller, request, rpcCallback); - ExampleProtos.CountResponse response = rpcCallback.get(); - if (controller.failedOnException()) { - throw controller.getFailedOn(); - } - return (response != null && response.hasCount()) ? response.getCount() : 0; - } - }); - // should be one region with results - assertEquals(1, results.size()); - Iterator iter = results.values().iterator(); - Long val = iter.next(); - assertNotNull(val); - assertEquals(5l, val.longValue()); - } - - -} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/endpoint/ProtobufTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/endpoint/ProtobufTest.java deleted file mode 100644 index 360dc52..0000000 --- a/storage/src/test/java/com/kylinolap/storage/hbase/endpoint/ProtobufTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.kylinolap.storage.hbase.endpoint; - -import com.kylinolap.storage.hbase.endpoint.example.generated.NodeProtos; -import org.junit.Assert; -import org.junit.Test; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; - -/** - * Created by honma on 11/6/14. - */ -public class ProtobufTest { - - @Test - public void testRecursive() throws IOException { - - - NodeProtos.Node node = NodeProtos.Node.newBuilder().setName("root"). - setLeft( - NodeProtos.Node.newBuilder().setName("L1 left"). - setLeft( - NodeProtos.Node.newBuilder().setName("L2 left most"))). - setRight( - NodeProtos.Node.newBuilder().setName("L1 right"). - setRight( - NodeProtos.Node.newBuilder().setName("L2 right most"))).build(); - - File a = File.createTempFile("dfsd", "fdsfsd"); - FileOutputStream outputStream = new FileOutputStream(a); - node.writeTo(outputStream); - outputStream.close(); - - FileInputStream inputStream = new FileInputStream(a); - NodeProtos.Node newNode = NodeProtos.Node.parseFrom(inputStream); - Assert.assertEquals(newNode.getLeft().getLeft().getName(), "L2 left most"); - - } -} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserverTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserverTest.java deleted file mode 100644 index 8415b4d..0000000 --- a/storage/src/test/java/com/kylinolap/storage/hbase/observer/AggregateRegionObserverTest.java +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import static org.junit.Assert.*; - -import java.io.IOException; -import java.math.BigDecimal; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; - -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.HConstants; -import org.apache.hadoop.hbase.HRegionInfo; -import org.apache.hadoop.hbase.KeyValue; -import org.apache.hadoop.hbase.KeyValue.Type; -import org.apache.hadoop.hbase.regionserver.RegionScanner; -import org.apache.hadoop.hbase.util.Bytes; -import org.apache.hadoop.io.LongWritable; -import org.junit.Before; -import org.junit.Test; - -import com.google.common.collect.Lists; -import com.kylinolap.cube.kv.RowConstants; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; -import com.kylinolap.storage.hbase.observer.ObserverAggregators.HCol; - -/** - * @author yangli9 - */ -public class AggregateRegionObserverTest { - ByteBuffer buf = ByteBuffer.allocate(RowConstants.ROWVALUE_BUFFER_SIZE); - - byte[] mask = new byte[] { (byte) 0xff, (byte) 0xff, 0, 0 }; - byte[] k1 = new byte[] { 0x01, 0x01, 0, 0x01 }; - byte[] k2 = new byte[] { 0x01, 0x01, 0, 0x02 }; - byte[] k3 = new byte[] { 0x02, 0x02, 0, 0x03 }; - byte[] k4 = new byte[] { 0x02, 0x02, 0, 0x04 }; - - ArrayList cellsInput = Lists.newArrayList(); - - byte[] family = Bytes.toBytes("f"); - byte[] q1 = Bytes.toBytes("q1"); - byte[] q2 = Bytes.toBytes("q2"); - - HCol c1 = new HCol(family, q1, new String[] { "SUM", "COUNT" }, new String[] { "decimal", "long" }); - HCol c2 = new HCol(family, q2, new String[] { "SUM" }, new String[] { "decimal" }); - - @Before - public void setup() { - cellsInput.add(newCell(k1, c1, "10.5", 1)); - cellsInput.add(newCell(k2, c1, "11.5", 2)); - cellsInput.add(newCell(k3, c1, "12.5", 3)); - cellsInput.add(newCell(k4, c1, "13.5", 4)); - - cellsInput.add(newCell(k1, c2, "21.5")); - cellsInput.add(newCell(k2, c2, "22.5")); - cellsInput.add(newCell(k3, c2, "23.5")); - cellsInput.add(newCell(k4, c2, "24.5")); - - } - - private Cell newCell(byte[] key, HCol col, String decimal) { - return newCell(key, col, decimal, Integer.MIN_VALUE); - } - - private Cell newCell(byte[] key, HCol col, String decimal, int number) { - Object[] values = number == Integer.MIN_VALUE ? // - new Object[] { new BigDecimal(decimal) } // - : new Object[] { new BigDecimal(decimal), new LongWritable(number) }; - buf.clear(); - col.measureCodec.encode(values, buf); - - Cell keyValue = new KeyValue(key, 0, key.length, // - col.family, 0, col.family.length, // - col.qualifier, 0, col.qualifier.length, // - HConstants.LATEST_TIMESTAMP, Type.Put, // - buf.array(), 0, buf.position()); - - return keyValue; - } - - @Test - public void test() throws IOException { - - ObserverRowType rowType = newRowType(); - ObserverProjector projector = new ObserverProjector(mask); - ObserverAggregators aggregators = new ObserverAggregators(new HCol[] { c1, c2 }); - ObserverFilter filter = ObserverFilter.deserialize(null); // a default, - // always-true, - // filter - HashSet expectedResult = new HashSet(); - - expectedResult.add("\\x02\\x02\\x00\\x00, f:q1, [26.0, 7]"); - expectedResult.add("\\x02\\x02\\x00\\x00, f:q2, [48.0]"); - expectedResult.add("\\x01\\x01\\x00\\x00, f:q1, [22.0, 3]"); - expectedResult.add("\\x01\\x01\\x00\\x00, f:q2, [44.0]"); - - MockupRegionScanner innerScanner = new MockupRegionScanner(cellsInput); - - RegionScanner aggrScanner = new AggregationScanner(rowType, filter, projector, aggregators, innerScanner); - ArrayList result = Lists.newArrayList(); - boolean hasMore = true; - while (hasMore) { - result.clear(); - hasMore = aggrScanner.next(result); - if (result.isEmpty()) - continue; - - Cell cell = result.get(0); - HCol hcol = null; - if (ObserverAggregators.match(c1, cell)) { - hcol = c1; - } else if (ObserverAggregators.match(c2, cell)) { - hcol = c2; - } else - fail(); - - hcol.measureCodec.decode(ByteBuffer.wrap(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()), hcol.measureValues); - - String rowKey = toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(), mask); - String col = Bytes.toString(hcol.family) + ":" + Bytes.toString(hcol.qualifier); - String values = Arrays.toString(hcol.measureValues); - - System.out.println(rowKey); - System.out.println(col); - System.out.println(values); - - assertTrue(expectedResult.contains(rowKey + ", " + col + ", " + values)); - } - aggrScanner.close(); - } - - @Test - public void testNoMeasure() throws IOException { - - ObserverRowType rowType = newRowType(); - ObserverProjector projector = new ObserverProjector(mask); - ObserverAggregators aggregators = new ObserverAggregators(new HCol[] {}); - ObserverFilter filter = ObserverFilter.deserialize(null); // a default, - // always-true, - // filter - HashSet expectedResult = new HashSet(); - - expectedResult.add("\\x02\\x02\\x00\\x00"); - expectedResult.add("\\x01\\x01\\x00\\x00"); - - MockupRegionScanner innerScanner = new MockupRegionScanner(cellsInput); - - RegionScanner aggrScanner = new AggregationScanner(rowType, filter, projector, aggregators, innerScanner); - ArrayList result = Lists.newArrayList(); - boolean hasMore = true; - while (hasMore) { - result.clear(); - hasMore = aggrScanner.next(result); - if (result.isEmpty()) - continue; - - Cell cell = result.get(0); - - String rowKey = toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(), mask); - - assertTrue(expectedResult.contains(rowKey)); - } - aggrScanner.close(); - } - - private String toString(byte[] array, int offset, short length, byte[] mask) { - StringBuilder result = new StringBuilder(); - for (int i = 0; i < length; i++) { - int ch = array[offset + i] & 0xFF & mask[i]; - result.append(String.format("\\x%02X", ch)); - } - return result.toString(); - } - - private ObserverRowType newRowType() { - TableDesc t = new TableDesc(); - t.setName("TABLE"); - TblColRef[] cols = new TblColRef[] { newCol("A", t), newCol("B", t), newCol("C", t), newCol("D", t) }; - int[] sizes = new int[] { 1, 1, 1, 1 }; - return new ObserverRowType(cols, sizes); - } - - private TblColRef newCol(String name, TableDesc t) { - ColumnDesc col = new ColumnDesc(); - col.setName(name); - col.setTable(t); - return new TblColRef(col); - } - - public static class MockupRegionScanner implements RegionScanner { - List input; - int i = 0; - - public MockupRegionScanner(List cellInputs) { - this.input = cellInputs; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.hadoop.hbase.regionserver.InternalScanner#next(java.util - * .List) - */ - @Override - public boolean next(List results) throws IOException { - return nextRaw(results); - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.hadoop.hbase.regionserver.InternalScanner#next(java.util - * .List, int) - */ - @Override - public boolean next(List result, int limit) throws IOException { - return next(result); - } - - /* - * (non-Javadoc) - * - * @see org.apache.hadoop.hbase.regionserver.InternalScanner#close() - */ - @Override - public void close() throws IOException { - - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.hadoop.hbase.regionserver.RegionScanner#getRegionInfo() - */ - @Override - public HRegionInfo getRegionInfo() { - return null; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.hadoop.hbase.regionserver.RegionScanner#isFilterDone() - */ - @Override - public boolean isFilterDone() throws IOException { - return false; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.hadoop.hbase.regionserver.RegionScanner#reseek(byte[]) - */ - @Override - public boolean reseek(byte[] row) throws IOException { - return false; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.hadoop.hbase.regionserver.RegionScanner#getMaxResultSize() - */ - @Override - public long getMaxResultSize() { - return 0; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.hadoop.hbase.regionserver.RegionScanner#getMvccReadPoint() - */ - @Override - public long getMvccReadPoint() { - return 0; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.hadoop.hbase.regionserver.RegionScanner#nextRaw(java.util - * .List) - */ - @Override - public boolean nextRaw(List result) throws IOException { - if (i < input.size()) { - result.add(input.get(i)); - i++; - } - return i < input.size(); - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.hadoop.hbase.regionserver.RegionScanner#nextRaw(java.util - * .List, int) - */ - @Override - public boolean nextRaw(List result, int limit) throws IOException { - return nextRaw(result); - } - - } - -} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowAggregatorsTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowAggregatorsTest.java deleted file mode 100644 index 33cb98b..0000000 --- a/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowAggregatorsTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import static org.junit.Assert.*; - -import java.util.Arrays; - -import org.apache.hadoop.hbase.util.Bytes; -import org.junit.Test; - -import com.kylinolap.storage.hbase.observer.ObserverAggregators.HCol; - -/** - * @author yangli9 - * - */ -public class RowAggregatorsTest { - - @Test - public void testSerialize() { - HCol[] hcols = new HCol[] { // - newHCol("f", "c1", new String[] { "SUM", "COUNT" }, new String[] { "decimal", "long" }), // - newHCol("f", "c2", new String[] { "SUM", "SUM" }, new String[] { "long", "long" }) }; - ObserverAggregators sample = new ObserverAggregators(hcols); - - byte[] bytes = ObserverAggregators.serialize(sample); - ObserverAggregators copy = ObserverAggregators.deserialize(bytes); - - assertTrue(sample.nHCols == copy.nHCols); - assertTrue(sample.nTotalMeasures == copy.nTotalMeasures); - assertEquals(sample.hcols[0], copy.hcols[0]); - assertEquals(sample.hcols[1], copy.hcols[1]); - } - - private static HCol newHCol(String family, String qualifier, String[] funcNames, String[] dataTypes) { - return new HCol(Bytes.toBytes(family), Bytes.toBytes(qualifier), funcNames, dataTypes); - } - - private static void assertEquals(HCol a, HCol b) { - assertTrue(a.nMeasures == b.nMeasures); - assertTrue(Arrays.equals(a.family, b.family)); - assertTrue(Arrays.equals(a.qualifier, b.qualifier)); - assertTrue(Arrays.equals(a.funcNames, b.funcNames)); - assertTrue(Arrays.equals(a.dataTypes, b.dataTypes)); - } - -} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowProjectorTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowProjectorTest.java deleted file mode 100644 index a1a8f1f..0000000 --- a/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowProjectorTest.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import static org.junit.Assert.*; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.KeyValue; -import org.apache.hadoop.hbase.util.Bytes; -import org.junit.Test; - -import com.google.common.collect.Lists; -import com.kylinolap.storage.hbase.observer.ObserverProjector.AggrKey; - -/** - * @author yangli9 - * - */ -public class RowProjectorTest { - - byte[] mask = new byte[] { (byte) 0xff, 0x00, 0x00, (byte) 0xff }; - ObserverProjector sample = new ObserverProjector(mask); - - @Test - public void testSerialize() { - - byte[] bytes = ObserverProjector.serialize(sample); - ObserverProjector copy = ObserverProjector.deserialize(bytes); - - assertTrue(Arrays.equals(sample.groupByMask, copy.groupByMask)); - } - - @Test - public void testProject() { - byte[] bytes1 = new byte[] { -1, -2, -3, -4 }; - byte[] bytes2 = new byte[] { 1, 2, 3, 4 }; - byte[] bytes3 = new byte[] { 1, 99, 100, 4 }; - byte[] bytes4 = new byte[] { 1, 1, 1, 5 }; - - AggrKey rowKey = sample.getRowKey(newCellWithRowKey(bytes1)); - AggrKey rowKey2 = sample.getRowKey(newCellWithRowKey(bytes2)); - assertTrue(rowKey == rowKey2); // no extra object creation - assertTrue(Bytes.equals(rowKey.get(), rowKey.offset(), rowKey.length(), bytes2, 0, bytes2.length)); - - rowKey2 = rowKey.copy(); // explicit object creation - assertTrue(rowKey != rowKey2); - - rowKey = sample.getRowKey(newCellWithRowKey(bytes1)); - assertTrue(rowKey.hashCode() != rowKey2.hashCode()); - assertTrue(rowKey.equals(rowKey2) == false); - assertTrue(rowKey.compareTo(rowKey2) > 0); // unsigned compare - - rowKey = sample.getRowKey(newCellWithRowKey(bytes3)); - assertTrue(rowKey.hashCode() == rowKey2.hashCode()); - assertTrue(rowKey.equals(rowKey2) == true); - assertTrue(rowKey.compareTo(rowKey2) == 0); - - rowKey = sample.getRowKey(newCellWithRowKey(bytes4)); - assertTrue(rowKey.hashCode() != rowKey2.hashCode()); - assertTrue(rowKey.equals(rowKey2) == false); - assertTrue(rowKey.compareTo(rowKey2) > 0); - } - - private List newCellWithRowKey(byte[] rowkey) { - ArrayList list = Lists.newArrayList(); - list.add(new KeyValue(rowkey, null, null, null)); - return list; - } -} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowTypeTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowTypeTest.java deleted file mode 100644 index 927fdde..0000000 --- a/storage/src/test/java/com/kylinolap/storage/hbase/observer/RowTypeTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.observer; - -import static org.junit.Assert.*; - -import java.util.Arrays; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.kylinolap.common.util.LocalFileMetadataTestCase; -import com.kylinolap.cube.CubeInstance; -import com.kylinolap.cube.CubeManager; -import com.kylinolap.cube.cuboid.Cuboid; -import com.kylinolap.metadata.model.cube.CubeDesc; - -/** - * @author yangli9 - * - */ -public class RowTypeTest extends LocalFileMetadataTestCase { - - @Before - public void setUp() throws Exception { - this.createTestMetadata(); - } - - @After - public void after() throws Exception { - this.cleanupTestMetadata(); - } - - @Test - public void testSerialize() { - - CubeInstance cube = CubeManager.getInstance(getTestConfig()).getCube("test_kylin_cube_without_slr_ready"); - CubeDesc cubeDesc = cube.getDescriptor(); - long baseCuboidId = Cuboid.getBaseCuboidId(cubeDesc); - Cuboid cuboid = Cuboid.findById(cubeDesc, baseCuboidId); - - ObserverRowType rowType = ObserverRowType.fromCuboid(cube.getLatestReadySegment(), cuboid); - byte[] bytes = ObserverRowType.serialize(rowType); - ObserverRowType copy = ObserverRowType.deserialize(bytes); - - assertTrue(Arrays.equals(rowType.columns, copy.columns)); - assertTrue(Arrays.equals(rowType.columnSizes, copy.columnSizes)); - } -} From 3d341177d27d0cf5f7035ae7caea49e7b3f14e53 Mon Sep 17 00:00:00 2001 From: honma Date: Thu, 27 Nov 2014 10:28:43 +0800 Subject: [PATCH 22/65] half way --- .../cube/invertedindex/TableRecordInfo.java | 9 - .../cube/invertedindex/TableRecordInfoDigest.java | 40 +++++ .../measure/fixedlen/FixedLenMeasureCodec.java | 6 +- .../cube/measure/fixedlen/FixedPointLongCodec.java | 16 +- .../hbase/coprocessor/CoprocessorProjector.java | 182 +++++++++++++++++++++ .../coprocessor/endpoint/EndpointAggregators.java | 158 ++++++++++++++++++ .../coprocessor/endpoint/EndpointRowType.java | 142 ---------------- .../hbase/coprocessor/endpoint/IIEndpoint.java | 6 +- .../observer/AggregateRegionObserver.java | 3 +- .../coprocessor/observer/AggregationCache.java | 13 +- .../coprocessor/observer/AggregationScanner.java | 7 +- .../coprocessor/observer/ObserverEnabler.java | 5 +- .../coprocessor/observer/ObserverProjector.java | 176 -------------------- .../hbase/coprocessor/RowProjectorTest.java | 87 ++++++++++ .../observer/AggregateRegionObserverTest.java | 14 +- .../coprocessor/observer/RowProjectorTest.java | 88 ---------- 16 files changed, 510 insertions(+), 442 deletions(-) create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorProjector.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointAggregators.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointRowType.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverProjector.java create mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/RowProjectorTest.java delete mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowProjectorTest.java diff --git a/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfo.java b/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfo.java index 2196a47..c8fa158 100644 --- a/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfo.java +++ b/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfo.java @@ -18,7 +18,6 @@ import java.io.IOException; -import org.apache.hadoop.io.LongWritable; import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.measure.fixedlen.FixedLenMeasureCodec; @@ -43,8 +42,6 @@ final String[] colNames; final Dictionary[] dictionaries; - final FixedLenMeasureCodec[] measureSerializers; - public TableRecordInfo(CubeSegment cubeSeg) throws IOException { @@ -120,12 +117,6 @@ public InvertedIndexDesc getDescriptor() { return (Dictionary) dictionaries[col]; } - // metrics go with fixed-len codec - @SuppressWarnings("unchecked") - public FixedLenMeasureCodec codec(int col) { - // yes, all metrics are long currently - return (FixedLenMeasureCodec) measureSerializers[col]; - } public int getTimestampColumn() { diff --git a/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfoDigest.java b/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfoDigest.java index 2833183..2ab2a59 100644 --- a/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfoDigest.java +++ b/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfoDigest.java @@ -3,6 +3,9 @@ import com.kylinolap.common.util.BytesSerializer; import com.kylinolap.common.util.BytesUtil; +import com.kylinolap.cube.measure.fixedlen.FixedLenMeasureCodec; +import com.kylinolap.metadata.model.schema.DataType; +import org.apache.hadoop.io.LongWritable; import java.nio.ByteBuffer; @@ -19,6 +22,8 @@ protected int[] lengths;//length of each encoded dict protected boolean[] isMetric;//whether it's metric or dict + protected FixedLenMeasureCodec[] measureSerializers; + public boolean isMetrics(int col) { return isMetric[col]; } @@ -39,11 +44,30 @@ public int getMaxID(int col) { return dictMaxIds[col]; } + public int getMetricCount() { + int ret = 0; + for (int i = 0; i < nColumns; ++i) { + if (isMetrics(i)) { + ret++; + } + } + return ret; + } + @Override public TableRecordBytes createTableRecord() { return new TableRecordBytes(this); } + + // metrics go with fixed-len codec + @SuppressWarnings("unchecked") + public FixedLenMeasureCodec codec(int col) { + // yes, all metrics are long currently + return (FixedLenMeasureCodec) measureSerializers[col]; + } + + public static byte[] serialize(TableRecordInfoDigest o) { ByteBuffer buf = ByteBuffer.allocate(Serializer.SERIALIZE_BUFFER_SIZE); serializer.serialize(o, buf); @@ -52,6 +76,7 @@ public TableRecordBytes createTableRecord() { return result; } + public static TableRecordInfoDigest deserialize(byte[] bytes) { return serializer.deserialize(ByteBuffer.wrap(bytes)); } @@ -71,6 +96,10 @@ public void serialize(TableRecordInfoDigest value, ByteBuffer out) { BytesUtil.writeIntArray(value.offsets, out); BytesUtil.writeIntArray(value.dictMaxIds, out); BytesUtil.writeIntArray(value.lengths, out); + + for (int i = 0; i < value.measureSerializers.length; ++i) { + BytesUtil.writeAsciiString(value.measureSerializers[i].getDataType().toString(), out); + } } @Override @@ -81,6 +110,17 @@ public TableRecordInfoDigest deserialize(ByteBuffer in) { result.offsets = BytesUtil.readIntArray(in); result.dictMaxIds = BytesUtil.readIntArray(in); result.lengths = BytesUtil.readIntArray(in); + + result.measureSerializers = new FixedLenMeasureCodec[result.nColumns]; + for (int i = 0; i < result.nColumns; ++i) { + String typeStr = BytesUtil.readAsciiString(in); + if (typeStr == null) { + result.measureSerializers[i] = null; + } else { + result.measureSerializers[i] = FixedLenMeasureCodec.get(DataType.getInstance(typeStr)); + } + } + return result; } diff --git a/cube/src/main/java/com/kylinolap/cube/measure/fixedlen/FixedLenMeasureCodec.java b/cube/src/main/java/com/kylinolap/cube/measure/fixedlen/FixedLenMeasureCodec.java index 6ea378c..909689c 100644 --- a/cube/src/main/java/com/kylinolap/cube/measure/fixedlen/FixedLenMeasureCodec.java +++ b/cube/src/main/java/com/kylinolap/cube/measure/fixedlen/FixedLenMeasureCodec.java @@ -3,13 +3,15 @@ import com.kylinolap.metadata.model.DataType; abstract public class FixedLenMeasureCodec { - + public static FixedLenMeasureCodec get(DataType type) { - return new FixedPointLongCodec(type.getScale()); + return new FixedPointLongCodec(type); } abstract public int getLength(); + abstract public DataType getDataType(); + abstract public T valueOf(String value); abstract public String toString(T value); diff --git a/cube/src/main/java/com/kylinolap/cube/measure/fixedlen/FixedPointLongCodec.java b/cube/src/main/java/com/kylinolap/cube/measure/fixedlen/FixedPointLongCodec.java index 84ba9fb..1b6dbc7 100644 --- a/cube/src/main/java/com/kylinolap/cube/measure/fixedlen/FixedPointLongCodec.java +++ b/cube/src/main/java/com/kylinolap/cube/measure/fixedlen/FixedPointLongCodec.java @@ -1,21 +1,24 @@ package com.kylinolap.cube.measure.fixedlen; +import com.kylinolap.metadata.model.schema.DataType; import org.apache.hadoop.io.LongWritable; import com.kylinolap.common.util.BytesUtil; public class FixedPointLongCodec extends FixedLenMeasureCodec { - + private static final int SIZE = 8; // number of digits after decimal point int scale; double scalePower; + DataType type; // avoid mass object creation LongWritable current = new LongWritable(); - public FixedPointLongCodec(int scale) { - scale = Math.max(0, scale); - this.scale = scale; + + public FixedPointLongCodec(DataType type) { + this.type = type; + this.scale = Math.max(0, type.getScale()); this.scalePower = Math.pow(10, scale); } @@ -25,6 +28,11 @@ public int getLength() { } @Override + public DataType getDataType() { + return type; + } + + @Override public LongWritable valueOf(String value) { if (value == null) current.set(0L); diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorProjector.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorProjector.java new file mode 100644 index 0000000..68e8808 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorProjector.java @@ -0,0 +1,182 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.coprocessor; + +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import org.apache.hadoop.hbase.Cell; + +import com.kylinolap.common.util.BytesSerializer; +import com.kylinolap.common.util.BytesUtil; +import com.kylinolap.cube.CubeSegment; +import com.kylinolap.cube.cuboid.Cuboid; +import com.kylinolap.cube.kv.RowKeyEncoder; +import com.kylinolap.metadata.model.realization.TblColRef; + +/** + * @author yangli9 + */ +public class CoprocessorProjector { + + public static CoprocessorProjector fromColumns(final CubeSegment cubeSegment, final Cuboid cuboid, final Collection dimensionColumns) { + + RowKeyEncoder rowKeyMaskEncoder = new RowKeyEncoder(cubeSegment, cuboid) { + @Override + protected int fillHeader(byte[] bytes, byte[][] values) { + Arrays.fill(bytes, 0, this.headerLength, (byte) 0xff); + return this.headerLength; + } + + @Override + protected void fillColumnValue(TblColRef column, int columnLen, byte[] value, int valueLen, byte[] outputValue, int outputValueOffset) { + byte bits = dimensionColumns.contains(column) ? (byte) 0xff : 0x00; + Arrays.fill(outputValue, outputValueOffset, outputValueOffset + columnLen, bits); + } + }; + + byte[] mask = rowKeyMaskEncoder.encode(new byte[cuboid.getColumns().size()][]); + return new CoprocessorProjector(mask); + } + + public static byte[] serialize(CoprocessorProjector o) { + ByteBuffer buf = ByteBuffer.allocate(CoprocessorConstants.SERIALIZE_BUFFER_SIZE); + serializer.serialize(o, buf); + byte[] result = new byte[buf.position()]; + System.arraycopy(buf.array(), 0, result, 0, buf.position()); + return result; + } + + public static CoprocessorProjector deserialize(byte[] bytes) { + return serializer.deserialize(ByteBuffer.wrap(bytes)); + } + + private static final Serializer serializer = new Serializer(); + + private static class Serializer implements BytesSerializer { + + @Override + public void serialize(CoprocessorProjector value, ByteBuffer out) { + BytesUtil.writeByteArray(value.groupByMask, out); + } + + @Override + public CoprocessorProjector deserialize(ByteBuffer in) { + byte[] mask = BytesUtil.readByteArray(in); + return new CoprocessorProjector(mask); + } + } + + // ============================================================================ + + final byte[] groupByMask; // mask out columns that are not needed (by group by) + final AggrKey aggrKey = new AggrKey(); + + public CoprocessorProjector(byte[] groupByMask) { + this.groupByMask = groupByMask; + } + + public AggrKey getRowKey(List rowCells) { + int length = groupByMask.length; + Cell cell = rowCells.get(0); + assert length == cell.getRowLength(); + + aggrKey.set(cell.getRowArray(), cell.getRowOffset()); + return aggrKey; + } + + public AggrKey getAggrKey(byte[] row) { + int length = groupByMask.length; + assert length == row.length; + aggrKey.set(row, 0); + return aggrKey; + } + + public class AggrKey implements Comparable { + byte[] data; + int offset; + + public byte[] get() { + return data; + } + + public int offset() { + return offset; + } + + public int length() { + return groupByMask.length; + } + + void set(byte[] data, int offset) { + this.data = data; + this.offset = offset; + } + + public AggrKey copy() { + AggrKey copy = new AggrKey(); + copy.set(new byte[length()], 0); + System.arraycopy(this.data, this.offset, copy.data, copy.offset, length()); + return copy; + } + + @Override + public int hashCode() { + int hash = 1; + for (int i = 0, j = offset, n = length(); i < n; i++, j++) { + if (groupByMask[i] != 0) + hash = (31 * hash) + (int) data[j]; + } + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + AggrKey other = (AggrKey) obj; + if (this.length() != other.length()) + return false; + + return compareTo(other) == 0; + } + + @Override + public int compareTo(AggrKey o) { + int comp = this.length() - o.length(); + if (comp != 0) + return comp; + + int n = this.length(); + for (int i = 0, j = offset, k = o.offset; i < n; i++, j++, k++) { + if (groupByMask[i] != 0) { + comp = BytesUtil.compareByteUnsigned(this.data[j], o.data[k]); + if (comp != 0) + return comp; + } + } + return 0; + } + } + +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointAggregators.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointAggregators.java new file mode 100644 index 0000000..a3d6f45 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointAggregators.java @@ -0,0 +1,158 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.coprocessor.endpoint; + +import com.kylinolap.common.util.BytesSerializer; +import com.kylinolap.common.util.BytesUtil; +import com.kylinolap.cube.invertedindex.TableRecordInfoDigest; +import com.kylinolap.cube.measure.MeasureAggregator; +import com.kylinolap.cube.measure.fixedlen.FixedLenMeasureCodec; +import com.kylinolap.metadata.model.cube.FunctionDesc; +import com.kylinolap.metadata.model.schema.DataType; +import com.kylinolap.storage.hbase.coprocessor.CoprocessorConstants; + +import java.nio.ByteBuffer; +import java.util.List; + +/** + * @author honma + */ +@SuppressWarnings({ "rawtypes", "unchecked" }) +public class EndpointAggregators { + + public static EndpointAggregators fromFunctions(List metrics, TableRecordInfoDigest tableInfo) { + String[] funcNames = new String[metrics.size()]; + String[] dataTypes = new String[metrics.size()]; + + for (int i = 0; i < metrics.size(); i++) { + funcNames[i] = metrics.get(i).getExpression(); + dataTypes[i] = metrics.get(i).getReturnType(); + } + + return new EndpointAggregators(funcNames, dataTypes, tableInfo); + } + + + final String[] funcNames; + final String[] dataTypes; + final TableRecordInfoDigest tableInfo; + + final transient FixedLenMeasureCodec[] measureSerializers; + final transient Object[] metricValues; + final transient byte[] metricBytes; + transient int metricBytesOffset = 0; + + public EndpointAggregators(String[] funcNames, String[] dataTypes, TableRecordInfoDigest tableInfo) { + this.funcNames = funcNames; + this.dataTypes = dataTypes; + this.tableInfo = tableInfo; + + this.metricBytes = new byte[CoprocessorConstants.SERIALIZE_BUFFER_SIZE]; + this.metricValues = new Object[funcNames.length]; + this.measureSerializers = new FixedLenMeasureCodec[funcNames.length]; + for (int i = 0; i < this.measureSerializers.length; ++i) { + this.measureSerializers[i] = FixedLenMeasureCodec.get(DataType.getInstance(dataTypes[i])); + } + } + + + public MeasureAggregator[] createBuffer() { + MeasureAggregator[] aggrs = new MeasureAggregator[funcNames.length]; + for (int j = 0; j < aggrs.length; j++) + aggrs[j++] = MeasureAggregator.create(funcNames[j], dataTypes[j]); + return aggrs; + } + + public void aggregate(MeasureAggregator[] measureAggrs, byte[] row) { + + int rawIndex = 0; + int metricIndex = 0; + int columnCount = tableInfo.getColumnCount(); + + for (int i = 0; i < columnCount; ++i) { + if (tableInfo.isMetrics(i)) { + measureAggrs[metricIndex].aggregate(measureSerializers[metricIndex].read(row, rawIndex)); + metricIndex++; + } + rawIndex += tableInfo.length(i); + } + } + + public byte[] getMetricValues(MeasureAggregator[] aggrs) { + for (int i = 0; i < funcNames.length; i++) { + metricValues[i] = aggrs[i++].getState(); + } + + metricBytesOffset = 0; + for (int i = 0; i < funcNames.length; i++) { + measureSerializers[i].write(metricValues[i], metricBytes, metricBytesOffset); + } + return metricBytes; + } + + public ByteBuffer[] getHColValues(MeasureAggregator[] aggrs) { + int i = 0; + for (int ci = 0; ci < nHCols; ci++) { + IIMetrics col = hcols[ci]; + for (int j = 0; j < col.nMeasures; j++) + col.measureValues[j] = aggrs[i++].getState(); + + col.measureBuf.clear(); + col.measureCodec.encode(col.measureValues, col.measureBuf); + metricBytes[ci] = col.measureBuf; + } + return metricBytes; + } + + + public static byte[] serialize(EndpointAggregators o) { + ByteBuffer buf = ByteBuffer.allocate(CoprocessorConstants.SERIALIZE_BUFFER_SIZE); + serializer.serialize(o, buf); + byte[] result = new byte[buf.position()]; + System.arraycopy(buf.array(), 0, result, 0, buf.position()); + return result; + } + + public static EndpointAggregators deserialize(byte[] bytes) { + return serializer.deserialize(ByteBuffer.wrap(bytes)); + } + + private static final Serializer serializer = new Serializer(); + + private static class Serializer implements BytesSerializer { + + @Override + public void serialize(EndpointAggregators value, ByteBuffer out) { + BytesUtil.writeAsciiStringArray(value.funcNames, out); + BytesUtil.writeAsciiStringArray(value.dataTypes, out); + BytesUtil.writeByteArray(TableRecordInfoDigest.serialize(value.tableInfo), out); + + } + + @Override + public EndpointAggregators deserialize(ByteBuffer in) { + String[] funcNames = BytesUtil.readAsciiStringArray(in); + String[] dataTypes = BytesUtil.readAsciiStringArray(in); + TableRecordInfoDigest tableInfo = TableRecordInfoDigest.deserialize(in); + return new EndpointAggregators(funcNames, dataTypes, tableInfo); + } + + } + + +} + diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointRowType.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointRowType.java deleted file mode 100644 index be40807..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointRowType.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.coprocessor.endpoint; - -import com.google.common.collect.Maps; -import com.kylinolap.common.util.BytesSerializer; -import com.kylinolap.common.util.BytesUtil; -import com.kylinolap.cube.CubeSegment; -import com.kylinolap.cube.cuboid.Cuboid; -import com.kylinolap.cube.kv.RowConstants; -import com.kylinolap.cube.kv.RowKeyColumnIO; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; -import com.kylinolap.storage.hbase.coprocessor.CoprocessorConstants; - -import java.nio.ByteBuffer; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; - -/** - * @author honma - */ -public class EndpointRowType { - - public static EndpointRowType fromCuboid(CubeSegment seg, Cuboid cuboid) { - List colList = cuboid.getColumns(); - TblColRef[] cols = colList.toArray(new TblColRef[colList.size()]); - RowKeyColumnIO colIO = new RowKeyColumnIO(seg); - int[] colSizes = new int[cols.length]; - for (int i = 0; i < cols.length; i++) { - colSizes[i] = colIO.getColumnLength(cols[i]); - } - return new EndpointRowType(cols, colSizes); - } - - public static byte[] serialize(EndpointRowType o) { - ByteBuffer buf = ByteBuffer.allocate(CoprocessorConstants.SERIALIZE_BUFFER_SIZE); - serializer.serialize(o, buf); - byte[] result = new byte[buf.position()]; - System.arraycopy(buf.array(), 0, result, 0, buf.position()); - return result; - } - - public static EndpointRowType deserialize(byte[] bytes) { - return serializer.deserialize(ByteBuffer.wrap(bytes)); - } - - private static final Serializer serializer = new Serializer(); - - private static class Serializer implements BytesSerializer { - - @Override - public void serialize(EndpointRowType o, ByteBuffer out) { - int n = o.columns.length; - BytesUtil.writeVInt(o.columns.length, out); - for (int i = 0; i < n; i++) { - BytesUtil.writeAsciiString(o.columns[i].getTable(), out); - BytesUtil.writeAsciiString(o.columns[i].getName(), out); - BytesUtil.writeVInt(o.columnSizes[i], out); - } - } - - @Override - public EndpointRowType deserialize(ByteBuffer in) { - int n = BytesUtil.readVInt(in); - TblColRef[] cols = new TblColRef[n]; - int[] colSizes = new int[n]; - for (int i = 0; i < n; i++) { - String tableName = BytesUtil.readAsciiString(in); - String colName = BytesUtil.readAsciiString(in); - TableDesc table = new TableDesc(); - table.setName(tableName); - ColumnDesc col = new ColumnDesc(); - col.setTable(table); - col.setName(colName); - cols[i] = new TblColRef(col); - - int colSize = BytesUtil.readVInt(in); - colSizes[i] = colSize; - } - return new EndpointRowType(cols, colSizes); - } - } - - // ============================================================================ - - TblColRef[] columns; - int[] columnSizes; - - int[] columnOffsets; - List columnsAsList; - HashMap columnIdxMap; - - public EndpointRowType(TblColRef[] columns, int[] columnSizes) { - this.columns = columns; - this.columnSizes = columnSizes; - init(); - } - - public int getColIndexByTblColRef(TblColRef colRef) { - return columnIdxMap.get(colRef); - } - - private void init() { - int[] offsets = new int[columns.length]; - int o = RowConstants.ROWKEY_CUBOIDID_LEN; - for (int i = 0; i < columns.length; i++) { - offsets[i] = o; - o += columnSizes[i]; - } - this.columnOffsets = offsets; - - this.columnsAsList = Arrays.asList(columns); - - HashMap map = Maps.newHashMap(); - for (int i = 0; i < columns.length; i++) { - map.put(columns[i], i); - } - this.columnIdxMap = map; - } - - public int getColumnCount() { - return columns.length; - } - -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/IIEndpoint.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/IIEndpoint.java index db4d4ec..91ae2c1 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/IIEndpoint.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/IIEndpoint.java @@ -6,10 +6,10 @@ import com.google.protobuf.Service; import com.kylinolap.cube.invertedindex.*; import com.kylinolap.storage.filter.BitMapFilterEvaluator; +import com.kylinolap.storage.hbase.coprocessor.CoprocessorProjector; import com.kylinolap.storage.hbase.coprocessor.endpoint.generated.IIProtos; import com.kylinolap.storage.hbase.coprocessor.CoprocessorFilter; import com.kylinolap.storage.hbase.coprocessor.observer.ObserverAggregators; -import com.kylinolap.storage.hbase.coprocessor.observer.ObserverProjector; import com.kylinolap.storage.hbase.coprocessor.observer.ObserverRowType; import it.uniroma3.mat.extendedset.intset.ConciseSet; @@ -51,7 +51,7 @@ private Scan buildScan() { public void getRows(RpcController controller, IIProtos.IIRequest request, RpcCallback done) { ObserverRowType type = null; - ObserverProjector projector = null; + CoprocessorProjector projector = null; ObserverAggregators aggregators = null; CoprocessorFilter filter = null; @@ -59,7 +59,7 @@ public void getRows(RpcController controller, IIProtos.IIRequest request, RpcCal type = ObserverRowType.deserialize(request.getSRowType().toByteArray()); } if (request.hasSRowProjector()) { - projector = ObserverProjector.deserialize(request.getSRowProjector().toByteArray()); + projector = CoprocessorProjector.deserialize(request.getSRowProjector().toByteArray()); } if (request.hasSRowAggregator()) { aggregators = ObserverAggregators.deserialize(request.getSRowAggregator().toByteArray()); diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserver.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserver.java index 2ee8642..cd131a6 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserver.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserver.java @@ -19,6 +19,7 @@ import java.io.IOException; import com.kylinolap.storage.hbase.coprocessor.CoprocessorFilter; +import com.kylinolap.storage.hbase.coprocessor.CoprocessorProjector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.hbase.client.Scan; @@ -71,7 +72,7 @@ private RegionScanner doPostScannerObserver(final ObserverContext aggBufMap; + private final SortedMap aggBufMap; private final ObserverAggregators aggregators; transient int rowMemBytes; @@ -52,7 +53,7 @@ public AggregationCache(ObserverAggregators aggregators) { this.aggBufMap = Maps.newTreeMap(); } - public MeasureAggregator[] getBuffer(ObserverProjector.AggrKey aggkey) { + public MeasureAggregator[] getBuffer(CoprocessorProjector.AggrKey aggkey) { MeasureAggregator[] aggBuf = aggBufMap.get(aggkey); if (aggBuf == null) { aggBuf = aggregators.createBuffer(); @@ -91,7 +92,7 @@ public void checkMemoryUsage() { private class AggregationRegionScanner implements RegionScanner { private final RegionScanner innerScanner; - private final Iterator> iterator; + private final Iterator> iterator; public AggregationRegionScanner(RegionScanner innerScanner) { this.innerScanner = innerScanner; @@ -103,7 +104,7 @@ public boolean next(List results) throws IOException { // AggregateRegionObserver.LOG.info("Kylin Scanner next()"); boolean hasMore = false; if (iterator.hasNext()) { - Entry entry = iterator.next(); + Entry entry = iterator.next(); makeCells(entry, results); hasMore = iterator.hasNext(); } @@ -111,12 +112,12 @@ public boolean next(List results) throws IOException { return hasMore; } - private void makeCells(Entry entry, List results) { + private void makeCells(Entry entry, List results) { byte[][] families = aggregators.getHColFamilies(); byte[][] qualifiers = aggregators.getHColQualifiers(); int nHCols = aggregators.getHColsNum(); - ObserverProjector.AggrKey rowKey = entry.getKey(); + CoprocessorProjector.AggrKey rowKey = entry.getKey(); MeasureAggregator[] aggBuf = entry.getValue(); ByteBuffer[] rowValues = aggregators.getHColValues(aggBuf); diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationScanner.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationScanner.java index cb1e01d..bf81207 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationScanner.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationScanner.java @@ -21,6 +21,7 @@ import java.util.List; import com.kylinolap.storage.hbase.coprocessor.CoprocessorFilter; +import com.kylinolap.storage.hbase.coprocessor.CoprocessorProjector; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.regionserver.RegionScanner; @@ -35,7 +36,7 @@ private RegionScanner outerScanner; - public AggregationScanner(ObserverRowType type, CoprocessorFilter filter, ObserverProjector groupBy, ObserverAggregators aggrs, RegionScanner innerScanner) throws IOException { + public AggregationScanner(ObserverRowType type, CoprocessorFilter filter, CoprocessorProjector groupBy, ObserverAggregators aggrs, RegionScanner innerScanner) throws IOException { AggregateRegionObserver.LOG.info("Kylin Coprocessor start"); @@ -50,7 +51,7 @@ public AggregationScanner(ObserverRowType type, CoprocessorFilter filter, Observ } @SuppressWarnings("rawtypes") - AggregationCache buildAggrCache(final RegionScanner innerScanner, ObserverRowType type, ObserverProjector projector, ObserverAggregators aggregators, CoprocessorFilter filter, Stats stats) throws IOException { + AggregationCache buildAggrCache(final RegionScanner innerScanner, ObserverRowType type, CoprocessorProjector projector, ObserverAggregators aggregators, CoprocessorFilter filter, Stats stats) throws IOException { AggregationCache aggCache = new AggregationCache(aggregators); @@ -71,7 +72,7 @@ AggregationCache buildAggrCache(final RegionScanner innerScanner, ObserverRowTyp if (filter != null && filter.evaluate(tuple) == false) continue; - ObserverProjector.AggrKey aggKey = projector.getRowKey(results); + CoprocessorProjector.AggrKey aggKey = projector.getRowKey(results); MeasureAggregator[] bufs = aggCache.getBuffer(aggKey); aggregators.aggregate(bufs, results); diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverEnabler.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverEnabler.java index 6293e92..e2715ac 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverEnabler.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverEnabler.java @@ -22,6 +22,7 @@ import java.util.Set; import com.kylinolap.storage.hbase.coprocessor.CoprocessorFilter; +import com.kylinolap.storage.hbase.coprocessor.CoprocessorProjector; import org.apache.hadoop.hbase.client.HTableInterface; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; @@ -61,7 +62,7 @@ public static ResultScanner scanWithCoprocessorIfBeneficial(CubeSegment segment, ObserverRowType type = ObserverRowType.fromCuboid(segment, cuboid); CoprocessorFilter filter = CoprocessorFilter.fromFilter(segment, tupleFiler); - ObserverProjector projector = ObserverProjector.fromColumns(segment, cuboid, groupBy); + CoprocessorProjector projector = CoprocessorProjector.fromColumns(segment, cuboid, groupBy); ObserverAggregators aggrs = ObserverAggregators.fromValueDecoders(rowValueDecoders); if (DEBUG_LOCAL_COPROCESSOR) { @@ -71,7 +72,7 @@ public static ResultScanner scanWithCoprocessorIfBeneficial(CubeSegment segment, } else { scan.setAttribute(AggregateRegionObserver.COPROCESSOR_ENABLE, new byte[] { 0x01 }); scan.setAttribute(AggregateRegionObserver.TYPE, ObserverRowType.serialize(type)); - scan.setAttribute(AggregateRegionObserver.PROJECTOR, ObserverProjector.serialize(projector)); + scan.setAttribute(AggregateRegionObserver.PROJECTOR, CoprocessorProjector.serialize(projector)); scan.setAttribute(AggregateRegionObserver.AGGREGATORS, ObserverAggregators.serialize(aggrs)); scan.setAttribute(AggregateRegionObserver.FILTER, CoprocessorFilter.serialize(filter)); return table.getScanner(scan); diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverProjector.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverProjector.java deleted file mode 100644 index 9d9a6ea..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverProjector.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.coprocessor.observer; - -import java.nio.ByteBuffer; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import com.kylinolap.storage.hbase.coprocessor.CoprocessorConstants; -import org.apache.hadoop.hbase.Cell; - -import com.kylinolap.common.util.BytesSerializer; -import com.kylinolap.common.util.BytesUtil; -import com.kylinolap.cube.CubeSegment; -import com.kylinolap.cube.cuboid.Cuboid; -import com.kylinolap.cube.kv.RowKeyEncoder; -import com.kylinolap.metadata.model.realization.TblColRef; - -/** - * @author yangli9 - */ -public class ObserverProjector { - - public static ObserverProjector fromColumns(final CubeSegment cubeSegment, final Cuboid cuboid, final Collection dimensionColumns) { - - RowKeyEncoder rowKeyMaskEncoder = new RowKeyEncoder(cubeSegment, cuboid) { - @Override - protected int fillHeader(byte[] bytes, byte[][] values) { - Arrays.fill(bytes, 0, this.headerLength, (byte) 0xff); - return this.headerLength; - } - - @Override - protected void fillColumnValue(TblColRef column, int columnLen, byte[] value, int valueLen, byte[] outputValue, int outputValueOffset) { - byte bits = dimensionColumns.contains(column) ? (byte) 0xff : 0x00; - Arrays.fill(outputValue, outputValueOffset, outputValueOffset + columnLen, bits); - } - }; - - byte[] mask = rowKeyMaskEncoder.encode(new byte[cuboid.getColumns().size()][]); - return new ObserverProjector(mask); - } - - public static byte[] serialize(ObserverProjector o) { - ByteBuffer buf = ByteBuffer.allocate(CoprocessorConstants.SERIALIZE_BUFFER_SIZE); - serializer.serialize(o, buf); - byte[] result = new byte[buf.position()]; - System.arraycopy(buf.array(), 0, result, 0, buf.position()); - return result; - } - - public static ObserverProjector deserialize(byte[] bytes) { - return serializer.deserialize(ByteBuffer.wrap(bytes)); - } - - private static final Serializer serializer = new Serializer(); - - private static class Serializer implements BytesSerializer { - - @Override - public void serialize(ObserverProjector value, ByteBuffer out) { - BytesUtil.writeByteArray(value.groupByMask, out); - } - - @Override - public ObserverProjector deserialize(ByteBuffer in) { - byte[] mask = BytesUtil.readByteArray(in); - return new ObserverProjector(mask); - } - } - - // ============================================================================ - - final byte[] groupByMask; // mask out columns that are not needed (by group by) - final AggrKey aggrKey = new AggrKey(); - - public ObserverProjector(byte[] groupByMask) { - this.groupByMask = groupByMask; - } - - public AggrKey getRowKey(List rowCells) { - int length = groupByMask.length; - Cell cell = rowCells.get(0); - assert length == cell.getRowLength(); - - aggrKey.set(cell.getRowArray(), cell.getRowOffset()); - return aggrKey; - } - - public class AggrKey implements Comparable { - byte[] data; - int offset; - - public byte[] get() { - return data; - } - - public int offset() { - return offset; - } - - public int length() { - return groupByMask.length; - } - - void set(byte[] data, int offset) { - this.data = data; - this.offset = offset; - } - - public AggrKey copy() { - AggrKey copy = new AggrKey(); - copy.set(new byte[length()], 0); - System.arraycopy(this.data, this.offset, copy.data, copy.offset, length()); - return copy; - } - - @Override - public int hashCode() { - int hash = 1; - for (int i = 0, j = offset, n = length(); i < n; i++, j++) { - if (groupByMask[i] != 0) - hash = (31 * hash) + (int) data[j]; - } - return hash; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - AggrKey other = (AggrKey) obj; - if (this.length() != other.length()) - return false; - - return compareTo(other) == 0; - } - - @Override - public int compareTo(AggrKey o) { - int comp = this.length() - o.length(); - if (comp != 0) - return comp; - - int n = this.length(); - for (int i = 0, j = offset, k = o.offset; i < n; i++, j++, k++) { - if (groupByMask[i] != 0) { - comp = BytesUtil.compareByteUnsigned(this.data[j], o.data[k]); - if (comp != 0) - return comp; - } - } - return 0; - } - } - -} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/RowProjectorTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/RowProjectorTest.java new file mode 100644 index 0000000..3db8641 --- /dev/null +++ b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/RowProjectorTest.java @@ -0,0 +1,87 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.coprocessor; + +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.KeyValue; +import org.apache.hadoop.hbase.util.Bytes; +import org.junit.Test; + +import com.google.common.collect.Lists; +import com.kylinolap.storage.hbase.coprocessor.CoprocessorProjector.AggrKey; + +/** + * @author yangli9 + * + */ +public class RowProjectorTest { + + byte[] mask = new byte[] { (byte) 0xff, 0x00, 0x00, (byte) 0xff }; + CoprocessorProjector sample = new CoprocessorProjector(mask); + + @Test + public void testSerialize() { + + byte[] bytes = CoprocessorProjector.serialize(sample); + CoprocessorProjector copy = CoprocessorProjector.deserialize(bytes); + + assertTrue(Arrays.equals(sample.groupByMask, copy.groupByMask)); + } + + @Test + public void testProject() { + byte[] bytes1 = new byte[] { -1, -2, -3, -4 }; + byte[] bytes2 = new byte[] { 1, 2, 3, 4 }; + byte[] bytes3 = new byte[] { 1, 99, 100, 4 }; + byte[] bytes4 = new byte[] { 1, 1, 1, 5 }; + + AggrKey rowKey = sample.getRowKey(newCellWithRowKey(bytes1)); + AggrKey rowKey2 = sample.getRowKey(newCellWithRowKey(bytes2)); + assertTrue(rowKey == rowKey2); // no extra object creation + assertTrue(Bytes.equals(rowKey.get(), rowKey.offset(), rowKey.length(), bytes2, 0, bytes2.length)); + + rowKey2 = rowKey.copy(); // explicit object creation + assertTrue(rowKey != rowKey2); + + rowKey = sample.getRowKey(newCellWithRowKey(bytes1)); + assertTrue(rowKey.hashCode() != rowKey2.hashCode()); + assertTrue(rowKey.equals(rowKey2) == false); + assertTrue(rowKey.compareTo(rowKey2) > 0); // unsigned compare + + rowKey = sample.getRowKey(newCellWithRowKey(bytes3)); + assertTrue(rowKey.hashCode() == rowKey2.hashCode()); + assertTrue(rowKey.equals(rowKey2) == true); + assertTrue(rowKey.compareTo(rowKey2) == 0); + + rowKey = sample.getRowKey(newCellWithRowKey(bytes4)); + assertTrue(rowKey.hashCode() != rowKey2.hashCode()); + assertTrue(rowKey.equals(rowKey2) == false); + assertTrue(rowKey.compareTo(rowKey2) > 0); + } + + private List newCellWithRowKey(byte[] rowkey) { + ArrayList list = Lists.newArrayList(); + list.add(new KeyValue(rowkey, null, null, null)); + return list; + } +} diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserverTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserverTest.java index 8415b4d..63c9a3e 100644 --- a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserverTest.java +++ b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserverTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.kylinolap.storage.hbase.observer; +package com.kylinolap.storage.hbase.coprocessor.observer; import static org.junit.Assert.*; @@ -26,6 +26,8 @@ import java.util.HashSet; import java.util.List; +import com.kylinolap.storage.hbase.coprocessor.CoprocessorFilter; +import com.kylinolap.storage.hbase.coprocessor.CoprocessorProjector; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HRegionInfo; @@ -42,7 +44,7 @@ import com.kylinolap.metadata.model.cube.TblColRef; import com.kylinolap.metadata.model.schema.ColumnDesc; import com.kylinolap.metadata.model.schema.TableDesc; -import com.kylinolap.storage.hbase.observer.ObserverAggregators.HCol; +import com.kylinolap.storage.hbase.coprocessor.observer.ObserverAggregators.HCol; /** * @author yangli9 @@ -103,9 +105,9 @@ private Cell newCell(byte[] key, HCol col, String decimal, int number) { public void test() throws IOException { ObserverRowType rowType = newRowType(); - ObserverProjector projector = new ObserverProjector(mask); + CoprocessorProjector projector = new CoprocessorProjector(mask); ObserverAggregators aggregators = new ObserverAggregators(new HCol[] { c1, c2 }); - ObserverFilter filter = ObserverFilter.deserialize(null); // a default, + CoprocessorFilter filter = CoprocessorFilter.deserialize(null); // a default, // always-true, // filter HashSet expectedResult = new HashSet(); @@ -154,9 +156,9 @@ public void test() throws IOException { public void testNoMeasure() throws IOException { ObserverRowType rowType = newRowType(); - ObserverProjector projector = new ObserverProjector(mask); + CoprocessorProjector projector = new CoprocessorProjector(mask); ObserverAggregators aggregators = new ObserverAggregators(new HCol[] {}); - ObserverFilter filter = ObserverFilter.deserialize(null); // a default, + CoprocessorFilter filter = CoprocessorFilter.deserialize(null); // a default, // always-true, // filter HashSet expectedResult = new HashSet(); diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowProjectorTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowProjectorTest.java deleted file mode 100644 index a19bc71..0000000 --- a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowProjectorTest.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.coprocessor.observer; - -import static org.junit.Assert.*; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import com.kylinolap.storage.hbase.coprocessor.observer.ObserverProjector; -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.KeyValue; -import org.apache.hadoop.hbase.util.Bytes; -import org.junit.Test; - -import com.google.common.collect.Lists; -import com.kylinolap.storage.hbase.coprocessor.observer.ObserverProjector.AggrKey; - -/** - * @author yangli9 - * - */ -public class RowProjectorTest { - - byte[] mask = new byte[] { (byte) 0xff, 0x00, 0x00, (byte) 0xff }; - ObserverProjector sample = new ObserverProjector(mask); - - @Test - public void testSerialize() { - - byte[] bytes = ObserverProjector.serialize(sample); - ObserverProjector copy = ObserverProjector.deserialize(bytes); - - assertTrue(Arrays.equals(sample.groupByMask, copy.groupByMask)); - } - - @Test - public void testProject() { - byte[] bytes1 = new byte[] { -1, -2, -3, -4 }; - byte[] bytes2 = new byte[] { 1, 2, 3, 4 }; - byte[] bytes3 = new byte[] { 1, 99, 100, 4 }; - byte[] bytes4 = new byte[] { 1, 1, 1, 5 }; - - AggrKey rowKey = sample.getRowKey(newCellWithRowKey(bytes1)); - AggrKey rowKey2 = sample.getRowKey(newCellWithRowKey(bytes2)); - assertTrue(rowKey == rowKey2); // no extra object creation - assertTrue(Bytes.equals(rowKey.get(), rowKey.offset(), rowKey.length(), bytes2, 0, bytes2.length)); - - rowKey2 = rowKey.copy(); // explicit object creation - assertTrue(rowKey != rowKey2); - - rowKey = sample.getRowKey(newCellWithRowKey(bytes1)); - assertTrue(rowKey.hashCode() != rowKey2.hashCode()); - assertTrue(rowKey.equals(rowKey2) == false); - assertTrue(rowKey.compareTo(rowKey2) > 0); // unsigned compare - - rowKey = sample.getRowKey(newCellWithRowKey(bytes3)); - assertTrue(rowKey.hashCode() == rowKey2.hashCode()); - assertTrue(rowKey.equals(rowKey2) == true); - assertTrue(rowKey.compareTo(rowKey2) == 0); - - rowKey = sample.getRowKey(newCellWithRowKey(bytes4)); - assertTrue(rowKey.hashCode() != rowKey2.hashCode()); - assertTrue(rowKey.equals(rowKey2) == false); - assertTrue(rowKey.compareTo(rowKey2) > 0); - } - - private List newCellWithRowKey(byte[] rowkey) { - ArrayList list = Lists.newArrayList(); - list.add(new KeyValue(rowkey, null, null, null)); - return list; - } -} From 7d59e6d98ac5c8d28ea14c221fedde3a8c7bdab4 Mon Sep 17 00:00:00 2001 From: honma Date: Fri, 28 Nov 2014 09:35:46 +0800 Subject: [PATCH 23/65] endpoint aggregation and projection at server side is done, but test case data requires retrofitting --- .../java/com/kylinolap/common/util/BytesUtil.java | 16 ++ .../java/com/kylinolap/common/util/BasicTest.java | 9 +- .../cube/invertedindex/TableRecordInfoDigest.java | 4 + .../kylinolap/job/coprocessor/IIEndpointTest.java | 2 +- .../hbase/coprocessor/AggregationCache.java | 53 ++++++ .../hbase/coprocessor/CoprocessorProjector.java | 22 ++- .../endpoint/EndpointAggregationCache.java | 29 +++ .../coprocessor/endpoint/EndpointAggregators.java | 28 +-- .../coprocessor/observer/AggregationCache.java | 195 --------------------- .../coprocessor/observer/AggregationScanner.java | 8 +- .../observer/ObserverAggregationCache.java | 162 +++++++++++++++++ .../coprocessor/observer/ObserverEnabler.java | 2 +- .../storage/hbase/InvertedIndexHBaseTest.java | 6 + .../hbase/coprocessor/RowProjectorTest.java | 10 +- .../endpoint/EndpoindAggregationTest.java | 127 ++++++++++++++ 15 files changed, 440 insertions(+), 233 deletions(-) create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/AggregationCache.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointAggregationCache.java delete mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationCache.java create mode 100644 storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverAggregationCache.java create mode 100644 storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpoindAggregationTest.java diff --git a/common/src/main/java/com/kylinolap/common/util/BytesUtil.java b/common/src/main/java/com/kylinolap/common/util/BytesUtil.java index d2c1098..999d40d 100644 --- a/common/src/main/java/com/kylinolap/common/util/BytesUtil.java +++ b/common/src/main/java/com/kylinolap/common/util/BytesUtil.java @@ -331,6 +331,22 @@ public static void writeByteArray(byte[] array, ByteBuffer out) { } } + public static String toReadableText(byte[] array) { + return toHex(array); + } + + public static byte[] fromReadableText(String text) { + String[] tokens = text.split("\\\\x"); + byte[] ret = new byte[tokens.length - 1]; + for (int i = 1; i < tokens.length; ++i) { + int x = Bytes.toBinaryFromHex((byte) tokens[i].charAt(0)); + x = x << 4; + int y = Bytes.toBinaryFromHex((byte) tokens[i].charAt(1)); + ret[i - 1] = (byte) (x + y); + } + return ret; + } + public static String toHex(byte[] array) { return toHex(new ImmutableBytesWritable(array)); } diff --git a/common/src/test/java/com/kylinolap/common/util/BasicTest.java b/common/src/test/java/com/kylinolap/common/util/BasicTest.java index 347f951..2d1d935 100644 --- a/common/src/test/java/com/kylinolap/common/util/BasicTest.java +++ b/common/src/test/java/com/kylinolap/common/util/BasicTest.java @@ -1,13 +1,17 @@ package com.kylinolap.common.util; import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import org.apache.hadoop.fs.HasEnhancedByteBufferAccess; +import org.apache.hadoop.hbase.util.Pair; import org.junit.Ignore; import org.junit.Test; /** * Created by honma on 10/17/14. - * + *

* Keep this test case to test basic java functionality * development concept proving use */ @@ -15,7 +19,6 @@ public class BasicTest { @Test public void test() throws IOException { - double i2 = 3234.4324234324234; - System.out.println(String.format("%.2f", i2)); } + } diff --git a/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfoDigest.java b/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfoDigest.java index 2ab2a59..40e988f 100644 --- a/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfoDigest.java +++ b/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfoDigest.java @@ -24,6 +24,10 @@ protected FixedLenMeasureCodec[] measureSerializers; + public int getByteFormLen() { + return byteFormLen; + } + public boolean isMetrics(int col) { return isMetric[col]; } diff --git a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java index a97e1b0..7957b33 100644 --- a/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java +++ b/job/src/test/java/com/kylinolap/job/coprocessor/IIEndpointTest.java @@ -142,7 +142,7 @@ public static void tearDownAfterClass() throws Exception { CoprocessorFilter filter = CoprocessorFilter.fromFilter(this.seg, rootFilter); - //SRowProjector projector = SRowProjector.fromColumns(segment, cuboid, groupBy); + //SRowProjector projector = SRowProjector.makeForObserver(segment, cuboid, groupBy); //SRowAggregators aggrs = SRowAggregators.fromValueDecoders(rowValueDecoders); diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/AggregationCache.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/AggregationCache.java new file mode 100644 index 0000000..e427573 --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/AggregationCache.java @@ -0,0 +1,53 @@ +package com.kylinolap.storage.hbase.coprocessor; + +import com.google.common.collect.Maps; +import com.kylinolap.cube.measure.MeasureAggregator; + +import java.util.SortedMap; + +/** + * Created by Hongbin Ma(Binmahone) on 11/27/14. + */ +public abstract class AggregationCache { + transient int rowMemBytes; + static final int MEMORY_USAGE_CAP = 500 * 1024 * 1024; // 500 MB + protected final SortedMap aggBufMap; + + public AggregationCache() { + this.aggBufMap = Maps.newTreeMap(); + } + + public abstract MeasureAggregator[] createBuffer(); + + public MeasureAggregator[] getBuffer(CoprocessorProjector.AggrKey aggkey) { + MeasureAggregator[] aggBuf = aggBufMap.get(aggkey); + if (aggBuf == null) { + aggBuf = createBuffer(); + aggBufMap.put(aggkey.copy(), aggBuf); + } + return aggBuf; + } + + public long getSize() { + return aggBufMap.size(); + } + + public void checkMemoryUsage() { + // about memory calculation, + // http://seniorjava.wordpress.com/2013/09/01/java-objects-memory-size-reference/ + if (rowMemBytes <= 0) { + if (aggBufMap.size() > 0) { + rowMemBytes = 0; + MeasureAggregator[] measureAggregators = aggBufMap.get(aggBufMap.firstKey()); + for (MeasureAggregator agg : measureAggregators) { + rowMemBytes += agg.getMemBytes(); + } + } + } + int size = aggBufMap.size(); + int memUsage = (40 + rowMemBytes) * size; + if (memUsage > MEMORY_USAGE_CAP) { + throw new RuntimeException("Kylin coprocess memory usage goes beyond cap, (40 + " + rowMemBytes + ") * " + size + " > " + MEMORY_USAGE_CAP + ". Abord coprocessor."); + } + } +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorProjector.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorProjector.java index 68e8808..0644936 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorProjector.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorProjector.java @@ -21,6 +21,8 @@ import java.util.Collection; import java.util.List; +import com.kylinolap.cube.invertedindex.TableRecordInfo; +import com.kylinolap.metadata.model.schema.ColumnDesc; import org.apache.hadoop.hbase.Cell; import com.kylinolap.common.util.BytesSerializer; @@ -35,7 +37,7 @@ */ public class CoprocessorProjector { - public static CoprocessorProjector fromColumns(final CubeSegment cubeSegment, final Cuboid cuboid, final Collection dimensionColumns) { + public static CoprocessorProjector makeForObserver(final CubeSegment cubeSegment, final Cuboid cuboid, final Collection dimensionColumns) { RowKeyEncoder rowKeyMaskEncoder = new RowKeyEncoder(cubeSegment, cuboid) { @Override @@ -55,6 +57,22 @@ protected void fillColumnValue(TblColRef column, int columnLen, byte[] value, in return new CoprocessorProjector(mask); } + public static CoprocessorProjector makeForEndpoint(final TableRecordInfo tableInfo, final Collection dimensionColumns) { + byte[] mask = new byte[tableInfo.getByteFormLen()]; + int maskIdx = 0; + for (int i = 0; i < tableInfo.getColumnCount(); ++i) { + for (ColumnDesc columnDesc : tableInfo.getColumns()) { + TblColRef tblColRef = new TblColRef(columnDesc); + int length = tableInfo.length(i); + byte bits = dimensionColumns.contains(tblColRef) ? (byte) 0xff : 0x00; + for (int j = 0; j < length; ++j) { + mask[maskIdx++] = bits; + } + } + } + return new CoprocessorProjector(mask); + } + public static byte[] serialize(CoprocessorProjector o) { ByteBuffer buf = ByteBuffer.allocate(CoprocessorConstants.SERIALIZE_BUFFER_SIZE); serializer.serialize(o, buf); @@ -92,7 +110,7 @@ public CoprocessorProjector(byte[] groupByMask) { this.groupByMask = groupByMask; } - public AggrKey getRowKey(List rowCells) { + public AggrKey getAggrKey(List rowCells) { int length = groupByMask.length; Cell cell = rowCells.get(0); assert length == cell.getRowLength(); diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointAggregationCache.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointAggregationCache.java new file mode 100644 index 0000000..0756d2b --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointAggregationCache.java @@ -0,0 +1,29 @@ +package com.kylinolap.storage.hbase.coprocessor.endpoint; + +import com.kylinolap.cube.measure.MeasureAggregator; +import com.kylinolap.storage.hbase.coprocessor.AggregationCache; +import com.kylinolap.storage.hbase.coprocessor.CoprocessorProjector; + +import java.util.Map; +import java.util.Set; + +/** + * Created by Hongbin Ma(Binmahone) on 11/27/14. + */ +public class EndpointAggregationCache extends AggregationCache { + + private EndpointAggregators aggregators; + + public EndpointAggregationCache(EndpointAggregators aggregators) { + this.aggregators = aggregators; + } + + @Override + public MeasureAggregator[] createBuffer() { + return this.aggregators.createBuffer(); + } + + public Set> getAllEntries() { + return aggBufMap.entrySet(); + } +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointAggregators.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointAggregators.java index a3d6f45..875785d 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointAggregators.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointAggregators.java @@ -46,12 +46,11 @@ public static EndpointAggregators fromFunctions(List metrics, Tabl return new EndpointAggregators(funcNames, dataTypes, tableInfo); } - final String[] funcNames; final String[] dataTypes; final TableRecordInfoDigest tableInfo; - final transient FixedLenMeasureCodec[] measureSerializers; + final transient FixedLenMeasureCodec[] measureSerializers; final transient Object[] metricValues; final transient byte[] metricBytes; transient int metricBytesOffset = 0; @@ -63,22 +62,22 @@ public EndpointAggregators(String[] funcNames, String[] dataTypes, TableRecordIn this.metricBytes = new byte[CoprocessorConstants.SERIALIZE_BUFFER_SIZE]; this.metricValues = new Object[funcNames.length]; - this.measureSerializers = new FixedLenMeasureCodec[funcNames.length]; + this.measureSerializers = new FixedLenMeasureCodec[funcNames.length]; for (int i = 0; i < this.measureSerializers.length; ++i) { this.measureSerializers[i] = FixedLenMeasureCodec.get(DataType.getInstance(dataTypes[i])); } } - public MeasureAggregator[] createBuffer() { MeasureAggregator[] aggrs = new MeasureAggregator[funcNames.length]; - for (int j = 0; j < aggrs.length; j++) - aggrs[j++] = MeasureAggregator.create(funcNames[j], dataTypes[j]); + for (int j = 0; j < aggrs.length; j++) { + //all fixed length measures can be aggregated as long + aggrs[j++] = MeasureAggregator.create(funcNames[j], "long"); + } return aggrs; } public void aggregate(MeasureAggregator[] measureAggrs, byte[] row) { - int rawIndex = 0; int metricIndex = 0; int columnCount = tableInfo.getColumnCount(); @@ -104,21 +103,6 @@ public void aggregate(MeasureAggregator[] measureAggrs, byte[] row) { return metricBytes; } - public ByteBuffer[] getHColValues(MeasureAggregator[] aggrs) { - int i = 0; - for (int ci = 0; ci < nHCols; ci++) { - IIMetrics col = hcols[ci]; - for (int j = 0; j < col.nMeasures; j++) - col.measureValues[j] = aggrs[i++].getState(); - - col.measureBuf.clear(); - col.measureCodec.encode(col.measureValues, col.measureBuf); - metricBytes[ci] = col.measureBuf; - } - return metricBytes; - } - - public static byte[] serialize(EndpointAggregators o) { ByteBuffer buf = ByteBuffer.allocate(CoprocessorConstants.SERIALIZE_BUFFER_SIZE); serializer.serialize(o, buf); diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationCache.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationCache.java deleted file mode 100644 index 3427e51..0000000 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationCache.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.storage.hbase.coprocessor.observer; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.Iterator; -import java.util.List; -import java.util.Map.Entry; -import java.util.SortedMap; - -import com.kylinolap.storage.hbase.coprocessor.CoprocessorProjector; -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.HConstants; -import org.apache.hadoop.hbase.HRegionInfo; -import org.apache.hadoop.hbase.KeyValue; -import org.apache.hadoop.hbase.KeyValue.Type; -import org.apache.hadoop.hbase.regionserver.RegionScanner; - -import com.google.common.collect.Maps; -import com.kylinolap.cube.measure.MeasureAggregator; - -/** - * @author yangli9 - * - */ -@SuppressWarnings("rawtypes") -public class AggregationCache { - - static final int MEMORY_USAGE_CAP = 500 * 1024 * 1024; // 500 MB - - private final SortedMap aggBufMap; - private final ObserverAggregators aggregators; - - transient int rowMemBytes; - - public AggregationCache(ObserverAggregators aggregators) { - this.aggregators = aggregators; - this.aggBufMap = Maps.newTreeMap(); - } - - public MeasureAggregator[] getBuffer(CoprocessorProjector.AggrKey aggkey) { - MeasureAggregator[] aggBuf = aggBufMap.get(aggkey); - if (aggBuf == null) { - aggBuf = aggregators.createBuffer(); - aggBufMap.put(aggkey.copy(), aggBuf); - } - return aggBuf; - } - - public RegionScanner getScanner(RegionScanner innerScanner) { - return new AggregationRegionScanner(innerScanner); - } - - public long getSize() { - return aggBufMap.size(); - } - - public void checkMemoryUsage() { - // about memory calculation, - // http://seniorjava.wordpress.com/2013/09/01/java-objects-memory-size-reference/ - if (rowMemBytes <= 0) { - if (aggBufMap.size() > 0) { - rowMemBytes = 0; - MeasureAggregator[] measureAggregators = aggBufMap.get(aggBufMap.firstKey()); - for (MeasureAggregator agg : measureAggregators) { - rowMemBytes += agg.getMemBytes(); - } - } - } - int size = aggBufMap.size(); - int memUsage = (40 + rowMemBytes) * size; - if (memUsage > MEMORY_USAGE_CAP) { - throw new RuntimeException("Kylin coprocess memory usage goes beyond cap, (40 + " + rowMemBytes + ") * " + size + " > " + MEMORY_USAGE_CAP + ". Abord coprocessor."); - } - } - - private class AggregationRegionScanner implements RegionScanner { - - private final RegionScanner innerScanner; - private final Iterator> iterator; - - public AggregationRegionScanner(RegionScanner innerScanner) { - this.innerScanner = innerScanner; - this.iterator = aggBufMap.entrySet().iterator(); - } - - @Override - public boolean next(List results) throws IOException { - // AggregateRegionObserver.LOG.info("Kylin Scanner next()"); - boolean hasMore = false; - if (iterator.hasNext()) { - Entry entry = iterator.next(); - makeCells(entry, results); - hasMore = iterator.hasNext(); - } - // AggregateRegionObserver.LOG.info("Kylin Scanner next() done"); - return hasMore; - } - - private void makeCells(Entry entry, List results) { - byte[][] families = aggregators.getHColFamilies(); - byte[][] qualifiers = aggregators.getHColQualifiers(); - int nHCols = aggregators.getHColsNum(); - - CoprocessorProjector.AggrKey rowKey = entry.getKey(); - MeasureAggregator[] aggBuf = entry.getValue(); - ByteBuffer[] rowValues = aggregators.getHColValues(aggBuf); - - if (nHCols == 0) { - Cell keyValue = new KeyValue(rowKey.get(), rowKey.offset(), rowKey.length(), // - null, 0, 0, // - null, 0, 0, // - HConstants.LATEST_TIMESTAMP, Type.Put, // - null, 0, 0); - results.add(keyValue); - } else { - for (int i = 0; i < nHCols; i++) { - Cell keyValue = new KeyValue(rowKey.get(), rowKey.offset(), rowKey.length(), // - families[i], 0, families[i].length, // - qualifiers[i], 0, qualifiers[i].length, // - HConstants.LATEST_TIMESTAMP, Type.Put, // - rowValues[i].array(), 0, rowValues[i].position()); - results.add(keyValue); - } - } - } - - @Override - public boolean next(List result, int limit) throws IOException { - return next(result); - } - - @Override - public boolean nextRaw(List result) throws IOException { - return next(result); - } - - @Override - public boolean nextRaw(List result, int limit) throws IOException { - return next(result); - } - - @Override - public void close() throws IOException { - // AggregateRegionObserver.LOG.info("Kylin Scanner close()"); - innerScanner.close(); - // AggregateRegionObserver.LOG.info("Kylin Scanner close() done"); - } - - @Override - public HRegionInfo getRegionInfo() { - // AggregateRegionObserver.LOG.info("Kylin Scanner getRegionInfo()"); - return innerScanner.getRegionInfo(); - } - - @Override - public long getMaxResultSize() { - // AggregateRegionObserver.LOG.info("Kylin Scanner getMaxResultSize()"); - return Long.MAX_VALUE; - } - - @Override - public boolean isFilterDone() throws IOException { - // AggregateRegionObserver.LOG.info("Kylin Scanner isFilterDone()"); - return false; - } - - @Override - public boolean reseek(byte[] row) throws IOException { - throw new UnsupportedOperationException(); - } - - @Override - public long getMvccReadPoint() { - // AggregateRegionObserver.LOG.info("Kylin Scanner getMvccReadPoint()"); - return Long.MAX_VALUE; - } - } - -} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationScanner.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationScanner.java index bf81207..fa9589f 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationScanner.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregationScanner.java @@ -40,7 +40,7 @@ public AggregationScanner(ObserverRowType type, CoprocessorFilter filter, Coproc AggregateRegionObserver.LOG.info("Kylin Coprocessor start"); - AggregationCache aggCache; + ObserverAggregationCache aggCache; Stats stats = new Stats(); aggCache = buildAggrCache(innerScanner, type, groupBy, aggrs, filter, stats); @@ -51,9 +51,9 @@ public AggregationScanner(ObserverRowType type, CoprocessorFilter filter, Coproc } @SuppressWarnings("rawtypes") - AggregationCache buildAggrCache(final RegionScanner innerScanner, ObserverRowType type, CoprocessorProjector projector, ObserverAggregators aggregators, CoprocessorFilter filter, Stats stats) throws IOException { + ObserverAggregationCache buildAggrCache(final RegionScanner innerScanner, ObserverRowType type, CoprocessorProjector projector, ObserverAggregators aggregators, CoprocessorFilter filter, Stats stats) throws IOException { - AggregationCache aggCache = new AggregationCache(aggregators); + ObserverAggregationCache aggCache = new ObserverAggregationCache(aggregators); ObserverTuple tuple = new ObserverTuple(type); boolean hasMore = true; @@ -72,7 +72,7 @@ AggregationCache buildAggrCache(final RegionScanner innerScanner, ObserverRowTyp if (filter != null && filter.evaluate(tuple) == false) continue; - CoprocessorProjector.AggrKey aggKey = projector.getRowKey(results); + CoprocessorProjector.AggrKey aggKey = projector.getAggrKey(results); MeasureAggregator[] bufs = aggCache.getBuffer(aggKey); aggregators.aggregate(bufs, results); diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverAggregationCache.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverAggregationCache.java new file mode 100644 index 0000000..691a2fc --- /dev/null +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverAggregationCache.java @@ -0,0 +1,162 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.storage.hbase.coprocessor.observer; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Iterator; +import java.util.List; +import java.util.Map.Entry; +import java.util.SortedMap; + +import com.kylinolap.storage.hbase.coprocessor.AggregationCache; +import com.kylinolap.storage.hbase.coprocessor.CoprocessorProjector; +import com.kylinolap.storage.hbase.coprocessor.observer.ObserverAggregators; +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.HRegionInfo; +import org.apache.hadoop.hbase.KeyValue; +import org.apache.hadoop.hbase.KeyValue.Type; +import org.apache.hadoop.hbase.regionserver.RegionScanner; + +import com.kylinolap.cube.measure.MeasureAggregator; + +/** + * @author yangli9 + */ +@SuppressWarnings("rawtypes") +public class ObserverAggregationCache extends AggregationCache { + + private final ObserverAggregators aggregators; + + public ObserverAggregationCache(ObserverAggregators aggregators) { + this.aggregators = aggregators; + } + + public RegionScanner getScanner(RegionScanner innerScanner) { + return new AggregationRegionScanner(innerScanner); + } + + @Override + public MeasureAggregator[] createBuffer() { + return aggregators.createBuffer(); + } + + private class AggregationRegionScanner implements RegionScanner { + + private final RegionScanner innerScanner; + private final Iterator> iterator; + + public AggregationRegionScanner(RegionScanner innerScanner) { + this.innerScanner = innerScanner; + this.iterator = aggBufMap.entrySet().iterator(); + } + + @Override + public boolean next(List results) throws IOException { + // AggregateRegionObserver.LOG.info("Kylin Scanner next()"); + boolean hasMore = false; + if (iterator.hasNext()) { + Entry entry = iterator.next(); + makeCells(entry, results); + hasMore = iterator.hasNext(); + } + // AggregateRegionObserver.LOG.info("Kylin Scanner next() done"); + return hasMore; + } + + private void makeCells(Entry entry, List results) { + byte[][] families = aggregators.getHColFamilies(); + byte[][] qualifiers = aggregators.getHColQualifiers(); + int nHCols = aggregators.getHColsNum(); + + CoprocessorProjector.AggrKey rowKey = entry.getKey(); + MeasureAggregator[] aggBuf = entry.getValue(); + ByteBuffer[] rowValues = aggregators.getHColValues(aggBuf); + + if (nHCols == 0) { + Cell keyValue = new KeyValue(rowKey.get(), rowKey.offset(), rowKey.length(), // + null, 0, 0, // + null, 0, 0, // + HConstants.LATEST_TIMESTAMP, Type.Put, // + null, 0, 0); + results.add(keyValue); + } else { + for (int i = 0; i < nHCols; i++) { + Cell keyValue = new KeyValue(rowKey.get(), rowKey.offset(), rowKey.length(), // + families[i], 0, families[i].length, // + qualifiers[i], 0, qualifiers[i].length, // + HConstants.LATEST_TIMESTAMP, Type.Put, // + rowValues[i].array(), 0, rowValues[i].position()); + results.add(keyValue); + } + } + } + + @Override + public boolean next(List result, int limit) throws IOException { + return next(result); + } + + @Override + public boolean nextRaw(List result) throws IOException { + return next(result); + } + + @Override + public boolean nextRaw(List result, int limit) throws IOException { + return next(result); + } + + @Override + public void close() throws IOException { + // AggregateRegionObserver.LOG.info("Kylin Scanner close()"); + innerScanner.close(); + // AggregateRegionObserver.LOG.info("Kylin Scanner close() done"); + } + + @Override + public HRegionInfo getRegionInfo() { + // AggregateRegionObserver.LOG.info("Kylin Scanner getRegionInfo()"); + return innerScanner.getRegionInfo(); + } + + @Override + public long getMaxResultSize() { + // AggregateRegionObserver.LOG.info("Kylin Scanner getMaxResultSize()"); + return Long.MAX_VALUE; + } + + @Override + public boolean isFilterDone() throws IOException { + // AggregateRegionObserver.LOG.info("Kylin Scanner isFilterDone()"); + return false; + } + + @Override + public boolean reseek(byte[] row) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public long getMvccReadPoint() { + // AggregateRegionObserver.LOG.info("Kylin Scanner getMvccReadPoint()"); + return Long.MAX_VALUE; + } + } + +} diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverEnabler.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverEnabler.java index e2715ac..15cdb8d 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverEnabler.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverEnabler.java @@ -62,7 +62,7 @@ public static ResultScanner scanWithCoprocessorIfBeneficial(CubeSegment segment, ObserverRowType type = ObserverRowType.fromCuboid(segment, cuboid); CoprocessorFilter filter = CoprocessorFilter.fromFilter(segment, tupleFiler); - CoprocessorProjector projector = CoprocessorProjector.fromColumns(segment, cuboid, groupBy); + CoprocessorProjector projector = CoprocessorProjector.makeForObserver(segment, cuboid, groupBy); ObserverAggregators aggrs = ObserverAggregators.fromValueDecoders(rowValueDecoders); if (DEBUG_LOCAL_COPROCESSOR) { diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/InvertedIndexHBaseTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/InvertedIndexHBaseTest.java index 6fbb0bc..fc35e37 100644 --- a/storage/src/test/java/com/kylinolap/storage/hbase/InvertedIndexHBaseTest.java +++ b/storage/src/test/java/com/kylinolap/storage/hbase/InvertedIndexHBaseTest.java @@ -18,6 +18,7 @@ import java.util.List; +import com.kylinolap.common.util.BytesUtil; import com.kylinolap.cube.invertedindex.*; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.client.*; @@ -95,6 +96,11 @@ public void testLoad() throws Exception { private void dump(Iterable records) { for (TableRecord rec : records) { System.out.println(rec.toString()); + + byte[] x = rec.getBytes(); + String y = BytesUtil.toReadableText(x); + System.out.println(y); + System.out.println(); } } diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/RowProjectorTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/RowProjectorTest.java index 3db8641..2eebaae 100644 --- a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/RowProjectorTest.java +++ b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/RowProjectorTest.java @@ -55,25 +55,25 @@ public void testProject() { byte[] bytes3 = new byte[] { 1, 99, 100, 4 }; byte[] bytes4 = new byte[] { 1, 1, 1, 5 }; - AggrKey rowKey = sample.getRowKey(newCellWithRowKey(bytes1)); - AggrKey rowKey2 = sample.getRowKey(newCellWithRowKey(bytes2)); + AggrKey rowKey = sample.getAggrKey(newCellWithRowKey(bytes1)); + AggrKey rowKey2 = sample.getAggrKey(newCellWithRowKey(bytes2)); assertTrue(rowKey == rowKey2); // no extra object creation assertTrue(Bytes.equals(rowKey.get(), rowKey.offset(), rowKey.length(), bytes2, 0, bytes2.length)); rowKey2 = rowKey.copy(); // explicit object creation assertTrue(rowKey != rowKey2); - rowKey = sample.getRowKey(newCellWithRowKey(bytes1)); + rowKey = sample.getAggrKey(newCellWithRowKey(bytes1)); assertTrue(rowKey.hashCode() != rowKey2.hashCode()); assertTrue(rowKey.equals(rowKey2) == false); assertTrue(rowKey.compareTo(rowKey2) > 0); // unsigned compare - rowKey = sample.getRowKey(newCellWithRowKey(bytes3)); + rowKey = sample.getAggrKey(newCellWithRowKey(bytes3)); assertTrue(rowKey.hashCode() == rowKey2.hashCode()); assertTrue(rowKey.equals(rowKey2) == true); assertTrue(rowKey.compareTo(rowKey2) == 0); - rowKey = sample.getRowKey(newCellWithRowKey(bytes4)); + rowKey = sample.getAggrKey(newCellWithRowKey(bytes4)); assertTrue(rowKey.hashCode() != rowKey2.hashCode()); assertTrue(rowKey.equals(rowKey2) == false); assertTrue(rowKey.compareTo(rowKey2) > 0); diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpoindAggregationTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpoindAggregationTest.java new file mode 100644 index 0000000..faf8f25 --- /dev/null +++ b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpoindAggregationTest.java @@ -0,0 +1,127 @@ +package com.kylinolap.storage.hbase.coprocessor.endpoint; + +import static org.junit.Assert.*; + +import com.kylinolap.common.util.BytesUtil; +import com.kylinolap.common.util.LocalFileMetadataTestCase; +import com.kylinolap.cube.CubeInstance; +import com.kylinolap.cube.CubeManager; +import com.kylinolap.cube.invertedindex.TableRecordInfo; +import com.kylinolap.cube.measure.MeasureAggregator; +import com.kylinolap.metadata.model.cube.FunctionDesc; +import com.kylinolap.metadata.model.cube.ParameterDesc; +import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.storage.filter.ColumnTupleFilter; +import com.kylinolap.storage.filter.CompareTupleFilter; +import com.kylinolap.storage.filter.ConstantTupleFilter; +import com.kylinolap.storage.filter.TupleFilter; +import com.kylinolap.storage.hbase.coprocessor.CoprocessorFilter; +import com.kylinolap.storage.hbase.coprocessor.CoprocessorProjector; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.util.*; + +/** + * Created by Hongbin Ma(Binmahone) on 11/27/14. + */ +public class EndpoindAggregationTest extends LocalFileMetadataTestCase { + CubeInstance cube; + TableRecordInfo tableRecordInfo; + + CoprocessorProjector projector; + EndpointAggregators aggregators; + CoprocessorFilter filter; + + EndpointAggregationCache aggCache; + + byte[][] data; + + + @Before + public void setup() throws IOException { + this.createTestMetadata(); + this.cube = CubeManager.getInstance(getTestConfig()).getCube("test_kylin_cube_ii"); + this.tableRecordInfo = new TableRecordInfo(cube.getFirstSegment()); + TblColRef formatName = this.cube.getDescriptor().findColumnRef("test_kylin_fact", "LSTG_FORMAT_NAME"); + TblColRef siteId = this.cube.getDescriptor().findColumnRef("test_kylin_fact", "LSTG_SITE_ID"); + + Collection dims = new HashSet<>(); + dims.add(formatName); + projector = CoprocessorProjector.makeForEndpoint(tableRecordInfo, dims); + aggregators = EndpointAggregators.fromFunctions(buildAggregations(), tableRecordInfo); + + CompareTupleFilter rawFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.EQ); + rawFilter.addChild(new ColumnTupleFilter(formatName)); + rawFilter.addChild(new ConstantTupleFilter("Others")); + filter = CoprocessorFilter.fromFilter(this.cube.getFirstSegment(), rawFilter); + + aggCache = new EndpointAggregationCache(aggregators); + + /** + [0,2012-10-08,Auction,16145,3,12,85.0913662952116,0,10000036] + [0,2012-10-08,FP-non GTC,20865,0,-99,44.721564542590485,0,10000328] + [0,2012-10-08,Others,75665,0,-99,15.583138983388148,0,10000809] + [0,2012-10-08,Others,2023,0,15,57.67495843017063,0,10000149] + [0,2012-10-13,FP-GTC,50508,0,5,96.04012848965151,0,10000559] + */ + String[] dataInHex = new String[] { + "\\x00\\x0B\\x37\\xAF\\x01\\x21\\x02\\x03\\x0B\\xCF\\x0D\\x77\\xD6\\xC9\\x8F\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x24", + "\\x00\\x0B\\x37\\xAF\\x03\\x25\\x00\\x00\\x06\\x34\\xD4\\x42\\x93\\x9B\\xAC\\xC0\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x48", + "\\x00\\x0B\\x37\\xAF\\x04\\x58\\x00\\x00\\x02\\x29\\x9F\\xD2\\xCB\\xE7\\x67\\x80\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03\\x29", + "\\x00\\x0B\\x37\\xAF\\x04\\x0F\\x00\\x06\\x08\\x01\\x06\\xB0\\xF0\\xA8\\x4C\\x80\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x95", + "\\x00\\x0B\\x37\\xB4\\x02\\x45\\x00\\x01\\x0D\\x54\\x07\\xE1\\x54\\x15\\xE4\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x2F", + }; + data = new byte[dataInHex.length][]; + for (int i = 0; i < dataInHex.length; ++i) { + data[i] = BytesUtil.fromReadableText(dataInHex[i]); + } + } + + @After + public void cleanUp() { + cleanupTestMetadata(); + } + + + private List buildAggregations() { + List functions = new ArrayList(); + + FunctionDesc f1 = new FunctionDesc(); + f1.setExpression("SUM"); + ParameterDesc p1 = new ParameterDesc(); + p1.setType("column"); + p1.setValue("PRICE"); + f1.setParameter(p1); + functions.add(f1); + + FunctionDesc f2 = new FunctionDesc(); + f2.setExpression("MIN"); + ParameterDesc p2 = new ParameterDesc(); + p1.setType("column"); + p1.setValue("PRICE"); + f2.setParameter(p2); + functions.add(f2); + + return functions; + } + + @Test + public void basicTest() { + + for (int i = 0; i < data.length; ++i) { + CoprocessorProjector.AggrKey aggKey = projector.getAggrKey(data[i]); + MeasureAggregator[] bufs = aggCache.getBuffer(aggKey); + aggregators.aggregate(bufs, data[i]); + aggCache.checkMemoryUsage(); + } + + assertEquals(aggCache.getAllEntries().size(), 4); + for (Map.Entry entry : aggCache.getAllEntries()) { + + } + + } +} From c5c5ff3b75cf7b5aa31a546fc5908257ad8dc242 Mon Sep 17 00:00:00 2001 From: honma Date: Fri, 28 Nov 2014 15:59:16 +0800 Subject: [PATCH 24/65] minor changes to basic test --- .../java/com/kylinolap/common/util/BasicTest.java | 40 ++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/common/src/test/java/com/kylinolap/common/util/BasicTest.java b/common/src/test/java/com/kylinolap/common/util/BasicTest.java index 2d1d935..68cbd9e 100644 --- a/common/src/test/java/com/kylinolap/common/util/BasicTest.java +++ b/common/src/test/java/com/kylinolap/common/util/BasicTest.java @@ -1,11 +1,15 @@ package com.kylinolap.common.util; import java.io.IOException; +import java.lang.management.ManagementFactory; import java.util.ArrayList; import java.util.HashSet; +import java.util.Map; +import java.util.concurrent.*; import org.apache.hadoop.fs.HasEnhancedByteBufferAccess; import org.apache.hadoop.hbase.util.Pair; +import org.apache.hadoop.hbase.util.Threads; import org.junit.Ignore; import org.junit.Test; @@ -19,6 +23,42 @@ public class BasicTest { @Test public void test() throws IOException { + for (String s : ManagementFactory.getRuntimeMXBean().getInputArguments()) + System.out.println(s); + return; +// //BlockingQueue workQueue = new ArrayBlockingQueue(1000000); +// BlockingQueue workQueue = new SynchronousQueue<>(); +// +// ExecutorService pool = new ThreadPoolExecutor(1, 1000, 60, TimeUnit.SECONDS, +// workQueue, Threads.newDaemonThreadFactory("htable")); +// +// for (int i = 0; i < 10000; ++i) { +// pool.submit(new Callable() { +// @Override +// public Object call() throws Exception { +// Thread.sleep(1000); +// } +// }); +// } + + +// +// for (int i = 0; i < 10000; ++i) { +// System.out.println("Hello from a thread! " + i); +// new Thread() { +// @Override +// public void run() { +// try { +// Thread.sleep(1000000); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// } +// }.start(); +// } + + } + } From df6fe22fb4ee46023c4d5307c546349746e95de8 Mon Sep 17 00:00:00 2001 From: honma Date: Fri, 28 Nov 2014 16:13:26 +0800 Subject: [PATCH 25/65] fix compilation issues --- .../com/kylinolap/cube/invertedindex/TableRecordInfoDigest.java | 2 +- .../com/kylinolap/cube/measure/fixedlen/FixedPointLongCodec.java | 2 +- query/src/test/java/com/kylinolap/query/test/KylinQueryTest.java | 2 +- .../kylinolap/storage/hbase/coprocessor/CoprocessorProjector.java | 2 +- .../storage/hbase/coprocessor/endpoint/EndpointAggregators.java | 4 ++-- .../storage/hbase/coprocessor/observer/ObserverRowType.java | 6 +++--- .../storage/hbase/coprocessor/endpoint/EndpoindAggregationTest.java | 6 +++--- .../hbase/coprocessor/observer/AggregateRegionObserverTest.java | 6 +++--- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfoDigest.java b/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfoDigest.java index 40e988f..b3d5b45 100644 --- a/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfoDigest.java +++ b/cube/src/main/java/com/kylinolap/cube/invertedindex/TableRecordInfoDigest.java @@ -4,7 +4,7 @@ import com.kylinolap.common.util.BytesSerializer; import com.kylinolap.common.util.BytesUtil; import com.kylinolap.cube.measure.fixedlen.FixedLenMeasureCodec; -import com.kylinolap.metadata.model.schema.DataType; +import com.kylinolap.metadata.model.DataType; import org.apache.hadoop.io.LongWritable; import java.nio.ByteBuffer; diff --git a/cube/src/main/java/com/kylinolap/cube/measure/fixedlen/FixedPointLongCodec.java b/cube/src/main/java/com/kylinolap/cube/measure/fixedlen/FixedPointLongCodec.java index 1b6dbc7..16bc096 100644 --- a/cube/src/main/java/com/kylinolap/cube/measure/fixedlen/FixedPointLongCodec.java +++ b/cube/src/main/java/com/kylinolap/cube/measure/fixedlen/FixedPointLongCodec.java @@ -1,6 +1,6 @@ package com.kylinolap.cube.measure.fixedlen; -import com.kylinolap.metadata.model.schema.DataType; +import com.kylinolap.metadata.model.DataType; import org.apache.hadoop.io.LongWritable; import com.kylinolap.common.util.BytesUtil; diff --git a/query/src/test/java/com/kylinolap/query/test/KylinQueryTest.java b/query/src/test/java/com/kylinolap/query/test/KylinQueryTest.java index 729dbb1..8b127d7 100644 --- a/query/src/test/java/com/kylinolap/query/test/KylinQueryTest.java +++ b/query/src/test/java/com/kylinolap/query/test/KylinQueryTest.java @@ -91,7 +91,7 @@ protected static void clean() { if (h2Connection != null) closeConnection(h2Connection); - CoprocessorEnabler.forceCoprocessorUnset(); + ObserverEnabler.forceCoprocessorUnset(); HBaseMetadataTestCase.staticCleanupTestMetadata(); } diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorProjector.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorProjector.java index 0644936..701bf01 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorProjector.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/CoprocessorProjector.java @@ -22,7 +22,7 @@ import java.util.List; import com.kylinolap.cube.invertedindex.TableRecordInfo; -import com.kylinolap.metadata.model.schema.ColumnDesc; +import com.kylinolap.metadata.model.ColumnDesc; import org.apache.hadoop.hbase.Cell; import com.kylinolap.common.util.BytesSerializer; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointAggregators.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointAggregators.java index 875785d..501f362 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointAggregators.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpointAggregators.java @@ -21,8 +21,8 @@ import com.kylinolap.cube.invertedindex.TableRecordInfoDigest; import com.kylinolap.cube.measure.MeasureAggregator; import com.kylinolap.cube.measure.fixedlen.FixedLenMeasureCodec; -import com.kylinolap.metadata.model.cube.FunctionDesc; -import com.kylinolap.metadata.model.schema.DataType; +import com.kylinolap.metadata.model.DataType; +import com.kylinolap.metadata.model.realization.FunctionDesc; import com.kylinolap.storage.hbase.coprocessor.CoprocessorConstants; import java.nio.ByteBuffer; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverRowType.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverRowType.java index abdf73d..b623523 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverRowType.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverRowType.java @@ -28,9 +28,9 @@ import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.cube.kv.RowConstants; import com.kylinolap.cube.kv.RowKeyColumnIO; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.hbase.coprocessor.CoprocessorConstants; /** diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpoindAggregationTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpoindAggregationTest.java index faf8f25..5bd0d1d 100644 --- a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpoindAggregationTest.java +++ b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpoindAggregationTest.java @@ -8,9 +8,9 @@ import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.invertedindex.TableRecordInfo; import com.kylinolap.cube.measure.MeasureAggregator; -import com.kylinolap.metadata.model.cube.FunctionDesc; -import com.kylinolap.metadata.model.cube.ParameterDesc; -import com.kylinolap.metadata.model.cube.TblColRef; +import com.kylinolap.metadata.model.realization.FunctionDesc; +import com.kylinolap.metadata.model.realization.ParameterDesc; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.filter.ColumnTupleFilter; import com.kylinolap.storage.filter.CompareTupleFilter; import com.kylinolap.storage.filter.ConstantTupleFilter; diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserverTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserverTest.java index 63c9a3e..800e87d 100644 --- a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserverTest.java +++ b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/AggregateRegionObserverTest.java @@ -26,6 +26,9 @@ import java.util.HashSet; import java.util.List; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.hbase.coprocessor.CoprocessorFilter; import com.kylinolap.storage.hbase.coprocessor.CoprocessorProjector; import org.apache.hadoop.hbase.Cell; @@ -41,9 +44,6 @@ import com.google.common.collect.Lists; import com.kylinolap.cube.kv.RowConstants; -import com.kylinolap.metadata.model.cube.TblColRef; -import com.kylinolap.metadata.model.schema.ColumnDesc; -import com.kylinolap.metadata.model.schema.TableDesc; import com.kylinolap.storage.hbase.coprocessor.observer.ObserverAggregators.HCol; /** From 2fd289f9552ab91660fa758b9346e5af68d4e509 Mon Sep 17 00:00:00 2001 From: "Li, Yang" Date: Fri, 28 Nov 2014 17:00:58 +0800 Subject: [PATCH 26/65] a lot of compile errors still, but I'm counting on you guys :-) --- .../main/java/com/kylinolap/cube/CubeInstance.java | 4 +- .../main/java/com/kylinolap/cube/CubeManager.java | 187 ++++- .../main/java/com/kylinolap/cube/CubeSegment.java | 2 +- .../com/kylinolap/cube/CubeSegmentValidator.java | 4 +- .../kylinolap/cube/cli/DictionaryGeneratorCLI.java | 2 +- .../com/kylinolap/cube/common/RowKeySplitter.java | 2 +- .../java/com/kylinolap/cube/cuboid/Cuboid.java | 10 +- .../java/com/kylinolap/cube/cuboid/CuboidCLI.java | 8 +- .../com/kylinolap/cube/cuboid/CuboidScheduler.java | 6 +- .../kylinolap/cube/dataGen/FactTableGenerator.java | 6 +- .../cube/estimation/CubeSizeEstimationCLI.java | 12 +- .../java/com/kylinolap/cube/kv/RowKeyColumnIO.java | 2 +- .../java/com/kylinolap/cube/kv/RowKeyDecoder.java | 2 +- .../com/kylinolap/cube/kv/RowValueDecoder.java | 4 +- .../kylinolap/cube/measure/MeasureAggregators.java | 2 +- .../com/kylinolap/cube/measure/MeasureCodec.java | 2 +- .../java/com/kylinolap/cube/model/CubeDesc.java | 834 +++++++++++++++++++++ .../kylinolap/cube/model/CubePartitionDesc.java | 87 +++ .../com/kylinolap/cube/model/DimensionDesc.java | 211 ++++++ .../com/kylinolap/cube/model/HBaseColumnDesc.java | 118 +++ .../cube/model/HBaseColumnFamilyDesc.java | 57 ++ .../com/kylinolap/cube/model/HBaseMappingDesc.java | 93 +++ .../com/kylinolap/cube/model/HierarchyDesc.java | 66 ++ .../java/com/kylinolap/cube/model/MeasureDesc.java | 101 +++ .../com/kylinolap/cube/model/RowKeyColDesc.java | 85 +++ .../java/com/kylinolap/cube/model/RowKeyDesc.java | 291 +++++++ .../model/validation/CubeMetadataValidator.java | 73 ++ .../cube/model/validation/IValidatorRule.java | 28 + .../cube/model/validation/ResultLevel.java | 36 + .../validation/SourceTableMetadataValidator.java | 32 + .../cube/model/validation/ValidateContext.java | 101 +++ .../validation/rule/AggregationGroupSizeRule.java | 64 ++ .../cube/model/validation/rule/FunctionRule.java | 181 +++++ .../rule/IKylinValidationConstances.java | 31 + .../model/validation/rule/MandatoryColumnRule.java | 74 ++ .../cube/model/validation/rule/RowKeyAttrRule.java | 69 ++ .../com/kylinolap/cube/project/ProjectManager.java | 6 +- .../com/kylinolap/cube/CubeManagerCacheTest.java | 2 +- .../java/com/kylinolap/cube/CubeManagerTest.java | 2 +- .../kylinolap/cube/CubeSizeEstimationCLITest.java | 2 +- .../com/kylinolap/cube/SegmentManagementTest.java | 2 +- .../kylinolap/cube/cuboid/CuboidSchedulerTest.java | 2 +- .../java/com/kylinolap/cube/cuboid/CuboidTest.java | 2 +- .../com/kylinolap/cube/kv/RowKeyDecoderTest.java | 2 +- .../com/kylinolap/cube/kv/RowKeyEncoderTest.java | 2 +- .../com/kylinolap/cube/kv/RowValueDecoderTest.java | 6 +- .../kylinolap/cube/measure/MeasureCodecTest.java | 2 +- .../kylinolap/cube/project/ProjectManagerTest.java | 2 +- .../java/com/kylinolap/dict/DictionaryManager.java | 2 +- .../com/kylinolap/dict/DictionaryManagerTest.java | 2 +- .../main/java/com/kylinolap/job/JobManager.java | 2 +- .../java/com/kylinolap/job/JoinedFlatTable.java | 4 +- .../com/kylinolap/job/engine/JobEngineConfig.java | 2 +- .../job/hadoop/cube/BaseCuboidMapper.java | 4 +- .../kylinolap/job/hadoop/cube/CubeHFileMapper.java | 8 +- .../com/kylinolap/job/hadoop/cube/CuboidJob.java | 2 +- .../kylinolap/job/hadoop/cube/CuboidReducer.java | 4 +- .../job/hadoop/cube/FactDistinctColumnsMapper.java | 4 +- .../hadoop/cube/FactDistinctColumnsReducer.java | 2 +- .../job/hadoop/cube/MergeCuboidMapper.java | 2 +- .../kylinolap/job/hadoop/cube/NDCuboidMapper.java | 2 +- .../job/hadoop/cube/NewBaseCuboidMapper.java | 6 +- .../job/hadoop/cube/RangeKeyDistributionJob.java | 2 +- .../hadoop/cube/RangeKeyDistributionReducer.java | 2 +- .../kylinolap/job/hadoop/hbase/BulkLoadJob.java | 4 +- .../job/hadoop/hbase/CreateHTableJob.java | 4 +- .../job/hadoop/hive/JoinedFlatTableDesc.java | 4 +- .../com/kylinolap/job/tools/CubeMigrationCLI.java | 2 +- .../job/hadoop/cube/BaseCuboidMapperTest.java | 2 +- .../job/hadoop/cube/CubeHFileMapper2Test.java | 2 +- .../kylinolap/job/hadoop/cube/CubeReducerTest.java | 2 +- .../com/kylinolap/metadata/MetadataManager.java | 178 +---- .../kylinolap/metadata/model/cube/CubeDesc.java | 834 --------------------- .../metadata/model/cube/CubePartitionDesc.java | 87 --- .../metadata/model/cube/DimensionDesc.java | 211 ------ .../metadata/model/cube/HBaseColumnDesc.java | 118 --- .../metadata/model/cube/HBaseColumnFamilyDesc.java | 57 -- .../metadata/model/cube/HBaseMappingDesc.java | 93 --- .../metadata/model/cube/HierarchyDesc.java | 66 -- .../kylinolap/metadata/model/cube/MeasureDesc.java | 101 --- .../metadata/model/cube/RowKeyColDesc.java | 85 --- .../kylinolap/metadata/model/cube/RowKeyDesc.java | 291 ------- .../metadata/validation/CubeMetadataValidator.java | 73 -- .../metadata/validation/IValidatorRule.java | 28 - .../kylinolap/metadata/validation/ResultLevel.java | 36 - .../validation/SourceTableMetadataValidator.java | 32 - .../metadata/validation/ValidateContext.java | 101 --- .../validation/rule/AggregationGroupSizeRule.java | 64 -- .../metadata/validation/rule/FunctionRule.java | 181 ----- .../rule/IKylinValidationConstances.java | 31 - .../validation/rule/MandatoryColumnRule.java | 74 -- .../metadata/validation/rule/RowKeyAttrRule.java | 69 -- .../java/com/kylinolap/metadata/CubeDescTest.java | 2 +- .../kylinolap/metadata/MetadataManagerTest.java | 2 +- .../rule/AggregationGroupSizeRuleTest.java | 7 +- .../validation/rule/MandatoryColumnRuleTest.java | 7 +- .../validation/rule/RowKeyAttrRuleTest.java | 7 +- .../kylinolap/query/enumerator/CubeEnumerator.java | 4 +- .../query/enumerator/LookupTableEnumerator.java | 2 +- .../com/kylinolap/query/relnode/OLAPContext.java | 2 +- .../com/kylinolap/query/relnode/OLAPSortRel.java | 2 +- .../com/kylinolap/query/routing/QueryRouter.java | 4 +- .../java/com/kylinolap/query/schema/OLAPTable.java | 2 +- .../kylinolap/rest/controller/CubeController.java | 3 +- .../rest/controller/CubeDescController.java | 2 +- .../com/kylinolap/rest/service/CubeService.java | 2 +- .../rest/controller/CubeControllerTest.java | 2 +- .../java/com/kylinolap/storage/StorageContext.java | 2 +- .../hbase/ConcurrentHBaseTupleIterator.java | 9 +- .../storage/hbase/CubeSegmentTupleIterator.java | 7 +- .../storage/hbase/DerivedFilterTranslator.java | 4 +- .../com/kylinolap/storage/hbase/HBaseKeyRange.java | 2 +- .../storage/hbase/HBaseStorageEngine.java | 11 +- .../coprocessor/observer/ObserverAggregators.java | 5 +- .../java/com/kylinolap/storage/tuple/Tuple.java | 2 +- .../hbase/coprocessor/observer/RowTypeTest.java | 3 +- 116 files changed, 2957 insertions(+), 2937 deletions(-) create mode 100644 cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/CubePartitionDesc.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/HBaseColumnDesc.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/HBaseColumnFamilyDesc.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/HBaseMappingDesc.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/HierarchyDesc.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/MeasureDesc.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/RowKeyColDesc.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/RowKeyDesc.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/validation/CubeMetadataValidator.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/validation/IValidatorRule.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/validation/ResultLevel.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/validation/SourceTableMetadataValidator.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/validation/ValidateContext.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/validation/rule/AggregationGroupSizeRule.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/validation/rule/FunctionRule.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/validation/rule/IKylinValidationConstances.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/validation/rule/MandatoryColumnRule.java create mode 100644 cube/src/main/java/com/kylinolap/cube/model/validation/rule/RowKeyAttrRule.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/cube/CubeDesc.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/cube/CubePartitionDesc.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/cube/DimensionDesc.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseColumnDesc.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseColumnFamilyDesc.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseMappingDesc.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/cube/HierarchyDesc.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/cube/MeasureDesc.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/cube/RowKeyColDesc.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/cube/RowKeyDesc.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/validation/CubeMetadataValidator.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/validation/IValidatorRule.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/validation/ResultLevel.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/validation/SourceTableMetadataValidator.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/validation/ValidateContext.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/validation/rule/AggregationGroupSizeRule.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/validation/rule/FunctionRule.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/validation/rule/IKylinValidationConstances.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/validation/rule/MandatoryColumnRule.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/validation/rule/RowKeyAttrRule.java diff --git a/cube/src/main/java/com/kylinolap/cube/CubeInstance.java b/cube/src/main/java/com/kylinolap/cube/CubeInstance.java index 4294934..2e33e5d 100644 --- a/cube/src/main/java/com/kylinolap/cube/CubeInstance.java +++ b/cube/src/main/java/com/kylinolap/cube/CubeInstance.java @@ -30,9 +30,9 @@ import com.kylinolap.common.KylinConfig; import com.kylinolap.common.persistence.ResourceStore; import com.kylinolap.common.persistence.RootPersistentEntity; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.CubePartitionDesc; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.CubePartitionDesc; import com.kylinolap.metadata.model.invertedindex.InvertedIndexDesc; @JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) diff --git a/cube/src/main/java/com/kylinolap/cube/CubeManager.java b/cube/src/main/java/com/kylinolap/cube/CubeManager.java index 8db69d9..2341425 100644 --- a/cube/src/main/java/com/kylinolap/cube/CubeManager.java +++ b/cube/src/main/java/com/kylinolap/cube/CubeManager.java @@ -17,10 +17,16 @@ package com.kylinolap.cube; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; -import com.kylinolap.dict.DateStrDictionary; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,8 +38,13 @@ import com.kylinolap.common.restclient.Broadcaster; import com.kylinolap.common.restclient.SingleValueCache; import com.kylinolap.cube.exception.CubeIntegrityException; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.DimensionDesc; +import com.kylinolap.cube.model.validation.CubeMetadataValidator; +import com.kylinolap.cube.model.validation.ValidateContext; import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.cube.project.ProjectManager; +import com.kylinolap.dict.DateStrDictionary; import com.kylinolap.dict.Dictionary; import com.kylinolap.dict.DictionaryInfo; import com.kylinolap.dict.DictionaryManager; @@ -41,11 +52,10 @@ import com.kylinolap.dict.lookup.LookupStringTable; import com.kylinolap.dict.lookup.SnapshotManager; import com.kylinolap.dict.lookup.SnapshotTable; +import com.kylinolap.metadata.MetadataConstances; import com.kylinolap.metadata.MetadataManager; import com.kylinolap.metadata.model.ColumnDesc; import com.kylinolap.metadata.model.TableDesc; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.DimensionDesc; import com.kylinolap.metadata.model.invertedindex.InvertedIndexDesc; import com.kylinolap.metadata.model.realization.TblColRef; @@ -58,6 +68,7 @@ private static int HBASE_TABLE_LENGTH = 10; + private static final Serializer CUBE_DESC_SERIALIZER = new JsonSerializer(CubeDesc.class); private static final Serializer CUBE_SERIALIZER = new JsonSerializer(CubeInstance.class); private static final Logger logger = LoggerFactory.getLogger(CubeManager.class); @@ -100,6 +111,8 @@ public static synchronized void removeInstance(KylinConfig config) { // ============================================================================ private KylinConfig config; + // name ==> CubeDesc + private SingleValueCache cubeDescMap = new SingleValueCache(Broadcaster.TYPE.METADATA); // cube name ==> CubeInstance private SingleValueCache cubeMap = new SingleValueCache(Broadcaster.TYPE.CUBE); // "table/column" ==> lookup table @@ -115,6 +128,172 @@ private CubeManager(KylinConfig config) throws IOException { loadAllCubeInstance(); } + public CubeDesc getCubeDesc(String name) { + return cubeDescMap.get(name); + } + + /** + * Create a new CubeDesc + * + * @param cubeDesc + * @return + * @throws IOException + */ + public CubeDesc createCubeDesc(CubeDesc cubeDesc) throws IOException { + if (cubeDesc.getUuid() == null || cubeDesc.getName() == null) + throw new IllegalArgumentException(); + if (cubeDescMap.containsKey(cubeDesc.getName())) + throw new IllegalArgumentException("CubeDesc '" + cubeDesc.getName() + "' already exists"); + + try { + cubeDesc.init(config, getMetadataManager().getAllTablesMap()); + } catch (IllegalStateException e) { + cubeDesc.addError(e.getMessage(), true); + } + // Check base validation + if (!cubeDesc.getError().isEmpty()) { + return cubeDesc; + } + // Semantic validation + CubeMetadataValidator validator = new CubeMetadataValidator(); + ValidateContext context = validator.validate(cubeDesc, true); + if (!context.ifPass()) { + return cubeDesc; + } + + cubeDesc.setSignature(cubeDesc.calculateSignature()); + + String path = cubeDesc.getResourcePath(); + getStore().putResource(path, cubeDesc, CUBE_DESC_SERIALIZER); + cubeDescMap.put(cubeDesc.getName(), cubeDesc); + + return cubeDesc; + } + + // remove cubeDesc + public void removeCubeDesc(CubeDesc cubeDesc) throws IOException{ + String path = cubeDesc.getResourcePath(); + getStore().deleteResource(path); + cubeDescMap.remove(cubeDesc.getName()); + } + + private void reloadAllCubeDesc() throws IOException { + ResourceStore store = getStore(); + logger.info("Reloading Cube Metadata from folder " + store.getReadableResourcePath(ResourceStore.CUBE_DESC_RESOURCE_ROOT)); + + cubeDescMap.clear(); + + List paths = store.collectResourceRecursively(ResourceStore.CUBE_DESC_RESOURCE_ROOT, MetadataConstances.FILE_SURFIX); + for (String path : paths) { + CubeDesc desc; + try { + desc = loadCubeDesc(path); + } catch (Exception e) { + logger.error("Error loading cube desc " + path, e); + continue; + } + if (path.equals(desc.getResourcePath()) == false) { + logger.error("Skip suspicious desc at " + path + ", " + desc + " should be at " + desc.getResourcePath()); + continue; + } + if (cubeDescMap.containsKey(desc.getName())) { + logger.error("Dup CubeDesc name '" + desc.getName() + "' on path " + path); + continue; + } + + cubeDescMap.putLocal(desc.getName(), desc); + } + + logger.debug("Loaded " + cubeDescMap.size() + " Cube(s)"); + } + + private CubeDesc loadCubeDesc(String path) throws IOException { + ResourceStore store = getStore(); + logger.debug("Loading CubeDesc " + store.getReadableResourcePath(path)); + + CubeDesc ndesc = store.getResource(path, CubeDesc.class, CUBE_DESC_SERIALIZER); + + if (StringUtils.isBlank(ndesc.getName())) { + throw new IllegalStateException("CubeDesc name must not be blank"); + } + + ndesc.init(config, getMetadataManager().getAllTablesMap()); + + if (ndesc.getError().isEmpty() == false) { + throw new IllegalStateException("Cube desc at " + path + " has issues: " + ndesc.getError()); + } + + return ndesc; + } + + /** + * Update CubeDesc with the input. Broadcast the event into cluster + * + * @param desc + * @return + * @throws IOException + */ + public CubeDesc updateCubeDesc(CubeDesc desc) throws IOException { + // Validate CubeDesc + if (desc.getUuid() == null || desc.getName() == null) { + throw new IllegalArgumentException(); + } + String name = desc.getName(); + if (!cubeDescMap.containsKey(name)) { + throw new IllegalArgumentException("CubeDesc '" + name + "' does not exist."); + } + + try { + desc.init(config, getMetadataManager().getAllTablesMap()); + } catch (IllegalStateException e) { + desc.addError(e.getMessage(), true); + return desc; + } catch (IllegalArgumentException e) { + desc.addError(e.getMessage(), true); + return desc; + } + + // Semantic validation + CubeMetadataValidator validator = new CubeMetadataValidator(); + ValidateContext context = validator.validate(desc, true); + if (!context.ifPass()) { + return desc; + } + + desc.setSignature(desc.calculateSignature()); + + // Save Source + String path = desc.getResourcePath(); + getStore().putResource(path, desc, CUBE_DESC_SERIALIZER); + + // Reload the CubeDesc + CubeDesc ndesc = loadCubeDesc(path); + // Here replace the old one + cubeDescMap.put(ndesc.getName(), desc); + + return ndesc; + } + + /** + * Reload CubeDesc from resource store It will be triggered by an desc + * update event. + * + * @param name + * @throws IOException + */ + public CubeDesc reloadCubeDesc(String name) throws IOException { + + // Save Source + String path = CubeDesc.getCubeDescResourcePath(name); + + // Reload the CubeDesc + CubeDesc ndesc = loadCubeDesc(path); + + // Here replace the old one + cubeDescMap.put(ndesc.getName(), ndesc); + return ndesc; + } + public List listAllCubes() { return new ArrayList(cubeMap.values()); } diff --git a/cube/src/main/java/com/kylinolap/cube/CubeSegment.java b/cube/src/main/java/com/kylinolap/cube/CubeSegment.java index 29dd37d..37fd739 100644 --- a/cube/src/main/java/com/kylinolap/cube/CubeSegment.java +++ b/cube/src/main/java/com/kylinolap/cube/CubeSegment.java @@ -26,7 +26,7 @@ import com.fasterxml.jackson.annotation.JsonBackReference; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Objects; -import com.kylinolap.metadata.model.cube.CubeDesc; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.metadata.model.realization.TblColRef; @JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) diff --git a/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java b/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java index b761244..0cc1939 100644 --- a/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java +++ b/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java @@ -22,9 +22,9 @@ import java.util.List; import com.kylinolap.cube.exception.CubeIntegrityException; +import com.kylinolap.cube.model.DimensionDesc; +import com.kylinolap.cube.model.CubePartitionDesc.CubePartitionType; import com.kylinolap.dict.DictionaryManager; -import com.kylinolap.metadata.model.cube.DimensionDesc; -import com.kylinolap.metadata.model.cube.CubePartitionDesc.CubePartitionType; import com.kylinolap.metadata.model.realization.TblColRef; /** diff --git a/cube/src/main/java/com/kylinolap/cube/cli/DictionaryGeneratorCLI.java b/cube/src/main/java/com/kylinolap/cube/cli/DictionaryGeneratorCLI.java index 2cee7ed..5fbb4ee 100644 --- a/cube/src/main/java/com/kylinolap/cube/cli/DictionaryGeneratorCLI.java +++ b/cube/src/main/java/com/kylinolap/cube/cli/DictionaryGeneratorCLI.java @@ -25,7 +25,7 @@ import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.CubeSegmentStatusEnum; -import com.kylinolap.metadata.model.cube.DimensionDesc; +import com.kylinolap.cube.model.DimensionDesc; import com.kylinolap.metadata.model.realization.TblColRef; public class DictionaryGeneratorCLI { diff --git a/cube/src/main/java/com/kylinolap/cube/common/RowKeySplitter.java b/cube/src/main/java/com/kylinolap/cube/common/RowKeySplitter.java index a80fd66..9d16bb1 100644 --- a/cube/src/main/java/com/kylinolap/cube/common/RowKeySplitter.java +++ b/cube/src/main/java/com/kylinolap/cube/common/RowKeySplitter.java @@ -21,7 +21,7 @@ import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.cube.kv.RowConstants; import com.kylinolap.cube.kv.RowKeyColumnIO; -import com.kylinolap.metadata.model.cube.CubeDesc; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.metadata.model.realization.TblColRef; /** diff --git a/cube/src/main/java/com/kylinolap/cube/cuboid/Cuboid.java b/cube/src/main/java/com/kylinolap/cube/cuboid/Cuboid.java index df7699a..ae5f221 100644 --- a/cube/src/main/java/com/kylinolap/cube/cuboid/Cuboid.java +++ b/cube/src/main/java/com/kylinolap/cube/cuboid/Cuboid.java @@ -26,11 +26,11 @@ import org.apache.hadoop.hbase.util.Bytes; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.RowKeyColDesc; -import com.kylinolap.metadata.model.cube.RowKeyDesc; -import com.kylinolap.metadata.model.cube.RowKeyDesc.AggrGroupMask; -import com.kylinolap.metadata.model.cube.RowKeyDesc.HierarchyMask; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.RowKeyColDesc; +import com.kylinolap.cube.model.RowKeyDesc; +import com.kylinolap.cube.model.RowKeyDesc.AggrGroupMask; +import com.kylinolap.cube.model.RowKeyDesc.HierarchyMask; import com.kylinolap.metadata.model.realization.TblColRef; /** diff --git a/cube/src/main/java/com/kylinolap/cube/cuboid/CuboidCLI.java b/cube/src/main/java/com/kylinolap/cube/cuboid/CuboidCLI.java index 95759c8..dd4605e 100644 --- a/cube/src/main/java/com/kylinolap/cube/cuboid/CuboidCLI.java +++ b/cube/src/main/java/com/kylinolap/cube/cuboid/CuboidCLI.java @@ -22,11 +22,11 @@ import java.util.TreeSet; import com.kylinolap.common.KylinConfig; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.RowKeyDesc; +import com.kylinolap.cube.model.RowKeyDesc.AggrGroupMask; +import com.kylinolap.cube.model.RowKeyDesc.HierarchyMask; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.RowKeyDesc; -import com.kylinolap.metadata.model.cube.RowKeyDesc.AggrGroupMask; -import com.kylinolap.metadata.model.cube.RowKeyDesc.HierarchyMask; /** * @author yangli9 diff --git a/cube/src/main/java/com/kylinolap/cube/cuboid/CuboidScheduler.java b/cube/src/main/java/com/kylinolap/cube/cuboid/CuboidScheduler.java index 9f77770..55d3fa3 100644 --- a/cube/src/main/java/com/kylinolap/cube/cuboid/CuboidScheduler.java +++ b/cube/src/main/java/com/kylinolap/cube/cuboid/CuboidScheduler.java @@ -26,9 +26,9 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.RowKeyDesc; -import com.kylinolap.metadata.model.cube.RowKeyDesc.AggrGroupMask; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.RowKeyDesc; +import com.kylinolap.cube.model.RowKeyDesc.AggrGroupMask; public class CuboidScheduler { diff --git a/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java b/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java index 12d2c8f..49b26eb 100644 --- a/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java +++ b/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java @@ -16,13 +16,13 @@ import com.kylinolap.common.util.Array; import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.DimensionDesc; +import com.kylinolap.cube.model.MeasureDesc; import com.kylinolap.metadata.MetadataManager; import com.kylinolap.metadata.model.ColumnDesc; import com.kylinolap.metadata.model.DataType; import com.kylinolap.metadata.model.JoinDesc; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.DimensionDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; import com.kylinolap.metadata.model.realization.TblColRef; /** diff --git a/cube/src/main/java/com/kylinolap/cube/estimation/CubeSizeEstimationCLI.java b/cube/src/main/java/com/kylinolap/cube/estimation/CubeSizeEstimationCLI.java index cd1ac30..eb94abe 100644 --- a/cube/src/main/java/com/kylinolap/cube/estimation/CubeSizeEstimationCLI.java +++ b/cube/src/main/java/com/kylinolap/cube/estimation/CubeSizeEstimationCLI.java @@ -11,13 +11,13 @@ import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.cube.cuboid.CuboidScheduler; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.DimensionDesc; +import com.kylinolap.cube.model.HierarchyDesc; +import com.kylinolap.cube.model.MeasureDesc; +import com.kylinolap.cube.model.RowKeyColDesc; +import com.kylinolap.cube.model.RowKeyDesc; import com.kylinolap.metadata.model.DataType; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.DimensionDesc; -import com.kylinolap.metadata.model.cube.HierarchyDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; -import com.kylinolap.metadata.model.cube.RowKeyColDesc; -import com.kylinolap.metadata.model.cube.RowKeyDesc; /** * Created by honma on 9/1/14. diff --git a/cube/src/main/java/com/kylinolap/cube/kv/RowKeyColumnIO.java b/cube/src/main/java/com/kylinolap/cube/kv/RowKeyColumnIO.java index bbcd8fe..e9b5f1e 100644 --- a/cube/src/main/java/com/kylinolap/cube/kv/RowKeyColumnIO.java +++ b/cube/src/main/java/com/kylinolap/cube/kv/RowKeyColumnIO.java @@ -25,8 +25,8 @@ import com.kylinolap.common.util.BytesUtil; import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.CubeSegment; +import com.kylinolap.cube.model.RowKeyDesc; import com.kylinolap.dict.Dictionary; -import com.kylinolap.metadata.model.cube.RowKeyDesc; import com.kylinolap.metadata.model.realization.TblColRef; /** diff --git a/cube/src/main/java/com/kylinolap/cube/kv/RowKeyDecoder.java b/cube/src/main/java/com/kylinolap/cube/kv/RowKeyDecoder.java index f211e28..ced7dee 100644 --- a/cube/src/main/java/com/kylinolap/cube/kv/RowKeyDecoder.java +++ b/cube/src/main/java/com/kylinolap/cube/kv/RowKeyDecoder.java @@ -24,7 +24,7 @@ import com.kylinolap.cube.common.RowKeySplitter; import com.kylinolap.cube.common.SplittedBytes; import com.kylinolap.cube.cuboid.Cuboid; -import com.kylinolap.metadata.model.cube.CubeDesc; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.metadata.model.realization.TblColRef; /** diff --git a/cube/src/main/java/com/kylinolap/cube/kv/RowValueDecoder.java b/cube/src/main/java/com/kylinolap/cube/kv/RowValueDecoder.java index 47a2099..5af32ec 100644 --- a/cube/src/main/java/com/kylinolap/cube/kv/RowValueDecoder.java +++ b/cube/src/main/java/com/kylinolap/cube/kv/RowValueDecoder.java @@ -27,8 +27,8 @@ import org.apache.hadoop.io.LongWritable; import com.kylinolap.cube.measure.MeasureCodec; -import com.kylinolap.metadata.model.cube.HBaseColumnDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; +import com.kylinolap.cube.model.HBaseColumnDesc; +import com.kylinolap.cube.model.MeasureDesc; import com.kylinolap.metadata.model.realization.FunctionDesc; /** diff --git a/cube/src/main/java/com/kylinolap/cube/measure/MeasureAggregators.java b/cube/src/main/java/com/kylinolap/cube/measure/MeasureAggregators.java index 993c688..6419f31 100644 --- a/cube/src/main/java/com/kylinolap/cube/measure/MeasureAggregators.java +++ b/cube/src/main/java/com/kylinolap/cube/measure/MeasureAggregators.java @@ -20,7 +20,7 @@ import java.util.HashMap; import java.util.Map; -import com.kylinolap.metadata.model.cube.MeasureDesc; +import com.kylinolap.cube.model.MeasureDesc; import com.kylinolap.metadata.model.realization.FunctionDesc; /** diff --git a/cube/src/main/java/com/kylinolap/cube/measure/MeasureCodec.java b/cube/src/main/java/com/kylinolap/cube/measure/MeasureCodec.java index 4a511e7..ce297ac 100644 --- a/cube/src/main/java/com/kylinolap/cube/measure/MeasureCodec.java +++ b/cube/src/main/java/com/kylinolap/cube/measure/MeasureCodec.java @@ -21,7 +21,7 @@ import org.apache.hadoop.io.Text; -import com.kylinolap.metadata.model.cube.MeasureDesc; +import com.kylinolap.cube.model.MeasureDesc; /** * @author yangli9 diff --git a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java new file mode 100644 index 0000000..bbaf36d --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java @@ -0,0 +1,834 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.net.util.Base64; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.kylinolap.common.KylinConfig; +import com.kylinolap.common.persistence.ResourceStore; +import com.kylinolap.common.persistence.RootPersistentEntity; +import com.kylinolap.common.util.Array; +import com.kylinolap.common.util.JsonUtil; +import com.kylinolap.metadata.MetadataConstances; +import com.kylinolap.metadata.MetadataManager; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.DataModelDesc; +import com.kylinolap.metadata.model.DataType; +import com.kylinolap.metadata.model.JoinDesc; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.FunctionDesc; +import com.kylinolap.metadata.model.realization.ParameterDesc; +import com.kylinolap.metadata.model.realization.TblColRef; + +/** + * Created with IntelliJ IDEA. User: lukhan Date: 9/24/13 Time: 10:40 AM To + * change this template use File | Settings | File Templates. + */ +@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +public class CubeDesc extends RootPersistentEntity { + + public static enum CubeCapacity { + SMALL, MEDIUM, LARGE; + } + + public static enum DeriveType { + LOOKUP, PK_FK + } + + public static class DeriveInfo { + public DeriveType type; + public DimensionDesc dimension; + public TblColRef[] columns; + public boolean isOneToOne; // only used when ref from derived to host + + DeriveInfo(DeriveType type, DimensionDesc dimension, TblColRef[] columns, boolean isOneToOne) { + this.type = type; + this.dimension = dimension; + this.columns = columns; + this.isOneToOne = isOneToOne; + } + + @Override + public String toString() { + return "DeriveInfo [type=" + type + ", dimension=" + dimension + ", columns=" + Arrays.toString(columns) + ", isOneToOne=" + isOneToOne + "]"; + } + + } + + private KylinConfig config; + + @JsonProperty("name") + private String name; + @JsonProperty("data_model") + private DataModelDesc model; + @JsonProperty("description") + private String description; + @JsonProperty("fact_table") + private String factTable; + @JsonProperty("null_string") + private String[] nullStrings; + @JsonProperty("filter_condition") + private String filterCondition; + @JsonProperty("cube_partition_desc") + CubePartitionDesc cubePartitionDesc; + @JsonProperty("dimensions") + private List dimensions; + @JsonProperty("measures") + private List measures; + @JsonProperty("rowkey") + private RowKeyDesc rowkey; + @JsonProperty("hbase_mapping") + private HBaseMappingDesc hbaseMapping; + @JsonProperty("signature") + private String signature; + @JsonProperty("capacity") + private CubeCapacity capacity = CubeCapacity.MEDIUM; + @JsonProperty("notify_list") + private List notifyList; + + private Map> columnMap = new HashMap>(); + private LinkedHashSet allColumns = new LinkedHashSet(); + private LinkedHashSet dimensionColumns = new LinkedHashSet(); + private Map derivedToHostMap = Maps.newHashMap(); + private Map, List> hostToDerivedMap = Maps.newHashMap(); + + /** + * Error messages during resolving json metadata + */ + private List errors = new ArrayList(); + + /** + * @return all columns this cube can support, including derived + */ + public Set listAllColumns() { + return allColumns; + } + + /** + * @return dimension columns including derived, BUT NOT measures + */ + public Set listDimensionColumnsIncludingDerived() { + return dimensionColumns; + } + + /** + * @return dimension columns excluding derived and measures + */ + public List listDimensionColumnsExcludingDerived() { + List result = new ArrayList(); + for (TblColRef col : dimensionColumns) { + if (isDerived(col) == false) + result.add(col); + } + return result; + } + + /** + * Find FunctionDesc by Full Expression. + * + * @return + */ + public FunctionDesc findFunctionOnCube(FunctionDesc manualFunc) { + for (MeasureDesc m : measures) { + if (m.getFunction().equals(manualFunc)) + return m.getFunction(); + } + return null; + } + + public TblColRef findColumnRef(String table, String column) { + Map cols = columnMap.get(table); + if (cols == null) + return null; + else + return cols.get(column); + } + + public DimensionDesc findDimensionByColumn(TblColRef col) { + for (DimensionDesc dim : dimensions) { + if (ArrayUtils.contains(dim.getColumnRefs(), col)) + return dim; + } + return null; + } + + public DimensionDesc findDimensionByTable(String lookupTableName) { + lookupTableName = lookupTableName.toUpperCase(); + for (DimensionDesc dim : dimensions) + if (dim.getTable() != null && dim.getTable().equals(lookupTableName)) + return dim; + return null; + } + + public DimensionDesc findDimensionByName(String dimName) { + dimName = dimName.toUpperCase(); + for (DimensionDesc dim : dimensions) { + if (dimName.equals(dim.getName())) + return dim; + } + return null; + } + + public TblColRef findPKByFK(TblColRef fk) { + assert isFactTable(fk.getTable()); + + TblColRef candidate = null; + + for (DimensionDesc dim : dimensions) { + JoinDesc join = dim.getJoin(); + if (join == null) + continue; + + int find = ArrayUtils.indexOf(join.getForeignKeyColumns(), fk); + if (find >= 0) { + candidate = join.getPrimaryKeyColumns()[find]; + if (join.getForeignKeyColumns().length == 1) { // is single + // column join? + break; + } + } + } + return candidate; + } + + /** + * Get all functions from each measure. + * + * @return + */ + public List listAllFunctions() { + List functions = new ArrayList(); + for (MeasureDesc m : measures) { + functions.add(m.getFunction()); + } + return functions; + } + + public List listTables() { + MetadataManager metaMgr = MetadataManager.getInstance(config); + HashSet tableNames = new HashSet(); + List result = new ArrayList(); + + tableNames.add(factTable.toUpperCase()); + for (DimensionDesc dim : dimensions) { + String table = dim.getTable(); + if (table != null) + tableNames.add(table.toUpperCase()); + } + + for (String tableName : tableNames) { + result.add(metaMgr.getTableDesc(tableName)); + } + + return result; + } + + public boolean isFactTable(String factTable) { + return this.factTable.equalsIgnoreCase(factTable); + } + + public boolean isDerived(TblColRef col) { + return derivedToHostMap.containsKey(col); + } + + public DeriveInfo getHostInfo(TblColRef derived) { + return derivedToHostMap.get(derived); + } + + public Map, List> getHostToDerivedInfo(List rowCols, Collection wantedCols) { + Map, List> result = new HashMap, List>(); + for (Entry, List> entry : hostToDerivedMap.entrySet()) { + Array hostCols = entry.getKey(); + boolean hostOnRow = rowCols.containsAll(Arrays.asList(hostCols.data)); + if (!hostOnRow) + continue; + + List wantedInfo = new ArrayList(); + for (DeriveInfo info : entry.getValue()) { + if (wantedCols == null || Collections.disjoint(wantedCols, Arrays.asList(info.columns)) == false) // has + // any + // wanted + // columns? + wantedInfo.add(info); + } + + if (wantedInfo.size() > 0) + result.put(hostCols, wantedInfo); + } + return result; + } + + public String getResourcePath() { + return getCubeDescResourcePath(name); + } + + public static String getCubeDescResourcePath(String descName) { + return ResourceStore.CUBE_DESC_RESOURCE_ROOT + "/" + descName + MetadataConstances.FILE_SURFIX; + } + + // ============================================================================ + + public HBaseMappingDesc getHBaseMapping() { + return hbaseMapping; + } + + public void setHBaseMapping(HBaseMappingDesc hbaseMapping) { + this.hbaseMapping = hbaseMapping; + } + + public KylinConfig getConfig() { + return config; + } + + public void setConfig(KylinConfig config) { + this.config = config; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getFactTable() { + return factTable; + } + + public void setFactTable(String factTable) { + this.factTable = factTable; + } + + public String[] getNullStrings() { + return nullStrings; + } + + public String getFilterCondition() { + return filterCondition; + } + + public void setFilterCondition(String filterCondition) { + this.filterCondition = filterCondition; + } + + public CubePartitionDesc getCubePartitionDesc() { + return cubePartitionDesc; + } + + public void setCubePartitionDesc(CubePartitionDesc cubePartitionDesc) { + this.cubePartitionDesc = cubePartitionDesc; + } + + public List getDimensions() { + return dimensions; + } + + public void setDimensions(List dimensions) { + this.dimensions = dimensions; + } + + public List getMeasures() { + return measures; + } + + public void setMeasures(List measures) { + this.measures = measures; + } + + public RowKeyDesc getRowkey() { + return rowkey; + } + + public void setRowkey(RowKeyDesc rowkey) { + this.rowkey = rowkey; + } + + public String getSignature() { + return signature; + } + + public void setSignature(String signature) { + this.signature = signature; + } + + public CubeCapacity getCapacity() { + return capacity; + } + + public void setCapacity(CubeCapacity capacity) { + this.capacity = capacity; + } + + public List getNotifyList() { + return notifyList; + } + + public void setNotifyList(List notifyList) { + this.notifyList = notifyList; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + CubeDesc cubeDesc = (CubeDesc) o; + + if (!name.equals(cubeDesc.name)) + return false; + if (!factTable.equals(cubeDesc.factTable)) + return false; + + return true; + } + + @Override + public int hashCode() { + int result = 0; + result = 31 * result + name.hashCode(); + result = 31 * result + factTable.hashCode(); + return result; + } + + @Override + public String toString() { + return "CubeDesc [name=" + name + ", factTable=" + factTable + ", cubePartitionDesc=" + cubePartitionDesc + ", dimensions=" + dimensions + ", measures=" + measures + ", rowkey=" + rowkey + ", hbaseMapping=" + hbaseMapping + "]"; + } + + public String calculateSignature() { + MessageDigest md = null; + try { + md = MessageDigest.getInstance("MD5"); + StringBuilder sigString = new StringBuilder(); + sigString.append(this.name).append("|").append(this.factTable).append("|").append(JsonUtil.writeValueAsString(this.cubePartitionDesc)).append("|").append(JsonUtil.writeValueAsString(this.dimensions)).append("|").append(JsonUtil.writeValueAsString(this.measures)).append("|").append(JsonUtil.writeValueAsString(this.rowkey)).append("|").append(JsonUtil.writeValueAsString(this.hbaseMapping)); + + byte[] signature = md.digest(sigString.toString().getBytes()); + return new String(Base64.encodeBase64(signature)); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("Failed to calculate signature"); + } catch (JsonProcessingException e) { + throw new RuntimeException("Failed to calculate signature"); + } + } + + public Map buildColumnNameAbbreviation() { + Map r = new HashMap(); + for (TblColRef col : listDimensionColumnsExcludingDerived()) { + r.put(col.getName(), col); + } + return r; + } + + public void init(KylinConfig config, Map tables) { + this.errors.clear(); + this.config = config; + + if (factTable != null) + factTable = factTable.toUpperCase(); + + for (DimensionDesc dim : dimensions) { + dim.init(tables); + } + + sortDimAndMeasure(); + + initJoinColumns(tables); + initDimensionColumns(tables); + initMeasureColumns(tables); + + rowkey.init(this); + if (hbaseMapping != null) { + hbaseMapping.init(this); + } + + initMeasureReferenceToColumnFamily(); + + if (null != this.cubePartitionDesc) { + this.cubePartitionDesc.init(columnMap); + } + + // check all dimension columns are presented on rowkey + List dimCols = listDimensionColumnsExcludingDerived(); + if (rowkey.getRowKeyColumns().length != dimCols.size()) { + addError("RowKey columns count (" + rowkey.getRowKeyColumns().length + ") does not equal to dimension columns count (" + dimCols.size() + "). "); + } + } + + private void initDimensionColumns(Map tables) { + // fill back ColRefDesc + for (DimensionDesc dim : dimensions) { + TableDesc dimTable = tables.get(dim.getTable()); + JoinDesc join = dim.getJoin(); + + ArrayList dimColList = new ArrayList(); + ArrayList hostColList = new ArrayList(); + + // dimension column + if (dim.getColumn() != null) { + if ("{FK}".equals(dim.getColumn())) { + for (TblColRef ref : join.getForeignKeyColumns()) { + TblColRef inited = initDimensionColRef(ref); + dimColList.add(inited); + hostColList.add(inited); + } + } else { + TblColRef ref = initDimensionColRef(dimTable, dim.getColumn()); + dimColList.add(ref); + hostColList.add(ref); + } + } + // hierarchy columns + if (dim.getHierarchy() != null) { + for (HierarchyDesc hier : dim.getHierarchy()) { + TblColRef ref = initDimensionColRef(dimTable, hier.getColumn()); + hier.setColumnRef(ref); + dimColList.add(ref); + } + if (hostColList.isEmpty()) { // the last hierarchy could serve + // as host when col is + // unspecified + hostColList.add(dimColList.get(dimColList.size() - 1)); + } + } + TblColRef[] dimCols = (TblColRef[]) dimColList.toArray(new TblColRef[dimColList.size()]); + dim.setColumnRefs(dimCols); + + // lookup derived columns + TblColRef[] hostCols = (TblColRef[]) hostColList.toArray(new TblColRef[hostColList.size()]); + String[] derived = dim.getDerived(); + if (derived != null) { + String[][] split = splitDerivedColumnAndExtra(derived); + String[] derivedNames = split[0]; + String[] derivedExtra = split[1]; + TblColRef[] derivedCols = new TblColRef[derivedNames.length]; + for (int i = 0; i < derivedNames.length; i++) { + derivedCols[i] = initDimensionColRef(dimTable, derivedNames[i]); + } + initDerivedMap(hostCols, DeriveType.LOOKUP, dim, derivedCols, derivedExtra); + } + + // FK derived column + if (join != null) { + TblColRef[] fk = join.getForeignKeyColumns(); + TblColRef[] pk = join.getPrimaryKeyColumns(); + for (int i = 0; i < fk.length; i++) { + int find = ArrayUtils.indexOf(hostCols, fk[i]); + if (find >= 0) { + TblColRef derivedCol = initDimensionColRef(pk[i]); + initDerivedMap(hostCols[find], DeriveType.PK_FK, dim, derivedCol); + } + } + for (int i = 0; i < pk.length; i++) { + int find = ArrayUtils.indexOf(hostCols, pk[i]); + if (find >= 0) { + TblColRef derivedCol = initDimensionColRef(fk[i]); + initDerivedMap(hostCols[find], DeriveType.PK_FK, dim, derivedCol); + } + } + } + } + } + + private String[][] splitDerivedColumnAndExtra(String[] derived) { + String[] cols = new String[derived.length]; + String[] extra = new String[derived.length]; + for (int i = 0; i < derived.length; i++) { + String str = derived[i]; + int cut = str.indexOf(":"); + if (cut >= 0) { + cols[i] = str.substring(0, cut); + extra[i] = str.substring(cut + 1).trim(); + } else { + cols[i] = str; + extra[i] = ""; + } + } + return new String[][] { cols, extra }; + } + + private void initDerivedMap(TblColRef hostCol, DeriveType type, DimensionDesc dimension, TblColRef derivedCol) { + initDerivedMap(new TblColRef[] { hostCol }, type, dimension, new TblColRef[] { derivedCol }, null); + } + + private void initDerivedMap(TblColRef[] hostCols, DeriveType type, DimensionDesc dimension, TblColRef[] derivedCols, String[] extra) { + if (hostCols.length == 0 || derivedCols.length == 0) + throw new IllegalStateException("host/derived columns must not be empty"); + + Array hostColArray = new Array(hostCols); + List infoList = hostToDerivedMap.get(hostColArray); + if (infoList == null) { + hostToDerivedMap.put(hostColArray, infoList = new ArrayList()); + } + infoList.add(new DeriveInfo(type, dimension, derivedCols, false)); + + for (int i = 0; i < derivedCols.length; i++) { + TblColRef derivedCol = derivedCols[i]; + boolean isOneToOne = type == DeriveType.PK_FK || ArrayUtils.contains(hostCols, derivedCol) || (extra != null && extra[i].contains("1-1")); + derivedToHostMap.put(derivedCol, new DeriveInfo(type, dimension, hostCols, isOneToOne)); + } + } + + private TblColRef initDimensionColRef(TableDesc table, String colName) { + ColumnDesc col = table.findColumnByName(colName); + if (col == null) + throw new IllegalArgumentException("No column '" + colName + "' found in table " + table); + + TblColRef ref = new TblColRef(col); + return initDimensionColRef(ref); + } + + private TblColRef initDimensionColRef(TblColRef ref) { + TblColRef existing = findColumnRef(ref.getTable(), ref.getName()); + if (existing != null) { + return existing; + } + + allColumns.add(ref); + dimensionColumns.add(ref); + + Map cols = columnMap.get(ref.getTable()); + if (cols == null) { + columnMap.put(ref.getTable(), cols = new HashMap()); + } + cols.put(ref.getName(), ref); + return ref; + } + + private void initJoinColumns(Map tables) { + // join columns may or may not present in cube; + // here we don't modify 'allColumns' and 'dimensionColumns'; + // initDimensionColumns() will do the update + for (DimensionDesc dim : dimensions) { + TableDesc dimTable = tables.get(dim.getTable()); + + JoinDesc join = dim.getJoin(); + if (join == null) + continue; + + // primary key + String[] pks = join.getPrimaryKey(); + TblColRef[] pkCols = new TblColRef[pks.length]; + for (int i = 0; i < pks.length; i++) { + ColumnDesc col = dimTable.findColumnByName(pks[i]); + if (col == null) { + addError("Can't find column " + pks[i] + " in table " + dimTable.getName()); + } + TblColRef colRef = new TblColRef(col); + pks[i] = colRef.getName(); + pkCols[i] = colRef; + } + join.setPrimaryKeyColumns(pkCols); + // foreign key + TableDesc factTable = tables.get(this.factTable); + if (factTable == null) { + addError("Fact table does not exist:" + this.factTable); + } + String[] fks = join.getForeignKey(); + TblColRef[] fkCols = new TblColRef[fks.length]; + for (int i = 0; i < fks.length; i++) { + ColumnDesc col = factTable.findColumnByName(fks[i]); + if (col == null) { + addError("Can't find column " + fks[i] + " in table " + this.factTable); + } + TblColRef colRef = new TblColRef(col); + fks[i] = colRef.getName(); + fkCols[i] = colRef; + } + join.setForeignKeyColumns(fkCols); + // Validate join in dimension + if (pkCols.length != fkCols.length) { + addError("Primary keys(" + dim.getTable() + ")" + Arrays.toString(pks) + " are not consistent with Foreign keys(" + this.factTable + ") " + Arrays.toString(fks)); + } + for (int i = 0; i < fkCols.length; i++) { + if (!fkCols[i].getDatatype().equals(pkCols[i].getDatatype())) { + addError("Primary key " + dim.getTable() + "." + pkCols[i].getName() + "." + pkCols[i].getDatatype() + " are not consistent with Foreign key " + this.factTable + "." + fkCols[i].getName() + "." + fkCols[i].getDatatype()); + } + } + + } + } + + private void initMeasureColumns(Map tables) { + if (measures == null || measures.isEmpty()) { + return; + } + + TableDesc factTable = tables.get(getFactTable()); + for (MeasureDesc m : measures) { + m.setName(m.getName().toUpperCase()); + + if (m.getDependentMeasureRef() != null) { + m.setDependentMeasureRef(m.getDependentMeasureRef().toUpperCase()); + } + + FunctionDesc f = m.getFunction(); + f.setExpression(f.getExpression().toUpperCase()); + f.setReturnDataType(DataType.getInstance(f.getReturnType())); + + ParameterDesc p = f.getParameter(); + p.normalizeColumnValue(); + + if (p.isColumnType()) { + ArrayList colRefs = Lists.newArrayList(); + for (String cName : p.getValue().split("\\s*,\\s*")) { + ColumnDesc sourceColumn = factTable.findColumnByName(cName); + TblColRef colRef = new TblColRef(sourceColumn); + colRefs.add(colRef); + allColumns.add(colRef); + } + if (colRefs.isEmpty() == false) + p.setColRefs(colRefs); + } + } + } + + private void initMeasureReferenceToColumnFamily() { + if (measures == null || measures.size() == 0) + return; + + Map measureCache = new HashMap(); + for (MeasureDesc m : measures) + measureCache.put(m.getName(), m); + + for (HBaseColumnFamilyDesc cf : getHBaseMapping().getColumnFamily()) { + for (HBaseColumnDesc c : cf.getColumns()) { + MeasureDesc[] measureDescs = new MeasureDesc[c.getMeasureRefs().length]; + for (int i = 0; i < c.getMeasureRefs().length; i++) { + measureDescs[i] = measureCache.get(c.getMeasureRefs()[i]); + } + c.setMeasures(measureDescs); + c.setColumnFamilyName(cf.getName()); + } + } + } + + private void sortDimAndMeasure() { + sortDimensionsByID(); + sortMeasuresByID(); + for (DimensionDesc dim : dimensions) { + sortHierarchiesByLevel(dim.getHierarchy()); + } + } + + private void sortDimensionsByID() { + Collections.sort(dimensions, new Comparator() { + @Override + public int compare(DimensionDesc d1, DimensionDesc d2) { + Integer id1 = d1.getId(); + Integer id2 = d2.getId(); + return id1.compareTo(id2); + } + }); + } + + private void sortMeasuresByID() { + if (measures == null) { + measures = Lists.newArrayList(); + } + + Collections.sort(measures, new Comparator() { + @Override + public int compare(MeasureDesc m1, MeasureDesc m2) { + Integer id1 = m1.getId(); + Integer id2 = m2.getId(); + return id1.compareTo(id2); + } + }); + } + + private void sortHierarchiesByLevel(HierarchyDesc[] hierarchies) { + if (hierarchies != null) { + Arrays.sort(hierarchies, new Comparator() { + @Override + public int compare(HierarchyDesc h1, HierarchyDesc h2) { + Integer level1 = Integer.parseInt(h1.getLevel()); + Integer level2 = Integer.parseInt(h2.getLevel()); + return level1.compareTo(level2); + } + }); + } + } + + public boolean hasHolisticCountDistinctMeasures() { + for (MeasureDesc measure : measures) { + if (measure.getFunction().isHolisticCountDistinct()) { + return true; + } + } + return false; + } + + /** + * Add error info and thrown exception out + * + * @param message + */ + public void addError(String message) { + addError(message, false); + } + + /** + * @param message + * error message + * @param silent + * if throw exception + */ + public void addError(String message, boolean silent) { + if (!silent) { + throw new IllegalStateException(message); + } else { + this.errors.add(message); + } + } + + public List getError() { + return this.errors; + } + +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/CubePartitionDesc.java b/cube/src/main/java/com/kylinolap/cube/model/CubePartitionDesc.java new file mode 100644 index 0000000..4f174d2 --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/CubePartitionDesc.java @@ -0,0 +1,87 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model; + +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.metadata.model.realization.TblColRef; + +/** + * @author xduo + * + */ +@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +public class CubePartitionDesc { + + public static enum CubePartitionType { + APPEND, UPDATE_INSERT + } + + @JsonProperty("partition_date_column") + private String partitionDateColumn; + @JsonProperty("partition_date_start") + private long partitionDateStart = 0L; + @JsonProperty("cube_partition_type") + private CubePartitionType cubePartitionType = CubePartitionType.APPEND; + + private TblColRef partitionDateColumnRef; + + public void init(Map> columnMap) { + if (null != partitionDateColumn) { + String[] columns = partitionDateColumn.split("\\."); + + if (null != columns && columns.length == 2) { + Map cols = columnMap.get(columns[0].toUpperCase()); + if (cols != null) + partitionDateColumnRef = cols.get(columns[1].toUpperCase()); + + } + } + } + + public String getPartitionDateColumn() { + return partitionDateColumn; + } + + public void setPartitionDateColumn(String partitionDateColumn) { + this.partitionDateColumn = partitionDateColumn; + } + + public long getPartitionDateStart() { + return partitionDateStart; + } + + public void setPartitionDateStart(long partitionDateStart) { + this.partitionDateStart = partitionDateStart; + } + + public CubePartitionType getCubePartitionType() { + return cubePartitionType; + } + + public void setCubePartitionType(CubePartitionType cubePartitionType) { + this.cubePartitionType = cubePartitionType; + } + + public TblColRef getPartitionDateColumnRef() { + return partitionDateColumnRef; + } + +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java b/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java new file mode 100644 index 0000000..3d9c7e3 --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java @@ -0,0 +1,211 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model; + +import java.util.Arrays; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.common.util.StringUtil; +import com.kylinolap.metadata.model.JoinDesc; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.TblColRef; + +/** + * Created with IntelliJ IDEA. User: lukhan Date: 9/24/13 Time: 10:40 AM To + * change this template use File | Settings | File Templates. + */ +@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +public class DimensionDesc { + + @JsonProperty("id") + private int id; + @JsonProperty("name") + private String name; + @JsonProperty("join") + private JoinDesc join; + @JsonProperty("hierarchy") + private HierarchyDesc[] hierarchy; + @JsonProperty("table") + private String table; + @JsonProperty("column") + private String column; + @JsonProperty("datatype") + private String datatype; + @JsonProperty("derived") + private String[] derived; + + // computed + private TblColRef[] columnRefs; + private TblColRef[] derivedColRefs; + + public boolean isHierarchyColumn(TblColRef col) { + if (hierarchy == null) + return false; + + for (HierarchyDesc hier : hierarchy) { + if (hier.getColumnRef().equals(col)) + return true; + } + return false; + } + + public String getDatatype() { + return datatype; + } + + public void setDatatype(String datatype) { + this.datatype = datatype; + } + + public String getTable() { + return table.toUpperCase(); + } + + public void setTable(String table) { + this.table = table; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public JoinDesc getJoin() { + return join; + } + + public void setJoin(JoinDesc join) { + this.join = join; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public TblColRef[] getColumnRefs() { + return this.columnRefs; + } + + public void setColumnRefs(TblColRef[] colRefs) { + this.columnRefs = colRefs; + } + + public String getColumn() { + return this.column; + } + + public void setColumn(String column) { + this.column = column; + if (this.column != null) + this.column = this.column.toUpperCase(); + } + + public HierarchyDesc[] getHierarchy() { + return hierarchy; + } + + public void setHierarchy(HierarchyDesc[] hierarchy) { + this.hierarchy = hierarchy; + } + + public String[] getDerived() { + return derived; + } + + public void setDerived(String[] derived) { + this.derived = derived; + } + + public TblColRef[] getDerivedColRefs() { + return derivedColRefs; + } + + public void setDerivedColRefs(TblColRef[] derivedColRefs) { + this.derivedColRefs = derivedColRefs; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + DimensionDesc that = (DimensionDesc) o; + + if (id != that.id) + return false; + if (!name.equals(that.name)) + return false; + + return true; + } + + @Override + public int hashCode() { + int result = id; + result = 31 * result + name.hashCode(); + return result; + } + + @Override + public String toString() { + return "DimensionDesc [name=" + name + ", join=" + join + ", hierarchy=" + Arrays.toString(hierarchy) + ", table=" + table + ", column=" + column + ", datatype=" + datatype + ", derived=" + Arrays.toString(derived) + "]"; + } + + public void init(Map tables) { + if (name != null) + name = name.toUpperCase(); + if (table != null) + table = table.toUpperCase(); + if (column != null) + column = column.toUpperCase(); + + TableDesc tableDesc = tables.get(table); + if (tableDesc == null) + throw new IllegalStateException("Can't find table " + table + " on dimension " + name); + + if (hierarchy != null && hierarchy.length == 0) + hierarchy = null; + if (derived != null && derived.length == 0) + derived = null; + + if (join != null) { + StringUtil.toUpperCaseArray(join.getForeignKey(), join.getForeignKey()); + StringUtil.toUpperCaseArray(join.getPrimaryKey(), join.getPrimaryKey()); + } + + if (hierarchy != null) { + for (HierarchyDesc h : hierarchy) + h.setColumn(h.getColumn().toUpperCase()); + } + + if (derived != null) { + StringUtil.toUpperCaseArray(derived, derived); + } + } + +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/HBaseColumnDesc.java b/cube/src/main/java/com/kylinolap/cube/model/HBaseColumnDesc.java new file mode 100644 index 0000000..7302330 --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/HBaseColumnDesc.java @@ -0,0 +1,118 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model; + +import java.util.Arrays; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.metadata.model.realization.FunctionDesc; + +/** + * Created with IntelliJ IDEA. User: lukhan Date: 9/30/13 Time: 10:57 AM To + * change this template use File | Settings | File Templates. + */ +@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +public class HBaseColumnDesc { + + @JsonProperty("qualifier") + private String qualifier; + @JsonProperty("measure_refs") + private String[] measureRefs; + + // these two will be assemble in runtime. + private MeasureDesc[] measures; + private String columnFamilyName; + + public String getQualifier() { + return qualifier; + } + + public void setQualifier(String qualifier) { + this.qualifier = qualifier; + } + + public String[] getMeasureRefs() { + return measureRefs; + } + + public void setMeasureRefs(String[] measureRefs) { + this.measureRefs = measureRefs; + } + + public MeasureDesc[] getMeasures() { + return measures; + } + + public int findMeasureIndex(FunctionDesc function) { + for (int i = 0; i < measures.length; i++) { + if (measures[i].getFunction().equals(function)) { + return i; + } + } + return -1; + } + + public void setMeasures(MeasureDesc[] measures) { + this.measures = measures; + } + + public String getColumnFamilyName() { + return columnFamilyName; + } + + public void setColumnFamilyName(String columnFamilyName) { + this.columnFamilyName = columnFamilyName; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((columnFamilyName == null) ? 0 : columnFamilyName.hashCode()); + result = prime * result + ((qualifier == null) ? 0 : qualifier.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + HBaseColumnDesc other = (HBaseColumnDesc) obj; + if (columnFamilyName == null) { + if (other.columnFamilyName != null) + return false; + } else if (!columnFamilyName.equals(other.columnFamilyName)) + return false; + if (qualifier == null) { + if (other.qualifier != null) + return false; + } else if (!qualifier.equals(other.qualifier)) + return false; + return true; + } + + @Override + public String toString() { + return "HBaseColumnDesc [qualifier=" + qualifier + ", measureRefs=" + Arrays.toString(measureRefs) + "]"; + } + +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/HBaseColumnFamilyDesc.java b/cube/src/main/java/com/kylinolap/cube/model/HBaseColumnFamilyDesc.java new file mode 100644 index 0000000..eb76a42 --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/HBaseColumnFamilyDesc.java @@ -0,0 +1,57 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model; + +import java.util.Arrays; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Created with IntelliJ IDEA. User: lukhan Date: 9/30/13 Time: 10:41 AM To + * change this template use File | Settings | File Templates. + */ +@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +public class HBaseColumnFamilyDesc { + + @JsonProperty("name") + private String name; + @JsonProperty("columns") + private HBaseColumnDesc[] columns; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public HBaseColumnDesc[] getColumns() { + return columns; + } + + public void setColumns(HBaseColumnDesc[] columns) { + this.columns = columns; + } + + @Override + public String toString() { + return "HBaseColumnFamilyDesc [name=" + name + ", columns=" + Arrays.toString(columns) + "]"; + } + +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/HBaseMappingDesc.java b/cube/src/main/java/com/kylinolap/cube/model/HBaseMappingDesc.java new file mode 100644 index 0000000..9baccaf --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/HBaseMappingDesc.java @@ -0,0 +1,93 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model; + +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedList; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.common.util.StringUtil; +import com.kylinolap.metadata.model.realization.FunctionDesc; + +/** + * Created with IntelliJ IDEA. User: lukhan Date: 9/24/13 Time: 10:44 AM To + * change this template use File | Settings | File Templates. + */ +@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +public class HBaseMappingDesc { + + @JsonProperty("column_family") + private HBaseColumnFamilyDesc[] columnFamily; + + // point to the cube instance which contain this HBaseMappingDesc instance. + private CubeDesc cubeRef; + + public Collection findHBaseColumnByFunction(FunctionDesc function) { + Collection result = new LinkedList(); + HBaseMappingDesc hbaseMapping = cubeRef.getHBaseMapping(); + if (hbaseMapping == null || hbaseMapping.getColumnFamily() == null) { + return result; + } + for (HBaseColumnFamilyDesc cf : hbaseMapping.getColumnFamily()) { + for (HBaseColumnDesc c : cf.getColumns()) { + for (MeasureDesc m : c.getMeasures()) { + if (m.getFunction().equals(function)) { + result.add(c); + } + } + } + } + return result; + } + + public CubeDesc getCubeRef() { + return cubeRef; + } + + public void setCubeRef(CubeDesc cubeRef) { + this.cubeRef = cubeRef; + } + + public HBaseColumnFamilyDesc[] getColumnFamily() { + return columnFamily; + } + + public void setColumnFamily(HBaseColumnFamilyDesc[] columnFamily) { + this.columnFamily = columnFamily; + } + + public void init(CubeDesc cubeDesc) { + cubeRef = cubeDesc; + + for (HBaseColumnFamilyDesc cf : columnFamily) { + cf.setName(cf.getName().toUpperCase()); + + for (HBaseColumnDesc c : cf.getColumns()) { + c.setQualifier(c.getQualifier().toUpperCase()); + StringUtil.toUpperCaseArray(c.getMeasureRefs(), c.getMeasureRefs()); + } + } + } + + @Override + public String toString() { + return "HBaseMappingDesc [columnFamily=" + Arrays.toString(columnFamily) + "]"; + } + +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/HierarchyDesc.java b/cube/src/main/java/com/kylinolap/cube/model/HierarchyDesc.java new file mode 100644 index 0000000..3c0e29e --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/HierarchyDesc.java @@ -0,0 +1,66 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.metadata.model.realization.TblColRef; + +/** + * Created with IntelliJ IDEA. User: lukhan Date: 9/24/13 Time: 10:46 AM To + * change this template use File | Settings | File Templates. + */ +@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +public class HierarchyDesc { + + @JsonProperty("level") + private String level; + @JsonProperty("column") + private String column; + + private TblColRef columnRef; + + public String getLevel() { + return level; + } + + public void setLevel(String level) { + this.level = level; + } + + public TblColRef getColumnRef() { + return columnRef; + } + + public void setColumnRef(TblColRef column) { + this.columnRef = column; + } + + public String getColumn() { + return column; + } + + public void setColumn(String columnName) { + this.column = columnName; + } + + @Override + public String toString() { + return "HierarchyDesc [level=" + level + ", column=" + column + "]"; + } + +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/MeasureDesc.java b/cube/src/main/java/com/kylinolap/cube/model/MeasureDesc.java new file mode 100644 index 0000000..7c7889f --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/MeasureDesc.java @@ -0,0 +1,101 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.metadata.model.realization.FunctionDesc; + +/** + * Created with IntelliJ IDEA. User: lukhan Date: 9/24/13 Time: 10:41 AM To + * change this template use File | Settings | File Templates. + */ + +@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +public class MeasureDesc { + + @JsonProperty("id") + private int id; + @JsonProperty("name") + private String name; + @JsonProperty("function") + private FunctionDesc function; + @JsonProperty("dependent_measure_ref") + private String dependentMeasureRef; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public FunctionDesc getFunction() { + return function; + } + + public void setFunction(FunctionDesc function) { + this.function = function; + } + + public String getDependentMeasureRef() { + return dependentMeasureRef; + } + + public void setDependentMeasureRef(String dependentMeasureRef) { + this.dependentMeasureRef = dependentMeasureRef; + } + + public boolean isHolisticCountDistinct() { + return function.isHolisticCountDistinct(); + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + MeasureDesc that = (MeasureDesc) o; + + if (id != that.id) + return false; + + return true; + } + + @Override + public int hashCode() { + return id; + } + + @Override + public String toString() { + return "MeasureDesc [name=" + name + ", function=" + function + "]"; + } + +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/RowKeyColDesc.java b/cube/src/main/java/com/kylinolap/cube/model/RowKeyColDesc.java new file mode 100644 index 0000000..d2a141f --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/RowKeyColDesc.java @@ -0,0 +1,85 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.metadata.model.realization.TblColRef; + +/** + * @author yangli9 + * + */ +@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +public class RowKeyColDesc { + + @JsonProperty("column") + private String column; + @JsonProperty("length") + private int length; + @JsonProperty("dictionary") + private String dictionary; + @JsonProperty("mandatory") + private boolean mandatory = false; + + // computed + private int bitIndex; + private TblColRef colRef; + + public String getDictionary() { + return dictionary; + } + + public String getColumn() { + return column; + } + + void setColumn(String column) { + this.column = column; + } + + public int getLength() { + return length; + } + + public boolean isMandatory() { + return mandatory; + } + + public int getBitIndex() { + return bitIndex; + } + + void setBitIndex(int index) { + this.bitIndex = index; + } + + public TblColRef getColRef() { + return colRef; + } + + void setColRef(TblColRef colRef) { + this.colRef = colRef; + } + + @Override + public String toString() { + return "RowKeyColDesc [column=" + column + ", length=" + length + ", dictionary=" + dictionary + ", mandatory=" + mandatory + "]"; + } + +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/RowKeyDesc.java b/cube/src/main/java/com/kylinolap/cube/model/RowKeyDesc.java new file mode 100644 index 0000000..1446d07 --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/RowKeyDesc.java @@ -0,0 +1,291 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.lang.StringUtils; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.common.util.StringUtil; +import com.kylinolap.metadata.model.realization.TblColRef; + +/** + * Created by lukhan on 1/2/14. + */ +@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +public class RowKeyDesc { + + public static class HierarchyMask { + public long fullMask; + public long[] allMasks; + } + + public static class AggrGroupMask { + public AggrGroupMask(int size) { + groupOneBitMasks = new long[size]; + } + + public long groupMask; + public long groupOneBitMasks[]; + public long uniqueMask; + public long leftoverMask; + } + + @JsonProperty("rowkey_columns") + private RowKeyColDesc[] rowkeyColumns; + @JsonProperty("aggregation_groups") + private String[][] aggregationGroups; + + // computed content + private CubeDesc cubeRef; + private Map columnMap; + + private long fullMask; + private long mandatoryColumnMask; + private AggrGroupMask[] aggrGroupMasks; + private long aggrGroupFullMask; + private long tailMask; + + private List hierarchyMasks; + + public RowKeyColDesc[] getRowKeyColumns() { + return rowkeyColumns; + } + + // search a specific row key col + public int getRowKeyIndexByColumnName(String columnName) { + if (this.rowkeyColumns == null) + return -1; + + for (int i = 0; i < this.rowkeyColumns.length; ++i) { + RowKeyColDesc desc = this.rowkeyColumns[i]; + if (desc.getColumn().equalsIgnoreCase(columnName)) { + return i; + } + } + return -1; + } + + public int getNCuboidBuildLevels() { + // N aggregation columns requires N levels of cuboid build + // - N columns requires N-1 levels build + // - zero tail cuboid needs one more additional level + Set aggDims = new HashSet(); + for (String[] aggrGroup : aggregationGroups) { + for (String dim : aggrGroup) { + aggDims.add(dim); + } + } + return aggDims.size(); + } + + public String[][] getAggregationGroups() { + return aggregationGroups; + } + + public CubeDesc getCubeRef() { + return cubeRef; + } + + public void setCubeRef(CubeDesc cubeRef) { + this.cubeRef = cubeRef; + } + + public long getFullMask() { + return fullMask; + } + + public long getMandatoryColumnMask() { + return mandatoryColumnMask; + } + + public long getAggrGroupFullMask() { + return aggrGroupFullMask; + } + + public AggrGroupMask[] getAggrGroupMasks() { + return aggrGroupMasks; + } + + public List getHierarchyMasks() { + return hierarchyMasks; + } + + public long getTailMask() { + return tailMask; + } + + public int getColumnBitIndex(TblColRef col) { + return getColDesc(col).getBitIndex(); + } + + public int getColumnLength(TblColRef col) { + return getColDesc(col).getLength(); + } + + public String getDictionary(TblColRef col) { + return getColDesc(col).getDictionary(); + } + + private RowKeyColDesc getColDesc(TblColRef col) { + RowKeyColDesc desc = columnMap.get(col); + if (desc == null) + throw new NullPointerException("Column " + col + " does not exist in row key desc"); + return desc; + } + + public boolean isUseDictionary(TblColRef col) { + String useDictionary = getDictionary(col); + return !StringUtils.isBlank(useDictionary) && !"false".equals(useDictionary); + } + + public boolean isUseDictionary() { + for (RowKeyColDesc col : getRowKeyColumns()) { + if (isUseDictionary(col.getColRef())) { + return true; + } + } + return false; + } + + public void init(CubeDesc cube) { + setCubeRef(cube); + Map colNameAbbr = cube.buildColumnNameAbbreviation(); + + buildRowKey(colNameAbbr); + buildAggregationGroups(colNameAbbr); + buildHierarchyMasks(); + } + + @Override + public String toString() { + return "RowKeyDesc [rowkeyColumns=" + Arrays.toString(rowkeyColumns) + ", aggregationGroups=" + Arrays.toString(aggregationGroups) + "]"; + } + + private void buildRowKey(Map colNameAbbr) { + columnMap = new HashMap(); + mandatoryColumnMask = 0; + + for (int i = 0; i < rowkeyColumns.length; i++) { + RowKeyColDesc col = rowkeyColumns[i]; + col.setColumn(col.getColumn().toUpperCase()); + col.setBitIndex(rowkeyColumns.length - i - 1); + col.setColRef(colNameAbbr.get(col.getColumn())); + if (col.getColRef() == null) + throw new IllegalArgumentException("Cannot find rowkey column " + col.getColumn() + " in cube " + cubeRef); + + columnMap.put(col.getColRef(), col); + + if (col.isMandatory()) { + mandatoryColumnMask |= 1L << col.getBitIndex(); + } + } + } + + private void buildAggregationGroups(Map colNameAbbr) { + if (aggregationGroups == null) { + aggregationGroups = new String[0][]; + } + + for (int i = 0; i < aggregationGroups.length; i++) { + StringUtil.toUpperCaseArray(aggregationGroups[i], this.aggregationGroups[i]); + } + + for (int i = 0; i < this.rowkeyColumns.length; i++) { + int index = rowkeyColumns[i].getBitIndex(); + this.fullMask |= 1L << index; + } + + this.aggrGroupMasks = new AggrGroupMask[aggregationGroups.length]; + for (int i = 0; i < this.aggregationGroups.length; i++) { + String[] aggGrp = this.aggregationGroups[i]; + AggrGroupMask mask = new AggrGroupMask(aggGrp.length); + + for (int j = 0; j < aggGrp.length; j++) { + TblColRef aggCol = colNameAbbr.get(aggGrp[j].toUpperCase()); + if (aggCol == null) { + throw new IllegalArgumentException("Can't find aggregation column " + aggGrp[j] + " in cube " + this.cubeRef.getName()); + } + Integer index = getColumnBitIndex(aggCol); + mask.groupMask |= 1L << index; + mask.groupOneBitMasks[j] = 1L << index; + this.aggrGroupFullMask |= 1L << index; + } + this.aggrGroupMasks[i] = mask; + } + + this.tailMask = fullMask ^ mandatoryColumnMask ^ aggrGroupFullMask; + + // unique mask = (bits in this group) - (bits in following groups) + // leftover mask = (tail bits) + (bits in following groups) - (bits in + // this group) + for (int i = 0; i < aggrGroupMasks.length; i++) { + AggrGroupMask mask = aggrGroupMasks[i]; + + mask.uniqueMask = mask.groupMask; + for (int j = i + 1; j < aggrGroupMasks.length; j++) { + mask.uniqueMask &= ~aggrGroupMasks[j].groupMask; + } + + mask.leftoverMask = tailMask; + for (int j = i + 1; j < aggrGroupMasks.length; j++) { + mask.leftoverMask |= aggrGroupMasks[j].groupMask; + } + mask.leftoverMask &= ~mask.groupMask; + } + } + + private void buildHierarchyMasks() { + this.hierarchyMasks = new ArrayList(); + + for (DimensionDesc dimension : this.cubeRef.getDimensions()) { + HierarchyDesc[] hierarchies = dimension.getHierarchy(); + if (hierarchies == null || hierarchies.length == 0) + continue; + + HierarchyMask mask = new HierarchyMask(); + ArrayList allMaskList = new ArrayList(); + for (int i = 0; i < hierarchies.length; i++) { + TblColRef hColumn = hierarchies[i].getColumnRef(); + Integer index = getColumnBitIndex(hColumn); + long bit = 1L << index; + + if ((tailMask & bit) > 0) + continue; // ignore levels in tail, they don't participate + // aggregation group combination anyway + + mask.fullMask |= bit; + allMaskList.add(mask.fullMask); + } + + mask.allMasks = new long[allMaskList.size()]; + for (int i = 0; i < allMaskList.size(); i++) + mask.allMasks[i] = allMaskList.get(i); + + this.hierarchyMasks.add(mask); + } + } + +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/validation/CubeMetadataValidator.java b/cube/src/main/java/com/kylinolap/cube/model/validation/CubeMetadataValidator.java new file mode 100644 index 0000000..508cc52 --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/validation/CubeMetadataValidator.java @@ -0,0 +1,73 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model.validation; + +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.validation.ValidateContext.Result; +import com.kylinolap.cube.model.validation.rule.AggregationGroupSizeRule; +import com.kylinolap.cube.model.validation.rule.FunctionRule; +import com.kylinolap.cube.model.validation.rule.MandatoryColumnRule; +import com.kylinolap.cube.model.validation.rule.RowKeyAttrRule; + +/** + * For cube metadata validator + * + * @author jianliu + * + */ +public class CubeMetadataValidator { + @SuppressWarnings("unchecked") + private IValidatorRule[] rules = new IValidatorRule[] { new FunctionRule(), new AggregationGroupSizeRule(), new MandatoryColumnRule(), new RowKeyAttrRule() }; + + public ValidateContext validate(CubeDesc cube) { + return validate(cube, false); + } + + /** + * @param cubeDesc + * @param inject + * inject error into cube desc + * @return + */ + public ValidateContext validate(CubeDesc cube, boolean inject) { + ValidateContext context = new ValidateContext(); + for (int i = 0; i < rules.length; i++) { + IValidatorRule rule = rules[i]; + rule.validate(cube, context); + } + if (inject) { + injectResult(cube, context); + } + return context; + } + + /** + * + * Inject errors info into cubeDesc + * + * @param cubeDesc + * @param context + */ + public void injectResult(CubeDesc cubeDesc, ValidateContext context) { + Result[] results = context.getResults(); + for (int i = 0; i < results.length; i++) { + Result result = results[i]; + cubeDesc.addError(result.getLevel() + " : " + result.getMessage(), true); + } + + } + +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/validation/IValidatorRule.java b/cube/src/main/java/com/kylinolap/cube/model/validation/IValidatorRule.java new file mode 100644 index 0000000..ebe5dd2 --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/validation/IValidatorRule.java @@ -0,0 +1,28 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model.validation; + +import com.kylinolap.cube.model.validation.rule.IKylinValidationConstances; + +/** + * @author jianliu + * + */ +public interface IValidatorRule extends IKylinValidationConstances { + + public void validate(T element, ValidateContext context); +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/validation/ResultLevel.java b/cube/src/main/java/com/kylinolap/cube/model/validation/ResultLevel.java new file mode 100644 index 0000000..31d172b --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/validation/ResultLevel.java @@ -0,0 +1,36 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model.validation; + +/** + * Validation result level + * + * @author jianliu + * + */ +public enum ResultLevel { + ERROR("ERROR"), WARN("WARN"); + private String level; + + ResultLevel(String level) { + this.level = level; + } + + public String toString() { + return level; + } +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/validation/SourceTableMetadataValidator.java b/cube/src/main/java/com/kylinolap/cube/model/validation/SourceTableMetadataValidator.java new file mode 100644 index 0000000..4c2ffde --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/validation/SourceTableMetadataValidator.java @@ -0,0 +1,32 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model.validation; + +import com.kylinolap.metadata.model.TableDesc; + +/** + * Validate Table metadata from source. + *

+ * User: lukhan Date: 12/2/13 Time: 10:45 AM To change this template use File | + * Settings | File Templates. + */ +public class SourceTableMetadataValidator { + + public static boolean validate(TableDesc table) { + // table.get + return true; + } +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/validation/ValidateContext.java b/cube/src/main/java/com/kylinolap/cube/model/validation/ValidateContext.java new file mode 100644 index 0000000..dcee258 --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/validation/ValidateContext.java @@ -0,0 +1,101 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model.validation; + +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * Context. Supply all dependent objects for validator + * + * @author jianliu + * + */ +public class ValidateContext { + private List results = new ArrayList(); + + public void addResult(ResultLevel level, String message) { + results.add(new Result(level, message)); + } + + public void addResult(Result result) { + results.add(result); + } + + public class Result { + private ResultLevel level; + private String message; + + /** + * @param level + * @param message + */ + public Result(ResultLevel level, String message) { + this.level = level; + this.message = message; + } + + /** + * @return the level + */ + public ResultLevel getLevel() { + return level; + } + + /** + * @return the message + */ + public String getMessage() { + return message; + } + } + + /** + * Get validation result + * + * @return + */ + public Result[] getResults() { + Result[] rs = new Result[0]; + rs = results.toArray(rs); + return rs; + } + + /** + * + */ + public void print(PrintStream out) { + if (results.isEmpty()) { + out.print("The element is perfect."); + } + Iterator it = results.iterator(); + while (it.hasNext()) { + Result result = it.next(); + out.println(result.level + " : " + result.message); + } + } + + /** + * @return if there is not validation errors + */ + public boolean ifPass() { + return results.isEmpty(); + } + +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/validation/rule/AggregationGroupSizeRule.java b/cube/src/main/java/com/kylinolap/cube/model/validation/rule/AggregationGroupSizeRule.java new file mode 100644 index 0000000..9ca1d66 --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/validation/rule/AggregationGroupSizeRule.java @@ -0,0 +1,64 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model.validation.rule; + +import com.kylinolap.common.KylinConfig; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.validation.IValidatorRule; +import com.kylinolap.cube.model.validation.ResultLevel; +import com.kylinolap.cube.model.validation.ValidateContext; + +/** + * Rule to validate: 1. The aggregationGroup size must be less than 20 + * + * @author jianliu + * + */ +public class AggregationGroupSizeRule implements IValidatorRule { + + /* + * (non-Javadoc) + * + * @see + * com.kylinolap.metadata.validation.IValidatorRule#validate(java.lang.Object + * , com.kylinolap.metadata.validation.ValidateContext) + */ + @Override + public void validate(CubeDesc cube, ValidateContext context) { + innerValidateMaxSize(cube, context); + } + + /** + * @param cube + * @param context + */ + private void innerValidateMaxSize(CubeDesc cube, ValidateContext context) { + int maxSize = getMaxAgrGroupSize(); + String[][] groups = cube.getRowkey().getAggregationGroups(); + for (int i = 0; i < groups.length; i++) { + String[] group = groups[i]; + if (group.length >= maxSize) { + context.addResult(ResultLevel.ERROR, "Length of the number " + i + " aggregation group's length should be less than " + maxSize); + } + } + } + + protected int getMaxAgrGroupSize() { + String size = KylinConfig.getInstanceFromEnv().getProperty(KEY_MAX_AGR_GROUP_SIZE, String.valueOf(DEFAULT_MAX_AGR_GROUP_SIZE)); + return Integer.parseInt(size); + } +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/validation/rule/FunctionRule.java b/cube/src/main/java/com/kylinolap/cube/model/validation/rule/FunctionRule.java new file mode 100644 index 0000000..f703e14 --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/validation/rule/FunctionRule.java @@ -0,0 +1,181 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model.validation.rule; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import org.apache.commons.lang.StringUtils; + +import com.kylinolap.common.KylinConfig; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.MeasureDesc; +import com.kylinolap.cube.model.validation.IValidatorRule; +import com.kylinolap.cube.model.validation.ResultLevel; +import com.kylinolap.cube.model.validation.ValidateContext; +import com.kylinolap.metadata.MetadataManager; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.DataType; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.FunctionDesc; +import com.kylinolap.metadata.model.realization.ParameterDesc; + +/** + * Validate function parameter. Ticket: + * https://github.scm.corp.ebay.com/Kylin/Kylin/issues/268 + *

+ * if type is column, check values are valid fact table columns if type is + * constant, the value only can be numberic + *

+ * the return type only can be int/bigint/long/double/decimal + * + * @author jianliu + */ +public class FunctionRule implements IValidatorRule { + + /* + * (non-Javadoc) + * + * @see + * com.kylinolap.metadata.validation.IValidatorRule#validate(java.lang.Object + * , com.kylinolap.metadata.validation.ValidateContext) + */ + @Override + public void validate(CubeDesc cube, ValidateContext context) { + List measures = cube.getMeasures(); + + List countFuncs = new ArrayList(); + + Iterator it = measures.iterator(); + while (it.hasNext()) { + MeasureDesc measure = it.next(); + FunctionDesc func = measure.getFunction(); + ParameterDesc parameter = func.getParameter(); + if (parameter == null) { + context.addResult(ResultLevel.ERROR, "Must define parameter for function " + func.getExpression() + " in " + measure.getName()); + return; + } + + String type = func.getParameter().getType(); + String value = func.getParameter().getValue(); + if (StringUtils.isEmpty(type)) { + context.addResult(ResultLevel.ERROR, "Must define type for parameter type " + func.getExpression() + " in " + measure.getName()); + return; + } + if (StringUtils.isEmpty(value)) { + context.addResult(ResultLevel.ERROR, "Must define type for parameter value " + func.getExpression() + " in " + measure.getName()); + return; + } + if (StringUtils.isEmpty(func.getReturnType())) { + context.addResult(ResultLevel.ERROR, "Must define return type for function " + func.getExpression() + " in " + measure.getName()); + return; + } + + if (StringUtils.equalsIgnoreCase(FunctionDesc.PARAMETER_TYPE_COLUMN, type)) { + validateColumnParameter(context, cube, value); + } else if (StringUtils.equals(FunctionDesc.PARAMTER_TYPE_CONSTANT, type)) { + validateCostantParameter(context, cube, value); + } + validateReturnType(context, cube, func); + + if (func.isCount()) + countFuncs.add(func); + } + + if (countFuncs.size() != 1) { + context.addResult(ResultLevel.ERROR, "Must define one and only one count(1) function, but there are " + countFuncs.size() + " -- " + countFuncs); + } + } + + private void validateReturnType(ValidateContext context, CubeDesc cube, FunctionDesc funcDesc) { + + String func = funcDesc.getExpression(); + DataType rtype = funcDesc.getReturnDataType(); + + if (funcDesc.isCount()) { + if (rtype.isIntegerFamily() == false) { + context.addResult(ResultLevel.ERROR, "Return type for function " + func + " must be one of " + DataType.INTEGER_FAMILY); + } + } else if (funcDesc.isCountDistinct()) { + if (rtype.isHLLC() == false && funcDesc.isHolisticCountDistinct() == false) { + context.addResult(ResultLevel.ERROR, "Return type for function " + func + " must be hllc(10), hllc(12) etc."); + } + } else if (funcDesc.isMax() || funcDesc.isMin() || funcDesc.isSum()) { + if (rtype.isNumberFamily() == false) { + context.addResult(ResultLevel.ERROR, "Return type for function " + func + " must be one of " + DataType.NUMBER_FAMILY); + } + } else { + if (StringUtils.equalsIgnoreCase(KylinConfig.getInstanceFromEnv().getProperty(KEY_IGNORE_UNKNOWN_FUNC, "false"), "false")) { + context.addResult(ResultLevel.ERROR, "Unrecognized function: [" + func + "]"); + } + } + + } + + /** + * @param context + * @param cube + * @param value + */ + private void validateCostantParameter(ValidateContext context, CubeDesc cube, String value) { + try { + Integer.parseInt(value); + } catch (Exception e) { + context.addResult(ResultLevel.ERROR, "Parameter value must be number, but it is " + value); + } + } + + /** + * @param context + * @param cube + * @param value + */ + private void validateColumnParameter(ValidateContext context, CubeDesc cube, String value) { + String factTable = cube.getFactTable(); + if (StringUtils.isEmpty(factTable)) { + context.addResult(ResultLevel.ERROR, "Fact table can not be null."); + return; + } + TableDesc table = MetadataManager.getInstance(cube.getConfig()).getTableDesc(factTable); + if (table == null) { + context.addResult(ResultLevel.ERROR, "Fact table can not be found: " + cube); + return; + } + // Prepare column set + Set set = new HashSet(); + ColumnDesc[] cdesc = table.getColumns(); + for (int i = 0; i < cdesc.length; i++) { + ColumnDesc columnDesc = cdesc[i]; + set.add(columnDesc.getName()); + } + + String[] items = value.split(","); + for (int i = 0; i < items.length; i++) { + String item = items[i].trim(); + if (StringUtils.isEmpty(item)) { + continue; + } + if (!set.contains(item)) { + context.addResult(ResultLevel.ERROR, "Column [" + item + "] does not exist in factable table" + factTable); + } + } + + } +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/validation/rule/IKylinValidationConstances.java b/cube/src/main/java/com/kylinolap/cube/model/validation/rule/IKylinValidationConstances.java new file mode 100644 index 0000000..65968ba --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/validation/rule/IKylinValidationConstances.java @@ -0,0 +1,31 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model.validation.rule; + +import com.kylinolap.metadata.MetadataConstances; + +/** + * @author jianliu + * + */ +public interface IKylinValidationConstances extends MetadataConstances { + + public static final int DEFAULT_MAX_AGR_GROUP_SIZE = 20; + public static final String KEY_MAX_AGR_GROUP_SIZE = "rule_max.arggregation.group.size"; + public static final String KEY_IGNORE_UNKNOWN_FUNC = "rule_ignore_unknown_func"; + +} \ No newline at end of file diff --git a/cube/src/main/java/com/kylinolap/cube/model/validation/rule/MandatoryColumnRule.java b/cube/src/main/java/com/kylinolap/cube/model/validation/rule/MandatoryColumnRule.java new file mode 100644 index 0000000..1c66331 --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/validation/rule/MandatoryColumnRule.java @@ -0,0 +1,74 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model.validation.rule; + +import java.util.HashSet; +import java.util.Set; + +import org.apache.commons.lang.ArrayUtils; + +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.RowKeyColDesc; +import com.kylinolap.cube.model.validation.IValidatorRule; +import com.kylinolap.cube.model.validation.ResultLevel; +import com.kylinolap.cube.model.validation.ValidateContext; + +/** + * Validate that mandatory column must NOT appear in aggregation group. + * + * @author jianliu + * + */ +public class MandatoryColumnRule implements IValidatorRule { + + /* + * (non-Javadoc) + * + * @see + * com.kylinolap.metadata.validation.IValidatorRule#validate(java.lang.Object + * , com.kylinolap.metadata.validation.ValidateContext) + */ + @Override + public void validate(CubeDesc cube, ValidateContext context) { + Set mands = new HashSet(); + RowKeyColDesc[] cols = cube.getRowkey().getRowKeyColumns(); + if (cols == null || cols.length == 0) { + return; + } + for (int i = 0; i < cols.length; i++) { + RowKeyColDesc rowKeyColDesc = cols[i]; + if (rowKeyColDesc.isMandatory()) { + mands.add(rowKeyColDesc.getColumn()); + } + } + if (mands.isEmpty()) { + return; + } + String[][] groups = cube.getRowkey().getAggregationGroups(); + for (int i = 0; i < groups.length; i++) { + String[] group = groups[i]; + for (int j = 0; j < group.length; j++) { + String col = group[j]; + if (mands.contains(col)) { + context.addResult(ResultLevel.ERROR, "mandatory column " + col + " must not be in aggregation group [" + ArrayUtils.toString(group) + "]"); + } + } + } + + } + +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/validation/rule/RowKeyAttrRule.java b/cube/src/main/java/com/kylinolap/cube/model/validation/rule/RowKeyAttrRule.java new file mode 100644 index 0000000..1ebd8b6 --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/model/validation/rule/RowKeyAttrRule.java @@ -0,0 +1,69 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.model.validation.rule; + +import org.apache.commons.lang.StringUtils; + +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.RowKeyColDesc; +import com.kylinolap.cube.model.RowKeyDesc; +import com.kylinolap.cube.model.validation.IValidatorRule; +import com.kylinolap.cube.model.validation.ResultLevel; +import com.kylinolap.cube.model.validation.ValidateContext; + +/** + * Validate that only one of "length" and "dictionary" appears on rowkey_column + * + * @author jianliu + * + */ +public class RowKeyAttrRule implements IValidatorRule { + + /* + * (non-Javadoc) + * + * @see + * com.kylinolap.metadata.validation.IValidatorRule#validate(java.lang.Object + * , com.kylinolap.metadata.validation.ValidateContext) + */ + @Override + public void validate(CubeDesc cube, ValidateContext context) { + RowKeyDesc row = cube.getRowkey(); + if (row == null) { + context.addResult(ResultLevel.ERROR, "Rowkey does not exist"); + return; + } + + RowKeyColDesc[] rcd = row.getRowKeyColumns(); + if (rcd == null || rcd.length == 0) { + context.addResult(ResultLevel.ERROR, "Rowkey columns do not exist or is empty"); + return; + } + + for (int i = 0; i < rcd.length; i++) { + RowKeyColDesc rd = rcd[i]; + if (rd.getLength() != 0 && !StringUtils.isEmpty(rd.getDictionary())) { + context.addResult(ResultLevel.ERROR, "Rowkey column " + rd.getColumn() + " must not have both 'length' and 'dictionary' attribute"); + } + if (rd.getLength() == 0 && StringUtils.isEmpty(rd.getDictionary())) { + context.addResult(ResultLevel.ERROR, "Rowkey column " + rd.getColumn() + " must not have both 'length' and 'dictionary' empty"); + } + } + + } + +} diff --git a/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java b/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java index 964decf..c744100 100644 --- a/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java +++ b/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java @@ -40,13 +40,13 @@ import com.kylinolap.common.restclient.SingleValueCache; import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.DimensionDesc; +import com.kylinolap.cube.model.MeasureDesc; import com.kylinolap.metadata.MetadataManager; import com.kylinolap.metadata.model.ColumnDesc; import com.kylinolap.metadata.model.JoinDesc; import com.kylinolap.metadata.model.TableDesc; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.DimensionDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; import com.kylinolap.metadata.model.realization.FunctionDesc; import com.kylinolap.metadata.model.realization.TblColRef; diff --git a/cube/src/test/java/com/kylinolap/cube/CubeManagerCacheTest.java b/cube/src/test/java/com/kylinolap/cube/CubeManagerCacheTest.java index 372cc17..ddd9b06 100644 --- a/cube/src/test/java/com/kylinolap/cube/CubeManagerCacheTest.java +++ b/cube/src/test/java/com/kylinolap/cube/CubeManagerCacheTest.java @@ -24,9 +24,9 @@ import com.kylinolap.common.persistence.ResourceStore; import com.kylinolap.common.util.LocalFileMetadataTestCase; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.cube.CubeDesc; /** * @author yangli9 diff --git a/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java b/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java index 82d2c0e..f0dd717 100644 --- a/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java +++ b/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java @@ -25,10 +25,10 @@ import com.kylinolap.common.persistence.ResourceStore; import com.kylinolap.common.util.JsonUtil; import com.kylinolap.common.util.LocalFileMetadataTestCase; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.cube.CubeDesc; /** * @author yangli9 diff --git a/cube/src/test/java/com/kylinolap/cube/CubeSizeEstimationCLITest.java b/cube/src/test/java/com/kylinolap/cube/CubeSizeEstimationCLITest.java index 0f0a4b2..a6ee956 100644 --- a/cube/src/test/java/com/kylinolap/cube/CubeSizeEstimationCLITest.java +++ b/cube/src/test/java/com/kylinolap/cube/CubeSizeEstimationCLITest.java @@ -6,8 +6,8 @@ import com.kylinolap.common.util.LocalFileMetadataTestCase; import com.kylinolap.cube.estimation.CubeSizeEstimationCLI; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.cube.CubeDesc; /** * Created by honma on 9/1/14. diff --git a/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java b/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java index f6f81c1..1687148 100644 --- a/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java +++ b/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java @@ -32,10 +32,10 @@ import com.kylinolap.common.util.JsonUtil; import com.kylinolap.common.util.LocalFileMetadataTestCase; import com.kylinolap.cube.exception.CubeIntegrityException; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.cube.CubeDesc; /** * @author ysong1 diff --git a/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidSchedulerTest.java b/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidSchedulerTest.java index c3e4540..6304b6e 100644 --- a/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidSchedulerTest.java +++ b/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidSchedulerTest.java @@ -28,8 +28,8 @@ import org.junit.Test; import com.kylinolap.common.util.LocalFileMetadataTestCase; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.cube.CubeDesc; /** * @author George Song (ysong1) diff --git a/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidTest.java b/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidTest.java index 6682c9d..2c87f8f 100644 --- a/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidTest.java +++ b/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidTest.java @@ -22,8 +22,8 @@ import org.junit.Test; import com.kylinolap.common.util.LocalFileMetadataTestCase; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.cube.CubeDesc; /** * @author yangli9 diff --git a/cube/src/test/java/com/kylinolap/cube/kv/RowKeyDecoderTest.java b/cube/src/test/java/com/kylinolap/cube/kv/RowKeyDecoderTest.java index b78b2fb..52dfa9e 100644 --- a/cube/src/test/java/com/kylinolap/cube/kv/RowKeyDecoderTest.java +++ b/cube/src/test/java/com/kylinolap/cube/kv/RowKeyDecoderTest.java @@ -29,8 +29,8 @@ import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.cuboid.Cuboid; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.cube.CubeDesc; /** * @author George Song (ysong1) diff --git a/cube/src/test/java/com/kylinolap/cube/kv/RowKeyEncoderTest.java b/cube/src/test/java/com/kylinolap/cube/kv/RowKeyEncoderTest.java index a89e04f..ac13383 100644 --- a/cube/src/test/java/com/kylinolap/cube/kv/RowKeyEncoderTest.java +++ b/cube/src/test/java/com/kylinolap/cube/kv/RowKeyEncoderTest.java @@ -28,8 +28,8 @@ import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.cuboid.Cuboid; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.cube.CubeDesc; /** * @author George Song (ysong1) diff --git a/cube/src/test/java/com/kylinolap/cube/kv/RowValueDecoderTest.java b/cube/src/test/java/com/kylinolap/cube/kv/RowValueDecoderTest.java index 3a9c3e4..bb6e186 100644 --- a/cube/src/test/java/com/kylinolap/cube/kv/RowValueDecoderTest.java +++ b/cube/src/test/java/com/kylinolap/cube/kv/RowValueDecoderTest.java @@ -30,10 +30,10 @@ import com.kylinolap.common.util.LocalFileMetadataTestCase; import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.measure.MeasureCodec; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.HBaseColumnDesc; +import com.kylinolap.cube.model.MeasureDesc; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.HBaseColumnDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; import com.kylinolap.metadata.model.realization.FunctionDesc; /** diff --git a/cube/src/test/java/com/kylinolap/cube/measure/MeasureCodecTest.java b/cube/src/test/java/com/kylinolap/cube/measure/MeasureCodecTest.java index baacd72..07413d3 100644 --- a/cube/src/test/java/com/kylinolap/cube/measure/MeasureCodecTest.java +++ b/cube/src/test/java/com/kylinolap/cube/measure/MeasureCodecTest.java @@ -28,7 +28,7 @@ import com.kylinolap.common.hll.HyperLogLogPlusCounter; import com.kylinolap.cube.kv.RowConstants; -import com.kylinolap.metadata.model.cube.MeasureDesc; +import com.kylinolap.cube.model.MeasureDesc; import com.kylinolap.metadata.model.realization.FunctionDesc; /** diff --git a/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java b/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java index 532c2dc..850bf9b 100644 --- a/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java +++ b/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java @@ -29,8 +29,8 @@ import com.kylinolap.common.util.LocalFileMetadataTestCase; import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.cube.CubeDesc; /** * @author xduo diff --git a/dictionary/src/main/java/com/kylinolap/dict/DictionaryManager.java b/dictionary/src/main/java/com/kylinolap/dict/DictionaryManager.java index 65e8366..985848c 100644 --- a/dictionary/src/main/java/com/kylinolap/dict/DictionaryManager.java +++ b/dictionary/src/main/java/com/kylinolap/dict/DictionaryManager.java @@ -33,12 +33,12 @@ import com.kylinolap.common.KylinConfig; import com.kylinolap.common.persistence.ResourceStore; import com.kylinolap.common.util.HadoopUtil; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.dict.lookup.FileTable; import com.kylinolap.dict.lookup.HiveTable; import com.kylinolap.dict.lookup.ReadableTable; import com.kylinolap.dict.lookup.TableSignature; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.model.realization.TblColRef; public class DictionaryManager { diff --git a/dictionary/src/test/java/com/kylinolap/dict/DictionaryManagerTest.java b/dictionary/src/test/java/com/kylinolap/dict/DictionaryManagerTest.java index 2ee9a68..790e0cf 100644 --- a/dictionary/src/test/java/com/kylinolap/dict/DictionaryManagerTest.java +++ b/dictionary/src/test/java/com/kylinolap/dict/DictionaryManagerTest.java @@ -26,8 +26,8 @@ import com.kylinolap.common.util.JsonUtil; import com.kylinolap.common.util.LocalFileMetadataTestCase; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.model.realization.TblColRef; public class DictionaryManagerTest extends LocalFileMetadataTestCase { diff --git a/job/src/main/java/com/kylinolap/job/JobManager.java b/job/src/main/java/com/kylinolap/job/JobManager.java index 00aa8bb..ec82f3a 100644 --- a/job/src/main/java/com/kylinolap/job/JobManager.java +++ b/job/src/main/java/com/kylinolap/job/JobManager.java @@ -34,6 +34,7 @@ import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.CubeSegmentStatusEnum; import com.kylinolap.cube.exception.CubeIntegrityException; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.job.JobInstance.JobStep; @@ -45,7 +46,6 @@ import com.kylinolap.job.exception.InvalidJobInstanceException; import com.kylinolap.job.exception.JobException; import com.kylinolap.job.hadoop.hive.JoinedFlatTableDesc; -import com.kylinolap.metadata.model.cube.CubeDesc; /** * @author xjiang, ysong1 diff --git a/job/src/main/java/com/kylinolap/job/JoinedFlatTable.java b/job/src/main/java/com/kylinolap/job/JoinedFlatTable.java index 4a8d7fa..19e480d 100644 --- a/job/src/main/java/com/kylinolap/job/JoinedFlatTable.java +++ b/job/src/main/java/com/kylinolap/job/JoinedFlatTable.java @@ -33,13 +33,13 @@ import com.kylinolap.common.util.StringUtil; import com.kylinolap.cube.CubeSegment; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.DimensionDesc; import com.kylinolap.job.engine.JobEngineConfig; import com.kylinolap.job.hadoop.hive.JoinedFlatTableDesc; import com.kylinolap.job.hadoop.hive.JoinedFlatTableDesc.IntermediateColumnDesc; import com.kylinolap.job.hadoop.hive.SqlHiveDataTypeMapping; import com.kylinolap.metadata.model.JoinDesc; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.DimensionDesc; import com.kylinolap.metadata.model.realization.TblColRef; /** diff --git a/job/src/main/java/com/kylinolap/job/engine/JobEngineConfig.java b/job/src/main/java/com/kylinolap/job/engine/JobEngineConfig.java index 5527cf6..064e0b4 100644 --- a/job/src/main/java/com/kylinolap/job/engine/JobEngineConfig.java +++ b/job/src/main/java/com/kylinolap/job/engine/JobEngineConfig.java @@ -27,8 +27,8 @@ import org.slf4j.LoggerFactory; import com.kylinolap.common.KylinConfig; +import com.kylinolap.cube.model.CubeDesc.CubeCapacity; import com.kylinolap.job.tools.OptionsHelper; -import com.kylinolap.metadata.model.cube.CubeDesc.CubeCapacity; /** * @author ysong1 diff --git a/job/src/main/java/com/kylinolap/job/hadoop/cube/BaseCuboidMapper.java b/job/src/main/java/com/kylinolap/job/hadoop/cube/BaseCuboidMapper.java index f85a5c8..4cb155c 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/cube/BaseCuboidMapper.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/cube/BaseCuboidMapper.java @@ -38,11 +38,11 @@ import com.kylinolap.cube.kv.AbstractRowKeyEncoder; import com.kylinolap.cube.kv.RowConstants; import com.kylinolap.cube.measure.MeasureCodec; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.MeasureDesc; import com.kylinolap.job.constant.BatchConstants; import com.kylinolap.job.hadoop.AbstractHadoopJob; import com.kylinolap.job.hadoop.hive.JoinedFlatTableDesc; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; import com.kylinolap.metadata.model.realization.FunctionDesc; import com.kylinolap.metadata.model.realization.ParameterDesc; diff --git a/job/src/main/java/com/kylinolap/job/hadoop/cube/CubeHFileMapper.java b/job/src/main/java/com/kylinolap/job/hadoop/cube/CubeHFileMapper.java index 4f9b5c8..8fbb3c6 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/cube/CubeHFileMapper.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/cube/CubeHFileMapper.java @@ -32,12 +32,12 @@ import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.kv.RowConstants; import com.kylinolap.cube.measure.MeasureCodec; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.HBaseColumnDesc; +import com.kylinolap.cube.model.HBaseColumnFamilyDesc; +import com.kylinolap.cube.model.MeasureDesc; import com.kylinolap.job.constant.BatchConstants; import com.kylinolap.job.hadoop.AbstractHadoopJob; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.HBaseColumnDesc; -import com.kylinolap.metadata.model.cube.HBaseColumnFamilyDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; /** * @author George Song (ysong1) diff --git a/job/src/main/java/com/kylinolap/job/hadoop/cube/CuboidJob.java b/job/src/main/java/com/kylinolap/job/hadoop/cube/CuboidJob.java index 687fe10..e3bc002 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/cube/CuboidJob.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/cube/CuboidJob.java @@ -37,10 +37,10 @@ import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.cuboid.CuboidCLI; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.job.constant.BatchConstants; import com.kylinolap.job.exception.JobException; import com.kylinolap.job.hadoop.AbstractHadoopJob; -import com.kylinolap.metadata.model.cube.CubeDesc; /** * @author ysong1 diff --git a/job/src/main/java/com/kylinolap/job/hadoop/cube/CuboidReducer.java b/job/src/main/java/com/kylinolap/job/hadoop/cube/CuboidReducer.java index 50af652..fa1377d 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/cube/CuboidReducer.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/cube/CuboidReducer.java @@ -29,10 +29,10 @@ import com.kylinolap.cube.kv.RowConstants; import com.kylinolap.cube.measure.MeasureAggregators; import com.kylinolap.cube.measure.MeasureCodec; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.MeasureDesc; import com.kylinolap.job.constant.BatchConstants; import com.kylinolap.job.hadoop.AbstractHadoopJob; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; /** * @author George Song (ysong1) diff --git a/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsMapper.java b/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsMapper.java index f9b8ace..bd6d1cc 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsMapper.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsMapper.java @@ -30,12 +30,12 @@ import com.kylinolap.cube.common.BytesSplitter; import com.kylinolap.cube.common.SplittedBytes; import com.kylinolap.cube.cuboid.Cuboid; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.RowKeyDesc; import com.kylinolap.dict.DictionaryManager; import com.kylinolap.job.constant.BatchConstants; import com.kylinolap.job.hadoop.AbstractHadoopJob; import com.kylinolap.job.hadoop.hive.JoinedFlatTableDesc; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.RowKeyDesc; import com.kylinolap.metadata.model.realization.TblColRef; /** diff --git a/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsReducer.java b/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsReducer.java index 58ab57f..c8b1ee5 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsReducer.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsReducer.java @@ -35,9 +35,9 @@ import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.cuboid.Cuboid; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.job.constant.BatchConstants; import com.kylinolap.job.hadoop.AbstractHadoopJob; -import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.model.realization.TblColRef; /** diff --git a/job/src/main/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapper.java b/job/src/main/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapper.java index b069e74..f32a5f2 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapper.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapper.java @@ -36,11 +36,11 @@ import com.kylinolap.cube.common.SplittedBytes; import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.cube.kv.RowConstants; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.dict.Dictionary; import com.kylinolap.dict.DictionaryManager; import com.kylinolap.job.constant.BatchConstants; import com.kylinolap.job.hadoop.AbstractHadoopJob; -import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.model.realization.TblColRef; /** diff --git a/job/src/main/java/com/kylinolap/job/hadoop/cube/NDCuboidMapper.java b/job/src/main/java/com/kylinolap/job/hadoop/cube/NDCuboidMapper.java index b1f08b0..a50b6ba 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/cube/NDCuboidMapper.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/cube/NDCuboidMapper.java @@ -32,9 +32,9 @@ import com.kylinolap.cube.common.SplittedBytes; import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.cube.cuboid.CuboidScheduler; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.job.constant.BatchConstants; import com.kylinolap.job.hadoop.AbstractHadoopJob; -import com.kylinolap.metadata.model.cube.CubeDesc; /** * @author George Song (ysong1) diff --git a/job/src/main/java/com/kylinolap/job/hadoop/cube/NewBaseCuboidMapper.java b/job/src/main/java/com/kylinolap/job/hadoop/cube/NewBaseCuboidMapper.java index b1d30f8..a3e7797 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/cube/NewBaseCuboidMapper.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/cube/NewBaseCuboidMapper.java @@ -44,6 +44,9 @@ import com.kylinolap.cube.kv.AbstractRowKeyEncoder; import com.kylinolap.cube.kv.RowConstants; import com.kylinolap.cube.measure.MeasureCodec; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.DimensionDesc; +import com.kylinolap.cube.model.MeasureDesc; import com.kylinolap.dict.lookup.HiveTable; import com.kylinolap.dict.lookup.LookupBytesTable; import com.kylinolap.job.constant.BatchConstants; @@ -51,9 +54,6 @@ import com.kylinolap.metadata.MetadataManager; import com.kylinolap.metadata.model.JoinDesc; import com.kylinolap.metadata.model.TableDesc; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.DimensionDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; import com.kylinolap.metadata.model.realization.FunctionDesc; import com.kylinolap.metadata.model.realization.ParameterDesc; import com.kylinolap.metadata.model.realization.TblColRef; diff --git a/job/src/main/java/com/kylinolap/job/hadoop/cube/RangeKeyDistributionJob.java b/job/src/main/java/com/kylinolap/job/hadoop/cube/RangeKeyDistributionJob.java index 8245266..3327e0f 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/cube/RangeKeyDistributionJob.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/cube/RangeKeyDistributionJob.java @@ -33,9 +33,9 @@ import com.kylinolap.common.KylinConfig; import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; +import com.kylinolap.cube.model.CubeDesc.CubeCapacity; import com.kylinolap.job.constant.BatchConstants; import com.kylinolap.job.hadoop.AbstractHadoopJob; -import com.kylinolap.metadata.model.cube.CubeDesc.CubeCapacity; /** * @author xjiang, ysong1 diff --git a/job/src/main/java/com/kylinolap/job/hadoop/cube/RangeKeyDistributionReducer.java b/job/src/main/java/com/kylinolap/job/hadoop/cube/RangeKeyDistributionReducer.java index dafea36..761e388 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/cube/RangeKeyDistributionReducer.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/cube/RangeKeyDistributionReducer.java @@ -23,8 +23,8 @@ import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.util.StringUtils; +import com.kylinolap.cube.model.CubeDesc.CubeCapacity; import com.kylinolap.job.constant.BatchConstants; -import com.kylinolap.metadata.model.cube.CubeDesc.CubeCapacity; /** * @author ysong1 diff --git a/job/src/main/java/com/kylinolap/job/hadoop/hbase/BulkLoadJob.java b/job/src/main/java/com/kylinolap/job/hadoop/hbase/BulkLoadJob.java index 52546f3..6307380 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/hbase/BulkLoadJob.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/hbase/BulkLoadJob.java @@ -28,9 +28,9 @@ import com.kylinolap.common.KylinConfig; import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.HBaseColumnFamilyDesc; import com.kylinolap.job.hadoop.AbstractHadoopJob; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.HBaseColumnFamilyDesc; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/job/src/main/java/com/kylinolap/job/hadoop/hbase/CreateHTableJob.java b/job/src/main/java/com/kylinolap/job/hadoop/hbase/CreateHTableJob.java index 4cb20cb..3def0cc 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/hbase/CreateHTableJob.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/hbase/CreateHTableJob.java @@ -45,11 +45,11 @@ import com.kylinolap.common.util.HadoopUtil; import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.HBaseColumnFamilyDesc; import com.kylinolap.job.hadoop.AbstractHadoopJob; import com.kylinolap.job.tools.DeployCoprocessorCLI; import com.kylinolap.job.tools.LZOSupportnessChecker; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.HBaseColumnFamilyDesc; /** * @author George Song (ysong1) diff --git a/job/src/main/java/com/kylinolap/job/hadoop/hive/JoinedFlatTableDesc.java b/job/src/main/java/com/kylinolap/job/hadoop/hive/JoinedFlatTableDesc.java index 360d243..7356c70 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/hive/JoinedFlatTableDesc.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/hive/JoinedFlatTableDesc.java @@ -22,8 +22,8 @@ import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.cuboid.Cuboid; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.MeasureDesc; import com.kylinolap.metadata.model.realization.FunctionDesc; import com.kylinolap.metadata.model.realization.TblColRef; diff --git a/job/src/main/java/com/kylinolap/job/tools/CubeMigrationCLI.java b/job/src/main/java/com/kylinolap/job/tools/CubeMigrationCLI.java index a5ca470..6323fbb 100644 --- a/job/src/main/java/com/kylinolap/job/tools/CubeMigrationCLI.java +++ b/job/src/main/java/com/kylinolap/job/tools/CubeMigrationCLI.java @@ -5,6 +5,7 @@ import com.kylinolap.common.persistence.ResourceStore; import com.kylinolap.common.persistence.Serializer; import com.kylinolap.cube.*; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.dict.DictionaryInfo; import com.kylinolap.dict.DictionaryManager; @@ -12,7 +13,6 @@ import com.kylinolap.dict.lookup.SnapshotTable; import com.kylinolap.job.JobInstance; import com.kylinolap.metadata.model.TableDesc; -import com.kylinolap.metadata.model.cube.CubeDesc; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; diff --git a/job/src/test/java/com/kylinolap/job/hadoop/cube/BaseCuboidMapperTest.java b/job/src/test/java/com/kylinolap/job/hadoop/cube/BaseCuboidMapperTest.java index 95f255f..cf291d5 100644 --- a/job/src/test/java/com/kylinolap/job/hadoop/cube/BaseCuboidMapperTest.java +++ b/job/src/test/java/com/kylinolap/job/hadoop/cube/BaseCuboidMapperTest.java @@ -36,8 +36,8 @@ import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.kv.RowKeyDecoder; import com.kylinolap.cube.measure.MeasureCodec; +import com.kylinolap.cube.model.MeasureDesc; import com.kylinolap.job.constant.BatchConstants; -import com.kylinolap.metadata.model.cube.MeasureDesc; /** * @author George Song (ysong1) diff --git a/job/src/test/java/com/kylinolap/job/hadoop/cube/CubeHFileMapper2Test.java b/job/src/test/java/com/kylinolap/job/hadoop/cube/CubeHFileMapper2Test.java index ffe2fad..596575b 100644 --- a/job/src/test/java/com/kylinolap/job/hadoop/cube/CubeHFileMapper2Test.java +++ b/job/src/test/java/com/kylinolap/job/hadoop/cube/CubeHFileMapper2Test.java @@ -36,7 +36,7 @@ import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.kv.RowConstants; import com.kylinolap.cube.measure.MeasureCodec; -import com.kylinolap.metadata.model.cube.CubeDesc; +import com.kylinolap.cube.model.CubeDesc; /** * @author yangli9 diff --git a/job/src/test/java/com/kylinolap/job/hadoop/cube/CubeReducerTest.java b/job/src/test/java/com/kylinolap/job/hadoop/cube/CubeReducerTest.java index 3d54122..fac3cb6 100644 --- a/job/src/test/java/com/kylinolap/job/hadoop/cube/CubeReducerTest.java +++ b/job/src/test/java/com/kylinolap/job/hadoop/cube/CubeReducerTest.java @@ -36,8 +36,8 @@ import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.kv.RowConstants; import com.kylinolap.cube.measure.MeasureCodec; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.job.constant.BatchConstants; -import com.kylinolap.metadata.model.cube.CubeDesc; /** * @author George Song (ysong1) diff --git a/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java b/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java index 85ae4d1..c493f06 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java +++ b/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java @@ -17,6 +17,7 @@ import java.io.IOException; import java.io.InputStream; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -38,10 +39,7 @@ import com.kylinolap.common.restclient.SingleValueCache; import com.kylinolap.common.util.JsonUtil; import com.kylinolap.metadata.model.TableDesc; -import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.model.invertedindex.InvertedIndexDesc; -import com.kylinolap.metadata.validation.CubeMetadataValidator; -import com.kylinolap.metadata.validation.ValidateContext; /** * Serves (and caches) cube metadata for Kylin instance. @@ -55,7 +53,6 @@ private static final Logger logger = LoggerFactory.getLogger(MetadataManager.class); - private static final Serializer CUBE_SERIALIZER = new JsonSerializer(CubeDesc.class); private static final Serializer TABLE_SERIALIZER = new JsonSerializer(TableDesc.class); private static final Serializer IIDESC_SERIALIZER = new JsonSerializer(InvertedIndexDesc.class); @@ -103,8 +100,6 @@ public static void dropCache() { private KylinConfig config; // table name ==> SourceTable private SingleValueCache srcTableMap = new SingleValueCache(Broadcaster.TYPE.METADATA); - // name ==> CubeDesc - private SingleValueCache cubeDescMap = new SingleValueCache(Broadcaster.TYPE.METADATA); // name ==> InvertedIndexDesc private SingleValueCache iiDescMap = new SingleValueCache(Broadcaster.TYPE.METADATA); // name => value @@ -125,6 +120,10 @@ public ResourceStore getStore() { public List listAllTables() { return Lists.newArrayList(srcTableMap.values()); } + + public Map getAllTablesMap() { + return Collections.unmodifiableMap(srcTableMap.getMap()); + } public Map> listAllTableExdMap() { return srcTableExdMap.getMap(); @@ -180,61 +179,11 @@ public InvertedIndexDesc getInvertedIndexDesc(String name) { return iiDescMap.get(name); } - public CubeDesc getCubeDesc(String name) { - return cubeDescMap.get(name); - } - - /** - * Create a new CubeDesc - * - * @param cubeDesc - * @return - * @throws IOException - */ - public CubeDesc createCubeDesc(CubeDesc cubeDesc) throws IOException { - if (cubeDesc.getUuid() == null || cubeDesc.getName() == null) - throw new IllegalArgumentException(); - if (cubeDescMap.containsKey(cubeDesc.getName())) - throw new IllegalArgumentException("CubeDesc '" + cubeDesc.getName() + "' already exists"); - - try { - cubeDesc.init(config, srcTableMap.getMap()); - } catch (IllegalStateException e) { - cubeDesc.addError(e.getMessage(), true); - } - // Check base validation - if (!cubeDesc.getError().isEmpty()) { - return cubeDesc; - } - // Semantic validation - CubeMetadataValidator validator = new CubeMetadataValidator(); - ValidateContext context = validator.validate(cubeDesc, true); - if (!context.ifPass()) { - return cubeDesc; - } - - cubeDesc.setSignature(cubeDesc.calculateSignature()); - - String path = cubeDesc.getResourcePath(); - getStore().putResource(path, cubeDesc, CUBE_SERIALIZER); - cubeDescMap.put(cubeDesc.getName(), cubeDesc); - - return cubeDesc; - } - - // remove cubeDesc - public void removeCubeDesc(CubeDesc cubeDesc) throws IOException{ - String path = cubeDesc.getResourcePath(); - getStore().deleteResource(path); - cubeDescMap.remove(cubeDesc.getName()); - } - // sync on update private void init(KylinConfig config) throws IOException { this.config = config; reloadAllSourceTable(); reloadAllSourceTableExd(); - reloadAllCubeDesc(); reloadAllInvertedIndexDesc(); } @@ -305,55 +254,6 @@ private TableDesc loadSourceTable(String path) throws IOException { return t; } - private void reloadAllCubeDesc() throws IOException { - ResourceStore store = getStore(); - logger.info("Reloading Cube Metadata from folder " + store.getReadableResourcePath(ResourceStore.CUBE_DESC_RESOURCE_ROOT)); - - cubeDescMap.clear(); - - List paths = store.collectResourceRecursively(ResourceStore.CUBE_DESC_RESOURCE_ROOT, MetadataConstances.FILE_SURFIX); - for (String path : paths) { - CubeDesc desc; - try { - desc = loadCubeDesc(path); - } catch (Exception e) { - logger.error("Error loading cube desc " + path, e); - continue; - } - if (path.equals(desc.getResourcePath()) == false) { - logger.error("Skip suspicious desc at " + path + ", " + desc + " should be at " + desc.getResourcePath()); - continue; - } - if (cubeDescMap.containsKey(desc.getName())) { - logger.error("Dup CubeDesc name '" + desc.getName() + "' on path " + path); - continue; - } - - cubeDescMap.putLocal(desc.getName(), desc); - } - - logger.debug("Loaded " + cubeDescMap.size() + " Cube(s)"); - } - - private CubeDesc loadCubeDesc(String path) throws IOException { - ResourceStore store = getStore(); - logger.debug("Loading CubeDesc " + store.getReadableResourcePath(path)); - - CubeDesc ndesc = store.getResource(path, CubeDesc.class, CUBE_SERIALIZER); - - if (StringUtils.isBlank(ndesc.getName())) { - throw new IllegalStateException("CubeDesc name must not be blank"); - } - - ndesc.init(config, srcTableMap.getMap()); - - if (ndesc.getError().isEmpty() == false) { - throw new IllegalStateException("Cube desc at " + path + " has issues: " + ndesc.getError()); - } - - return ndesc; - } - private void reloadAllInvertedIndexDesc() throws IOException { ResourceStore store = getStore(); logger.info("Reloading Inverted Index Desc from folder " + store.getReadableResourcePath(ResourceStore.IIDESC_RESOURCE_ROOT)); @@ -399,74 +299,6 @@ private InvertedIndexDesc loadInvertedIndexDesc(String path) throws IOException } /** - * Update CubeDesc with the input. Broadcast the event into cluster - * - * @param desc - * @return - * @throws IOException - */ - public CubeDesc updateCubeDesc(CubeDesc desc) throws IOException { - // Validate CubeDesc - if (desc.getUuid() == null || desc.getName() == null) { - throw new IllegalArgumentException(); - } - String name = desc.getName(); - if (!cubeDescMap.containsKey(name)) { - throw new IllegalArgumentException("CubeDesc '" + name + "' does not exist."); - } - - try { - desc.init(config, srcTableMap.getMap()); - } catch (IllegalStateException e) { - desc.addError(e.getMessage(), true); - return desc; - } catch (IllegalArgumentException e) { - desc.addError(e.getMessage(), true); - return desc; - } - - // Semantic validation - CubeMetadataValidator validator = new CubeMetadataValidator(); - ValidateContext context = validator.validate(desc, true); - if (!context.ifPass()) { - return desc; - } - - desc.setSignature(desc.calculateSignature()); - - // Save Source - String path = desc.getResourcePath(); - getStore().putResource(path, desc, CUBE_SERIALIZER); - - // Reload the CubeDesc - CubeDesc ndesc = loadCubeDesc(path); - // Here replace the old one - cubeDescMap.put(ndesc.getName(), desc); - - return ndesc; - } - - /** - * Reload CubeDesc from resource store It will be triggered by an desc - * update event. - * - * @param name - * @throws IOException - */ - public CubeDesc reloadCubeDesc(String name) throws IOException { - - // Save Source - String path = CubeDesc.getCubeDescResourcePath(name); - - // Reload the CubeDesc - CubeDesc ndesc = loadCubeDesc(path); - - // Here replace the old one - cubeDescMap.put(ndesc.getName(), ndesc); - return ndesc; - } - - /** * Tell CubeManager that the cube instance has changed. The cube info will * be stored Reload the cube desc and source table A broadcast must be sent * out diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/CubeDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/CubeDesc.java deleted file mode 100644 index bbf9107..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/CubeDesc.java +++ /dev/null @@ -1,834 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.model.cube; - -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.net.util.Base64; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.kylinolap.common.KylinConfig; -import com.kylinolap.common.persistence.ResourceStore; -import com.kylinolap.common.persistence.RootPersistentEntity; -import com.kylinolap.common.util.Array; -import com.kylinolap.common.util.JsonUtil; -import com.kylinolap.metadata.MetadataConstances; -import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.ColumnDesc; -import com.kylinolap.metadata.model.DataModelDesc; -import com.kylinolap.metadata.model.DataType; -import com.kylinolap.metadata.model.JoinDesc; -import com.kylinolap.metadata.model.TableDesc; -import com.kylinolap.metadata.model.realization.FunctionDesc; -import com.kylinolap.metadata.model.realization.ParameterDesc; -import com.kylinolap.metadata.model.realization.TblColRef; - -/** - * Created with IntelliJ IDEA. User: lukhan Date: 9/24/13 Time: 10:40 AM To - * change this template use File | Settings | File Templates. - */ -@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) -public class CubeDesc extends RootPersistentEntity { - - public static enum CubeCapacity { - SMALL, MEDIUM, LARGE; - } - - public static enum DeriveType { - LOOKUP, PK_FK - } - - public static class DeriveInfo { - public DeriveType type; - public DimensionDesc dimension; - public TblColRef[] columns; - public boolean isOneToOne; // only used when ref from derived to host - - DeriveInfo(DeriveType type, DimensionDesc dimension, TblColRef[] columns, boolean isOneToOne) { - this.type = type; - this.dimension = dimension; - this.columns = columns; - this.isOneToOne = isOneToOne; - } - - @Override - public String toString() { - return "DeriveInfo [type=" + type + ", dimension=" + dimension + ", columns=" + Arrays.toString(columns) + ", isOneToOne=" + isOneToOne + "]"; - } - - } - - private KylinConfig config; - - @JsonProperty("name") - private String name; - @JsonProperty("data_model") - private DataModelDesc model; - @JsonProperty("description") - private String description; - @JsonProperty("fact_table") - private String factTable; - @JsonProperty("null_string") - private String[] nullStrings; - @JsonProperty("filter_condition") - private String filterCondition; - @JsonProperty("cube_partition_desc") - CubePartitionDesc cubePartitionDesc; - @JsonProperty("dimensions") - private List dimensions; - @JsonProperty("measures") - private List measures; - @JsonProperty("rowkey") - private RowKeyDesc rowkey; - @JsonProperty("hbase_mapping") - private HBaseMappingDesc hbaseMapping; - @JsonProperty("signature") - private String signature; - @JsonProperty("capacity") - private CubeCapacity capacity = CubeCapacity.MEDIUM; - @JsonProperty("notify_list") - private List notifyList; - - private Map> columnMap = new HashMap>(); - private LinkedHashSet allColumns = new LinkedHashSet(); - private LinkedHashSet dimensionColumns = new LinkedHashSet(); - private Map derivedToHostMap = Maps.newHashMap(); - private Map, List> hostToDerivedMap = Maps.newHashMap(); - - /** - * Error messages during resolving json metadata - */ - private List errors = new ArrayList(); - - /** - * @return all columns this cube can support, including derived - */ - public Set listAllColumns() { - return allColumns; - } - - /** - * @return dimension columns including derived, BUT NOT measures - */ - public Set listDimensionColumnsIncludingDerived() { - return dimensionColumns; - } - - /** - * @return dimension columns excluding derived and measures - */ - public List listDimensionColumnsExcludingDerived() { - List result = new ArrayList(); - for (TblColRef col : dimensionColumns) { - if (isDerived(col) == false) - result.add(col); - } - return result; - } - - /** - * Find FunctionDesc by Full Expression. - * - * @return - */ - public FunctionDesc findFunctionOnCube(FunctionDesc manualFunc) { - for (MeasureDesc m : measures) { - if (m.getFunction().equals(manualFunc)) - return m.getFunction(); - } - return null; - } - - public TblColRef findColumnRef(String table, String column) { - Map cols = columnMap.get(table); - if (cols == null) - return null; - else - return cols.get(column); - } - - public DimensionDesc findDimensionByColumn(TblColRef col) { - for (DimensionDesc dim : dimensions) { - if (ArrayUtils.contains(dim.getColumnRefs(), col)) - return dim; - } - return null; - } - - public DimensionDesc findDimensionByTable(String lookupTableName) { - lookupTableName = lookupTableName.toUpperCase(); - for (DimensionDesc dim : dimensions) - if (dim.getTable() != null && dim.getTable().equals(lookupTableName)) - return dim; - return null; - } - - public DimensionDesc findDimensionByName(String dimName) { - dimName = dimName.toUpperCase(); - for (DimensionDesc dim : dimensions) { - if (dimName.equals(dim.getName())) - return dim; - } - return null; - } - - public TblColRef findPKByFK(TblColRef fk) { - assert isFactTable(fk.getTable()); - - TblColRef candidate = null; - - for (DimensionDesc dim : dimensions) { - JoinDesc join = dim.getJoin(); - if (join == null) - continue; - - int find = ArrayUtils.indexOf(join.getForeignKeyColumns(), fk); - if (find >= 0) { - candidate = join.getPrimaryKeyColumns()[find]; - if (join.getForeignKeyColumns().length == 1) { // is single - // column join? - break; - } - } - } - return candidate; - } - - /** - * Get all functions from each measure. - * - * @return - */ - public List listAllFunctions() { - List functions = new ArrayList(); - for (MeasureDesc m : measures) { - functions.add(m.getFunction()); - } - return functions; - } - - public List listTables() { - MetadataManager metaMgr = MetadataManager.getInstance(config); - HashSet tableNames = new HashSet(); - List result = new ArrayList(); - - tableNames.add(factTable.toUpperCase()); - for (DimensionDesc dim : dimensions) { - String table = dim.getTable(); - if (table != null) - tableNames.add(table.toUpperCase()); - } - - for (String tableName : tableNames) { - result.add(metaMgr.getTableDesc(tableName)); - } - - return result; - } - - public boolean isFactTable(String factTable) { - return this.factTable.equalsIgnoreCase(factTable); - } - - public boolean isDerived(TblColRef col) { - return derivedToHostMap.containsKey(col); - } - - public DeriveInfo getHostInfo(TblColRef derived) { - return derivedToHostMap.get(derived); - } - - public Map, List> getHostToDerivedInfo(List rowCols, Collection wantedCols) { - Map, List> result = new HashMap, List>(); - for (Entry, List> entry : hostToDerivedMap.entrySet()) { - Array hostCols = entry.getKey(); - boolean hostOnRow = rowCols.containsAll(Arrays.asList(hostCols.data)); - if (!hostOnRow) - continue; - - List wantedInfo = new ArrayList(); - for (DeriveInfo info : entry.getValue()) { - if (wantedCols == null || Collections.disjoint(wantedCols, Arrays.asList(info.columns)) == false) // has - // any - // wanted - // columns? - wantedInfo.add(info); - } - - if (wantedInfo.size() > 0) - result.put(hostCols, wantedInfo); - } - return result; - } - - public String getResourcePath() { - return getCubeDescResourcePath(name); - } - - public static String getCubeDescResourcePath(String descName) { - return ResourceStore.CUBE_DESC_RESOURCE_ROOT + "/" + descName + MetadataConstances.FILE_SURFIX; - } - - // ============================================================================ - - public HBaseMappingDesc getHBaseMapping() { - return hbaseMapping; - } - - public void setHBaseMapping(HBaseMappingDesc hbaseMapping) { - this.hbaseMapping = hbaseMapping; - } - - public KylinConfig getConfig() { - return config; - } - - public void setConfig(KylinConfig config) { - this.config = config; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getFactTable() { - return factTable; - } - - public void setFactTable(String factTable) { - this.factTable = factTable; - } - - public String[] getNullStrings() { - return nullStrings; - } - - public String getFilterCondition() { - return filterCondition; - } - - public void setFilterCondition(String filterCondition) { - this.filterCondition = filterCondition; - } - - public CubePartitionDesc getCubePartitionDesc() { - return cubePartitionDesc; - } - - public void setCubePartitionDesc(CubePartitionDesc cubePartitionDesc) { - this.cubePartitionDesc = cubePartitionDesc; - } - - public List getDimensions() { - return dimensions; - } - - public void setDimensions(List dimensions) { - this.dimensions = dimensions; - } - - public List getMeasures() { - return measures; - } - - public void setMeasures(List measures) { - this.measures = measures; - } - - public RowKeyDesc getRowkey() { - return rowkey; - } - - public void setRowkey(RowKeyDesc rowkey) { - this.rowkey = rowkey; - } - - public String getSignature() { - return signature; - } - - public void setSignature(String signature) { - this.signature = signature; - } - - public CubeCapacity getCapacity() { - return capacity; - } - - public void setCapacity(CubeCapacity capacity) { - this.capacity = capacity; - } - - public List getNotifyList() { - return notifyList; - } - - public void setNotifyList(List notifyList) { - this.notifyList = notifyList; - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - - CubeDesc cubeDesc = (CubeDesc) o; - - if (!name.equals(cubeDesc.name)) - return false; - if (!factTable.equals(cubeDesc.factTable)) - return false; - - return true; - } - - @Override - public int hashCode() { - int result = 0; - result = 31 * result + name.hashCode(); - result = 31 * result + factTable.hashCode(); - return result; - } - - @Override - public String toString() { - return "CubeDesc [name=" + name + ", factTable=" + factTable + ", cubePartitionDesc=" + cubePartitionDesc + ", dimensions=" + dimensions + ", measures=" + measures + ", rowkey=" + rowkey + ", hbaseMapping=" + hbaseMapping + "]"; - } - - public String calculateSignature() { - MessageDigest md = null; - try { - md = MessageDigest.getInstance("MD5"); - StringBuilder sigString = new StringBuilder(); - sigString.append(this.name).append("|").append(this.factTable).append("|").append(JsonUtil.writeValueAsString(this.cubePartitionDesc)).append("|").append(JsonUtil.writeValueAsString(this.dimensions)).append("|").append(JsonUtil.writeValueAsString(this.measures)).append("|").append(JsonUtil.writeValueAsString(this.rowkey)).append("|").append(JsonUtil.writeValueAsString(this.hbaseMapping)); - - byte[] signature = md.digest(sigString.toString().getBytes()); - return new String(Base64.encodeBase64(signature)); - } catch (NoSuchAlgorithmException e) { - throw new RuntimeException("Failed to calculate signature"); - } catch (JsonProcessingException e) { - throw new RuntimeException("Failed to calculate signature"); - } - } - - public Map buildColumnNameAbbreviation() { - Map r = new HashMap(); - for (TblColRef col : listDimensionColumnsExcludingDerived()) { - r.put(col.getName(), col); - } - return r; - } - - public void init(KylinConfig config, Map tables) { - this.errors.clear(); - this.config = config; - - if (factTable != null) - factTable = factTable.toUpperCase(); - - for (DimensionDesc dim : dimensions) { - dim.init(tables); - } - - sortDimAndMeasure(); - - initJoinColumns(tables); - initDimensionColumns(tables); - initMeasureColumns(tables); - - rowkey.init(this); - if (hbaseMapping != null) { - hbaseMapping.init(this); - } - - initMeasureReferenceToColumnFamily(); - - if (null != this.cubePartitionDesc) { - this.cubePartitionDesc.init(columnMap); - } - - // check all dimension columns are presented on rowkey - List dimCols = listDimensionColumnsExcludingDerived(); - if (rowkey.getRowKeyColumns().length != dimCols.size()) { - addError("RowKey columns count (" + rowkey.getRowKeyColumns().length + ") does not equal to dimension columns count (" + dimCols.size() + "). "); - } - } - - private void initDimensionColumns(Map tables) { - // fill back ColRefDesc - for (DimensionDesc dim : dimensions) { - TableDesc dimTable = tables.get(dim.getTable()); - JoinDesc join = dim.getJoin(); - - ArrayList dimColList = new ArrayList(); - ArrayList hostColList = new ArrayList(); - - // dimension column - if (dim.getColumn() != null) { - if ("{FK}".equals(dim.getColumn())) { - for (TblColRef ref : join.getForeignKeyColumns()) { - TblColRef inited = initDimensionColRef(ref); - dimColList.add(inited); - hostColList.add(inited); - } - } else { - TblColRef ref = initDimensionColRef(dimTable, dim.getColumn()); - dimColList.add(ref); - hostColList.add(ref); - } - } - // hierarchy columns - if (dim.getHierarchy() != null) { - for (HierarchyDesc hier : dim.getHierarchy()) { - TblColRef ref = initDimensionColRef(dimTable, hier.getColumn()); - hier.setColumnRef(ref); - dimColList.add(ref); - } - if (hostColList.isEmpty()) { // the last hierarchy could serve - // as host when col is - // unspecified - hostColList.add(dimColList.get(dimColList.size() - 1)); - } - } - TblColRef[] dimCols = (TblColRef[]) dimColList.toArray(new TblColRef[dimColList.size()]); - dim.setColumnRefs(dimCols); - - // lookup derived columns - TblColRef[] hostCols = (TblColRef[]) hostColList.toArray(new TblColRef[hostColList.size()]); - String[] derived = dim.getDerived(); - if (derived != null) { - String[][] split = splitDerivedColumnAndExtra(derived); - String[] derivedNames = split[0]; - String[] derivedExtra = split[1]; - TblColRef[] derivedCols = new TblColRef[derivedNames.length]; - for (int i = 0; i < derivedNames.length; i++) { - derivedCols[i] = initDimensionColRef(dimTable, derivedNames[i]); - } - initDerivedMap(hostCols, DeriveType.LOOKUP, dim, derivedCols, derivedExtra); - } - - // FK derived column - if (join != null) { - TblColRef[] fk = join.getForeignKeyColumns(); - TblColRef[] pk = join.getPrimaryKeyColumns(); - for (int i = 0; i < fk.length; i++) { - int find = ArrayUtils.indexOf(hostCols, fk[i]); - if (find >= 0) { - TblColRef derivedCol = initDimensionColRef(pk[i]); - initDerivedMap(hostCols[find], DeriveType.PK_FK, dim, derivedCol); - } - } - for (int i = 0; i < pk.length; i++) { - int find = ArrayUtils.indexOf(hostCols, pk[i]); - if (find >= 0) { - TblColRef derivedCol = initDimensionColRef(fk[i]); - initDerivedMap(hostCols[find], DeriveType.PK_FK, dim, derivedCol); - } - } - } - } - } - - private String[][] splitDerivedColumnAndExtra(String[] derived) { - String[] cols = new String[derived.length]; - String[] extra = new String[derived.length]; - for (int i = 0; i < derived.length; i++) { - String str = derived[i]; - int cut = str.indexOf(":"); - if (cut >= 0) { - cols[i] = str.substring(0, cut); - extra[i] = str.substring(cut + 1).trim(); - } else { - cols[i] = str; - extra[i] = ""; - } - } - return new String[][] { cols, extra }; - } - - private void initDerivedMap(TblColRef hostCol, DeriveType type, DimensionDesc dimension, TblColRef derivedCol) { - initDerivedMap(new TblColRef[] { hostCol }, type, dimension, new TblColRef[] { derivedCol }, null); - } - - private void initDerivedMap(TblColRef[] hostCols, DeriveType type, DimensionDesc dimension, TblColRef[] derivedCols, String[] extra) { - if (hostCols.length == 0 || derivedCols.length == 0) - throw new IllegalStateException("host/derived columns must not be empty"); - - Array hostColArray = new Array(hostCols); - List infoList = hostToDerivedMap.get(hostColArray); - if (infoList == null) { - hostToDerivedMap.put(hostColArray, infoList = new ArrayList()); - } - infoList.add(new DeriveInfo(type, dimension, derivedCols, false)); - - for (int i = 0; i < derivedCols.length; i++) { - TblColRef derivedCol = derivedCols[i]; - boolean isOneToOne = type == DeriveType.PK_FK || ArrayUtils.contains(hostCols, derivedCol) || (extra != null && extra[i].contains("1-1")); - derivedToHostMap.put(derivedCol, new DeriveInfo(type, dimension, hostCols, isOneToOne)); - } - } - - private TblColRef initDimensionColRef(TableDesc table, String colName) { - ColumnDesc col = table.findColumnByName(colName); - if (col == null) - throw new IllegalArgumentException("No column '" + colName + "' found in table " + table); - - TblColRef ref = new TblColRef(col); - return initDimensionColRef(ref); - } - - private TblColRef initDimensionColRef(TblColRef ref) { - TblColRef existing = findColumnRef(ref.getTable(), ref.getName()); - if (existing != null) { - return existing; - } - - allColumns.add(ref); - dimensionColumns.add(ref); - - Map cols = columnMap.get(ref.getTable()); - if (cols == null) { - columnMap.put(ref.getTable(), cols = new HashMap()); - } - cols.put(ref.getName(), ref); - return ref; - } - - private void initJoinColumns(Map tables) { - // join columns may or may not present in cube; - // here we don't modify 'allColumns' and 'dimensionColumns'; - // initDimensionColumns() will do the update - for (DimensionDesc dim : dimensions) { - TableDesc dimTable = tables.get(dim.getTable()); - - JoinDesc join = dim.getJoin(); - if (join == null) - continue; - - // primary key - String[] pks = join.getPrimaryKey(); - TblColRef[] pkCols = new TblColRef[pks.length]; - for (int i = 0; i < pks.length; i++) { - ColumnDesc col = dimTable.findColumnByName(pks[i]); - if (col == null) { - addError("Can't find column " + pks[i] + " in table " + dimTable.getName()); - } - TblColRef colRef = new TblColRef(col); - pks[i] = colRef.getName(); - pkCols[i] = colRef; - } - join.setPrimaryKeyColumns(pkCols); - // foreign key - TableDesc factTable = tables.get(this.factTable); - if (factTable == null) { - addError("Fact table does not exist:" + this.factTable); - } - String[] fks = join.getForeignKey(); - TblColRef[] fkCols = new TblColRef[fks.length]; - for (int i = 0; i < fks.length; i++) { - ColumnDesc col = factTable.findColumnByName(fks[i]); - if (col == null) { - addError("Can't find column " + fks[i] + " in table " + this.factTable); - } - TblColRef colRef = new TblColRef(col); - fks[i] = colRef.getName(); - fkCols[i] = colRef; - } - join.setForeignKeyColumns(fkCols); - // Validate join in dimension - if (pkCols.length != fkCols.length) { - addError("Primary keys(" + dim.getTable() + ")" + Arrays.toString(pks) + " are not consistent with Foreign keys(" + this.factTable + ") " + Arrays.toString(fks)); - } - for (int i = 0; i < fkCols.length; i++) { - if (!fkCols[i].getDatatype().equals(pkCols[i].getDatatype())) { - addError("Primary key " + dim.getTable() + "." + pkCols[i].getName() + "." + pkCols[i].getDatatype() + " are not consistent with Foreign key " + this.factTable + "." + fkCols[i].getName() + "." + fkCols[i].getDatatype()); - } - } - - } - } - - private void initMeasureColumns(Map tables) { - if (measures == null || measures.isEmpty()) { - return; - } - - TableDesc factTable = tables.get(getFactTable()); - for (MeasureDesc m : measures) { - m.setName(m.getName().toUpperCase()); - - if (m.getDependentMeasureRef() != null) { - m.setDependentMeasureRef(m.getDependentMeasureRef().toUpperCase()); - } - - FunctionDesc f = m.getFunction(); - f.setExpression(f.getExpression().toUpperCase()); - f.setReturnDataType(DataType.getInstance(f.getReturnType())); - - ParameterDesc p = f.getParameter(); - p.normalizeColumnValue(); - - if (p.isColumnType()) { - ArrayList colRefs = Lists.newArrayList(); - for (String cName : p.getValue().split("\\s*,\\s*")) { - ColumnDesc sourceColumn = factTable.findColumnByName(cName); - TblColRef colRef = new TblColRef(sourceColumn); - colRefs.add(colRef); - allColumns.add(colRef); - } - if (colRefs.isEmpty() == false) - p.setColRefs(colRefs); - } - } - } - - private void initMeasureReferenceToColumnFamily() { - if (measures == null || measures.size() == 0) - return; - - Map measureCache = new HashMap(); - for (MeasureDesc m : measures) - measureCache.put(m.getName(), m); - - for (HBaseColumnFamilyDesc cf : getHBaseMapping().getColumnFamily()) { - for (HBaseColumnDesc c : cf.getColumns()) { - MeasureDesc[] measureDescs = new MeasureDesc[c.getMeasureRefs().length]; - for (int i = 0; i < c.getMeasureRefs().length; i++) { - measureDescs[i] = measureCache.get(c.getMeasureRefs()[i]); - } - c.setMeasures(measureDescs); - c.setColumnFamilyName(cf.getName()); - } - } - } - - private void sortDimAndMeasure() { - sortDimensionsByID(); - sortMeasuresByID(); - for (DimensionDesc dim : dimensions) { - sortHierarchiesByLevel(dim.getHierarchy()); - } - } - - private void sortDimensionsByID() { - Collections.sort(dimensions, new Comparator() { - @Override - public int compare(DimensionDesc d1, DimensionDesc d2) { - Integer id1 = d1.getId(); - Integer id2 = d2.getId(); - return id1.compareTo(id2); - } - }); - } - - private void sortMeasuresByID() { - if (measures == null) { - measures = Lists.newArrayList(); - } - - Collections.sort(measures, new Comparator() { - @Override - public int compare(MeasureDesc m1, MeasureDesc m2) { - Integer id1 = m1.getId(); - Integer id2 = m2.getId(); - return id1.compareTo(id2); - } - }); - } - - private void sortHierarchiesByLevel(HierarchyDesc[] hierarchies) { - if (hierarchies != null) { - Arrays.sort(hierarchies, new Comparator() { - @Override - public int compare(HierarchyDesc h1, HierarchyDesc h2) { - Integer level1 = Integer.parseInt(h1.getLevel()); - Integer level2 = Integer.parseInt(h2.getLevel()); - return level1.compareTo(level2); - } - }); - } - } - - public boolean hasHolisticCountDistinctMeasures() { - for (MeasureDesc measure : measures) { - if (measure.getFunction().isHolisticCountDistinct()) { - return true; - } - } - return false; - } - - /** - * Add error info and thrown exception out - * - * @param message - */ - public void addError(String message) { - addError(message, false); - } - - /** - * @param message - * error message - * @param silent - * if throw exception - */ - public void addError(String message, boolean silent) { - if (!silent) { - throw new IllegalStateException(message); - } else { - this.errors.add(message); - } - } - - public List getError() { - return this.errors; - } - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/CubePartitionDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/CubePartitionDesc.java deleted file mode 100644 index 1de33b1..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/CubePartitionDesc.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.model.cube; - -import java.util.Map; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.kylinolap.metadata.model.realization.TblColRef; - -/** - * @author xduo - * - */ -@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) -public class CubePartitionDesc { - - public static enum CubePartitionType { - APPEND, UPDATE_INSERT - } - - @JsonProperty("partition_date_column") - private String partitionDateColumn; - @JsonProperty("partition_date_start") - private long partitionDateStart = 0L; - @JsonProperty("cube_partition_type") - private CubePartitionType cubePartitionType = CubePartitionType.APPEND; - - private TblColRef partitionDateColumnRef; - - public void init(Map> columnMap) { - if (null != partitionDateColumn) { - String[] columns = partitionDateColumn.split("\\."); - - if (null != columns && columns.length == 2) { - Map cols = columnMap.get(columns[0].toUpperCase()); - if (cols != null) - partitionDateColumnRef = cols.get(columns[1].toUpperCase()); - - } - } - } - - public String getPartitionDateColumn() { - return partitionDateColumn; - } - - public void setPartitionDateColumn(String partitionDateColumn) { - this.partitionDateColumn = partitionDateColumn; - } - - public long getPartitionDateStart() { - return partitionDateStart; - } - - public void setPartitionDateStart(long partitionDateStart) { - this.partitionDateStart = partitionDateStart; - } - - public CubePartitionType getCubePartitionType() { - return cubePartitionType; - } - - public void setCubePartitionType(CubePartitionType cubePartitionType) { - this.cubePartitionType = cubePartitionType; - } - - public TblColRef getPartitionDateColumnRef() { - return partitionDateColumnRef; - } - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/DimensionDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/DimensionDesc.java deleted file mode 100644 index 05f1100..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/DimensionDesc.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.model.cube; - -import java.util.Arrays; -import java.util.Map; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.kylinolap.common.util.StringUtil; -import com.kylinolap.metadata.model.JoinDesc; -import com.kylinolap.metadata.model.TableDesc; -import com.kylinolap.metadata.model.realization.TblColRef; - -/** - * Created with IntelliJ IDEA. User: lukhan Date: 9/24/13 Time: 10:40 AM To - * change this template use File | Settings | File Templates. - */ -@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) -public class DimensionDesc { - - @JsonProperty("id") - private int id; - @JsonProperty("name") - private String name; - @JsonProperty("join") - private JoinDesc join; - @JsonProperty("hierarchy") - private HierarchyDesc[] hierarchy; - @JsonProperty("table") - private String table; - @JsonProperty("column") - private String column; - @JsonProperty("datatype") - private String datatype; - @JsonProperty("derived") - private String[] derived; - - // computed - private TblColRef[] columnRefs; - private TblColRef[] derivedColRefs; - - public boolean isHierarchyColumn(TblColRef col) { - if (hierarchy == null) - return false; - - for (HierarchyDesc hier : hierarchy) { - if (hier.getColumnRef().equals(col)) - return true; - } - return false; - } - - public String getDatatype() { - return datatype; - } - - public void setDatatype(String datatype) { - this.datatype = datatype; - } - - public String getTable() { - return table.toUpperCase(); - } - - public void setTable(String table) { - this.table = table; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public JoinDesc getJoin() { - return join; - } - - public void setJoin(JoinDesc join) { - this.join = join; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public TblColRef[] getColumnRefs() { - return this.columnRefs; - } - - public void setColumnRefs(TblColRef[] colRefs) { - this.columnRefs = colRefs; - } - - public String getColumn() { - return this.column; - } - - public void setColumn(String column) { - this.column = column; - if (this.column != null) - this.column = this.column.toUpperCase(); - } - - public HierarchyDesc[] getHierarchy() { - return hierarchy; - } - - public void setHierarchy(HierarchyDesc[] hierarchy) { - this.hierarchy = hierarchy; - } - - public String[] getDerived() { - return derived; - } - - public void setDerived(String[] derived) { - this.derived = derived; - } - - public TblColRef[] getDerivedColRefs() { - return derivedColRefs; - } - - public void setDerivedColRefs(TblColRef[] derivedColRefs) { - this.derivedColRefs = derivedColRefs; - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - - DimensionDesc that = (DimensionDesc) o; - - if (id != that.id) - return false; - if (!name.equals(that.name)) - return false; - - return true; - } - - @Override - public int hashCode() { - int result = id; - result = 31 * result + name.hashCode(); - return result; - } - - @Override - public String toString() { - return "DimensionDesc [name=" + name + ", join=" + join + ", hierarchy=" + Arrays.toString(hierarchy) + ", table=" + table + ", column=" + column + ", datatype=" + datatype + ", derived=" + Arrays.toString(derived) + "]"; - } - - public void init(Map tables) { - if (name != null) - name = name.toUpperCase(); - if (table != null) - table = table.toUpperCase(); - if (column != null) - column = column.toUpperCase(); - - TableDesc tableDesc = tables.get(table); - if (tableDesc == null) - throw new IllegalStateException("Can't find table " + table + " on dimension " + name); - - if (hierarchy != null && hierarchy.length == 0) - hierarchy = null; - if (derived != null && derived.length == 0) - derived = null; - - if (join != null) { - StringUtil.toUpperCaseArray(join.getForeignKey(), join.getForeignKey()); - StringUtil.toUpperCaseArray(join.getPrimaryKey(), join.getPrimaryKey()); - } - - if (hierarchy != null) { - for (HierarchyDesc h : hierarchy) - h.setColumn(h.getColumn().toUpperCase()); - } - - if (derived != null) { - StringUtil.toUpperCaseArray(derived, derived); - } - } - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseColumnDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseColumnDesc.java deleted file mode 100644 index c1eb6a6..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseColumnDesc.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.model.cube; - -import java.util.Arrays; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.kylinolap.metadata.model.realization.FunctionDesc; - -/** - * Created with IntelliJ IDEA. User: lukhan Date: 9/30/13 Time: 10:57 AM To - * change this template use File | Settings | File Templates. - */ -@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) -public class HBaseColumnDesc { - - @JsonProperty("qualifier") - private String qualifier; - @JsonProperty("measure_refs") - private String[] measureRefs; - - // these two will be assemble in runtime. - private MeasureDesc[] measures; - private String columnFamilyName; - - public String getQualifier() { - return qualifier; - } - - public void setQualifier(String qualifier) { - this.qualifier = qualifier; - } - - public String[] getMeasureRefs() { - return measureRefs; - } - - public void setMeasureRefs(String[] measureRefs) { - this.measureRefs = measureRefs; - } - - public MeasureDesc[] getMeasures() { - return measures; - } - - public int findMeasureIndex(FunctionDesc function) { - for (int i = 0; i < measures.length; i++) { - if (measures[i].getFunction().equals(function)) { - return i; - } - } - return -1; - } - - public void setMeasures(MeasureDesc[] measures) { - this.measures = measures; - } - - public String getColumnFamilyName() { - return columnFamilyName; - } - - public void setColumnFamilyName(String columnFamilyName) { - this.columnFamilyName = columnFamilyName; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((columnFamilyName == null) ? 0 : columnFamilyName.hashCode()); - result = prime * result + ((qualifier == null) ? 0 : qualifier.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - HBaseColumnDesc other = (HBaseColumnDesc) obj; - if (columnFamilyName == null) { - if (other.columnFamilyName != null) - return false; - } else if (!columnFamilyName.equals(other.columnFamilyName)) - return false; - if (qualifier == null) { - if (other.qualifier != null) - return false; - } else if (!qualifier.equals(other.qualifier)) - return false; - return true; - } - - @Override - public String toString() { - return "HBaseColumnDesc [qualifier=" + qualifier + ", measureRefs=" + Arrays.toString(measureRefs) + "]"; - } - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseColumnFamilyDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseColumnFamilyDesc.java deleted file mode 100644 index 4560ec9..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseColumnFamilyDesc.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.model.cube; - -import java.util.Arrays; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Created with IntelliJ IDEA. User: lukhan Date: 9/30/13 Time: 10:41 AM To - * change this template use File | Settings | File Templates. - */ -@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) -public class HBaseColumnFamilyDesc { - - @JsonProperty("name") - private String name; - @JsonProperty("columns") - private HBaseColumnDesc[] columns; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public HBaseColumnDesc[] getColumns() { - return columns; - } - - public void setColumns(HBaseColumnDesc[] columns) { - this.columns = columns; - } - - @Override - public String toString() { - return "HBaseColumnFamilyDesc [name=" + name + ", columns=" + Arrays.toString(columns) + "]"; - } - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseMappingDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseMappingDesc.java deleted file mode 100644 index 4493cbd..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/HBaseMappingDesc.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.model.cube; - -import java.util.Arrays; -import java.util.Collection; -import java.util.LinkedList; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.kylinolap.common.util.StringUtil; -import com.kylinolap.metadata.model.realization.FunctionDesc; - -/** - * Created with IntelliJ IDEA. User: lukhan Date: 9/24/13 Time: 10:44 AM To - * change this template use File | Settings | File Templates. - */ -@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) -public class HBaseMappingDesc { - - @JsonProperty("column_family") - private HBaseColumnFamilyDesc[] columnFamily; - - // point to the cube instance which contain this HBaseMappingDesc instance. - private CubeDesc cubeRef; - - public Collection findHBaseColumnByFunction(FunctionDesc function) { - Collection result = new LinkedList(); - HBaseMappingDesc hbaseMapping = cubeRef.getHBaseMapping(); - if (hbaseMapping == null || hbaseMapping.getColumnFamily() == null) { - return result; - } - for (HBaseColumnFamilyDesc cf : hbaseMapping.getColumnFamily()) { - for (HBaseColumnDesc c : cf.getColumns()) { - for (MeasureDesc m : c.getMeasures()) { - if (m.getFunction().equals(function)) { - result.add(c); - } - } - } - } - return result; - } - - public CubeDesc getCubeRef() { - return cubeRef; - } - - public void setCubeRef(CubeDesc cubeRef) { - this.cubeRef = cubeRef; - } - - public HBaseColumnFamilyDesc[] getColumnFamily() { - return columnFamily; - } - - public void setColumnFamily(HBaseColumnFamilyDesc[] columnFamily) { - this.columnFamily = columnFamily; - } - - public void init(CubeDesc cubeDesc) { - cubeRef = cubeDesc; - - for (HBaseColumnFamilyDesc cf : columnFamily) { - cf.setName(cf.getName().toUpperCase()); - - for (HBaseColumnDesc c : cf.getColumns()) { - c.setQualifier(c.getQualifier().toUpperCase()); - StringUtil.toUpperCaseArray(c.getMeasureRefs(), c.getMeasureRefs()); - } - } - } - - @Override - public String toString() { - return "HBaseMappingDesc [columnFamily=" + Arrays.toString(columnFamily) + "]"; - } - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/HierarchyDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/HierarchyDesc.java deleted file mode 100644 index 7b87bb3..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/HierarchyDesc.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.model.cube; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.kylinolap.metadata.model.realization.TblColRef; - -/** - * Created with IntelliJ IDEA. User: lukhan Date: 9/24/13 Time: 10:46 AM To - * change this template use File | Settings | File Templates. - */ -@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) -public class HierarchyDesc { - - @JsonProperty("level") - private String level; - @JsonProperty("column") - private String column; - - private TblColRef columnRef; - - public String getLevel() { - return level; - } - - public void setLevel(String level) { - this.level = level; - } - - public TblColRef getColumnRef() { - return columnRef; - } - - public void setColumnRef(TblColRef column) { - this.columnRef = column; - } - - public String getColumn() { - return column; - } - - public void setColumn(String columnName) { - this.column = columnName; - } - - @Override - public String toString() { - return "HierarchyDesc [level=" + level + ", column=" + column + "]"; - } - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/MeasureDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/MeasureDesc.java deleted file mode 100644 index 1e44441..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/MeasureDesc.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.model.cube; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.kylinolap.metadata.model.realization.FunctionDesc; - -/** - * Created with IntelliJ IDEA. User: lukhan Date: 9/24/13 Time: 10:41 AM To - * change this template use File | Settings | File Templates. - */ - -@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) -public class MeasureDesc { - - @JsonProperty("id") - private int id; - @JsonProperty("name") - private String name; - @JsonProperty("function") - private FunctionDesc function; - @JsonProperty("dependent_measure_ref") - private String dependentMeasureRef; - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public FunctionDesc getFunction() { - return function; - } - - public void setFunction(FunctionDesc function) { - this.function = function; - } - - public String getDependentMeasureRef() { - return dependentMeasureRef; - } - - public void setDependentMeasureRef(String dependentMeasureRef) { - this.dependentMeasureRef = dependentMeasureRef; - } - - public boolean isHolisticCountDistinct() { - return function.isHolisticCountDistinct(); - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - - MeasureDesc that = (MeasureDesc) o; - - if (id != that.id) - return false; - - return true; - } - - @Override - public int hashCode() { - return id; - } - - @Override - public String toString() { - return "MeasureDesc [name=" + name + ", function=" + function + "]"; - } - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/RowKeyColDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/RowKeyColDesc.java deleted file mode 100644 index e2281e8..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/RowKeyColDesc.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.model.cube; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.kylinolap.metadata.model.realization.TblColRef; - -/** - * @author yangli9 - * - */ -@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) -public class RowKeyColDesc { - - @JsonProperty("column") - private String column; - @JsonProperty("length") - private int length; - @JsonProperty("dictionary") - private String dictionary; - @JsonProperty("mandatory") - private boolean mandatory = false; - - // computed - private int bitIndex; - private TblColRef colRef; - - public String getDictionary() { - return dictionary; - } - - public String getColumn() { - return column; - } - - void setColumn(String column) { - this.column = column; - } - - public int getLength() { - return length; - } - - public boolean isMandatory() { - return mandatory; - } - - public int getBitIndex() { - return bitIndex; - } - - void setBitIndex(int index) { - this.bitIndex = index; - } - - public TblColRef getColRef() { - return colRef; - } - - void setColRef(TblColRef colRef) { - this.colRef = colRef; - } - - @Override - public String toString() { - return "RowKeyColDesc [column=" + column + ", length=" + length + ", dictionary=" + dictionary + ", mandatory=" + mandatory + "]"; - } - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/cube/RowKeyDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/cube/RowKeyDesc.java deleted file mode 100644 index cbb1e9d..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/cube/RowKeyDesc.java +++ /dev/null @@ -1,291 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.model.cube; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.lang.StringUtils; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.kylinolap.common.util.StringUtil; -import com.kylinolap.metadata.model.realization.TblColRef; - -/** - * Created by lukhan on 1/2/14. - */ -@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) -public class RowKeyDesc { - - public static class HierarchyMask { - public long fullMask; - public long[] allMasks; - } - - public static class AggrGroupMask { - public AggrGroupMask(int size) { - groupOneBitMasks = new long[size]; - } - - public long groupMask; - public long groupOneBitMasks[]; - public long uniqueMask; - public long leftoverMask; - } - - @JsonProperty("rowkey_columns") - private RowKeyColDesc[] rowkeyColumns; - @JsonProperty("aggregation_groups") - private String[][] aggregationGroups; - - // computed content - private CubeDesc cubeRef; - private Map columnMap; - - private long fullMask; - private long mandatoryColumnMask; - private AggrGroupMask[] aggrGroupMasks; - private long aggrGroupFullMask; - private long tailMask; - - private List hierarchyMasks; - - public RowKeyColDesc[] getRowKeyColumns() { - return rowkeyColumns; - } - - // search a specific row key col - public int getRowKeyIndexByColumnName(String columnName) { - if (this.rowkeyColumns == null) - return -1; - - for (int i = 0; i < this.rowkeyColumns.length; ++i) { - RowKeyColDesc desc = this.rowkeyColumns[i]; - if (desc.getColumn().equalsIgnoreCase(columnName)) { - return i; - } - } - return -1; - } - - public int getNCuboidBuildLevels() { - // N aggregation columns requires N levels of cuboid build - // - N columns requires N-1 levels build - // - zero tail cuboid needs one more additional level - Set aggDims = new HashSet(); - for (String[] aggrGroup : aggregationGroups) { - for (String dim : aggrGroup) { - aggDims.add(dim); - } - } - return aggDims.size(); - } - - public String[][] getAggregationGroups() { - return aggregationGroups; - } - - public CubeDesc getCubeRef() { - return cubeRef; - } - - public void setCubeRef(CubeDesc cubeRef) { - this.cubeRef = cubeRef; - } - - public long getFullMask() { - return fullMask; - } - - public long getMandatoryColumnMask() { - return mandatoryColumnMask; - } - - public long getAggrGroupFullMask() { - return aggrGroupFullMask; - } - - public AggrGroupMask[] getAggrGroupMasks() { - return aggrGroupMasks; - } - - public List getHierarchyMasks() { - return hierarchyMasks; - } - - public long getTailMask() { - return tailMask; - } - - public int getColumnBitIndex(TblColRef col) { - return getColDesc(col).getBitIndex(); - } - - public int getColumnLength(TblColRef col) { - return getColDesc(col).getLength(); - } - - public String getDictionary(TblColRef col) { - return getColDesc(col).getDictionary(); - } - - private RowKeyColDesc getColDesc(TblColRef col) { - RowKeyColDesc desc = columnMap.get(col); - if (desc == null) - throw new NullPointerException("Column " + col + " does not exist in row key desc"); - return desc; - } - - public boolean isUseDictionary(TblColRef col) { - String useDictionary = getDictionary(col); - return !StringUtils.isBlank(useDictionary) && !"false".equals(useDictionary); - } - - public boolean isUseDictionary() { - for (RowKeyColDesc col : getRowKeyColumns()) { - if (isUseDictionary(col.getColRef())) { - return true; - } - } - return false; - } - - public void init(CubeDesc cube) { - setCubeRef(cube); - Map colNameAbbr = cube.buildColumnNameAbbreviation(); - - buildRowKey(colNameAbbr); - buildAggregationGroups(colNameAbbr); - buildHierarchyMasks(); - } - - @Override - public String toString() { - return "RowKeyDesc [rowkeyColumns=" + Arrays.toString(rowkeyColumns) + ", aggregationGroups=" + Arrays.toString(aggregationGroups) + "]"; - } - - private void buildRowKey(Map colNameAbbr) { - columnMap = new HashMap(); - mandatoryColumnMask = 0; - - for (int i = 0; i < rowkeyColumns.length; i++) { - RowKeyColDesc col = rowkeyColumns[i]; - col.setColumn(col.getColumn().toUpperCase()); - col.setBitIndex(rowkeyColumns.length - i - 1); - col.setColRef(colNameAbbr.get(col.getColumn())); - if (col.getColRef() == null) - throw new IllegalArgumentException("Cannot find rowkey column " + col.getColumn() + " in cube " + cubeRef); - - columnMap.put(col.getColRef(), col); - - if (col.isMandatory()) { - mandatoryColumnMask |= 1L << col.getBitIndex(); - } - } - } - - private void buildAggregationGroups(Map colNameAbbr) { - if (aggregationGroups == null) { - aggregationGroups = new String[0][]; - } - - for (int i = 0; i < aggregationGroups.length; i++) { - StringUtil.toUpperCaseArray(aggregationGroups[i], this.aggregationGroups[i]); - } - - for (int i = 0; i < this.rowkeyColumns.length; i++) { - int index = rowkeyColumns[i].getBitIndex(); - this.fullMask |= 1L << index; - } - - this.aggrGroupMasks = new AggrGroupMask[aggregationGroups.length]; - for (int i = 0; i < this.aggregationGroups.length; i++) { - String[] aggGrp = this.aggregationGroups[i]; - AggrGroupMask mask = new AggrGroupMask(aggGrp.length); - - for (int j = 0; j < aggGrp.length; j++) { - TblColRef aggCol = colNameAbbr.get(aggGrp[j].toUpperCase()); - if (aggCol == null) { - throw new IllegalArgumentException("Can't find aggregation column " + aggGrp[j] + " in cube " + this.cubeRef.getName()); - } - Integer index = getColumnBitIndex(aggCol); - mask.groupMask |= 1L << index; - mask.groupOneBitMasks[j] = 1L << index; - this.aggrGroupFullMask |= 1L << index; - } - this.aggrGroupMasks[i] = mask; - } - - this.tailMask = fullMask ^ mandatoryColumnMask ^ aggrGroupFullMask; - - // unique mask = (bits in this group) - (bits in following groups) - // leftover mask = (tail bits) + (bits in following groups) - (bits in - // this group) - for (int i = 0; i < aggrGroupMasks.length; i++) { - AggrGroupMask mask = aggrGroupMasks[i]; - - mask.uniqueMask = mask.groupMask; - for (int j = i + 1; j < aggrGroupMasks.length; j++) { - mask.uniqueMask &= ~aggrGroupMasks[j].groupMask; - } - - mask.leftoverMask = tailMask; - for (int j = i + 1; j < aggrGroupMasks.length; j++) { - mask.leftoverMask |= aggrGroupMasks[j].groupMask; - } - mask.leftoverMask &= ~mask.groupMask; - } - } - - private void buildHierarchyMasks() { - this.hierarchyMasks = new ArrayList(); - - for (DimensionDesc dimension : this.cubeRef.getDimensions()) { - HierarchyDesc[] hierarchies = dimension.getHierarchy(); - if (hierarchies == null || hierarchies.length == 0) - continue; - - HierarchyMask mask = new HierarchyMask(); - ArrayList allMaskList = new ArrayList(); - for (int i = 0; i < hierarchies.length; i++) { - TblColRef hColumn = hierarchies[i].getColumnRef(); - Integer index = getColumnBitIndex(hColumn); - long bit = 1L << index; - - if ((tailMask & bit) > 0) - continue; // ignore levels in tail, they don't participate - // aggregation group combination anyway - - mask.fullMask |= bit; - allMaskList.add(mask.fullMask); - } - - mask.allMasks = new long[allMaskList.size()]; - for (int i = 0; i < allMaskList.size(); i++) - mask.allMasks[i] = allMaskList.get(i); - - this.hierarchyMasks.add(mask); - } - } - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/validation/CubeMetadataValidator.java b/metadata/src/main/java/com/kylinolap/metadata/validation/CubeMetadataValidator.java deleted file mode 100644 index 7ee2f97..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/validation/CubeMetadataValidator.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.validation; - -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.validation.ValidateContext.Result; -import com.kylinolap.metadata.validation.rule.AggregationGroupSizeRule; -import com.kylinolap.metadata.validation.rule.FunctionRule; -import com.kylinolap.metadata.validation.rule.MandatoryColumnRule; -import com.kylinolap.metadata.validation.rule.RowKeyAttrRule; - -/** - * For cube metadata validator - * - * @author jianliu - * - */ -public class CubeMetadataValidator { - @SuppressWarnings("unchecked") - private IValidatorRule[] rules = new IValidatorRule[] { new FunctionRule(), new AggregationGroupSizeRule(), new MandatoryColumnRule(), new RowKeyAttrRule() }; - - public ValidateContext validate(CubeDesc cube) { - return validate(cube, false); - } - - /** - * @param cubeDesc - * @param inject - * inject error into cube desc - * @return - */ - public ValidateContext validate(CubeDesc cube, boolean inject) { - ValidateContext context = new ValidateContext(); - for (int i = 0; i < rules.length; i++) { - IValidatorRule rule = rules[i]; - rule.validate(cube, context); - } - if (inject) { - injectResult(cube, context); - } - return context; - } - - /** - * - * Inject errors info into cubeDesc - * - * @param cubeDesc - * @param context - */ - public void injectResult(CubeDesc cubeDesc, ValidateContext context) { - Result[] results = context.getResults(); - for (int i = 0; i < results.length; i++) { - Result result = results[i]; - cubeDesc.addError(result.getLevel() + " : " + result.getMessage(), true); - } - - } - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/validation/IValidatorRule.java b/metadata/src/main/java/com/kylinolap/metadata/validation/IValidatorRule.java deleted file mode 100644 index 1091775..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/validation/IValidatorRule.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.validation; - -import com.kylinolap.metadata.validation.rule.IKylinValidationConstances; - -/** - * @author jianliu - * - */ -public interface IValidatorRule extends IKylinValidationConstances { - - public void validate(T element, ValidateContext context); -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/validation/ResultLevel.java b/metadata/src/main/java/com/kylinolap/metadata/validation/ResultLevel.java deleted file mode 100644 index 32af9d7..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/validation/ResultLevel.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.validation; - -/** - * Validation result level - * - * @author jianliu - * - */ -public enum ResultLevel { - ERROR("ERROR"), WARN("WARN"); - private String level; - - ResultLevel(String level) { - this.level = level; - } - - public String toString() { - return level; - } -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/validation/SourceTableMetadataValidator.java b/metadata/src/main/java/com/kylinolap/metadata/validation/SourceTableMetadataValidator.java deleted file mode 100644 index ef63df6..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/validation/SourceTableMetadataValidator.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.validation; - -import com.kylinolap.metadata.model.TableDesc; - -/** - * Validate Table metadata from source. - *

- * User: lukhan Date: 12/2/13 Time: 10:45 AM To change this template use File | - * Settings | File Templates. - */ -public class SourceTableMetadataValidator { - - public static boolean validate(TableDesc table) { - // table.get - return true; - } -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/validation/ValidateContext.java b/metadata/src/main/java/com/kylinolap/metadata/validation/ValidateContext.java deleted file mode 100644 index bd27244..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/validation/ValidateContext.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.validation; - -import java.io.PrintStream; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * Context. Supply all dependent objects for validator - * - * @author jianliu - * - */ -public class ValidateContext { - private List results = new ArrayList(); - - public void addResult(ResultLevel level, String message) { - results.add(new Result(level, message)); - } - - public void addResult(Result result) { - results.add(result); - } - - public class Result { - private ResultLevel level; - private String message; - - /** - * @param level - * @param message - */ - public Result(ResultLevel level, String message) { - this.level = level; - this.message = message; - } - - /** - * @return the level - */ - public ResultLevel getLevel() { - return level; - } - - /** - * @return the message - */ - public String getMessage() { - return message; - } - } - - /** - * Get validation result - * - * @return - */ - public Result[] getResults() { - Result[] rs = new Result[0]; - rs = results.toArray(rs); - return rs; - } - - /** - * - */ - public void print(PrintStream out) { - if (results.isEmpty()) { - out.print("The element is perfect."); - } - Iterator it = results.iterator(); - while (it.hasNext()) { - Result result = it.next(); - out.println(result.level + " : " + result.message); - } - } - - /** - * @return if there is not validation errors - */ - public boolean ifPass() { - return results.isEmpty(); - } - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/validation/rule/AggregationGroupSizeRule.java b/metadata/src/main/java/com/kylinolap/metadata/validation/rule/AggregationGroupSizeRule.java deleted file mode 100644 index 8ab5a7e..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/validation/rule/AggregationGroupSizeRule.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.validation.rule; - -import com.kylinolap.common.KylinConfig; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.validation.IValidatorRule; -import com.kylinolap.metadata.validation.ResultLevel; -import com.kylinolap.metadata.validation.ValidateContext; - -/** - * Rule to validate: 1. The aggregationGroup size must be less than 20 - * - * @author jianliu - * - */ -public class AggregationGroupSizeRule implements IValidatorRule { - - /* - * (non-Javadoc) - * - * @see - * com.kylinolap.metadata.validation.IValidatorRule#validate(java.lang.Object - * , com.kylinolap.metadata.validation.ValidateContext) - */ - @Override - public void validate(CubeDesc cube, ValidateContext context) { - innerValidateMaxSize(cube, context); - } - - /** - * @param cube - * @param context - */ - private void innerValidateMaxSize(CubeDesc cube, ValidateContext context) { - int maxSize = getMaxAgrGroupSize(); - String[][] groups = cube.getRowkey().getAggregationGroups(); - for (int i = 0; i < groups.length; i++) { - String[] group = groups[i]; - if (group.length >= maxSize) { - context.addResult(ResultLevel.ERROR, "Length of the number " + i + " aggregation group's length should be less than " + maxSize); - } - } - } - - protected int getMaxAgrGroupSize() { - String size = KylinConfig.getInstanceFromEnv().getProperty(KEY_MAX_AGR_GROUP_SIZE, String.valueOf(DEFAULT_MAX_AGR_GROUP_SIZE)); - return Integer.parseInt(size); - } -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/validation/rule/FunctionRule.java b/metadata/src/main/java/com/kylinolap/metadata/validation/rule/FunctionRule.java deleted file mode 100644 index 1dc5443..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/validation/rule/FunctionRule.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.validation.rule; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import org.apache.commons.lang.StringUtils; - -import com.kylinolap.common.KylinConfig; -import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.ColumnDesc; -import com.kylinolap.metadata.model.DataType; -import com.kylinolap.metadata.model.TableDesc; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; -import com.kylinolap.metadata.model.realization.FunctionDesc; -import com.kylinolap.metadata.model.realization.ParameterDesc; -import com.kylinolap.metadata.validation.IValidatorRule; -import com.kylinolap.metadata.validation.ResultLevel; -import com.kylinolap.metadata.validation.ValidateContext; - -/** - * Validate function parameter. Ticket: - * https://github.scm.corp.ebay.com/Kylin/Kylin/issues/268 - *

- * if type is column, check values are valid fact table columns if type is - * constant, the value only can be numberic - *

- * the return type only can be int/bigint/long/double/decimal - * - * @author jianliu - */ -public class FunctionRule implements IValidatorRule { - - /* - * (non-Javadoc) - * - * @see - * com.kylinolap.metadata.validation.IValidatorRule#validate(java.lang.Object - * , com.kylinolap.metadata.validation.ValidateContext) - */ - @Override - public void validate(CubeDesc cube, ValidateContext context) { - List measures = cube.getMeasures(); - - List countFuncs = new ArrayList(); - - Iterator it = measures.iterator(); - while (it.hasNext()) { - MeasureDesc measure = it.next(); - FunctionDesc func = measure.getFunction(); - ParameterDesc parameter = func.getParameter(); - if (parameter == null) { - context.addResult(ResultLevel.ERROR, "Must define parameter for function " + func.getExpression() + " in " + measure.getName()); - return; - } - - String type = func.getParameter().getType(); - String value = func.getParameter().getValue(); - if (StringUtils.isEmpty(type)) { - context.addResult(ResultLevel.ERROR, "Must define type for parameter type " + func.getExpression() + " in " + measure.getName()); - return; - } - if (StringUtils.isEmpty(value)) { - context.addResult(ResultLevel.ERROR, "Must define type for parameter value " + func.getExpression() + " in " + measure.getName()); - return; - } - if (StringUtils.isEmpty(func.getReturnType())) { - context.addResult(ResultLevel.ERROR, "Must define return type for function " + func.getExpression() + " in " + measure.getName()); - return; - } - - if (StringUtils.equalsIgnoreCase(FunctionDesc.PARAMETER_TYPE_COLUMN, type)) { - validateColumnParameter(context, cube, value); - } else if (StringUtils.equals(FunctionDesc.PARAMTER_TYPE_CONSTANT, type)) { - validateCostantParameter(context, cube, value); - } - validateReturnType(context, cube, func); - - if (func.isCount()) - countFuncs.add(func); - } - - if (countFuncs.size() != 1) { - context.addResult(ResultLevel.ERROR, "Must define one and only one count(1) function, but there are " + countFuncs.size() + " -- " + countFuncs); - } - } - - private void validateReturnType(ValidateContext context, CubeDesc cube, FunctionDesc funcDesc) { - - String func = funcDesc.getExpression(); - DataType rtype = funcDesc.getReturnDataType(); - - if (funcDesc.isCount()) { - if (rtype.isIntegerFamily() == false) { - context.addResult(ResultLevel.ERROR, "Return type for function " + func + " must be one of " + DataType.INTEGER_FAMILY); - } - } else if (funcDesc.isCountDistinct()) { - if (rtype.isHLLC() == false && funcDesc.isHolisticCountDistinct() == false) { - context.addResult(ResultLevel.ERROR, "Return type for function " + func + " must be hllc(10), hllc(12) etc."); - } - } else if (funcDesc.isMax() || funcDesc.isMin() || funcDesc.isSum()) { - if (rtype.isNumberFamily() == false) { - context.addResult(ResultLevel.ERROR, "Return type for function " + func + " must be one of " + DataType.NUMBER_FAMILY); - } - } else { - if (StringUtils.equalsIgnoreCase(KylinConfig.getInstanceFromEnv().getProperty(KEY_IGNORE_UNKNOWN_FUNC, "false"), "false")) { - context.addResult(ResultLevel.ERROR, "Unrecognized function: [" + func + "]"); - } - } - - } - - /** - * @param context - * @param cube - * @param value - */ - private void validateCostantParameter(ValidateContext context, CubeDesc cube, String value) { - try { - Integer.parseInt(value); - } catch (Exception e) { - context.addResult(ResultLevel.ERROR, "Parameter value must be number, but it is " + value); - } - } - - /** - * @param context - * @param cube - * @param value - */ - private void validateColumnParameter(ValidateContext context, CubeDesc cube, String value) { - String factTable = cube.getFactTable(); - if (StringUtils.isEmpty(factTable)) { - context.addResult(ResultLevel.ERROR, "Fact table can not be null."); - return; - } - TableDesc table = MetadataManager.getInstance(cube.getConfig()).getTableDesc(factTable); - if (table == null) { - context.addResult(ResultLevel.ERROR, "Fact table can not be found: " + cube); - return; - } - // Prepare column set - Set set = new HashSet(); - ColumnDesc[] cdesc = table.getColumns(); - for (int i = 0; i < cdesc.length; i++) { - ColumnDesc columnDesc = cdesc[i]; - set.add(columnDesc.getName()); - } - - String[] items = value.split(","); - for (int i = 0; i < items.length; i++) { - String item = items[i].trim(); - if (StringUtils.isEmpty(item)) { - continue; - } - if (!set.contains(item)) { - context.addResult(ResultLevel.ERROR, "Column [" + item + "] does not exist in factable table" + factTable); - } - } - - } -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/validation/rule/IKylinValidationConstances.java b/metadata/src/main/java/com/kylinolap/metadata/validation/rule/IKylinValidationConstances.java deleted file mode 100644 index bc1bbc6..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/validation/rule/IKylinValidationConstances.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.validation.rule; - -import com.kylinolap.metadata.MetadataConstances; - -/** - * @author jianliu - * - */ -public interface IKylinValidationConstances extends MetadataConstances { - - public static final int DEFAULT_MAX_AGR_GROUP_SIZE = 20; - public static final String KEY_MAX_AGR_GROUP_SIZE = "rule_max.arggregation.group.size"; - public static final String KEY_IGNORE_UNKNOWN_FUNC = "rule_ignore_unknown_func"; - -} \ No newline at end of file diff --git a/metadata/src/main/java/com/kylinolap/metadata/validation/rule/MandatoryColumnRule.java b/metadata/src/main/java/com/kylinolap/metadata/validation/rule/MandatoryColumnRule.java deleted file mode 100644 index 2e2d43e..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/validation/rule/MandatoryColumnRule.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.validation.rule; - -import java.util.HashSet; -import java.util.Set; - -import org.apache.commons.lang.ArrayUtils; - -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.RowKeyColDesc; -import com.kylinolap.metadata.validation.IValidatorRule; -import com.kylinolap.metadata.validation.ResultLevel; -import com.kylinolap.metadata.validation.ValidateContext; - -/** - * Validate that mandatory column must NOT appear in aggregation group. - * - * @author jianliu - * - */ -public class MandatoryColumnRule implements IValidatorRule { - - /* - * (non-Javadoc) - * - * @see - * com.kylinolap.metadata.validation.IValidatorRule#validate(java.lang.Object - * , com.kylinolap.metadata.validation.ValidateContext) - */ - @Override - public void validate(CubeDesc cube, ValidateContext context) { - Set mands = new HashSet(); - RowKeyColDesc[] cols = cube.getRowkey().getRowKeyColumns(); - if (cols == null || cols.length == 0) { - return; - } - for (int i = 0; i < cols.length; i++) { - RowKeyColDesc rowKeyColDesc = cols[i]; - if (rowKeyColDesc.isMandatory()) { - mands.add(rowKeyColDesc.getColumn()); - } - } - if (mands.isEmpty()) { - return; - } - String[][] groups = cube.getRowkey().getAggregationGroups(); - for (int i = 0; i < groups.length; i++) { - String[] group = groups[i]; - for (int j = 0; j < group.length; j++) { - String col = group[j]; - if (mands.contains(col)) { - context.addResult(ResultLevel.ERROR, "mandatory column " + col + " must not be in aggregation group [" + ArrayUtils.toString(group) + "]"); - } - } - } - - } - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/validation/rule/RowKeyAttrRule.java b/metadata/src/main/java/com/kylinolap/metadata/validation/rule/RowKeyAttrRule.java deleted file mode 100644 index 2016cd6..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/validation/rule/RowKeyAttrRule.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.validation.rule; - -import org.apache.commons.lang.StringUtils; - -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.RowKeyColDesc; -import com.kylinolap.metadata.model.cube.RowKeyDesc; -import com.kylinolap.metadata.validation.IValidatorRule; -import com.kylinolap.metadata.validation.ResultLevel; -import com.kylinolap.metadata.validation.ValidateContext; - -/** - * Validate that only one of "length" and "dictionary" appears on rowkey_column - * - * @author jianliu - * - */ -public class RowKeyAttrRule implements IValidatorRule { - - /* - * (non-Javadoc) - * - * @see - * com.kylinolap.metadata.validation.IValidatorRule#validate(java.lang.Object - * , com.kylinolap.metadata.validation.ValidateContext) - */ - @Override - public void validate(CubeDesc cube, ValidateContext context) { - RowKeyDesc row = cube.getRowkey(); - if (row == null) { - context.addResult(ResultLevel.ERROR, "Rowkey does not exist"); - return; - } - - RowKeyColDesc[] rcd = row.getRowKeyColumns(); - if (rcd == null || rcd.length == 0) { - context.addResult(ResultLevel.ERROR, "Rowkey columns do not exist or is empty"); - return; - } - - for (int i = 0; i < rcd.length; i++) { - RowKeyColDesc rd = rcd[i]; - if (rd.getLength() != 0 && !StringUtils.isEmpty(rd.getDictionary())) { - context.addResult(ResultLevel.ERROR, "Rowkey column " + rd.getColumn() + " must not have both 'length' and 'dictionary' attribute"); - } - if (rd.getLength() == 0 && StringUtils.isEmpty(rd.getDictionary())) { - context.addResult(ResultLevel.ERROR, "Rowkey column " + rd.getColumn() + " must not have both 'length' and 'dictionary' empty"); - } - } - - } - -} diff --git a/metadata/src/test/java/com/kylinolap/metadata/CubeDescTest.java b/metadata/src/test/java/com/kylinolap/metadata/CubeDescTest.java index 1320b73..3b723e3 100644 --- a/metadata/src/test/java/com/kylinolap/metadata/CubeDescTest.java +++ b/metadata/src/test/java/com/kylinolap/metadata/CubeDescTest.java @@ -22,7 +22,7 @@ import com.kylinolap.common.util.JsonUtil; import com.kylinolap.common.util.LocalFileMetadataTestCase; -import com.kylinolap.metadata.model.cube.CubeDesc; +import com.kylinolap.cube.model.CubeDesc; /** * @author yangli9 diff --git a/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java b/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java index 3433393..6fc9797 100644 --- a/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java +++ b/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java @@ -23,8 +23,8 @@ import org.junit.Test; import com.kylinolap.common.util.LocalFileMetadataTestCase; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.metadata.model.TableDesc; -import com.kylinolap.metadata.model.cube.CubeDesc; /** * Created with IntelliJ IDEA. User: lukhan Date: 9/24/13 Time: 2:38 PM To diff --git a/metadata/src/test/java/com/kylinolap/metadata/validation/rule/AggregationGroupSizeRuleTest.java b/metadata/src/test/java/com/kylinolap/metadata/validation/rule/AggregationGroupSizeRuleTest.java index 356c6e7..e3e3e7d 100644 --- a/metadata/src/test/java/com/kylinolap/metadata/validation/rule/AggregationGroupSizeRuleTest.java +++ b/metadata/src/test/java/com/kylinolap/metadata/validation/rule/AggregationGroupSizeRuleTest.java @@ -22,9 +22,10 @@ import org.junit.Test; import com.kylinolap.common.util.JsonUtil; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.validation.IValidatorRule; -import com.kylinolap.metadata.validation.ValidateContext; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.validation.IValidatorRule; +import com.kylinolap.cube.model.validation.ValidateContext; +import com.kylinolap.cube.model.validation.rule.AggregationGroupSizeRule; /** * @author jianliu diff --git a/metadata/src/test/java/com/kylinolap/metadata/validation/rule/MandatoryColumnRuleTest.java b/metadata/src/test/java/com/kylinolap/metadata/validation/rule/MandatoryColumnRuleTest.java index a78bfe4..4ebe5ab 100644 --- a/metadata/src/test/java/com/kylinolap/metadata/validation/rule/MandatoryColumnRuleTest.java +++ b/metadata/src/test/java/com/kylinolap/metadata/validation/rule/MandatoryColumnRuleTest.java @@ -22,9 +22,10 @@ import org.junit.Test; import com.kylinolap.common.util.JsonUtil; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.validation.IValidatorRule; -import com.kylinolap.metadata.validation.ValidateContext; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.validation.IValidatorRule; +import com.kylinolap.cube.model.validation.ValidateContext; +import com.kylinolap.cube.model.validation.rule.MandatoryColumnRule; /** * @author jianliu diff --git a/metadata/src/test/java/com/kylinolap/metadata/validation/rule/RowKeyAttrRuleTest.java b/metadata/src/test/java/com/kylinolap/metadata/validation/rule/RowKeyAttrRuleTest.java index 4f9ebe3..81f1d40 100644 --- a/metadata/src/test/java/com/kylinolap/metadata/validation/rule/RowKeyAttrRuleTest.java +++ b/metadata/src/test/java/com/kylinolap/metadata/validation/rule/RowKeyAttrRuleTest.java @@ -22,9 +22,10 @@ import org.junit.Test; import com.kylinolap.common.util.JsonUtil; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.validation.IValidatorRule; -import com.kylinolap.metadata.validation.ValidateContext; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.validation.IValidatorRule; +import com.kylinolap.cube.model.validation.ValidateContext; +import com.kylinolap.cube.model.validation.rule.RowKeyAttrRule; /** * @author jianliu diff --git a/query/src/main/java/com/kylinolap/query/enumerator/CubeEnumerator.java b/query/src/main/java/com/kylinolap/query/enumerator/CubeEnumerator.java index a58b616..68fce94 100644 --- a/query/src/main/java/com/kylinolap/query/enumerator/CubeEnumerator.java +++ b/query/src/main/java/com/kylinolap/query/enumerator/CubeEnumerator.java @@ -29,8 +29,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.kylinolap.metadata.model.cube.DimensionDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; +import com.kylinolap.cube.model.DimensionDesc; +import com.kylinolap.cube.model.MeasureDesc; import com.kylinolap.metadata.model.realization.FunctionDesc; import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.query.relnode.OLAPContext; diff --git a/query/src/main/java/com/kylinolap/query/enumerator/LookupTableEnumerator.java b/query/src/main/java/com/kylinolap/query/enumerator/LookupTableEnumerator.java index 3bd1577..0d5a5db 100644 --- a/query/src/main/java/com/kylinolap/query/enumerator/LookupTableEnumerator.java +++ b/query/src/main/java/com/kylinolap/query/enumerator/LookupTableEnumerator.java @@ -24,9 +24,9 @@ import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; +import com.kylinolap.cube.model.DimensionDesc; import com.kylinolap.dict.lookup.LookupStringTable; import com.kylinolap.metadata.model.ColumnDesc; -import com.kylinolap.metadata.model.cube.DimensionDesc; import com.kylinolap.query.relnode.OLAPContext; import com.kylinolap.query.schema.OLAPTable; import com.kylinolap.storage.tuple.Tuple; diff --git a/query/src/main/java/com/kylinolap/query/relnode/OLAPContext.java b/query/src/main/java/com/kylinolap/query/relnode/OLAPContext.java index f2da184..9c5e4e6 100644 --- a/query/src/main/java/com/kylinolap/query/relnode/OLAPContext.java +++ b/query/src/main/java/com/kylinolap/query/relnode/OLAPContext.java @@ -27,8 +27,8 @@ import org.eigenbase.reltype.RelDataType; import com.kylinolap.cube.CubeInstance; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.metadata.model.JoinDesc; -import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.model.realization.FunctionDesc; import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.query.schema.OLAPSchema; diff --git a/query/src/main/java/com/kylinolap/query/relnode/OLAPSortRel.java b/query/src/main/java/com/kylinolap/query/relnode/OLAPSortRel.java index bc9e654..de589a8 100644 --- a/query/src/main/java/com/kylinolap/query/relnode/OLAPSortRel.java +++ b/query/src/main/java/com/kylinolap/query/relnode/OLAPSortRel.java @@ -33,7 +33,7 @@ import org.eigenbase.rex.RexNode; import com.google.common.base.Preconditions; -import com.kylinolap.metadata.model.cube.MeasureDesc; +import com.kylinolap.cube.model.MeasureDesc; import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.StorageContext; diff --git a/query/src/main/java/com/kylinolap/query/routing/QueryRouter.java b/query/src/main/java/com/kylinolap/query/routing/QueryRouter.java index 42a9d9c..4e5bbde 100644 --- a/query/src/main/java/com/kylinolap/query/routing/QueryRouter.java +++ b/query/src/main/java/com/kylinolap/query/routing/QueryRouter.java @@ -31,10 +31,10 @@ import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.DimensionDesc; import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.metadata.model.JoinDesc; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.DimensionDesc; import com.kylinolap.metadata.model.realization.FunctionDesc; import com.kylinolap.metadata.model.realization.ParameterDesc; import com.kylinolap.metadata.model.realization.TblColRef; diff --git a/query/src/main/java/com/kylinolap/query/schema/OLAPTable.java b/query/src/main/java/com/kylinolap/query/schema/OLAPTable.java index 3120971..83a709f 100644 --- a/query/src/main/java/com/kylinolap/query/schema/OLAPTable.java +++ b/query/src/main/java/com/kylinolap/query/schema/OLAPTable.java @@ -42,10 +42,10 @@ import org.eigenbase.sql.type.SqlTypeName; import org.eigenbase.sql.type.SqlTypeUtil; +import com.kylinolap.cube.model.MeasureDesc; import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.metadata.model.ColumnDesc; import com.kylinolap.metadata.model.TableDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; import com.kylinolap.metadata.model.realization.FunctionDesc; import com.kylinolap.query.enumerator.OLAPQuery; import com.kylinolap.query.enumerator.OLAPQuery.EnumeratorTypeEnum; diff --git a/server/src/main/java/com/kylinolap/rest/controller/CubeController.java b/server/src/main/java/com/kylinolap/rest/controller/CubeController.java index 06cf4c5..1600fa5 100644 --- a/server/src/main/java/com/kylinolap/rest/controller/CubeController.java +++ b/server/src/main/java/com/kylinolap/rest/controller/CubeController.java @@ -24,6 +24,7 @@ import java.util.UUID; import com.kylinolap.storage.hbase.coprocessor.observer.ObserverEnabler; + import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,11 +46,11 @@ import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.exception.CubeIntegrityException; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.job.JobInstance; import com.kylinolap.job.exception.InvalidJobInstanceException; import com.kylinolap.job.exception.JobException; -import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.rest.exception.BadRequestException; import com.kylinolap.rest.exception.ForbiddenException; import com.kylinolap.rest.exception.InternalErrorException; diff --git a/server/src/main/java/com/kylinolap/rest/controller/CubeDescController.java b/server/src/main/java/com/kylinolap/rest/controller/CubeDescController.java index 173c3b6..31b789e 100644 --- a/server/src/main/java/com/kylinolap/rest/controller/CubeDescController.java +++ b/server/src/main/java/com/kylinolap/rest/controller/CubeDescController.java @@ -26,7 +26,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import com.kylinolap.cube.CubeInstance; -import com.kylinolap.metadata.model.cube.CubeDesc; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.rest.service.CubeService; /** diff --git a/server/src/main/java/com/kylinolap/rest/service/CubeService.java b/server/src/main/java/com/kylinolap/rest/service/CubeService.java index 8d3a99e..fc3bbc3 100644 --- a/server/src/main/java/com/kylinolap/rest/service/CubeService.java +++ b/server/src/main/java/com/kylinolap/rest/service/CubeService.java @@ -60,6 +60,7 @@ import com.kylinolap.cube.CubeStatusEnum; import com.kylinolap.cube.cuboid.CuboidCLI; import com.kylinolap.cube.exception.CubeIntegrityException; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.job.JobDAO; import com.kylinolap.job.JobInstance; @@ -71,7 +72,6 @@ import com.kylinolap.metadata.MetadataConstances; import com.kylinolap.metadata.model.ColumnDesc; import com.kylinolap.metadata.model.TableDesc; -import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.tool.HiveSourceTableLoader; import com.kylinolap.rest.constant.Constant; import com.kylinolap.rest.controller.QueryController; diff --git a/server/src/test/java/com/kylinolap/rest/controller/CubeControllerTest.java b/server/src/test/java/com/kylinolap/rest/controller/CubeControllerTest.java index f71f3a7..f873683 100644 --- a/server/src/test/java/com/kylinolap/rest/controller/CubeControllerTest.java +++ b/server/src/test/java/com/kylinolap/rest/controller/CubeControllerTest.java @@ -25,7 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired; import com.fasterxml.jackson.databind.ObjectMapper; -import com.kylinolap.metadata.model.cube.CubeDesc; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.rest.request.CubeRequest; import com.kylinolap.rest.service.CubeService; import com.kylinolap.rest.service.JobService; diff --git a/storage/src/main/java/com/kylinolap/storage/StorageContext.java b/storage/src/main/java/com/kylinolap/storage/StorageContext.java index f7d9396..75af853 100644 --- a/storage/src/main/java/com/kylinolap/storage/StorageContext.java +++ b/storage/src/main/java/com/kylinolap/storage/StorageContext.java @@ -23,7 +23,7 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.kylinolap.cube.cuboid.Cuboid; -import com.kylinolap.metadata.model.cube.MeasureDesc; +import com.kylinolap.cube.model.MeasureDesc; import com.kylinolap.metadata.model.realization.TblColRef; /** diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/ConcurrentHBaseTupleIterator.java b/storage/src/main/java/com/kylinolap/storage/hbase/ConcurrentHBaseTupleIterator.java index b6e164b..66e85ad 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/ConcurrentHBaseTupleIterator.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/ConcurrentHBaseTupleIterator.java @@ -34,6 +34,7 @@ import java.util.concurrent.atomic.AtomicLong; import com.kylinolap.storage.hbase.coprocessor.observer.ObserverEnabler; + import org.apache.hadoop.hbase.client.HConnection; import org.apache.hadoop.hbase.client.HTableInterface; import org.apache.hadoop.hbase.client.Result; @@ -62,10 +63,10 @@ import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.cube.kv.RowKeyDecoder; import com.kylinolap.cube.kv.RowValueDecoder; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.HBaseColumnDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; -import com.kylinolap.metadata.model.cube.CubeDesc.DeriveInfo; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.HBaseColumnDesc; +import com.kylinolap.cube.model.MeasureDesc; +import com.kylinolap.cube.model.CubeDesc.DeriveInfo; import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.StorageContext; import com.kylinolap.storage.filter.TupleFilter; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/CubeSegmentTupleIterator.java b/storage/src/main/java/com/kylinolap/storage/hbase/CubeSegmentTupleIterator.java index bbea782..f3fcc20 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/CubeSegmentTupleIterator.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/CubeSegmentTupleIterator.java @@ -27,6 +27,7 @@ import java.util.Map.Entry; import com.kylinolap.storage.hbase.coprocessor.observer.ObserverEnabler; + import org.apache.hadoop.hbase.client.HConnection; import org.apache.hadoop.hbase.client.HTableInterface; import org.apache.hadoop.hbase.client.Result; @@ -50,9 +51,9 @@ import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.cube.kv.RowKeyDecoder; import com.kylinolap.cube.kv.RowValueDecoder; -import com.kylinolap.metadata.model.cube.HBaseColumnDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; -import com.kylinolap.metadata.model.cube.CubeDesc.DeriveInfo; +import com.kylinolap.cube.model.HBaseColumnDesc; +import com.kylinolap.cube.model.MeasureDesc; +import com.kylinolap.cube.model.CubeDesc.DeriveInfo; import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.StorageContext; import com.kylinolap.storage.filter.TupleFilter; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/DerivedFilterTranslator.java b/storage/src/main/java/com/kylinolap/storage/hbase/DerivedFilterTranslator.java index 3ee9be0..773ad89 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/DerivedFilterTranslator.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/DerivedFilterTranslator.java @@ -25,9 +25,9 @@ import com.google.common.collect.Sets; import com.kylinolap.common.util.Array; import com.kylinolap.cube.kv.RowKeyColumnOrder; +import com.kylinolap.cube.model.CubeDesc.DeriveInfo; +import com.kylinolap.cube.model.CubeDesc.DeriveType; import com.kylinolap.dict.lookup.LookupStringTable; -import com.kylinolap.metadata.model.cube.CubeDesc.DeriveInfo; -import com.kylinolap.metadata.model.cube.CubeDesc.DeriveType; import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.filter.ColumnTupleFilter; import com.kylinolap.storage.filter.CompareTupleFilter; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/HBaseKeyRange.java b/storage/src/main/java/com/kylinolap/storage/hbase/HBaseKeyRange.java index 913ee63..27da107 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/HBaseKeyRange.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/HBaseKeyRange.java @@ -33,8 +33,8 @@ import com.kylinolap.cube.kv.FuzzyKeyEncoder; import com.kylinolap.cube.kv.FuzzyMaskEncoder; import com.kylinolap.cube.kv.RowConstants; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.dict.DateStrDictionary; -import com.kylinolap.metadata.model.cube.CubeDesc; import com.kylinolap.metadata.model.realization.TblColRef; /** diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java b/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java index a103d3b..9201784 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/HBaseStorageEngine.java @@ -27,6 +27,7 @@ import java.util.Set; import com.kylinolap.storage.hbase.coprocessor.observer.ObserverEnabler; + import org.apache.hadoop.hbase.client.HConnection; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Pair; @@ -43,12 +44,12 @@ import com.kylinolap.cube.CubeSegmentStatusEnum; import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.cube.kv.RowValueDecoder; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.HBaseColumnDesc; +import com.kylinolap.cube.model.HBaseMappingDesc; +import com.kylinolap.cube.model.MeasureDesc; +import com.kylinolap.cube.model.CubeDesc.DeriveInfo; import com.kylinolap.dict.lookup.LookupStringTable; -import com.kylinolap.metadata.model.cube.CubeDesc; -import com.kylinolap.metadata.model.cube.HBaseColumnDesc; -import com.kylinolap.metadata.model.cube.HBaseMappingDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; -import com.kylinolap.metadata.model.cube.CubeDesc.DeriveInfo; import com.kylinolap.metadata.model.realization.FunctionDesc; import com.kylinolap.metadata.model.realization.TblColRef; import com.kylinolap.storage.IStorageEngine; diff --git a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverAggregators.java b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverAggregators.java index fb25f46..fa6e4da 100644 --- a/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverAggregators.java +++ b/storage/src/main/java/com/kylinolap/storage/hbase/coprocessor/observer/ObserverAggregators.java @@ -23,6 +23,7 @@ import java.util.List; import com.kylinolap.storage.hbase.coprocessor.CoprocessorConstants; + import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.util.Bytes; @@ -32,8 +33,8 @@ import com.kylinolap.cube.kv.RowValueDecoder; import com.kylinolap.cube.measure.MeasureAggregator; import com.kylinolap.cube.measure.MeasureCodec; -import com.kylinolap.metadata.model.cube.HBaseColumnDesc; -import com.kylinolap.metadata.model.cube.MeasureDesc; +import com.kylinolap.cube.model.HBaseColumnDesc; +import com.kylinolap.cube.model.MeasureDesc; /** * @author yangli9 diff --git a/storage/src/main/java/com/kylinolap/storage/tuple/Tuple.java b/storage/src/main/java/com/kylinolap/storage/tuple/Tuple.java index 31869ba..fb64bf0 100644 --- a/storage/src/main/java/com/kylinolap/storage/tuple/Tuple.java +++ b/storage/src/main/java/com/kylinolap/storage/tuple/Tuple.java @@ -22,9 +22,9 @@ import com.kylinolap.common.util.Array; import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.CubeSegment; +import com.kylinolap.cube.model.CubeDesc.DeriveInfo; import com.kylinolap.dict.DateStrDictionary; import com.kylinolap.dict.lookup.LookupStringTable; -import com.kylinolap.metadata.model.cube.CubeDesc.DeriveInfo; import com.kylinolap.metadata.model.realization.TblColRef; /** diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowTypeTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowTypeTest.java index bc8627e..78ab295 100644 --- a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowTypeTest.java +++ b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/observer/RowTypeTest.java @@ -21,6 +21,7 @@ import java.util.Arrays; import com.kylinolap.storage.hbase.coprocessor.observer.ObserverRowType; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -29,7 +30,7 @@ import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.cuboid.Cuboid; -import com.kylinolap.metadata.model.cube.CubeDesc; +import com.kylinolap.cube.model.CubeDesc; /** * @author yangli9 From 2cbcb190ae2ac632ecd28ed714ececa1d581ffe8 Mon Sep 17 00:00:00 2001 From: shaofengshi Date: Fri, 28 Nov 2014 19:18:43 +0800 Subject: [PATCH 27/65] Code refactor for metadata structure change; --- .../main/java/com/kylinolap/cube/CubeInstance.java | 2 +- .../main/java/com/kylinolap/cube/CubeManager.java | 13 +-- .../com/kylinolap/cube/CubeSegmentValidator.java | 7 +- .../java/com/kylinolap/cube/cuboid/CuboidCLI.java | 4 +- .../java/com/kylinolap/cube/model/CubeDesc.java | 79 ++++++++++------- .../com/kylinolap/cube/project/ProjectManager.java | 4 +- .../cube/AggregationGroupSizeRuleTest.java | 99 ++++++++++++++++++++++ .../test/java/com/kylinolap/cube/CubeDescTest.java | 59 +++++++++++++ .../com/kylinolap/cube/CubeManagerCacheTest.java | 6 +- .../java/com/kylinolap/cube/CubeManagerTest.java | 6 +- .../com/kylinolap/cube/DictionaryManagerTest.java | 82 ++++++++++++++++++ .../kylinolap/cube/MandatoryColumnRuleTest.java | 56 ++++++++++++ .../com/kylinolap/cube/RowKeyAttrRuleTest.java | 57 +++++++++++++ .../com/kylinolap/cube/SegmentManagementTest.java | 18 ++-- .../kylinolap/cube/cuboid/CuboidSchedulerTest.java | 19 +++-- .../java/com/kylinolap/cube/cuboid/CuboidTest.java | 12 ++- .../kylinolap/cube/project/ProjectManagerTest.java | 8 +- .../java/com/kylinolap/dict/DictionaryManager.java | 30 +++---- .../com/kylinolap/dict/DictionaryManagerTest.java | 80 ----------------- .../job/hadoop/cube/FactDistinctColumnsMapper.java | 4 +- .../job/hadoop/cube/MergeCuboidMapper.java | 3 +- .../kylinolap/metadata/model/DataModelDesc.java | 53 ++++++++++++ .../com/kylinolap/metadata/model/LookupDesc.java | 17 ++++ .../java/com/kylinolap/metadata/CubeDescTest.java | 50 ----------- .../kylinolap/metadata/MetadataManagerTest.java | 7 -- .../rule/AggregationGroupSizeRuleTest.java | 99 ---------------------- .../validation/rule/MandatoryColumnRuleTest.java | 56 ------------ .../validation/rule/RowKeyAttrRuleTest.java | 57 ------------- .../com/kylinolap/rest/service/BasicService.java | 2 +- .../com/kylinolap/rest/service/CubeService.java | 10 +-- .../rest/controller/CubeControllerTest.java | 2 +- 31 files changed, 558 insertions(+), 443 deletions(-) create mode 100644 cube/src/test/java/com/kylinolap/cube/AggregationGroupSizeRuleTest.java create mode 100644 cube/src/test/java/com/kylinolap/cube/CubeDescTest.java create mode 100644 cube/src/test/java/com/kylinolap/cube/DictionaryManagerTest.java create mode 100644 cube/src/test/java/com/kylinolap/cube/MandatoryColumnRuleTest.java create mode 100644 cube/src/test/java/com/kylinolap/cube/RowKeyAttrRuleTest.java delete mode 100644 dictionary/src/test/java/com/kylinolap/dict/DictionaryManagerTest.java delete mode 100644 metadata/src/test/java/com/kylinolap/metadata/CubeDescTest.java delete mode 100644 metadata/src/test/java/com/kylinolap/metadata/validation/rule/AggregationGroupSizeRuleTest.java delete mode 100644 metadata/src/test/java/com/kylinolap/metadata/validation/rule/MandatoryColumnRuleTest.java delete mode 100644 metadata/src/test/java/com/kylinolap/metadata/validation/rule/RowKeyAttrRuleTest.java diff --git a/cube/src/main/java/com/kylinolap/cube/CubeInstance.java b/cube/src/main/java/com/kylinolap/cube/CubeInstance.java index 2e33e5d..fd7abb0 100644 --- a/cube/src/main/java/com/kylinolap/cube/CubeInstance.java +++ b/cube/src/main/java/com/kylinolap/cube/CubeInstance.java @@ -166,7 +166,7 @@ public long getAllocatedStartDate() { } public CubeDesc getDescriptor() { - return MetadataManager.getInstance(config).getCubeDesc(descName); + return CubeManager.getInstance(config).getCubeDesc(descName); } public InvertedIndexDesc getInvertedIndexDesc() { diff --git a/cube/src/main/java/com/kylinolap/cube/CubeManager.java b/cube/src/main/java/com/kylinolap/cube/CubeManager.java index 2341425..fd546d1 100644 --- a/cube/src/main/java/com/kylinolap/cube/CubeManager.java +++ b/cube/src/main/java/com/kylinolap/cube/CubeManager.java @@ -335,7 +335,7 @@ public void buildInvertedIndexDictionary(CubeSegment cubeSeg, String factColumns if (iiDesc.isMetricsCol(col)) continue; - DictionaryInfo dict = dictMgr.buildDictionary(null, col, factColumnsPath); + DictionaryInfo dict = dictMgr.buildDictionary(null, null, col, factColumnsPath); cubeSeg.putDictResPath(col, dict.getResourcePath()); } @@ -343,11 +343,12 @@ public void buildInvertedIndexDictionary(CubeSegment cubeSeg, String factColumns } public DictionaryInfo buildDictionary(CubeSegment cubeSeg, TblColRef col, String factColumnsPath) throws IOException { - if (!cubeSeg.getCubeDesc().getRowkey().isUseDictionary(col)) + CubeDesc cubeDesc = cubeSeg.getCubeDesc(); + if (!cubeDesc.getRowkey().isUseDictionary(col)) return null; DictionaryManager dictMgr = getDictionaryManager(); - DictionaryInfo dictInfo = dictMgr.buildDictionary(cubeSeg.getCubeDesc(), col, factColumnsPath); + DictionaryInfo dictInfo = dictMgr.buildDictionary(cubeDesc.getModel(), cubeDesc.getRowkey().getDictionary(col), col, factColumnsPath); cubeSeg.putDictResPath(col, dictInfo.getResourcePath()); saveResource(cubeSeg.getCubeInstance()); @@ -639,10 +640,12 @@ private void makeDictForNewSegment(CubeInstance cube, CubeSegment newSeg, List colsNeedCopyDict = new HashSet(); DictionaryManager dictMgr = this.getDictionaryManager(); - for (DimensionDesc dim : cube.getDescriptor().getDimensions()) { + CubeDesc cubeDesc = cube.getDescriptor(); + for (DimensionDesc dim : cubeDesc.getDimensions()) { for (TblColRef col : dim.getColumnRefs()) { if (newSeg.getCubeDesc().getRowkey().isUseDictionary(col)) { - if (cube.getDescriptor().getFactTable().equalsIgnoreCase((String) dictMgr.decideSourceData(cube.getDescriptor(), col, null)[0])) { + String dictTable = (String) dictMgr.decideSourceData(cubeDesc.getModel(), cubeDesc.getRowkey().getDictionary(col), col, null)[0]; + if (cubeDesc.getFactTable().equalsIgnoreCase(dictTable)) { colsNeedMeringDict.add(col); } else { colsNeedCopyDict.add(col); diff --git a/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java b/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java index 0cc1939..3f50032 100644 --- a/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java +++ b/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java @@ -22,6 +22,7 @@ import java.util.List; import com.kylinolap.cube.exception.CubeIntegrityException; +import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.cube.model.DimensionDesc; import com.kylinolap.cube.model.CubePartitionDesc.CubePartitionType; import com.kylinolap.dict.DictionaryManager; @@ -87,11 +88,13 @@ private void checkLoopTableConsistency(CubeInstance cube, List newS List segmentList = cube.getMergingSegments(cubeSeg); HashSet cols = new HashSet(); - for (DimensionDesc dim : cube.getDescriptor().getDimensions()) { + CubeDesc cubeDesc = cube.getDescriptor(); + for (DimensionDesc dim : cubeDesc.getDimensions()) { for (TblColRef col : dim.getColumnRefs()) { // include those dictionaries that do not need mergning try { - if (cubeSeg.getCubeDesc().getRowkey().isUseDictionary(col) && !cube.getDescriptor().getFactTable().equalsIgnoreCase((String) dictMgr.decideSourceData(cube.getDescriptor(), col, null)[0])) { + String dictTable = (String) dictMgr.decideSourceData(cubeDesc.getModel(), cubeDesc.getRowkey().getDictionary(col), col, null)[0]; + if (cubeSeg.getCubeDesc().getRowkey().isUseDictionary(col) && !cubeDesc.getFactTable().equalsIgnoreCase(dictTable)) { cols.add(col); } } catch (IOException e) { diff --git a/cube/src/main/java/com/kylinolap/cube/cuboid/CuboidCLI.java b/cube/src/main/java/com/kylinolap/cube/cuboid/CuboidCLI.java index dd4605e..380a073 100644 --- a/cube/src/main/java/com/kylinolap/cube/cuboid/CuboidCLI.java +++ b/cube/src/main/java/com/kylinolap/cube/cuboid/CuboidCLI.java @@ -22,11 +22,11 @@ import java.util.TreeSet; import com.kylinolap.common.KylinConfig; +import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.cube.model.RowKeyDesc; import com.kylinolap.cube.model.RowKeyDesc.AggrGroupMask; import com.kylinolap.cube.model.RowKeyDesc.HierarchyMask; -import com.kylinolap.metadata.MetadataManager; /** * @author yangli9 @@ -35,7 +35,7 @@ public class CuboidCLI { public static void main(String[] args) throws IOException { - MetadataManager metaMgr = MetadataManager.getInstance(KylinConfig.getInstanceFromEnv()); + CubeManager metaMgr = CubeManager.getInstance(KylinConfig.getInstanceFromEnv()); if ("test".equals(args[0])) { CubeDesc cubeDesc = metaMgr.getCubeDesc(args[1]); diff --git a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java index bbaf36d..51130f9 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java @@ -91,11 +91,12 @@ public String toString() { } private KylinConfig config; - + private DataModelDesc model; + @JsonProperty("name") private String name; - @JsonProperty("data_model") - private DataModelDesc model; + @JsonProperty("model_name") + private String modelName; @JsonProperty("description") private String description; @JsonProperty("fact_table") @@ -204,27 +205,27 @@ public DimensionDesc findDimensionByName(String dimName) { return null; } - public TblColRef findPKByFK(TblColRef fk) { - assert isFactTable(fk.getTable()); - - TblColRef candidate = null; - - for (DimensionDesc dim : dimensions) { - JoinDesc join = dim.getJoin(); - if (join == null) - continue; - - int find = ArrayUtils.indexOf(join.getForeignKeyColumns(), fk); - if (find >= 0) { - candidate = join.getPrimaryKeyColumns()[find]; - if (join.getForeignKeyColumns().length == 1) { // is single - // column join? - break; - } - } - } - return candidate; - } +// public TblColRef findPKByFK(TblColRef fk) { +// assert isFactTable(fk.getTable()); +// +// TblColRef candidate = null; +// +// for (DimensionDesc dim : dimensions) { +// JoinDesc join = dim.getJoin(); +// if (join == null) +// continue; +// +// int find = ArrayUtils.indexOf(join.getForeignKeyColumns(), fk); +// if (find >= 0) { +// candidate = join.getPrimaryKeyColumns()[find]; +// if (join.getForeignKeyColumns().length == 1) { // is single +// // column join? +// break; +// } +// } +// } +// return candidate; +// } /** * Get all functions from each measure. @@ -258,9 +259,9 @@ public TblColRef findPKByFK(TblColRef fk) { return result; } - public boolean isFactTable(String factTable) { - return this.factTable.equalsIgnoreCase(factTable); - } +// public boolean isFactTable(String factTable) { +// return this.factTable.equalsIgnoreCase(factTable); +// } public boolean isDerived(TblColRef col) { return derivedToHostMap.containsKey(col); @@ -327,6 +328,22 @@ public void setName(String name) { this.name = name; } + public String getModelName() { + return modelName; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public DataModelDesc getModel() { + return model; + } + + public void setModel(DataModelDesc model) { + this.model = model; + } + public String getDescription() { return description; } @@ -336,11 +353,7 @@ public void setDescription(String description) { } public String getFactTable() { - return factTable; - } - - public void setFactTable(String factTable) { - this.factTable = factTable; + return model.getFactTable(); } public String[] getNullStrings() { @@ -481,6 +494,8 @@ public void init(KylinConfig config, Map tables) { initJoinColumns(tables); initDimensionColumns(tables); initMeasureColumns(tables); + + //TODO create the DataModel object from MetadataManager and then set here; rowkey.init(this); if (hbaseMapping != null) { diff --git a/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java b/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java index c744100..fba564a 100644 --- a/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java +++ b/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java @@ -325,7 +325,7 @@ public boolean isExposedColumn(String project, String table, String col) { List cubes = new ArrayList(); ProjectTable projectTable = this.getProjectTable(project, factTableName); for (CubeInstance cube : projectTable.getCubes()) { - if (cube.getDescriptor().isFactTable(factTableName) && cube.isReady()) { + if (cube.getDescriptor().getModel().isFactTable(factTableName) && cube.isReady()) { cubes.add(cube); } } @@ -340,7 +340,7 @@ public boolean isExposedColumn(String project, String table, String col) { for (CubeInstance cube : getProjectTable(project, factTable).getCubes()) { if (cube.isReady() == false) continue; - if (cube.getDescriptor().isFactTable(factTable) == false) + if (cube.getDescriptor().getModel().isFactTable(factTable) == false) continue; relatedDesc.add(cube.getDescriptor()); diff --git a/cube/src/test/java/com/kylinolap/cube/AggregationGroupSizeRuleTest.java b/cube/src/test/java/com/kylinolap/cube/AggregationGroupSizeRuleTest.java new file mode 100644 index 0000000..a76a16a --- /dev/null +++ b/cube/src/test/java/com/kylinolap/cube/AggregationGroupSizeRuleTest.java @@ -0,0 +1,99 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.kylinolap.common.util.JsonUtil; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.validation.IValidatorRule; +import com.kylinolap.cube.model.validation.ValidateContext; +import com.kylinolap.cube.model.validation.rule.AggregationGroupSizeRule; + +/** + * @author jianliu + * + */ +public class AggregationGroupSizeRuleTest { + + private CubeDesc cube; + private ValidateContext vContext = new ValidateContext(); + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + CubeDesc desc2 = JsonUtil.readValue(getClass().getClassLoader().getResourceAsStream("data/TEST2_desc.json"), CubeDesc.class); + this.cube = desc2; + + } + + @Test + public void testOneMandatoryColumn() { + IValidatorRule rule = new AggregationGroupSizeRule() { + /* + * (non-Javadoc) + * + * @see + * com.kylinolap.metadata.validation.rule.AggregationGroupSizeRule + * #getMaxAgrGroupSize() + */ + @Override + protected int getMaxAgrGroupSize() { + return 3; + } + }; + rule.validate(cube, vContext); + vContext.print(System.out); + assertEquals("Failed to validate aggragation group error", vContext.getResults().length, 2); + assertTrue("Failed to validate aggragation group error", vContext.getResults()[0].getMessage().startsWith("Length of the number")); + assertTrue("Failed to validate aggragation group error", vContext.getResults()[1].getMessage().startsWith("Length of the number")); + // assertTrue("Failed to validate aggragation group error", + // vContext.getResults()[2].getMessage() + // .startsWith("Hierachy column")); + } + + @Test + public void testAggColumnSize() { + AggregationGroupSizeRule rule = new AggregationGroupSizeRule() { + /* + * (non-Javadoc) + * + * @see + * com.kylinolap.metadata.validation.rule.AggregationGroupSizeRule + * #getMaxAgrGroupSize() + */ + @Override + protected int getMaxAgrGroupSize() { + return 20; + } + }; + rule.validate(cube, vContext); + vContext.print(System.out); + assertEquals("Failed to validate aggragation group error", vContext.getResults().length, 0); + // assertTrue("Failed to validate aggragation group error", + // vContext.getResults()[0].getMessage() + // .startsWith("Aggregation group")); + // assertTrue("Failed to validate aggragation group error", + // vContext.getResults()[0].getMessage() + // .startsWith("Hierachy column")); + } +} diff --git a/cube/src/test/java/com/kylinolap/cube/CubeDescTest.java b/cube/src/test/java/com/kylinolap/cube/CubeDescTest.java new file mode 100644 index 0000000..45cca7b --- /dev/null +++ b/cube/src/test/java/com/kylinolap/cube/CubeDescTest.java @@ -0,0 +1,59 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.kylinolap.common.util.JsonUtil; +import com.kylinolap.common.util.LocalFileMetadataTestCase; +import com.kylinolap.cube.model.CubeDesc; + +/** + * @author yangli9 + */ +public class CubeDescTest extends LocalFileMetadataTestCase { + + @Before + public void setUp() throws Exception { + this.createTestMetadata(); + } + + @After + public void after() throws Exception { + this.cleanupTestMetadata(); + } + + @Test + public void testSerialize() throws Exception { + CubeDesc desc = CubeManager.getInstance(this.getTestConfig()).getCubeDesc("test_kylin_cube_with_slr_desc"); + String str = JsonUtil.writeValueAsIndentString(desc); + System.out.println(str); + @SuppressWarnings("unused") + CubeDesc desc2 = JsonUtil.readValue(str, CubeDesc.class); + } + + + @Test + public void testGetCubeDesc() throws Exception { + CubeDesc cubeDesc = CubeManager.getInstance(this.getTestConfig()).getCubeDesc("test_kylin_cube_with_slr_desc"); + Assert.assertNotNull(cubeDesc); + } + +} diff --git a/cube/src/test/java/com/kylinolap/cube/CubeManagerCacheTest.java b/cube/src/test/java/com/kylinolap/cube/CubeManagerCacheTest.java index ddd9b06..87c0734 100644 --- a/cube/src/test/java/com/kylinolap/cube/CubeManagerCacheTest.java +++ b/cube/src/test/java/com/kylinolap/cube/CubeManagerCacheTest.java @@ -56,7 +56,7 @@ public void testReloadCache() throws Exception { // clean legacy in case last run failed store.deleteResource("/cube/a_whole_new_cube.json"); - MetadataManager metaMgr = getMetadataManager(); + CubeManager metaMgr = getCubeManager(); CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); cubeManager.createCube("a_whole_new_cube", "default", desc, null); @@ -69,7 +69,7 @@ public void testReloadCache() throws Exception { assertEquals(CubeStatusEnum.DESCBROKEN, cubeManager.getCube("a_whole_new_cube").getStatus()); } - private MetadataManager getMetadataManager() { - return MetadataManager.getInstance(getTestConfig()); + private CubeManager getCubeManager() { + return CubeManager.getInstance(getTestConfig()); } } diff --git a/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java b/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java index f0dd717..0e8b0af 100644 --- a/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java +++ b/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java @@ -67,7 +67,7 @@ public void testCreateAndDrop() throws Exception { // clean legacy in case last run failed store.deleteResource("/cube/a_whole_new_cube.json"); - MetadataManager metaMgr = getMetadataManager(); + CubeManager metaMgr = getCubeManager(); CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); CubeInstance createdCube = CubeManager.getInstance(this.getTestConfig()).createCube("a_whole_new_cube", ProjectInstance.DEFAULT_PROJECT_NAME, desc, null); assertTrue(createdCube == CubeManager.getInstance(this.getTestConfig()).getCube("a_whole_new_cube")); @@ -82,7 +82,7 @@ public void testCreateAndDrop() throws Exception { assertNull(CubeManager.getInstance(this.getTestConfig()).getCube("a_whole_new_cube")); } - private MetadataManager getMetadataManager() { - return MetadataManager.getInstance(getTestConfig()); + private CubeManager getCubeManager() { + return CubeManager.getInstance(getTestConfig()); } } diff --git a/cube/src/test/java/com/kylinolap/cube/DictionaryManagerTest.java b/cube/src/test/java/com/kylinolap/cube/DictionaryManagerTest.java new file mode 100644 index 0000000..540e453 --- /dev/null +++ b/cube/src/test/java/com/kylinolap/cube/DictionaryManagerTest.java @@ -0,0 +1,82 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube; + +import static org.junit.Assert.*; + +import java.util.HashSet; + +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + +import com.kylinolap.common.util.JsonUtil; +import com.kylinolap.common.util.LocalFileMetadataTestCase; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.dict.Dictionary; +import com.kylinolap.dict.DictionaryInfo; +import com.kylinolap.dict.DictionaryManager; +import com.kylinolap.metadata.model.realization.TblColRef; + +public class DictionaryManagerTest extends LocalFileMetadataTestCase { + + DictionaryManager dictMgr; + + @Before + public void setup() throws Exception { + createTestMetadata(); + dictMgr = DictionaryManager.getInstance(this.getTestConfig()); + } + + @After + public void after() throws Exception { + cleanupTestMetadata(); + } + + @Test + @Ignore + public void basic() throws Exception { + CubeDesc cubeDesc = CubeManager.getInstance(this.getTestConfig()).getCubeDesc("test_kylin_cube_without_slr_desc"); + TblColRef col = cubeDesc.findColumnRef("TEST_SITES", "SITE_NAME"); + + DictionaryInfo info1 = dictMgr.buildDictionary(cubeDesc.getModel(), cubeDesc.getRowkey().getDictionary(col), col, null); + System.out.println(JsonUtil.writeValueAsIndentString(info1)); + + DictionaryInfo info2 = dictMgr.buildDictionary(cubeDesc.getModel(), cubeDesc.getRowkey().getDictionary(col), col, null); + System.out.println(JsonUtil.writeValueAsIndentString(info2)); + + assertTrue(info1.getUuid() == info2.getUuid()); + + assertTrue(info1 == dictMgr.getDictionaryInfo(info1.getResourcePath())); + assertTrue(info2 == dictMgr.getDictionaryInfo(info2.getResourcePath())); + + assertTrue(info1.getDictionaryObject() == info2.getDictionaryObject()); + + touchDictValues(info1); + } + + @SuppressWarnings("unchecked") + private void touchDictValues(DictionaryInfo info1) { + Dictionary dict = (Dictionary) info1.getDictionaryObject(); + + HashSet set = new HashSet(); + for (int i = 0, n = info1.getCardinality(); i < n; i++) { + set.add(dict.getValueFromId(i)); + } + assertEquals(info1.getCardinality(), set.size()); + } +} diff --git a/cube/src/test/java/com/kylinolap/cube/MandatoryColumnRuleTest.java b/cube/src/test/java/com/kylinolap/cube/MandatoryColumnRuleTest.java new file mode 100644 index 0000000..6ab0906 --- /dev/null +++ b/cube/src/test/java/com/kylinolap/cube/MandatoryColumnRuleTest.java @@ -0,0 +1,56 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.kylinolap.common.util.JsonUtil; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.validation.IValidatorRule; +import com.kylinolap.cube.model.validation.ValidateContext; +import com.kylinolap.cube.model.validation.rule.MandatoryColumnRule; + +/** + * @author jianliu + * + */ +public class MandatoryColumnRuleTest { + + private CubeDesc cube; + private ValidateContext vContext = new ValidateContext(); + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + CubeDesc desc2 = JsonUtil.readValue(getClass().getClassLoader().getResourceAsStream("data/TEST1_desc.json"), CubeDesc.class); + this.cube = desc2; + + } + + @Test + public void testOneMandatoryColumn() { + IValidatorRule rule = new MandatoryColumnRule(); + rule.validate(cube, vContext); + assertTrue("Failed to validate mandatory error", vContext.getResults().length == 1); + assertTrue("Failed to validate mandatory error", vContext.getResults()[0].getMessage().startsWith("mandatory column")); + } +} diff --git a/cube/src/test/java/com/kylinolap/cube/RowKeyAttrRuleTest.java b/cube/src/test/java/com/kylinolap/cube/RowKeyAttrRuleTest.java new file mode 100644 index 0000000..a37def4 --- /dev/null +++ b/cube/src/test/java/com/kylinolap/cube/RowKeyAttrRuleTest.java @@ -0,0 +1,57 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.kylinolap.common.util.JsonUtil; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.validation.IValidatorRule; +import com.kylinolap.cube.model.validation.ValidateContext; +import com.kylinolap.cube.model.validation.rule.RowKeyAttrRule; + +/** + * @author jianliu + * + */ +public class RowKeyAttrRuleTest { + + private CubeDesc cube; + private ValidateContext vContext = new ValidateContext(); + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + CubeDesc desc2 = JsonUtil.readValue(getClass().getClassLoader().getResourceAsStream("data/TEST3_desc.json"), CubeDesc.class); + this.cube = desc2; + + } + + @Test + public void testOneMandatoryColumn() { + IValidatorRule rule = new RowKeyAttrRule(); + rule.validate(cube, vContext); + vContext.print(System.out); + assertTrue("Failed to validate rowkey", vContext.getResults().length == 1); + assertTrue("Failed to validate mandatory error", vContext.getResults()[0].getMessage().startsWith("Rowkey column")); + } +} diff --git a/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java b/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java index 1687148..49f8577 100644 --- a/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java +++ b/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java @@ -73,7 +73,7 @@ private void createNewCube(CubeDesc cubeDesc) throws IOException { @Test public void testInitialAndAppend() throws ParseException, IOException, CubeIntegrityException { // create a new cube - MetadataManager metaMgr = getMetadataManager(); + CubeManager metaMgr = getCubeManager(); CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); createNewCube(desc); @@ -212,7 +212,7 @@ public void testMergeSegments() throws IOException, CubeIntegrityException { @Test public void testNonPartitionedCube() throws ParseException, IOException, CubeIntegrityException { // create a new cube - MetadataManager metaMgr = getMetadataManager(); + CubeManager metaMgr = getCubeManager(); CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_without_slr_desc"); createNewCube(desc); @@ -283,7 +283,7 @@ public void testNonPartitionedCube() throws ParseException, IOException, CubeInt @Test(expected = CubeIntegrityException.class) public void testInvalidAppend() throws ParseException, IOException, CubeIntegrityException { // create a new cube - MetadataManager metaMgr = getMetadataManager(); + CubeManager metaMgr = getCubeManager(); CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); createNewCube(desc); @@ -332,7 +332,7 @@ public void testInvalidAppend() throws ParseException, IOException, CubeIntegrit @Test public void testInitialAndUpsert() throws ParseException, IOException, CubeIntegrityException { // create a new cube - MetadataManager metaMgr = getMetadataManager(); + CubeManager metaMgr = getCubeManager(); CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_without_slr_left_join_desc"); createNewCube(desc); @@ -488,7 +488,7 @@ public void testInitialAndUpsert() throws ParseException, IOException, CubeInteg @Test public void testInitialAndUpsert2() throws ParseException, IOException, CubeIntegrityException { // create a new cube - MetadataManager metaMgr = getMetadataManager(); + CubeManager metaMgr = getCubeManager(); CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_without_slr_left_join_desc"); createNewCube(desc); @@ -603,7 +603,7 @@ public void testInitialAndUpsert2() throws ParseException, IOException, CubeInte @Test(expected = CubeIntegrityException.class) public void testInvalidUpsert() throws IOException, CubeIntegrityException, ParseException { // create a new cube - MetadataManager metaMgr = getMetadataManager(); + CubeManager metaMgr = getCubeManager(); CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_without_slr_left_join_desc"); createNewCube(desc); @@ -654,7 +654,7 @@ public void testInvalidUpsert() throws IOException, CubeIntegrityException, Pars @Test(expected = CubeIntegrityException.class) public void testInvalidUpsert2() throws IOException, CubeIntegrityException, ParseException { // create a new cube - MetadataManager metaMgr = getMetadataManager(); + CubeManager metaMgr = getCubeManager(); CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_without_slr_left_join_desc"); createNewCube(desc); @@ -707,4 +707,8 @@ public void testInvalidUpsert2() throws IOException, CubeIntegrityException, Par private MetadataManager getMetadataManager() { return MetadataManager.getInstance(getTestConfig()); } + + private CubeManager getCubeManager() { + return CubeManager.getInstance(getTestConfig()); + } } diff --git a/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidSchedulerTest.java b/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidSchedulerTest.java index 6304b6e..7b968e1 100644 --- a/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidSchedulerTest.java +++ b/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidSchedulerTest.java @@ -28,6 +28,7 @@ import org.junit.Test; import com.kylinolap.common.util.LocalFileMetadataTestCase; +import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.metadata.MetadataManager; @@ -68,15 +69,15 @@ static String toString(Collection cuboids) { } private CubeDesc getTestKylinCubeWithoutSeller() { - return getMetadataManager().getCubeDesc("test_kylin_cube_without_slr_desc"); + return getCubeManager().getCubeDesc("test_kylin_cube_without_slr_desc"); } private CubeDesc getTestKylinCubeWithSeller() { - return getMetadataManager().getCubeDesc("test_kylin_cube_with_slr_desc"); + return getCubeManager().getCubeDesc("test_kylin_cube_with_slr_desc"); } private CubeDesc getTestKylinCubeWithoutSellerLeftJoin() { - return getMetadataManager().getCubeDesc("test_kylin_cube_without_slr_left_join_desc"); + return getCubeManager().getCubeDesc("test_kylin_cube_without_slr_left_join_desc"); } @Test @@ -248,28 +249,28 @@ public void testCuboidGeneration3() { @Test @Ignore public void testCuboidGeneration4() { - CubeDesc cube = getMetadataManager().getCubeDesc("geox_trans_mtrc_sd_cube_desc"); + CubeDesc cube = getCubeManager().getCubeDesc("geox_trans_mtrc_sd_cube_desc"); CuboidCLI.simulateCuboidGeneration(cube); } @Test @Ignore public void testCuboidGeneration5() { - CubeDesc cube = getMetadataManager().getCubeDesc("clsfd_ga_dayweek"); + CubeDesc cube = getCubeManager().getCubeDesc("clsfd_ga_dayweek"); CuboidCLI.simulateCuboidGeneration(cube); } @Test @Ignore public void testCuboidGeneration6() { - CubeDesc cube = getMetadataManager().getCubeDesc("clsfd_ga_day"); + CubeDesc cube = getCubeManager().getCubeDesc("clsfd_ga_day"); CuboidCLI.simulateCuboidGeneration(cube); } @Test @Ignore public void testCuboidGeneration7() { - CubeDesc cube = getMetadataManager().getCubeDesc("clsfd_ga_week"); + CubeDesc cube = getCubeManager().getCubeDesc("clsfd_ga_week"); CuboidCLI.simulateCuboidGeneration(cube); } @@ -299,6 +300,10 @@ private String sortToString(Collection longs) { private MetadataManager getMetadataManager() { return MetadataManager.getInstance(getTestConfig()); } + + private CubeManager getCubeManager() { + return CubeManager.getInstance(getTestConfig()); + } private void printCount(int[] counts) { int sum = 0; diff --git a/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidTest.java b/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidTest.java index 2c87f8f..6c0c816 100644 --- a/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidTest.java +++ b/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidTest.java @@ -22,6 +22,7 @@ import org.junit.Test; import com.kylinolap.common.util.LocalFileMetadataTestCase; +import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.metadata.MetadataManager; @@ -38,16 +39,21 @@ private MetadataManager getMetadataManager() { return MetadataManager.getInstance(getTestConfig()); } + private CubeManager getCubeManager() { + return CubeManager.getInstance(getTestConfig()); + } + + private CubeDesc getTestKylinCubeII() { - return getMetadataManager().getCubeDesc("test_kylin_cube_ii"); + return getCubeManager().getCubeDesc("test_kylin_cube_ii"); } private CubeDesc getTestKylinCubeWithoutSeller() { - return getMetadataManager().getCubeDesc("test_kylin_cube_without_slr_desc"); + return getCubeManager().getCubeDesc("test_kylin_cube_without_slr_desc"); } private CubeDesc getTestKylinCubeWithSeller() { - return getMetadataManager().getCubeDesc("test_kylin_cube_with_slr_desc"); + return getCubeManager().getCubeDesc("test_kylin_cube_with_slr_desc"); } @Before diff --git a/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java b/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java index 850bf9b..0d14862 100644 --- a/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java +++ b/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java @@ -71,7 +71,7 @@ public void testNewProject() throws Exception { // clean legacy in case last run failed store.deleteResource("/cube/cube_in_alien_project.json"); - MetadataManager metaMgr = getMetadataManager(); + CubeManager metaMgr = getCubeManager(); CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); CubeInstance createdCube = CubeManager.getInstance(this.getTestConfig()).createCube("cube_in_alien_project", "alien", desc, null); assertTrue(createdCube == CubeManager.getInstance(this.getTestConfig()).getCube("cube_in_alien_project")); @@ -115,7 +115,7 @@ public void testExistingProject() throws Exception { // clean legacy in case last run failed store.deleteResource("/cube/new_cube_in_default.json"); - MetadataManager metaMgr = getMetadataManager(); + CubeManager metaMgr = getCubeManager(); CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); CubeInstance createdCube = CubeManager.getInstance(this.getTestConfig()).createCube("new_cube_in_default", ProjectInstance.DEFAULT_PROJECT_NAME, desc, null); assertTrue(createdCube == CubeManager.getInstance(this.getTestConfig()).getCube("new_cube_in_default")); @@ -162,4 +162,8 @@ public void testProjectsLoadAfterProjectChange() throws IOException { private MetadataManager getMetadataManager() { return MetadataManager.getInstance(getTestConfig()); } + + private CubeManager getCubeManager() { + return CubeManager.getInstance(getTestConfig()); + } } diff --git a/dictionary/src/main/java/com/kylinolap/dict/DictionaryManager.java b/dictionary/src/main/java/com/kylinolap/dict/DictionaryManager.java index 985848c..668b0ef 100644 --- a/dictionary/src/main/java/com/kylinolap/dict/DictionaryManager.java +++ b/dictionary/src/main/java/com/kylinolap/dict/DictionaryManager.java @@ -33,12 +33,12 @@ import com.kylinolap.common.KylinConfig; import com.kylinolap.common.persistence.ResourceStore; import com.kylinolap.common.util.HadoopUtil; -import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.dict.lookup.FileTable; import com.kylinolap.dict.lookup.HiveTable; import com.kylinolap.dict.lookup.ReadableTable; import com.kylinolap.dict.lookup.TableSignature; import com.kylinolap.metadata.MetadataManager; +import com.kylinolap.metadata.model.DataModelDesc; import com.kylinolap.metadata.model.realization.TblColRef; public class DictionaryManager { @@ -147,9 +147,9 @@ public DictionaryInfo mergeDictionary(List dicts) throws IOExcep return trySaveNewDict(newDict, newDictInfo); } - public DictionaryInfo buildDictionary(CubeDesc cube, TblColRef col, String factColumnsPath) throws IOException { + public DictionaryInfo buildDictionary(DataModelDesc model, String dict, TblColRef col, String factColumnsPath) throws IOException { - Object[] tmp = decideSourceData(cube, col, factColumnsPath); + Object[] tmp = decideSourceData(model, dict, col, factColumnsPath); String srcTable = (String) tmp[0]; String srcCol = (String) tmp[1]; int srcColIdx = (Integer) tmp[2]; @@ -163,9 +163,9 @@ public DictionaryInfo buildDictionary(CubeDesc cube, TblColRef col, String factC return getDictionaryInfo(dupDict); } - Dictionary dict = DictionaryGenerator.buildDictionary(dictInfo, inpTable); + Dictionary dictionary = DictionaryGenerator.buildDictionary(dictInfo, inpTable); - return trySaveNewDict(dict, dictInfo); + return trySaveNewDict(dictionary, dictInfo); } /** @@ -176,7 +176,7 @@ public DictionaryInfo buildDictionary(CubeDesc cube, TblColRef col, String factC * 3. column cardinal in source table * 4. ReadableTable object */ - public Object[] decideSourceData(CubeDesc cube, TblColRef col, String factColumnsPath) throws IOException { + public Object[] decideSourceData(DataModelDesc model, String dict, TblColRef col, String factColumnsPath) throws IOException { String srcTable; String srcCol; int srcColIdx; @@ -184,7 +184,7 @@ public DictionaryInfo buildDictionary(CubeDesc cube, TblColRef col, String factC MetadataManager metaMgr = MetadataManager.getInstance(config); // case of full table (dict on fact table) - if (cube == null) { + if (model == null) { srcTable = col.getTable(); srcCol = col.getName(); srcColIdx = col.getColumn().getZeroBasedIndex(); @@ -200,13 +200,13 @@ public DictionaryInfo buildDictionary(CubeDesc cube, TblColRef col, String factC // Note FK on fact table is supported by scan the related PK on lookup // table - String useDict = cube.getRowkey().getDictionary(col); + //String useDict = cube.getRowkey().getDictionary(col); // normal case, source from lookup table - if ("true".equals(useDict) || "string".equals(useDict) || "number".equals(useDict) || "any".equals(useDict)) { + if ("true".equals(dict) || "string".equals(dict) || "number".equals(dict) || "any".equals(dict)) { // FK on fact table, use PK from lookup instead - if (cube.isFactTable(col.getTable())) { - TblColRef pkCol = cube.findPKByFK(col); + if (model.isFactTable(col.getTable())) { + TblColRef pkCol = model.findPKByFK(col); if (pkCol != null) col = pkCol; // scan the counterparty PK on lookup table // instead @@ -214,7 +214,7 @@ public DictionaryInfo buildDictionary(CubeDesc cube, TblColRef col, String factC srcTable = col.getTable(); srcCol = col.getName(); srcColIdx = col.getColumn().getZeroBasedIndex(); - if (cube.isFactTable(col.getTable())) { + if (model.isFactTable(col.getTable())) { table = new FileTable(factColumnsPath + "/" + col.getName(), -1); } else { table = new HiveTable(metaMgr, col.getTable()); @@ -223,11 +223,11 @@ public DictionaryInfo buildDictionary(CubeDesc cube, TblColRef col, String factC // otherwise could refer to a data set, e.g. common_indicators.txt // (LEGACY PATH, since distinct values are collected from fact table) else { - String dictDataSetPath = unpackDataSet(this.config.getTempHDFSDir(), useDict); + String dictDataSetPath = unpackDataSet(this.config.getTempHDFSDir(), dict); if (dictDataSetPath == null) - throw new IllegalArgumentException("Unknown dictionary data set '" + useDict + "', referred from " + col); + throw new IllegalArgumentException("Unknown dictionary data set '" + dict + "', referred from " + col); srcTable = "PREDEFINED"; - srcCol = useDict; + srcCol = dict; srcColIdx = 0; table = new FileTable(dictDataSetPath, -1); } diff --git a/dictionary/src/test/java/com/kylinolap/dict/DictionaryManagerTest.java b/dictionary/src/test/java/com/kylinolap/dict/DictionaryManagerTest.java deleted file mode 100644 index 790e0cf..0000000 --- a/dictionary/src/test/java/com/kylinolap/dict/DictionaryManagerTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.dict; - -import static org.junit.Assert.*; - -import java.util.HashSet; - -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; - -import com.kylinolap.common.util.JsonUtil; -import com.kylinolap.common.util.LocalFileMetadataTestCase; -import com.kylinolap.cube.model.CubeDesc; -import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.realization.TblColRef; - -public class DictionaryManagerTest extends LocalFileMetadataTestCase { - - DictionaryManager dictMgr; - - @Before - public void setup() throws Exception { - createTestMetadata(); - dictMgr = DictionaryManager.getInstance(this.getTestConfig()); - } - - @After - public void after() throws Exception { - cleanupTestMetadata(); - } - - @Test - @Ignore - public void basic() throws Exception { - CubeDesc cubeDesc = MetadataManager.getInstance(this.getTestConfig()).getCubeDesc("test_kylin_cube_without_slr_desc"); - TblColRef col = cubeDesc.findColumnRef("TEST_SITES", "SITE_NAME"); - - DictionaryInfo info1 = dictMgr.buildDictionary(cubeDesc, col, null); - System.out.println(JsonUtil.writeValueAsIndentString(info1)); - - DictionaryInfo info2 = dictMgr.buildDictionary(cubeDesc, col, null); - System.out.println(JsonUtil.writeValueAsIndentString(info2)); - - assertTrue(info1.getUuid() == info2.getUuid()); - - assertTrue(info1 == dictMgr.getDictionaryInfo(info1.getResourcePath())); - assertTrue(info2 == dictMgr.getDictionaryInfo(info2.getResourcePath())); - - assertTrue(info1.getDictionaryObject() == info2.getDictionaryObject()); - - touchDictValues(info1); - } - - @SuppressWarnings("unchecked") - private void touchDictValues(DictionaryInfo info1) { - Dictionary dict = (Dictionary) info1.getDictionaryObject(); - - HashSet set = new HashSet(); - for (int i = 0, n = info1.getCardinality(); i < n; i++) { - set.add(dict.getValueFromId(i)); - } - assertEquals(info1.getCardinality(), set.size()); - } -} diff --git a/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsMapper.java b/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsMapper.java index bd6d1cc..9a98b23 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsMapper.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/cube/FactDistinctColumnsMapper.java @@ -81,8 +81,8 @@ protected void setup(Context context) throws IOException { if (rowkey.isUseDictionary(col) == false) continue; - String scanTable = (String) dictMgr.decideSourceData(cubeDesc, col, null)[0]; - if (cubeDesc.isFactTable(scanTable)) { + String scanTable = (String) dictMgr.decideSourceData(cubeDesc.getModel(), cubeDesc.getRowkey().getDictionary(col), col, null)[0]; + if (cubeDesc.getModel().isFactTable(scanTable)) { System.out.println(col + " -- " + i); factDictCols.add(i); } diff --git a/job/src/main/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapper.java b/job/src/main/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapper.java index f32a5f2..fd051c1 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapper.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapper.java @@ -72,7 +72,8 @@ private Boolean checkNeedMerging(TblColRef col) throws IOException { if (ret != null) return ret; else { - ret = cubeDesc.getRowkey().isUseDictionary(col) && cubeDesc.getFactTable().equalsIgnoreCase((String) DictionaryManager.getInstance(config).decideSourceData(cubeDesc, col, null)[0]); + String dictTable = (String) DictionaryManager.getInstance(config).decideSourceData(cubeDesc.getModel(), cubeDesc.getRowkey().getDictionary(col), col, null)[0]; + ret = cubeDesc.getRowkey().isUseDictionary(col) && cubeDesc.getFactTable().equalsIgnoreCase(dictTable); dictsNeedMerging.put(col, ret); return ret; } diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java index 6489143..3e95ee9 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java @@ -1,8 +1,11 @@ package com.kylinolap.metadata.model; +import org.apache.commons.lang.ArrayUtils; + import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.metadata.model.realization.TblColRef; @JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) public class DataModelDesc { @@ -15,5 +18,55 @@ @JsonProperty("lookups") private LookupDesc[] lookups; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getFactTable() { + return factTable; + } + + public void setFactTable(String factTable) { + this.factTable = factTable; + } + + public LookupDesc[] getLookups() { + return lookups; + } + + public void setLookups(LookupDesc[] lookups) { + this.lookups = lookups; + } + + public boolean isFactTable(String factTable) { + return this.factTable.equalsIgnoreCase(factTable); + } + + public TblColRef findPKByFK(TblColRef fk) { + assert isFactTable(fk.getTable()); + + TblColRef candidate = null; + + for (LookupDesc dim : lookups) { + JoinDesc join = dim.getJoin(); + if (join == null) + continue; + + int find = ArrayUtils.indexOf(join.getForeignKeyColumns(), fk); + if (find >= 0) { + candidate = join.getPrimaryKeyColumns()[find]; + if (join.getForeignKeyColumns().length == 1) { // is single + // column join? + break; + } + } + } + return candidate; + } } diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/LookupDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/LookupDesc.java index 089ded8..fe3cff5 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/LookupDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/LookupDesc.java @@ -12,5 +12,22 @@ @JsonProperty("join") private JoinDesc join; + + public String getTable() { + return table; + } + + public void setTable(String table) { + this.table = table; + } + + public JoinDesc getJoin() { + return join; + } + + public void setJoin(JoinDesc join) { + this.join = join; + } + } diff --git a/metadata/src/test/java/com/kylinolap/metadata/CubeDescTest.java b/metadata/src/test/java/com/kylinolap/metadata/CubeDescTest.java deleted file mode 100644 index 3b723e3..0000000 --- a/metadata/src/test/java/com/kylinolap/metadata/CubeDescTest.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.kylinolap.common.util.JsonUtil; -import com.kylinolap.common.util.LocalFileMetadataTestCase; -import com.kylinolap.cube.model.CubeDesc; - -/** - * @author yangli9 - */ -public class CubeDescTest extends LocalFileMetadataTestCase { - - @Before - public void setUp() throws Exception { - this.createTestMetadata(); - } - - @After - public void after() throws Exception { - this.cleanupTestMetadata(); - } - - @Test - public void testSerialize() throws Exception { - CubeDesc desc = MetadataManager.getInstance(this.getTestConfig()).getCubeDesc("test_kylin_cube_with_slr_desc"); - String str = JsonUtil.writeValueAsIndentString(desc); - System.out.println(str); - @SuppressWarnings("unused") - CubeDesc desc2 = JsonUtil.readValue(str, CubeDesc.class); - } -} diff --git a/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java b/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java index 6fc9797..149a618 100644 --- a/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java +++ b/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java @@ -23,7 +23,6 @@ import org.junit.Test; import com.kylinolap.common.util.LocalFileMetadataTestCase; -import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.metadata.model.TableDesc; /** @@ -64,10 +63,4 @@ public void testGetInstance() throws Exception { Assert.assertTrue(MetadataManager.getInstance(this.getTestConfig()).listAllTables().size() > 0); } - @Test - public void testGetCubeDesc() throws Exception { - CubeDesc cubeDesc = MetadataManager.getInstance(this.getTestConfig()).getCubeDesc("test_kylin_cube_with_slr_desc"); - Assert.assertNotNull(cubeDesc); - } - } diff --git a/metadata/src/test/java/com/kylinolap/metadata/validation/rule/AggregationGroupSizeRuleTest.java b/metadata/src/test/java/com/kylinolap/metadata/validation/rule/AggregationGroupSizeRuleTest.java deleted file mode 100644 index e3e3e7d..0000000 --- a/metadata/src/test/java/com/kylinolap/metadata/validation/rule/AggregationGroupSizeRuleTest.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.validation.rule; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.kylinolap.common.util.JsonUtil; -import com.kylinolap.cube.model.CubeDesc; -import com.kylinolap.cube.model.validation.IValidatorRule; -import com.kylinolap.cube.model.validation.ValidateContext; -import com.kylinolap.cube.model.validation.rule.AggregationGroupSizeRule; - -/** - * @author jianliu - * - */ -public class AggregationGroupSizeRuleTest { - - private CubeDesc cube; - private ValidateContext vContext = new ValidateContext(); - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception { - CubeDesc desc2 = JsonUtil.readValue(getClass().getClassLoader().getResourceAsStream("data/TEST2_desc.json"), CubeDesc.class); - this.cube = desc2; - - } - - @Test - public void testOneMandatoryColumn() { - IValidatorRule rule = new AggregationGroupSizeRule() { - /* - * (non-Javadoc) - * - * @see - * com.kylinolap.metadata.validation.rule.AggregationGroupSizeRule - * #getMaxAgrGroupSize() - */ - @Override - protected int getMaxAgrGroupSize() { - return 3; - } - }; - rule.validate(cube, vContext); - vContext.print(System.out); - assertEquals("Failed to validate aggragation group error", vContext.getResults().length, 2); - assertTrue("Failed to validate aggragation group error", vContext.getResults()[0].getMessage().startsWith("Length of the number")); - assertTrue("Failed to validate aggragation group error", vContext.getResults()[1].getMessage().startsWith("Length of the number")); - // assertTrue("Failed to validate aggragation group error", - // vContext.getResults()[2].getMessage() - // .startsWith("Hierachy column")); - } - - @Test - public void testAggColumnSize() { - AggregationGroupSizeRule rule = new AggregationGroupSizeRule() { - /* - * (non-Javadoc) - * - * @see - * com.kylinolap.metadata.validation.rule.AggregationGroupSizeRule - * #getMaxAgrGroupSize() - */ - @Override - protected int getMaxAgrGroupSize() { - return 20; - } - }; - rule.validate(cube, vContext); - vContext.print(System.out); - assertEquals("Failed to validate aggragation group error", vContext.getResults().length, 0); - // assertTrue("Failed to validate aggragation group error", - // vContext.getResults()[0].getMessage() - // .startsWith("Aggregation group")); - // assertTrue("Failed to validate aggragation group error", - // vContext.getResults()[0].getMessage() - // .startsWith("Hierachy column")); - } -} diff --git a/metadata/src/test/java/com/kylinolap/metadata/validation/rule/MandatoryColumnRuleTest.java b/metadata/src/test/java/com/kylinolap/metadata/validation/rule/MandatoryColumnRuleTest.java deleted file mode 100644 index 4ebe5ab..0000000 --- a/metadata/src/test/java/com/kylinolap/metadata/validation/rule/MandatoryColumnRuleTest.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.validation.rule; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.kylinolap.common.util.JsonUtil; -import com.kylinolap.cube.model.CubeDesc; -import com.kylinolap.cube.model.validation.IValidatorRule; -import com.kylinolap.cube.model.validation.ValidateContext; -import com.kylinolap.cube.model.validation.rule.MandatoryColumnRule; - -/** - * @author jianliu - * - */ -public class MandatoryColumnRuleTest { - - private CubeDesc cube; - private ValidateContext vContext = new ValidateContext(); - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception { - CubeDesc desc2 = JsonUtil.readValue(getClass().getClassLoader().getResourceAsStream("data/TEST1_desc.json"), CubeDesc.class); - this.cube = desc2; - - } - - @Test - public void testOneMandatoryColumn() { - IValidatorRule rule = new MandatoryColumnRule(); - rule.validate(cube, vContext); - assertTrue("Failed to validate mandatory error", vContext.getResults().length == 1); - assertTrue("Failed to validate mandatory error", vContext.getResults()[0].getMessage().startsWith("mandatory column")); - } -} diff --git a/metadata/src/test/java/com/kylinolap/metadata/validation/rule/RowKeyAttrRuleTest.java b/metadata/src/test/java/com/kylinolap/metadata/validation/rule/RowKeyAttrRuleTest.java deleted file mode 100644 index 81f1d40..0000000 --- a/metadata/src/test/java/com/kylinolap/metadata/validation/rule/RowKeyAttrRuleTest.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.metadata.validation.rule; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.kylinolap.common.util.JsonUtil; -import com.kylinolap.cube.model.CubeDesc; -import com.kylinolap.cube.model.validation.IValidatorRule; -import com.kylinolap.cube.model.validation.ValidateContext; -import com.kylinolap.cube.model.validation.rule.RowKeyAttrRule; - -/** - * @author jianliu - * - */ -public class RowKeyAttrRuleTest { - - private CubeDesc cube; - private ValidateContext vContext = new ValidateContext(); - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception { - CubeDesc desc2 = JsonUtil.readValue(getClass().getClassLoader().getResourceAsStream("data/TEST3_desc.json"), CubeDesc.class); - this.cube = desc2; - - } - - @Test - public void testOneMandatoryColumn() { - IValidatorRule rule = new RowKeyAttrRule(); - rule.validate(cube, vContext); - vContext.print(System.out); - assertTrue("Failed to validate rowkey", vContext.getResults().length == 1); - assertTrue("Failed to validate mandatory error", vContext.getResults()[0].getMessage().startsWith("Rowkey column")); - } -} diff --git a/server/src/main/java/com/kylinolap/rest/service/BasicService.java b/server/src/main/java/com/kylinolap/rest/service/BasicService.java index 812c6aa..b76da75 100644 --- a/server/src/main/java/com/kylinolap/rest/service/BasicService.java +++ b/server/src/main/java/com/kylinolap/rest/service/BasicService.java @@ -149,7 +149,7 @@ public KylinConfig getKylinConfig() { public MetadataManager getMetadataManager() { return MetadataManager.getInstance(getConfig()); } - + public CubeManager getCubeManager() { return CubeManager.getInstance(getConfig()); } diff --git a/server/src/main/java/com/kylinolap/rest/service/CubeService.java b/server/src/main/java/com/kylinolap/rest/service/CubeService.java index fc3bbc3..fa3c181 100644 --- a/server/src/main/java/com/kylinolap/rest/service/CubeService.java +++ b/server/src/main/java/com/kylinolap/rest/service/CubeService.java @@ -163,10 +163,10 @@ public CubeInstance createCubeAndDesc(String cubeName, String projectName, CubeD CubeDesc createdDesc = null; CubeInstance createdCube = null; - createdDesc = getMetadataManager().createCubeDesc(desc); + createdDesc = getCubeManager().createCubeDesc(desc); if (!createdDesc.getError().isEmpty()) { - getMetadataManager().removeCubeDesc(createdDesc); + getCubeManager().removeCubeDesc(createdDesc); throw new InternalErrorException(createdDesc.getError().get(0)); } @@ -174,7 +174,7 @@ public CubeInstance createCubeAndDesc(String cubeName, String projectName, CubeD int cuboidCount = CuboidCLI.simulateCuboidGeneration(createdDesc); logger.info("New cube " + cubeName + " has " + cuboidCount + " cuboids"); }catch(Exception e){ - getMetadataManager().removeCubeDesc(createdDesc); + getCubeManager().removeCubeDesc(createdDesc); throw new InternalErrorException("Failed to deal with the request.", e); } @@ -201,7 +201,7 @@ public CubeDesc updateCubeAndDesc(CubeInstance cube, CubeDesc desc, String newPr this.releaseAllSegments(cube); } - CubeDesc updatedCubeDesc = getMetadataManager().updateCubeDesc(desc); + CubeDesc updatedCubeDesc = getCubeManager().updateCubeDesc(desc); int cuboidCount = CuboidCLI.simulateCuboidGeneration(updatedCubeDesc); logger.info("Updated cube " + cube.getName() + " has " + cuboidCount + " cuboids"); @@ -552,7 +552,7 @@ private static void writeResource(InputStream source, KylinConfig dstConfig, Str public void updateCubeNotifyList(CubeInstance cube, List notifyList) throws IOException, CubeIntegrityException { CubeDesc desc = cube.getDescriptor(); desc.setNotifyList(notifyList); - getMetadataManager().updateCubeDesc(desc); + getCubeManager().updateCubeDesc(desc); } public CubeInstance rebuildLookupSnapshot(String cubeName, String segmentName, String lookupTable) throws IOException { diff --git a/server/src/test/java/com/kylinolap/rest/controller/CubeControllerTest.java b/server/src/test/java/com/kylinolap/rest/controller/CubeControllerTest.java index f873683..3f68729 100644 --- a/server/src/test/java/com/kylinolap/rest/controller/CubeControllerTest.java +++ b/server/src/test/java/com/kylinolap/rest/controller/CubeControllerTest.java @@ -70,7 +70,7 @@ public void testBasics() throws IOException { newCube.setHBaseMapping(cube.getHBaseMapping()); newCube.setMeasures(cube.getMeasures()); newCube.setConfig(cube.getConfig()); - newCube.setFactTable(cube.getFactTable()); + newCube.getModel().setFactTable(cube.getFactTable()); newCube.setRowkey(cube.getRowkey()); ObjectMapper mapper = new ObjectMapper(); From 57b4a65d6c1f17a8d9481fbb6e41689b6fc63e7c Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Mon, 1 Dec 2014 09:34:11 +0800 Subject: [PATCH 28/65] add CRUD for DataModelDesc --- .../java/com/kylinolap/metadata/MetadataManager.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java b/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java index c493f06..5aaf67e 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java +++ b/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java @@ -25,6 +25,7 @@ import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; +import com.kylinolap.metadata.model.DataModelDesc; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -311,4 +312,20 @@ public void reload() { getInstance(config); } + public DataModelDesc getDataModelDesc(String name) { + return null; + } + + public void updateDataModelDesc(DataModelDesc dataModelDesc) { + throw new UnsupportedOperationException(); + } + + public DataModelDesc createDataModelDesc(DataModelDesc dataModelDesc) { + return dataModelDesc; + } + + public boolean deleteDataModelDesc(DataModelDesc dataModelDesc) { + throw new UnsupportedOperationException(); + } + } From 5d98ca0e57480e03c0ac3fce231c5a69cd1308c8 Mon Sep 17 00:00:00 2001 From: honma Date: Mon, 1 Dec 2014 10:56:02 +0800 Subject: [PATCH 29/65] minor change --- cube/src/main/java/com/kylinolap/cube/cuboid/Cuboid.java | 1 + 1 file changed, 1 insertion(+) diff --git a/cube/src/main/java/com/kylinolap/cube/cuboid/Cuboid.java b/cube/src/main/java/com/kylinolap/cube/cuboid/Cuboid.java index ae5f221..c9efacc 100644 --- a/cube/src/main/java/com/kylinolap/cube/cuboid/Cuboid.java +++ b/cube/src/main/java/com/kylinolap/cube/cuboid/Cuboid.java @@ -57,6 +57,7 @@ public static Cuboid findById(CubeDesc cube, long cuboidID) { cubeCache.put(cuboidID, cuboid); } return cuboid; + } public static boolean isValid(CubeDesc cube, long cuboidID) { From 04c9aa9320b635c850d7f5d7d074f4e3a74b0d2b Mon Sep 17 00:00:00 2001 From: shaofengshi Date: Mon, 1 Dec 2014 11:43:21 +0800 Subject: [PATCH 30/65] Continue the refactor on mete data structure change. --- .../java/com/kylinolap/cube/model/CubeDesc.java | 27 ++++++------- .../com/kylinolap/cube/model/DimensionDesc.java | 45 +++++++++++----------- .../com/kylinolap/metadata/model/TableDesc.java | 6 +++ 3 files changed, 39 insertions(+), 39 deletions(-) diff --git a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java index 51130f9..aedb80f 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java @@ -99,8 +99,6 @@ public String toString() { private String modelName; @JsonProperty("description") private String description; - @JsonProperty("fact_table") - private String factTable; @JsonProperty("null_string") private String[] nullStrings; @JsonProperty("filter_condition") @@ -245,7 +243,7 @@ public DimensionDesc findDimensionByName(String dimName) { HashSet tableNames = new HashSet(); List result = new ArrayList(); - tableNames.add(factTable.toUpperCase()); + tableNames.add(this.getFactTable().toUpperCase()); for (DimensionDesc dim : dimensions) { String table = dim.getTable(); if (table != null) @@ -435,7 +433,7 @@ public boolean equals(Object o) { if (!name.equals(cubeDesc.name)) return false; - if (!factTable.equals(cubeDesc.factTable)) + if (!getFactTable().equals(cubeDesc.getFactTable())) return false; return true; @@ -445,13 +443,13 @@ public boolean equals(Object o) { public int hashCode() { int result = 0; result = 31 * result + name.hashCode(); - result = 31 * result + factTable.hashCode(); + result = 31 * result + getFactTable().hashCode(); return result; } @Override public String toString() { - return "CubeDesc [name=" + name + ", factTable=" + factTable + ", cubePartitionDesc=" + cubePartitionDesc + ", dimensions=" + dimensions + ", measures=" + measures + ", rowkey=" + rowkey + ", hbaseMapping=" + hbaseMapping + "]"; + return "CubeDesc [name=" + name + ", factTable=" + getFactTable() + ", cubePartitionDesc=" + cubePartitionDesc + ", dimensions=" + dimensions + ", measures=" + measures + ", rowkey=" + rowkey + ", hbaseMapping=" + hbaseMapping + "]"; } public String calculateSignature() { @@ -459,7 +457,7 @@ public String calculateSignature() { try { md = MessageDigest.getInstance("MD5"); StringBuilder sigString = new StringBuilder(); - sigString.append(this.name).append("|").append(this.factTable).append("|").append(JsonUtil.writeValueAsString(this.cubePartitionDesc)).append("|").append(JsonUtil.writeValueAsString(this.dimensions)).append("|").append(JsonUtil.writeValueAsString(this.measures)).append("|").append(JsonUtil.writeValueAsString(this.rowkey)).append("|").append(JsonUtil.writeValueAsString(this.hbaseMapping)); + sigString.append(this.name).append("|").append(this.getFactTable()).append("|").append(JsonUtil.writeValueAsString(this.cubePartitionDesc)).append("|").append(JsonUtil.writeValueAsString(this.dimensions)).append("|").append(JsonUtil.writeValueAsString(this.measures)).append("|").append(JsonUtil.writeValueAsString(this.rowkey)).append("|").append(JsonUtil.writeValueAsString(this.hbaseMapping)); byte[] signature = md.digest(sigString.toString().getBytes()); return new String(Base64.encodeBase64(signature)); @@ -482,11 +480,8 @@ public void init(KylinConfig config, Map tables) { this.errors.clear(); this.config = config; - if (factTable != null) - factTable = factTable.toUpperCase(); - for (DimensionDesc dim : dimensions) { - dim.init(tables); + dim.init(this, tables); } sortDimAndMeasure(); @@ -680,16 +675,16 @@ private void initJoinColumns(Map tables) { } join.setPrimaryKeyColumns(pkCols); // foreign key - TableDesc factTable = tables.get(this.factTable); + TableDesc factTable = tables.get(this.getFactTable()); if (factTable == null) { - addError("Fact table does not exist:" + this.factTable); + addError("Fact table does not exist:" + this.getFactTable()); } String[] fks = join.getForeignKey(); TblColRef[] fkCols = new TblColRef[fks.length]; for (int i = 0; i < fks.length; i++) { ColumnDesc col = factTable.findColumnByName(fks[i]); if (col == null) { - addError("Can't find column " + fks[i] + " in table " + this.factTable); + addError("Can't find column " + fks[i] + " in table " + this.getFactTable()); } TblColRef colRef = new TblColRef(col); fks[i] = colRef.getName(); @@ -698,11 +693,11 @@ private void initJoinColumns(Map tables) { join.setForeignKeyColumns(fkCols); // Validate join in dimension if (pkCols.length != fkCols.length) { - addError("Primary keys(" + dim.getTable() + ")" + Arrays.toString(pks) + " are not consistent with Foreign keys(" + this.factTable + ") " + Arrays.toString(fks)); + addError("Primary keys(" + dim.getTable() + ")" + Arrays.toString(pks) + " are not consistent with Foreign keys(" + this.getFactTable() + ") " + Arrays.toString(fks)); } for (int i = 0; i < fkCols.length; i++) { if (!fkCols[i].getDatatype().equals(pkCols[i].getDatatype())) { - addError("Primary key " + dim.getTable() + "." + pkCols[i].getName() + "." + pkCols[i].getDatatype() + " are not consistent with Foreign key " + this.factTable + "." + fkCols[i].getName() + "." + fkCols[i].getDatatype()); + addError("Primary key " + dim.getTable() + "." + pkCols[i].getName() + "." + pkCols[i].getDatatype() + " are not consistent with Foreign key " + this.getFactTable() + "." + fkCols[i].getName() + "." + fkCols[i].getDatatype()); } } diff --git a/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java b/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java index 3d9c7e3..8c43fd7 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java @@ -23,6 +23,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.kylinolap.common.util.StringUtil; import com.kylinolap.metadata.model.JoinDesc; +import com.kylinolap.metadata.model.LookupDesc; import com.kylinolap.metadata.model.TableDesc; import com.kylinolap.metadata.model.realization.TblColRef; @@ -37,16 +38,12 @@ private int id; @JsonProperty("name") private String name; - @JsonProperty("join") private JoinDesc join; @JsonProperty("hierarchy") private HierarchyDesc[] hierarchy; - @JsonProperty("table") private String table; @JsonProperty("column") private String column; - @JsonProperty("datatype") - private String datatype; @JsonProperty("derived") private String[] derived; @@ -65,22 +62,11 @@ public boolean isHierarchyColumn(TblColRef col) { return false; } - public String getDatatype() { - return datatype; - } - - public void setDatatype(String datatype) { - this.datatype = datatype; - } public String getTable() { return table.toUpperCase(); } - public void setTable(String table) { - this.table = table; - } - public int getId() { return id; } @@ -93,10 +79,6 @@ public JoinDesc getJoin() { return join; } - public void setJoin(JoinDesc join) { - this.join = join; - } - public String getName() { return name; } @@ -173,25 +155,42 @@ public int hashCode() { @Override public String toString() { - return "DimensionDesc [name=" + name + ", join=" + join + ", hierarchy=" + Arrays.toString(hierarchy) + ", table=" + table + ", column=" + column + ", datatype=" + datatype + ", derived=" + Arrays.toString(derived) + "]"; + return "DimensionDesc [name=" + name + ", join=" + join + ", hierarchy=" + Arrays.toString(hierarchy) + ", table=" + table + ", column=" + column + ", derived=" + Arrays.toString(derived) + "]"; } - public void init(Map tables) { + public void init(CubeDesc cubeDesc, Map tables) { if (name != null) name = name.toUpperCase(); - if (table != null) - table = table.toUpperCase(); if (column != null) column = column.toUpperCase(); + + // parse 'column' to get the table name; if table name is not appeared, use fact table; + String[] splits = this.column.split("."); + if (splits.length > 1) { + table = splits[splits.length - 2].toUpperCase(); + } else { + table = cubeDesc.getFactTable().toUpperCase(); + } TableDesc tableDesc = tables.get(table); if (tableDesc == null) throw new IllegalStateException("Can't find table " + table + " on dimension " + name); + boolean isOnFactTable = table.equalsIgnoreCase(cubeDesc.getFactTable()); + if (hierarchy != null && hierarchy.length == 0) hierarchy = null; if (derived != null && derived.length == 0) derived = null; + + if(!isOnFactTable) { + for(LookupDesc lookup: cubeDesc.getModel().getLookups()) { + if(lookup.getTable().equals(table)) { + join = lookup.getJoin(); + break; + } + } + } if (join != null) { StringUtil.toUpperCaseArray(join.getForeignKey(), join.getForeignKey()); diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java index 0014e0f..917cc60 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java @@ -40,6 +40,12 @@ private DatabaseDesc database; public ColumnDesc findColumnByName(String name) { + //ignore the db name and table name + int lastIndexOfDot = name.lastIndexOf("."); + if (lastIndexOfDot >= 0) { + name = name.substring(lastIndexOfDot + 1); + } + for (ColumnDesc c : columns) { // return first matched column if (name.equalsIgnoreCase(c.getName())) { From 3c2cac15b000845eb62a5fd01b102ea3570a1521 Mon Sep 17 00:00:00 2001 From: shaofengshi Date: Mon, 1 Dec 2014 14:15:11 +0800 Subject: [PATCH 31/65] Extract CubeDesc related code from CubeManager.java to CubeDescManager.java --- .../java/com/kylinolap/cube/CubeDescManager.java | 278 +++++++++++++++++++++ .../main/java/com/kylinolap/cube/CubeInstance.java | 2 +- .../main/java/com/kylinolap/cube/CubeManager.java | 173 ------------- .../java/com/kylinolap/cube/cuboid/CuboidCLI.java | 6 +- .../test/java/com/kylinolap/cube/CubeDescTest.java | 4 +- .../com/kylinolap/cube/CubeManagerCacheTest.java | 8 +- .../java/com/kylinolap/cube/CubeManagerTest.java | 8 +- .../com/kylinolap/cube/DictionaryManagerTest.java | 2 +- .../com/kylinolap/cube/SegmentManagementTest.java | 36 ++- .../kylinolap/cube/cuboid/CuboidSchedulerTest.java | 24 +- .../java/com/kylinolap/cube/cuboid/CuboidTest.java | 17 +- .../kylinolap/cube/project/ProjectManagerTest.java | 13 +- .../com/kylinolap/rest/service/BasicService.java | 5 + .../com/kylinolap/rest/service/CubeService.java | 10 +- 14 files changed, 344 insertions(+), 242 deletions(-) create mode 100644 cube/src/main/java/com/kylinolap/cube/CubeDescManager.java diff --git a/cube/src/main/java/com/kylinolap/cube/CubeDescManager.java b/cube/src/main/java/com/kylinolap/cube/CubeDescManager.java new file mode 100644 index 0000000..033c2d8 --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/CubeDescManager.java @@ -0,0 +1,278 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube; + +import java.io.IOException; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.kylinolap.common.KylinConfig; +import com.kylinolap.common.persistence.JsonSerializer; +import com.kylinolap.common.persistence.ResourceStore; +import com.kylinolap.common.persistence.Serializer; +import com.kylinolap.common.restclient.Broadcaster; +import com.kylinolap.common.restclient.SingleValueCache; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.validation.CubeMetadataValidator; +import com.kylinolap.cube.model.validation.ValidateContext; +import com.kylinolap.metadata.MetadataConstances; +import com.kylinolap.metadata.MetadataManager; + +/** + * Manager class for CubeDesc; extracted from #CubeManager + * @author shaoshi + * + */ +public class CubeDescManager { + + private static final Logger logger = LoggerFactory.getLogger(CubeDescManager.class); + + private static final Serializer CUBE_DESC_SERIALIZER = new JsonSerializer(CubeDesc.class); + + // static cached instances + private static final ConcurrentHashMap CACHE = new ConcurrentHashMap(); + + // ============================================================================ + + private KylinConfig config; + // name ==> CubeDesc + private SingleValueCache cubeDescMap = new SingleValueCache(Broadcaster.TYPE.METADATA); + + public static CubeDescManager getInstance(KylinConfig config) { + CubeDescManager r = CACHE.get(config); + if (r != null) { + return r; + } + + synchronized (CubeDescManager.class) { + r = CACHE.get(config); + if (r != null) { + return r; + } + try { + r = new CubeDescManager(config); + CACHE.put(config, r); + if (CACHE.size() > 1) { + logger.warn("More than one singleton exist"); + } + return r; + } catch (IOException e) { + throw new IllegalStateException("Failed to init CubeDescManager from " + config, e); + } + } + } + + public static void clearCache() { + CACHE.clear(); + } + + public static synchronized void removeInstance(KylinConfig config) { + CACHE.remove(config); + } + + private CubeDescManager(KylinConfig config) throws IOException { + logger.info("Initializing CubeDescManager with config " + config); + this.config = config; + + } + + public CubeDesc getCubeDesc(String name) { + return cubeDescMap.get(name); + } + + + /** + * Reload CubeDesc from resource store It will be triggered by an desc + * update event. + * + * @param name + * @throws IOException + */ + public CubeDesc reloadCubeDesc(String name) throws IOException { + + // Save Source + String path = CubeDesc.getCubeDescResourcePath(name); + + // Reload the CubeDesc + CubeDesc ndesc = loadCubeDesc(path); + + // Here replace the old one + cubeDescMap.put(ndesc.getName(), ndesc); + return ndesc; + } + + private CubeDesc loadCubeDesc(String path) throws IOException { + ResourceStore store = getStore(); + logger.debug("Loading CubeDesc " + store.getReadableResourcePath(path)); + + CubeDesc ndesc = store.getResource(path, CubeDesc.class, CUBE_DESC_SERIALIZER); + + if (StringUtils.isBlank(ndesc.getName())) { + throw new IllegalStateException("CubeDesc name must not be blank"); + } + + ndesc.init(config, getMetadataManager().getAllTablesMap()); + + if (ndesc.getError().isEmpty() == false) { + throw new IllegalStateException("Cube desc at " + path + " has issues: " + ndesc.getError()); + } + + return ndesc; + } + + + /** + * Create a new CubeDesc + * + * @param cubeDesc + * @return + * @throws IOException + */ + public CubeDesc createCubeDesc(CubeDesc cubeDesc) throws IOException { + if (cubeDesc.getUuid() == null || cubeDesc.getName() == null) + throw new IllegalArgumentException(); + if (cubeDescMap.containsKey(cubeDesc.getName())) + throw new IllegalArgumentException("CubeDesc '" + cubeDesc.getName() + "' already exists"); + + try { + cubeDesc.init(config, getMetadataManager().getAllTablesMap()); + } catch (IllegalStateException e) { + cubeDesc.addError(e.getMessage(), true); + } + // Check base validation + if (!cubeDesc.getError().isEmpty()) { + return cubeDesc; + } + // Semantic validation + CubeMetadataValidator validator = new CubeMetadataValidator(); + ValidateContext context = validator.validate(cubeDesc, true); + if (!context.ifPass()) { + return cubeDesc; + } + + cubeDesc.setSignature(cubeDesc.calculateSignature()); + + String path = cubeDesc.getResourcePath(); + getStore().putResource(path, cubeDesc, CUBE_DESC_SERIALIZER); + cubeDescMap.put(cubeDesc.getName(), cubeDesc); + + return cubeDesc; + } + + + + // remove cubeDesc + public void removeCubeDesc(CubeDesc cubeDesc) throws IOException{ + String path = cubeDesc.getResourcePath(); + getStore().deleteResource(path); + cubeDescMap.remove(cubeDesc.getName()); + } + + private void reloadAllCubeDesc() throws IOException { + ResourceStore store = getStore(); + logger.info("Reloading Cube Metadata from folder " + store.getReadableResourcePath(ResourceStore.CUBE_DESC_RESOURCE_ROOT)); + + cubeDescMap.clear(); + + List paths = store.collectResourceRecursively(ResourceStore.CUBE_DESC_RESOURCE_ROOT, MetadataConstances.FILE_SURFIX); + for (String path : paths) { + CubeDesc desc; + try { + desc = loadCubeDesc(path); + } catch (Exception e) { + logger.error("Error loading cube desc " + path, e); + continue; + } + if (path.equals(desc.getResourcePath()) == false) { + logger.error("Skip suspicious desc at " + path + ", " + desc + " should be at " + desc.getResourcePath()); + continue; + } + if (cubeDescMap.containsKey(desc.getName())) { + logger.error("Dup CubeDesc name '" + desc.getName() + "' on path " + path); + continue; + } + + cubeDescMap.putLocal(desc.getName(), desc); + } + + logger.debug("Loaded " + cubeDescMap.size() + " Cube(s)"); + } + + + /** + * Update CubeDesc with the input. Broadcast the event into cluster + * + * @param desc + * @return + * @throws IOException + */ + public CubeDesc updateCubeDesc(CubeDesc desc) throws IOException { + // Validate CubeDesc + if (desc.getUuid() == null || desc.getName() == null) { + throw new IllegalArgumentException(); + } + String name = desc.getName(); + if (!cubeDescMap.containsKey(name)) { + throw new IllegalArgumentException("CubeDesc '" + name + "' does not exist."); + } + + try { + desc.init(config, getMetadataManager().getAllTablesMap()); + } catch (IllegalStateException e) { + desc.addError(e.getMessage(), true); + return desc; + } catch (IllegalArgumentException e) { + desc.addError(e.getMessage(), true); + return desc; + } + + // Semantic validation + CubeMetadataValidator validator = new CubeMetadataValidator(); + ValidateContext context = validator.validate(desc, true); + if (!context.ifPass()) { + return desc; + } + + desc.setSignature(desc.calculateSignature()); + + // Save Source + String path = desc.getResourcePath(); + getStore().putResource(path, desc, CUBE_DESC_SERIALIZER); + + // Reload the CubeDesc + CubeDesc ndesc = loadCubeDesc(path); + // Here replace the old one + cubeDescMap.put(ndesc.getName(), desc); + + return ndesc; + } + + + + private MetadataManager getMetadataManager() { + return MetadataManager.getInstance(config); + } + + private ResourceStore getStore() { + return ResourceStore.getStore(this.config); + } + +} diff --git a/cube/src/main/java/com/kylinolap/cube/CubeInstance.java b/cube/src/main/java/com/kylinolap/cube/CubeInstance.java index fd7abb0..796eaba 100644 --- a/cube/src/main/java/com/kylinolap/cube/CubeInstance.java +++ b/cube/src/main/java/com/kylinolap/cube/CubeInstance.java @@ -166,7 +166,7 @@ public long getAllocatedStartDate() { } public CubeDesc getDescriptor() { - return CubeManager.getInstance(config).getCubeDesc(descName); + return CubeDescManager.getInstance(config).getCubeDesc(descName); } public InvertedIndexDesc getInvertedIndexDesc() { diff --git a/cube/src/main/java/com/kylinolap/cube/CubeManager.java b/cube/src/main/java/com/kylinolap/cube/CubeManager.java index fd546d1..1813e7b 100644 --- a/cube/src/main/java/com/kylinolap/cube/CubeManager.java +++ b/cube/src/main/java/com/kylinolap/cube/CubeManager.java @@ -40,8 +40,6 @@ import com.kylinolap.cube.exception.CubeIntegrityException; import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.cube.model.DimensionDesc; -import com.kylinolap.cube.model.validation.CubeMetadataValidator; -import com.kylinolap.cube.model.validation.ValidateContext; import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.dict.DateStrDictionary; @@ -52,7 +50,6 @@ import com.kylinolap.dict.lookup.LookupStringTable; import com.kylinolap.dict.lookup.SnapshotManager; import com.kylinolap.dict.lookup.SnapshotTable; -import com.kylinolap.metadata.MetadataConstances; import com.kylinolap.metadata.MetadataManager; import com.kylinolap.metadata.model.ColumnDesc; import com.kylinolap.metadata.model.TableDesc; @@ -67,8 +64,6 @@ private static String ALPHA_NUM = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private static int HBASE_TABLE_LENGTH = 10; - - private static final Serializer CUBE_DESC_SERIALIZER = new JsonSerializer(CubeDesc.class); private static final Serializer CUBE_SERIALIZER = new JsonSerializer(CubeInstance.class); private static final Logger logger = LoggerFactory.getLogger(CubeManager.class); @@ -111,8 +106,6 @@ public static synchronized void removeInstance(KylinConfig config) { // ============================================================================ private KylinConfig config; - // name ==> CubeDesc - private SingleValueCache cubeDescMap = new SingleValueCache(Broadcaster.TYPE.METADATA); // cube name ==> CubeInstance private SingleValueCache cubeMap = new SingleValueCache(Broadcaster.TYPE.CUBE); // "table/column" ==> lookup table @@ -128,172 +121,6 @@ private CubeManager(KylinConfig config) throws IOException { loadAllCubeInstance(); } - public CubeDesc getCubeDesc(String name) { - return cubeDescMap.get(name); - } - - /** - * Create a new CubeDesc - * - * @param cubeDesc - * @return - * @throws IOException - */ - public CubeDesc createCubeDesc(CubeDesc cubeDesc) throws IOException { - if (cubeDesc.getUuid() == null || cubeDesc.getName() == null) - throw new IllegalArgumentException(); - if (cubeDescMap.containsKey(cubeDesc.getName())) - throw new IllegalArgumentException("CubeDesc '" + cubeDesc.getName() + "' already exists"); - - try { - cubeDesc.init(config, getMetadataManager().getAllTablesMap()); - } catch (IllegalStateException e) { - cubeDesc.addError(e.getMessage(), true); - } - // Check base validation - if (!cubeDesc.getError().isEmpty()) { - return cubeDesc; - } - // Semantic validation - CubeMetadataValidator validator = new CubeMetadataValidator(); - ValidateContext context = validator.validate(cubeDesc, true); - if (!context.ifPass()) { - return cubeDesc; - } - - cubeDesc.setSignature(cubeDesc.calculateSignature()); - - String path = cubeDesc.getResourcePath(); - getStore().putResource(path, cubeDesc, CUBE_DESC_SERIALIZER); - cubeDescMap.put(cubeDesc.getName(), cubeDesc); - - return cubeDesc; - } - - // remove cubeDesc - public void removeCubeDesc(CubeDesc cubeDesc) throws IOException{ - String path = cubeDesc.getResourcePath(); - getStore().deleteResource(path); - cubeDescMap.remove(cubeDesc.getName()); - } - - private void reloadAllCubeDesc() throws IOException { - ResourceStore store = getStore(); - logger.info("Reloading Cube Metadata from folder " + store.getReadableResourcePath(ResourceStore.CUBE_DESC_RESOURCE_ROOT)); - - cubeDescMap.clear(); - - List paths = store.collectResourceRecursively(ResourceStore.CUBE_DESC_RESOURCE_ROOT, MetadataConstances.FILE_SURFIX); - for (String path : paths) { - CubeDesc desc; - try { - desc = loadCubeDesc(path); - } catch (Exception e) { - logger.error("Error loading cube desc " + path, e); - continue; - } - if (path.equals(desc.getResourcePath()) == false) { - logger.error("Skip suspicious desc at " + path + ", " + desc + " should be at " + desc.getResourcePath()); - continue; - } - if (cubeDescMap.containsKey(desc.getName())) { - logger.error("Dup CubeDesc name '" + desc.getName() + "' on path " + path); - continue; - } - - cubeDescMap.putLocal(desc.getName(), desc); - } - - logger.debug("Loaded " + cubeDescMap.size() + " Cube(s)"); - } - - private CubeDesc loadCubeDesc(String path) throws IOException { - ResourceStore store = getStore(); - logger.debug("Loading CubeDesc " + store.getReadableResourcePath(path)); - - CubeDesc ndesc = store.getResource(path, CubeDesc.class, CUBE_DESC_SERIALIZER); - - if (StringUtils.isBlank(ndesc.getName())) { - throw new IllegalStateException("CubeDesc name must not be blank"); - } - - ndesc.init(config, getMetadataManager().getAllTablesMap()); - - if (ndesc.getError().isEmpty() == false) { - throw new IllegalStateException("Cube desc at " + path + " has issues: " + ndesc.getError()); - } - - return ndesc; - } - - /** - * Update CubeDesc with the input. Broadcast the event into cluster - * - * @param desc - * @return - * @throws IOException - */ - public CubeDesc updateCubeDesc(CubeDesc desc) throws IOException { - // Validate CubeDesc - if (desc.getUuid() == null || desc.getName() == null) { - throw new IllegalArgumentException(); - } - String name = desc.getName(); - if (!cubeDescMap.containsKey(name)) { - throw new IllegalArgumentException("CubeDesc '" + name + "' does not exist."); - } - - try { - desc.init(config, getMetadataManager().getAllTablesMap()); - } catch (IllegalStateException e) { - desc.addError(e.getMessage(), true); - return desc; - } catch (IllegalArgumentException e) { - desc.addError(e.getMessage(), true); - return desc; - } - - // Semantic validation - CubeMetadataValidator validator = new CubeMetadataValidator(); - ValidateContext context = validator.validate(desc, true); - if (!context.ifPass()) { - return desc; - } - - desc.setSignature(desc.calculateSignature()); - - // Save Source - String path = desc.getResourcePath(); - getStore().putResource(path, desc, CUBE_DESC_SERIALIZER); - - // Reload the CubeDesc - CubeDesc ndesc = loadCubeDesc(path); - // Here replace the old one - cubeDescMap.put(ndesc.getName(), desc); - - return ndesc; - } - - /** - * Reload CubeDesc from resource store It will be triggered by an desc - * update event. - * - * @param name - * @throws IOException - */ - public CubeDesc reloadCubeDesc(String name) throws IOException { - - // Save Source - String path = CubeDesc.getCubeDescResourcePath(name); - - // Reload the CubeDesc - CubeDesc ndesc = loadCubeDesc(path); - - // Here replace the old one - cubeDescMap.put(ndesc.getName(), ndesc); - return ndesc; - } - public List listAllCubes() { return new ArrayList(cubeMap.values()); } diff --git a/cube/src/main/java/com/kylinolap/cube/cuboid/CuboidCLI.java b/cube/src/main/java/com/kylinolap/cube/cuboid/CuboidCLI.java index 380a073..8a6fc22 100644 --- a/cube/src/main/java/com/kylinolap/cube/cuboid/CuboidCLI.java +++ b/cube/src/main/java/com/kylinolap/cube/cuboid/CuboidCLI.java @@ -22,7 +22,7 @@ import java.util.TreeSet; import com.kylinolap.common.KylinConfig; -import com.kylinolap.cube.CubeManager; +import com.kylinolap.cube.CubeDescManager; import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.cube.model.RowKeyDesc; import com.kylinolap.cube.model.RowKeyDesc.AggrGroupMask; @@ -35,10 +35,10 @@ public class CuboidCLI { public static void main(String[] args) throws IOException { - CubeManager metaMgr = CubeManager.getInstance(KylinConfig.getInstanceFromEnv()); + CubeDescManager cubeDescMgr = CubeDescManager.getInstance(KylinConfig.getInstanceFromEnv()); if ("test".equals(args[0])) { - CubeDesc cubeDesc = metaMgr.getCubeDesc(args[1]); + CubeDesc cubeDesc = cubeDescMgr.getCubeDesc(args[1]); simulateCuboidGeneration(cubeDesc); } } diff --git a/cube/src/test/java/com/kylinolap/cube/CubeDescTest.java b/cube/src/test/java/com/kylinolap/cube/CubeDescTest.java index 45cca7b..2ed9055 100644 --- a/cube/src/test/java/com/kylinolap/cube/CubeDescTest.java +++ b/cube/src/test/java/com/kylinolap/cube/CubeDescTest.java @@ -42,7 +42,7 @@ public void after() throws Exception { @Test public void testSerialize() throws Exception { - CubeDesc desc = CubeManager.getInstance(this.getTestConfig()).getCubeDesc("test_kylin_cube_with_slr_desc"); + CubeDesc desc = CubeDescManager.getInstance(this.getTestConfig()).getCubeDesc("test_kylin_cube_with_slr_desc"); String str = JsonUtil.writeValueAsIndentString(desc); System.out.println(str); @SuppressWarnings("unused") @@ -52,7 +52,7 @@ public void testSerialize() throws Exception { @Test public void testGetCubeDesc() throws Exception { - CubeDesc cubeDesc = CubeManager.getInstance(this.getTestConfig()).getCubeDesc("test_kylin_cube_with_slr_desc"); + CubeDesc cubeDesc = CubeDescManager.getInstance(this.getTestConfig()).getCubeDesc("test_kylin_cube_with_slr_desc"); Assert.assertNotNull(cubeDesc); } diff --git a/cube/src/test/java/com/kylinolap/cube/CubeManagerCacheTest.java b/cube/src/test/java/com/kylinolap/cube/CubeManagerCacheTest.java index 87c0734..c9f9b24 100644 --- a/cube/src/test/java/com/kylinolap/cube/CubeManagerCacheTest.java +++ b/cube/src/test/java/com/kylinolap/cube/CubeManagerCacheTest.java @@ -56,8 +56,8 @@ public void testReloadCache() throws Exception { // clean legacy in case last run failed store.deleteResource("/cube/a_whole_new_cube.json"); - CubeManager metaMgr = getCubeManager(); - CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); + CubeDescManager cubeDescMgr = getCubeDescManager(); + CubeDesc desc = cubeDescMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); cubeManager.createCube("a_whole_new_cube", "default", desc, null); CubeInstance createdCube = cubeManager.getCube("a_whole_new_cube"); @@ -69,7 +69,7 @@ public void testReloadCache() throws Exception { assertEquals(CubeStatusEnum.DESCBROKEN, cubeManager.getCube("a_whole_new_cube").getStatus()); } - private CubeManager getCubeManager() { - return CubeManager.getInstance(getTestConfig()); + public CubeDescManager getCubeDescManager() { + return CubeDescManager.getInstance(getTestConfig()); } } diff --git a/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java b/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java index 0e8b0af..990ea37 100644 --- a/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java +++ b/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java @@ -67,8 +67,8 @@ public void testCreateAndDrop() throws Exception { // clean legacy in case last run failed store.deleteResource("/cube/a_whole_new_cube.json"); - CubeManager metaMgr = getCubeManager(); - CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); + CubeDescManager cubeDescMgr = getCubeDescManager(); + CubeDesc desc = cubeDescMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); CubeInstance createdCube = CubeManager.getInstance(this.getTestConfig()).createCube("a_whole_new_cube", ProjectInstance.DEFAULT_PROJECT_NAME, desc, null); assertTrue(createdCube == CubeManager.getInstance(this.getTestConfig()).getCube("a_whole_new_cube")); @@ -82,7 +82,7 @@ public void testCreateAndDrop() throws Exception { assertNull(CubeManager.getInstance(this.getTestConfig()).getCube("a_whole_new_cube")); } - private CubeManager getCubeManager() { - return CubeManager.getInstance(getTestConfig()); + public CubeDescManager getCubeDescManager() { + return CubeDescManager.getInstance(getTestConfig()); } } diff --git a/cube/src/test/java/com/kylinolap/cube/DictionaryManagerTest.java b/cube/src/test/java/com/kylinolap/cube/DictionaryManagerTest.java index 540e453..e69c9c7 100644 --- a/cube/src/test/java/com/kylinolap/cube/DictionaryManagerTest.java +++ b/cube/src/test/java/com/kylinolap/cube/DictionaryManagerTest.java @@ -50,7 +50,7 @@ public void after() throws Exception { @Test @Ignore public void basic() throws Exception { - CubeDesc cubeDesc = CubeManager.getInstance(this.getTestConfig()).getCubeDesc("test_kylin_cube_without_slr_desc"); + CubeDesc cubeDesc = CubeDescManager.getInstance(this.getTestConfig()).getCubeDesc("test_kylin_cube_without_slr_desc"); TblColRef col = cubeDesc.findColumnRef("TEST_SITES", "SITE_NAME"); DictionaryInfo info1 = dictMgr.buildDictionary(cubeDesc.getModel(), cubeDesc.getRowkey().getDictionary(col), col, null); diff --git a/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java b/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java index 49f8577..5d0558e 100644 --- a/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java +++ b/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java @@ -73,8 +73,8 @@ private void createNewCube(CubeDesc cubeDesc) throws IOException { @Test public void testInitialAndAppend() throws ParseException, IOException, CubeIntegrityException { // create a new cube - CubeManager metaMgr = getCubeManager(); - CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); + CubeDescManager cubeDescMgr = getCubeDescManager(); + CubeDesc desc = cubeDescMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); createNewCube(desc); SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); @@ -212,8 +212,8 @@ public void testMergeSegments() throws IOException, CubeIntegrityException { @Test public void testNonPartitionedCube() throws ParseException, IOException, CubeIntegrityException { // create a new cube - CubeManager metaMgr = getCubeManager(); - CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_without_slr_desc"); + CubeDescManager cubeDescMgr = getCubeDescManager(); + CubeDesc desc = cubeDescMgr.getCubeDesc("test_kylin_cube_without_slr_desc"); createNewCube(desc); SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); @@ -283,8 +283,8 @@ public void testNonPartitionedCube() throws ParseException, IOException, CubeInt @Test(expected = CubeIntegrityException.class) public void testInvalidAppend() throws ParseException, IOException, CubeIntegrityException { // create a new cube - CubeManager metaMgr = getCubeManager(); - CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); + CubeDescManager cubeDescMgr = getCubeDescManager(); + CubeDesc desc = cubeDescMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); createNewCube(desc); SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); @@ -332,8 +332,8 @@ public void testInvalidAppend() throws ParseException, IOException, CubeIntegrit @Test public void testInitialAndUpsert() throws ParseException, IOException, CubeIntegrityException { // create a new cube - CubeManager metaMgr = getCubeManager(); - CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_without_slr_left_join_desc"); + CubeDescManager cubeDescMgr = getCubeDescManager(); + CubeDesc desc = cubeDescMgr.getCubeDesc("test_kylin_cube_without_slr_left_join_desc"); createNewCube(desc); SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); @@ -488,8 +488,8 @@ public void testInitialAndUpsert() throws ParseException, IOException, CubeInteg @Test public void testInitialAndUpsert2() throws ParseException, IOException, CubeIntegrityException { // create a new cube - CubeManager metaMgr = getCubeManager(); - CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_without_slr_left_join_desc"); + CubeDescManager cubeDescMgr = getCubeDescManager(); + CubeDesc desc = cubeDescMgr.getCubeDesc("test_kylin_cube_without_slr_left_join_desc"); createNewCube(desc); SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); @@ -603,8 +603,8 @@ public void testInitialAndUpsert2() throws ParseException, IOException, CubeInte @Test(expected = CubeIntegrityException.class) public void testInvalidUpsert() throws IOException, CubeIntegrityException, ParseException { // create a new cube - CubeManager metaMgr = getCubeManager(); - CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_without_slr_left_join_desc"); + CubeDescManager cubeDescMgr = getCubeDescManager(); + CubeDesc desc = cubeDescMgr.getCubeDesc("test_kylin_cube_without_slr_left_join_desc"); createNewCube(desc); SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); @@ -654,8 +654,8 @@ public void testInvalidUpsert() throws IOException, CubeIntegrityException, Pars @Test(expected = CubeIntegrityException.class) public void testInvalidUpsert2() throws IOException, CubeIntegrityException, ParseException { // create a new cube - CubeManager metaMgr = getCubeManager(); - CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_without_slr_left_join_desc"); + CubeDescManager cubeDescMgr = getCubeDescManager(); + CubeDesc desc = cubeDescMgr.getCubeDesc("test_kylin_cube_without_slr_left_join_desc"); createNewCube(desc); SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); @@ -704,11 +704,7 @@ public void testInvalidUpsert2() throws IOException, CubeIntegrityException, Par System.out.println(JsonUtil.writeValueAsIndentString(cubeInstance)); } - private MetadataManager getMetadataManager() { - return MetadataManager.getInstance(getTestConfig()); - } - - private CubeManager getCubeManager() { - return CubeManager.getInstance(getTestConfig()); + public CubeDescManager getCubeDescManager() { + return CubeDescManager.getInstance(getTestConfig()); } } diff --git a/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidSchedulerTest.java b/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidSchedulerTest.java index 7b968e1..0a7db9b 100644 --- a/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidSchedulerTest.java +++ b/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidSchedulerTest.java @@ -28,7 +28,7 @@ import org.junit.Test; import com.kylinolap.common.util.LocalFileMetadataTestCase; -import com.kylinolap.cube.CubeManager; +import com.kylinolap.cube.CubeDescManager; import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.metadata.MetadataManager; @@ -69,15 +69,15 @@ static String toString(Collection cuboids) { } private CubeDesc getTestKylinCubeWithoutSeller() { - return getCubeManager().getCubeDesc("test_kylin_cube_without_slr_desc"); + return getCubeDescManager().getCubeDesc("test_kylin_cube_without_slr_desc"); } private CubeDesc getTestKylinCubeWithSeller() { - return getCubeManager().getCubeDesc("test_kylin_cube_with_slr_desc"); + return getCubeDescManager().getCubeDesc("test_kylin_cube_with_slr_desc"); } private CubeDesc getTestKylinCubeWithoutSellerLeftJoin() { - return getCubeManager().getCubeDesc("test_kylin_cube_without_slr_left_join_desc"); + return getCubeDescManager().getCubeDesc("test_kylin_cube_without_slr_left_join_desc"); } @Test @@ -249,28 +249,28 @@ public void testCuboidGeneration3() { @Test @Ignore public void testCuboidGeneration4() { - CubeDesc cube = getCubeManager().getCubeDesc("geox_trans_mtrc_sd_cube_desc"); + CubeDesc cube = getCubeDescManager().getCubeDesc("geox_trans_mtrc_sd_cube_desc"); CuboidCLI.simulateCuboidGeneration(cube); } @Test @Ignore public void testCuboidGeneration5() { - CubeDesc cube = getCubeManager().getCubeDesc("clsfd_ga_dayweek"); + CubeDesc cube = getCubeDescManager().getCubeDesc("clsfd_ga_dayweek"); CuboidCLI.simulateCuboidGeneration(cube); } @Test @Ignore public void testCuboidGeneration6() { - CubeDesc cube = getCubeManager().getCubeDesc("clsfd_ga_day"); + CubeDesc cube = getCubeDescManager().getCubeDesc("clsfd_ga_day"); CuboidCLI.simulateCuboidGeneration(cube); } @Test @Ignore public void testCuboidGeneration7() { - CubeDesc cube = getCubeManager().getCubeDesc("clsfd_ga_week"); + CubeDesc cube = getCubeDescManager().getCubeDesc("clsfd_ga_week"); CuboidCLI.simulateCuboidGeneration(cube); } @@ -297,12 +297,8 @@ private String sortToString(Collection longs) { return copy.toString(); } - private MetadataManager getMetadataManager() { - return MetadataManager.getInstance(getTestConfig()); - } - - private CubeManager getCubeManager() { - return CubeManager.getInstance(getTestConfig()); + public CubeDescManager getCubeDescManager() { + return CubeDescManager.getInstance(getTestConfig()); } private void printCount(int[] counts) { diff --git a/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidTest.java b/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidTest.java index 6c0c816..edd2a11 100644 --- a/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidTest.java +++ b/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidTest.java @@ -22,7 +22,7 @@ import org.junit.Test; import com.kylinolap.common.util.LocalFileMetadataTestCase; -import com.kylinolap.cube.CubeManager; +import com.kylinolap.cube.CubeDescManager; import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.metadata.MetadataManager; @@ -35,25 +35,20 @@ private long toLong(String bin) { return Long.parseLong(bin, 2); } - private MetadataManager getMetadataManager() { - return MetadataManager.getInstance(getTestConfig()); + public CubeDescManager getCubeDescManager() { + return CubeDescManager.getInstance(getTestConfig()); } - private CubeManager getCubeManager() { - return CubeManager.getInstance(getTestConfig()); - } - - private CubeDesc getTestKylinCubeII() { - return getCubeManager().getCubeDesc("test_kylin_cube_ii"); + return getCubeDescManager().getCubeDesc("test_kylin_cube_ii"); } private CubeDesc getTestKylinCubeWithoutSeller() { - return getCubeManager().getCubeDesc("test_kylin_cube_without_slr_desc"); + return getCubeDescManager().getCubeDesc("test_kylin_cube_without_slr_desc"); } private CubeDesc getTestKylinCubeWithSeller() { - return getCubeManager().getCubeDesc("test_kylin_cube_with_slr_desc"); + return getCubeDescManager().getCubeDesc("test_kylin_cube_with_slr_desc"); } @Before diff --git a/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java b/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java index 0d14862..de54438 100644 --- a/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java +++ b/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java @@ -27,6 +27,7 @@ import com.kylinolap.common.persistence.ResourceStore; import com.kylinolap.common.util.JsonUtil; import com.kylinolap.common.util.LocalFileMetadataTestCase; +import com.kylinolap.cube.CubeDescManager; import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.model.CubeDesc; @@ -71,8 +72,8 @@ public void testNewProject() throws Exception { // clean legacy in case last run failed store.deleteResource("/cube/cube_in_alien_project.json"); - CubeManager metaMgr = getCubeManager(); - CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); + CubeDescManager cubeDescMgr = getCubeDescManager(); + CubeDesc desc = cubeDescMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); CubeInstance createdCube = CubeManager.getInstance(this.getTestConfig()).createCube("cube_in_alien_project", "alien", desc, null); assertTrue(createdCube == CubeManager.getInstance(this.getTestConfig()).getCube("cube_in_alien_project")); assertTrue(ProjectManager.getInstance(getTestConfig()).listAllCubes("alien").contains(createdCube)); @@ -115,8 +116,8 @@ public void testExistingProject() throws Exception { // clean legacy in case last run failed store.deleteResource("/cube/new_cube_in_default.json"); - CubeManager metaMgr = getCubeManager(); - CubeDesc desc = metaMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); + CubeDescManager cubeDescMgr = getCubeDescManager(); + CubeDesc desc = cubeDescMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); CubeInstance createdCube = CubeManager.getInstance(this.getTestConfig()).createCube("new_cube_in_default", ProjectInstance.DEFAULT_PROJECT_NAME, desc, null); assertTrue(createdCube == CubeManager.getInstance(this.getTestConfig()).getCube("new_cube_in_default")); @@ -166,4 +167,8 @@ private MetadataManager getMetadataManager() { private CubeManager getCubeManager() { return CubeManager.getInstance(getTestConfig()); } + + public CubeDescManager getCubeDescManager() { + return CubeDescManager.getInstance(getTestConfig()); + } } diff --git a/server/src/main/java/com/kylinolap/rest/service/BasicService.java b/server/src/main/java/com/kylinolap/rest/service/BasicService.java index b76da75..d202313 100644 --- a/server/src/main/java/com/kylinolap/rest/service/BasicService.java +++ b/server/src/main/java/com/kylinolap/rest/service/BasicService.java @@ -40,6 +40,7 @@ import com.google.common.io.Files; import com.kylinolap.common.KylinConfig; +import com.kylinolap.cube.CubeDescManager; import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.cube.project.ProjectManager; @@ -154,6 +155,10 @@ public CubeManager getCubeManager() { return CubeManager.getInstance(getConfig()); } + public CubeDescManager getCubeDescManager() { + return CubeDescManager.getInstance(getConfig()); + } + public ProjectManager getProjectManager() { return ProjectManager.getInstance(getConfig()); } diff --git a/server/src/main/java/com/kylinolap/rest/service/CubeService.java b/server/src/main/java/com/kylinolap/rest/service/CubeService.java index fa3c181..4c3eea9 100644 --- a/server/src/main/java/com/kylinolap/rest/service/CubeService.java +++ b/server/src/main/java/com/kylinolap/rest/service/CubeService.java @@ -163,10 +163,10 @@ public CubeInstance createCubeAndDesc(String cubeName, String projectName, CubeD CubeDesc createdDesc = null; CubeInstance createdCube = null; - createdDesc = getCubeManager().createCubeDesc(desc); + createdDesc = getCubeDescManager().createCubeDesc(desc); if (!createdDesc.getError().isEmpty()) { - getCubeManager().removeCubeDesc(createdDesc); + getCubeDescManager().removeCubeDesc(createdDesc); throw new InternalErrorException(createdDesc.getError().get(0)); } @@ -174,7 +174,7 @@ public CubeInstance createCubeAndDesc(String cubeName, String projectName, CubeD int cuboidCount = CuboidCLI.simulateCuboidGeneration(createdDesc); logger.info("New cube " + cubeName + " has " + cuboidCount + " cuboids"); }catch(Exception e){ - getCubeManager().removeCubeDesc(createdDesc); + getCubeDescManager().removeCubeDesc(createdDesc); throw new InternalErrorException("Failed to deal with the request.", e); } @@ -201,7 +201,7 @@ public CubeDesc updateCubeAndDesc(CubeInstance cube, CubeDesc desc, String newPr this.releaseAllSegments(cube); } - CubeDesc updatedCubeDesc = getCubeManager().updateCubeDesc(desc); + CubeDesc updatedCubeDesc = getCubeDescManager().updateCubeDesc(desc); int cuboidCount = CuboidCLI.simulateCuboidGeneration(updatedCubeDesc); logger.info("Updated cube " + cube.getName() + " has " + cuboidCount + " cuboids"); @@ -552,7 +552,7 @@ private static void writeResource(InputStream source, KylinConfig dstConfig, Str public void updateCubeNotifyList(CubeInstance cube, List notifyList) throws IOException, CubeIntegrityException { CubeDesc desc = cube.getDescriptor(); desc.setNotifyList(notifyList); - getCubeManager().updateCubeDesc(desc); + getCubeDescManager().updateCubeDesc(desc); } public CubeInstance rebuildLookupSnapshot(String cubeName, String segmentName, String lookupTable) throws IOException { From 53c6067fd7d1c53c34bd3a33bca0449a5422c571 Mon Sep 17 00:00:00 2001 From: shaofengshi Date: Mon, 1 Dec 2014 16:05:46 +0800 Subject: [PATCH 32/65] Update test case data with the new metadata structure --- .../java/com/kylinolap/cube/CubeDescManager.java | 2 +- .../java/com/kylinolap/cube/model/CubeDesc.java | 3 +- .../cube_desc/test_kylin_cube_with_slr_desc.json | 33 ++--------------- .../model_desc/test_kylin_with_slr_model_desc.json | 43 ++++++++++++++++++++++ 4 files changed, 49 insertions(+), 32 deletions(-) create mode 100644 examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_model_desc.json diff --git a/cube/src/main/java/com/kylinolap/cube/CubeDescManager.java b/cube/src/main/java/com/kylinolap/cube/CubeDescManager.java index 033c2d8..91f4e2d 100644 --- a/cube/src/main/java/com/kylinolap/cube/CubeDescManager.java +++ b/cube/src/main/java/com/kylinolap/cube/CubeDescManager.java @@ -91,7 +91,7 @@ public static synchronized void removeInstance(KylinConfig config) { private CubeDescManager(KylinConfig config) throws IOException { logger.info("Initializing CubeDescManager with config " + config); this.config = config; - + reloadAllCubeDesc(); } public CubeDesc getCubeDesc(String name) { diff --git a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java index aedb80f..f8f3f8d 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java @@ -479,6 +479,7 @@ public String calculateSignature() { public void init(KylinConfig config, Map tables) { this.errors.clear(); this.config = config; + this.model = MetadataManager.getInstance(config).getDataModelDesc(this.modelName); for (DimensionDesc dim : dimensions) { dim.init(this, tables); @@ -489,8 +490,6 @@ public void init(KylinConfig config, Map tables) { initJoinColumns(tables); initDimensionColumns(tables); initMeasureColumns(tables); - - //TODO create the DataModel object from MetadataManager and then set here; rowkey.init(this); if (hbaseMapping != null) { diff --git a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json index e7f8d79..8bc0b17 100644 --- a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json +++ b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json @@ -1,7 +1,7 @@ { "uuid": "a24ca905-1fc6-4f67-985c-38fa5aeafd92", "name": "test_kylin_cube_with_slr_desc", - "fact_table": "test_kylin_fact", + "model_name": "test_kylin_with_slr_model_desc" "filter_condition": null, "cube_partition_desc": { "partition_date_column": "test_kylin_fact.cal_dt", @@ -12,15 +12,9 @@ { "id": "1", "name": "cal_dt", - "datatype": "date", "table": "test_cal_dt", "column": "{FK}", - "derived": ["week_beg_dt"], - "join": { - "type": "inner", - "primary_key": ["cal_dt"], - "foreign_key": ["cal_dt"] - } + "derived": ["week_beg_dt"] }, { "id": "2", @@ -28,11 +22,6 @@ "table": "test_category_groupings", "column": "{FK}", "derived": ["USER_DEFINED_FIELD1", "USER_DEFINED_FIELD3", "UPD_DATE", "UPD_USER"], - "join": { - "type": "inner", - "primary_key": ["leaf_categ_id", "site_id"], - "foreign_key": ["leaf_categ_id", "lstg_site_id"] - }, "hierarchy": [ { "level": "1", @@ -51,40 +40,26 @@ { "id": "3", "name": "lstg_format_name", - "datatype": "string", "table": "test_kylin_fact", "column": "lstg_format_name" }, { "id": "4", "name": "site_id", - "datatype": "string", "table": "test_sites", "column": "{FK}", - "derived": ["site_name", "cre_user"], - "join": { - "type": "inner", - "primary_key": ["site_id"], - "foreign_key": ["lstg_site_id"] - } + "derived": ["site_name", "cre_user"] }, { "id": "5", "name": "seller_type_cd", - "datatype": "string", "table": "test_seller_type_dim", "column": "{FK}", - "derived": ["seller_type_desc"], - "join": { - "type": "inner", - "primary_key": ["seller_type_cd"], - "foreign_key": ["slr_segment_cd"] - } + "derived": ["seller_type_desc"] }, { "id": "6", "name": "seller_id", - "datatype": "string", "table": "test_kylin_fact", "column": "seller_id" } diff --git a/examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_model_desc.json b/examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_model_desc.json new file mode 100644 index 0000000..7209e88 --- /dev/null +++ b/examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_model_desc.json @@ -0,0 +1,43 @@ +{ + "uuid": "a24ca905-1fc6-4f67-985c-341fewaeafd92", + "name": "test_kylin_with_slr_model_desc", + "fact_table": "test_kylin_fact", + "lookups": [ + { + "id": "1", + "table": "test_cal_dt", + "join": { + "type": "inner", + "primary_key": ["cal_dt"], + "foreign_key": ["cal_dt"] + } + }, + { + "id": "2", + "table": "test_category_groupings", + "join": { + "type": "inner", + "primary_key": ["leaf_categ_id", "site_id"], + "foreign_key": ["leaf_categ_id", "lstg_site_id"] + } + }, + { + "id": "3", + "table": "test_sites", + "join": { + "type": "inner", + "primary_key": ["site_id"], + "foreign_key": ["lstg_site_id"] + } + }, + { + "id": "4", + "table": "test_seller_type_dim", + "join": { + "type": "inner", + "primary_key": ["seller_type_cd"], + "foreign_key": ["slr_segment_cd"] + } + } + ] +} From a0d6310c38516178e6b26aa52e24e2b4197dd862 Mon Sep 17 00:00:00 2001 From: shaofengshi Date: Tue, 2 Dec 2014 17:49:57 +0800 Subject: [PATCH 33/65] This commit includes the following changes: 1. Code change for the metadata model structure change; 2. Update the example data, separating cube descriptor to cube + model descriptor; 3. Update some test cases. --- .../common/persistence/ResourceStore.java | 1 + .../com/kylinolap/cube/CubeSegmentValidator.java | 8 +- .../kylinolap/cube/dataGen/FactTableGenerator.java | 6 +- .../java/com/kylinolap/cube/model/CubeDesc.java | 97 ++--------- .../com/kylinolap/cube/model/DimensionDesc.java | 85 +++++---- cube/src/test/resources/data/TEST1_desc.json | 192 +++++++++++++++++++++ cube/src/test/resources/data/TEST2_desc.json | 192 +++++++++++++++++++++ cube/src/test/resources/data/TEST3_desc.json | 192 +++++++++++++++++++++ .../localmeta/cube_desc/test_kylin_cube_ii.json | 82 ++------- .../cube_desc/test_kylin_cube_with_slr_desc.json | 41 +---- .../test_kylin_cube_with_slr_left_join_desc.json | 82 ++------- .../test_kylin_cube_without_slr_desc.json | 84 ++------- ...test_kylin_cube_without_slr_left_join_desc.json | 85 ++------- .../model_desc/test_kylin_ii_model_desc.json | 38 ++++ .../test_kylin_with_slr_left_join_model_desc.json | 46 +++++ .../model_desc/test_kylin_with_slr_model_desc.json | 5 - ...est_kylin_without_slr_left_join_model_desc.json | 56 ++++++ .../test_kylin_without_slr_model_desc.json | 56 ++++++ .../com/kylinolap/metadata/MetadataManager.java | 121 +++++++++++-- .../kylinolap/metadata/model/DataModelDesc.java | 113 +++++++++++- metadata/src/test/resources/data/TEST1_desc.json | 192 --------------------- metadata/src/test/resources/data/TEST2_desc.json | 192 --------------------- metadata/src/test/resources/data/TEST3_desc.json | 192 --------------------- .../endpoint/EndpoindAggregationTest.java | 19 +- 24 files changed, 1132 insertions(+), 1045 deletions(-) create mode 100644 cube/src/test/resources/data/TEST1_desc.json create mode 100644 cube/src/test/resources/data/TEST2_desc.json create mode 100644 cube/src/test/resources/data/TEST3_desc.json create mode 100644 examples/test_case_data/localmeta/model_desc/test_kylin_ii_model_desc.json create mode 100644 examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_left_join_model_desc.json create mode 100644 examples/test_case_data/localmeta/model_desc/test_kylin_without_slr_left_join_model_desc.json create mode 100644 examples/test_case_data/localmeta/model_desc/test_kylin_without_slr_model_desc.json delete mode 100644 metadata/src/test/resources/data/TEST1_desc.json delete mode 100644 metadata/src/test/resources/data/TEST2_desc.json delete mode 100644 metadata/src/test/resources/data/TEST3_desc.json diff --git a/common/src/main/java/com/kylinolap/common/persistence/ResourceStore.java b/common/src/main/java/com/kylinolap/common/persistence/ResourceStore.java index 36abfdd..e920d4d 100644 --- a/common/src/main/java/com/kylinolap/common/persistence/ResourceStore.java +++ b/common/src/main/java/com/kylinolap/common/persistence/ResourceStore.java @@ -37,6 +37,7 @@ public static final String CUBE_RESOURCE_ROOT = "/cube"; public static final String CUBE_DESC_RESOURCE_ROOT = "/cube_desc"; + public static final String DATA_MODEL_DESC_RESOURCE_ROOT = "/model_desc"; public static final String DICT_RESOURCE_ROOT = "/dict"; public static final String IIDESC_RESOURCE_ROOT = "/invertedindex_desc"; public static final String JOB_PATH_ROOT = "/job"; diff --git a/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java b/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java index 3f50032..7d83e2e 100644 --- a/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java +++ b/cube/src/main/java/com/kylinolap/cube/CubeSegmentValidator.java @@ -93,9 +93,11 @@ private void checkLoopTableConsistency(CubeInstance cube, List newS for (TblColRef col : dim.getColumnRefs()) { // include those dictionaries that do not need mergning try { - String dictTable = (String) dictMgr.decideSourceData(cubeDesc.getModel(), cubeDesc.getRowkey().getDictionary(col), col, null)[0]; - if (cubeSeg.getCubeDesc().getRowkey().isUseDictionary(col) && !cubeDesc.getFactTable().equalsIgnoreCase(dictTable)) { - cols.add(col); + if (cubeSeg.getCubeDesc().getRowkey().isUseDictionary(col)) { + String dictTable = (String) dictMgr.decideSourceData(cubeDesc.getModel(), cubeDesc.getRowkey().getDictionary(col), col, null)[0]; + if (!cubeDesc.getFactTable().equalsIgnoreCase(dictTable)) { + cols.add(col); + } } } catch (IOException e) { throw new CubeIntegrityException("checkLoopTableConsistency not passed when allocating a new segment."); diff --git a/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java b/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java index 49b26eb..7781e61 100644 --- a/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java +++ b/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java @@ -304,8 +304,10 @@ private String generate() throws Exception { JoinDesc jDesc = dim.getJoin(); if (jDesc == null) { // column on fact table used directly as a dimension - if (!factTableCol2LookupCol.containsKey(dim.getColumn())) - usedCols.add(dim.getColumn()); + for (String aColumn : dim.getColumn()) { + if (!factTableCol2LookupCol.containsKey(aColumn)) + usedCols.add(aColumn); + } } } diff --git a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java index f8f3f8d..56745ad 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java @@ -203,28 +203,6 @@ public DimensionDesc findDimensionByName(String dimName) { return null; } -// public TblColRef findPKByFK(TblColRef fk) { -// assert isFactTable(fk.getTable()); -// -// TblColRef candidate = null; -// -// for (DimensionDesc dim : dimensions) { -// JoinDesc join = dim.getJoin(); -// if (join == null) -// continue; -// -// int find = ArrayUtils.indexOf(join.getForeignKeyColumns(), fk); -// if (find >= 0) { -// candidate = join.getPrimaryKeyColumns()[find]; -// if (join.getForeignKeyColumns().length == 1) { // is single -// // column join? -// break; -// } -// } -// } -// return candidate; -// } - /** * Get all functions from each measure. * @@ -479,15 +457,21 @@ public String calculateSignature() { public void init(KylinConfig config, Map tables) { this.errors.clear(); this.config = config; + if(this.modelName == null || this.modelName.length() ==0) { + this.addError("The cubeDesc '" + this.getName() + "' doesn't have data model specified."); + } + this.model = MetadataManager.getInstance(config).getDataModelDesc(this.modelName); + + if(this.model == null) { + this.addError("No data model found with name '" + modelName + "'."); + } for (DimensionDesc dim : dimensions) { dim.init(this, tables); } sortDimAndMeasure(); - - initJoinColumns(tables); initDimensionColumns(tables); initMeasureColumns(tables); @@ -520,16 +504,19 @@ private void initDimensionColumns(Map tables) { // dimension column if (dim.getColumn() != null) { - if ("{FK}".equals(dim.getColumn())) { + //if ("{FK}".equals(dim.getColumn())) { + if (join != null) { for (TblColRef ref : join.getForeignKeyColumns()) { TblColRef inited = initDimensionColRef(ref); dimColList.add(inited); hostColList.add(inited); } } else { - TblColRef ref = initDimensionColRef(dimTable, dim.getColumn()); - dimColList.add(ref); - hostColList.add(ref); + for (String aColumn : dim.getColumn()) { + TblColRef ref = initDimensionColRef(dimTable, aColumn); + dimColList.add(ref); + hostColList.add(ref); + } } } // hierarchy columns @@ -649,60 +636,6 @@ private TblColRef initDimensionColRef(TblColRef ref) { return ref; } - private void initJoinColumns(Map tables) { - // join columns may or may not present in cube; - // here we don't modify 'allColumns' and 'dimensionColumns'; - // initDimensionColumns() will do the update - for (DimensionDesc dim : dimensions) { - TableDesc dimTable = tables.get(dim.getTable()); - - JoinDesc join = dim.getJoin(); - if (join == null) - continue; - - // primary key - String[] pks = join.getPrimaryKey(); - TblColRef[] pkCols = new TblColRef[pks.length]; - for (int i = 0; i < pks.length; i++) { - ColumnDesc col = dimTable.findColumnByName(pks[i]); - if (col == null) { - addError("Can't find column " + pks[i] + " in table " + dimTable.getName()); - } - TblColRef colRef = new TblColRef(col); - pks[i] = colRef.getName(); - pkCols[i] = colRef; - } - join.setPrimaryKeyColumns(pkCols); - // foreign key - TableDesc factTable = tables.get(this.getFactTable()); - if (factTable == null) { - addError("Fact table does not exist:" + this.getFactTable()); - } - String[] fks = join.getForeignKey(); - TblColRef[] fkCols = new TblColRef[fks.length]; - for (int i = 0; i < fks.length; i++) { - ColumnDesc col = factTable.findColumnByName(fks[i]); - if (col == null) { - addError("Can't find column " + fks[i] + " in table " + this.getFactTable()); - } - TblColRef colRef = new TblColRef(col); - fks[i] = colRef.getName(); - fkCols[i] = colRef; - } - join.setForeignKeyColumns(fkCols); - // Validate join in dimension - if (pkCols.length != fkCols.length) { - addError("Primary keys(" + dim.getTable() + ")" + Arrays.toString(pks) + " are not consistent with Foreign keys(" + this.getFactTable() + ") " + Arrays.toString(fks)); - } - for (int i = 0; i < fkCols.length; i++) { - if (!fkCols[i].getDatatype().equals(pkCols[i].getDatatype())) { - addError("Primary key " + dim.getTable() + "." + pkCols[i].getName() + "." + pkCols[i].getDatatype() + " are not consistent with Foreign key " + this.getFactTable() + "." + fkCols[i].getName() + "." + fkCols[i].getDatatype()); - } - } - - } - } - private void initMeasureColumns(Map tables) { if (measures == null || measures.isEmpty()) { return; diff --git a/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java b/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java index 8c43fd7..c041037 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java @@ -15,12 +15,15 @@ */ package com.kylinolap.cube.model; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.Map; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.common.util.StringSplitter; import com.kylinolap.common.util.StringUtil; import com.kylinolap.metadata.model.JoinDesc; import com.kylinolap.metadata.model.LookupDesc; @@ -39,11 +42,13 @@ @JsonProperty("name") private String name; private JoinDesc join; - @JsonProperty("hierarchy") private HierarchyDesc[] hierarchy; + @JsonProperty("hierarchy") + private boolean isHierarchy; private String table; + private String database; @JsonProperty("column") - private String column; + private String[] column; @JsonProperty("derived") private String[] derived; @@ -95,14 +100,12 @@ public void setColumnRefs(TblColRef[] colRefs) { this.columnRefs = colRefs; } - public String getColumn() { + public String[] getColumn() { return this.column; } - public void setColumn(String column) { + public void setColumn(String[] column) { this.column = column; - if (this.column != null) - this.column = this.column.toUpperCase(); } public HierarchyDesc[] getHierarchy() { @@ -128,6 +131,7 @@ public void setDerived(String[] derived) { public void setDerivedColRefs(TblColRef[] derivedColRefs) { this.derivedColRefs = derivedColRefs; } + @Override public boolean equals(Object o) { @@ -155,47 +159,68 @@ public int hashCode() { @Override public String toString() { - return "DimensionDesc [name=" + name + ", join=" + join + ", hierarchy=" + Arrays.toString(hierarchy) + ", table=" + table + ", column=" + column + ", derived=" + Arrays.toString(derived) + "]"; + return "DimensionDesc [name=" + name + ", join=" + join + ", hierarchy=" + Arrays.toString(hierarchy) + ", table=" + table + ", column=" + Arrays.toString(column) + ", derived=" + Arrays.toString(derived) + "]"; } public void init(CubeDesc cubeDesc, Map tables) { if (name != null) name = name.toUpperCase(); - if (column != null) - column = column.toUpperCase(); - // parse 'column' to get the table name; if table name is not appeared, use fact table; - String[] splits = this.column.split("."); - if (splits.length > 1) { - table = splits[splits.length - 2].toUpperCase(); - } else { - table = cubeDesc.getFactTable().toUpperCase(); + this.table = null; + this.database = null; + this.join = null; + + for(int i=0, n = this.column.length; i 1) { + String thisTable = splits[splits.length - 2].toUpperCase(); + if(table == null) { + table = thisTable; + } else if (thisTable != null && !table.equalsIgnoreCase(thisTable)) { + throw new IllegalStateException("One dimension can only refer to the columns on the same table."); + } + + if (database == null && splits.length > 2) { + database = splits[splits.length - 3].toUpperCase(); + } + + this.column[i] = splits[splits.length - 1].toUpperCase(); + } else { + // if no table specified, assume it is on fact table + table = cubeDesc.getFactTable(); + } } - + TableDesc tableDesc = tables.get(table); if (tableDesc == null) throw new IllegalStateException("Can't find table " + table + " on dimension " + name); + + for(LookupDesc lookup : cubeDesc.getModel().getLookups()) { + if(lookup.getTable().equalsIgnoreCase(table)) { + this.join = lookup.getJoin(); + break; + } + } - boolean isOnFactTable = table.equalsIgnoreCase(cubeDesc.getFactTable()); + if (isHierarchy && this.column.length > 0) { + List hierarchyList = new ArrayList(3); + for (int i = 0, n = this.column.length; i < n; i++) { + String aColumn = this.column[i]; + HierarchyDesc aHierarchy = new HierarchyDesc(); + aHierarchy.setLevel(String.valueOf(i + 1)); + aHierarchy.setColumn(aColumn); + hierarchyList.add(aHierarchy); + } + + this.hierarchy = hierarchyList.toArray(new HierarchyDesc[hierarchyList.size()]); + } if (hierarchy != null && hierarchy.length == 0) hierarchy = null; if (derived != null && derived.length == 0) derived = null; - if(!isOnFactTable) { - for(LookupDesc lookup: cubeDesc.getModel().getLookups()) { - if(lookup.getTable().equals(table)) { - join = lookup.getJoin(); - break; - } - } - } - - if (join != null) { - StringUtil.toUpperCaseArray(join.getForeignKey(), join.getForeignKey()); - StringUtil.toUpperCaseArray(join.getPrimaryKey(), join.getPrimaryKey()); - } if (hierarchy != null) { for (HierarchyDesc h : hierarchy) diff --git a/cube/src/test/resources/data/TEST1_desc.json b/cube/src/test/resources/data/TEST1_desc.json new file mode 100644 index 0000000..175b105 --- /dev/null +++ b/cube/src/test/resources/data/TEST1_desc.json @@ -0,0 +1,192 @@ +{ + "uuid" : "9c53506d-d7b9-4ad4-b3b1-53ea42673c4b", + "last_modified" : 1401429176099, + "name" : "TEST1_desc", + "fact_table" : "TEST_KYLIN_FACT", + "dimensions" : [ { + "id" : 1, + "name" : "CAL_DT", + "join" : { + "type" : "inner", + "primary_key" : [ "CAL_DT" ], + "foreign_key" : [ "CAL_DT" ] + }, + "hierarchy" : null, + "table" : "TEST_CAL_DT", + "column" : "CAL_DT", + "datatype" : "date", + "derived" : [ "WEEK_BEG_DT" ] + }, { + "id" : 2, + "name" : "CATEGORY", + "join" : { + "type" : "inner", + "primary_key" : [ "LEAF_CATEG_ID", "SITE_ID" ], + "foreign_key" : [ "LEAF_CATEG_ID", "LSTG_SITE_ID" ] + }, + "hierarchy" : [ { + "level" : "1", + "column" : "META_CATEG_NAME" + }, { + "level" : "2", + "column" : "CATEG_LVL2_NAME" + }, { + "level" : "3", + "column" : "CATEG_LVL3_NAME" + } ], + "table" : "TEST_CATEGORY_GROUPINGS", + "column" : null, + "datatype" : null, + "derived" : null + }, { + "id" : 3, + "name" : "LSTG_FORMAT_NAME", + "join" : null, + "hierarchy" : null, + "table" : "TEST_KYLIN_FACT", + "column" : "LSTG_FORMAT_NAME", + "datatype" : "string", + "derived" : null + }, { + "id" : 4, + "name" : "SITE_ID", + "join" : { + "type" : "inner", + "primary_key" : [ "SITE_ID" ], + "foreign_key" : [ "LSTG_SITE_ID" ] + }, + "hierarchy" : null, + "table" : "TEST_SITES", + "column" : "SITE_ID", + "datatype" : "string", + "derived" : [ "SITE_NAME", "CRE_USER" ] + }, { + "id" : 5, + "name" : "SELLER_TYPE_CD", + "join" : { + "type" : "inner", + "primary_key" : [ "SELLER_TYPE_CD" ], + "foreign_key" : [ "SLR_SEGMENT_CD" ] + }, + "hierarchy" : null, + "table" : "TEST_SELLER_TYPE_DIM", + "column" : "SELLER_TYPE_CD", + "datatype" : "string", + "derived" : [ "SELLER_TYPE_DESC" ] + } ], + "measures" : [ { + "id" : 1, + "name" : "GMV_SUM", + "function" : { + "expression" : "SUM", + "parameter" : { + "type" : "column", + "value" : "PRICE" + }, + "returntype" : "decimal" + } + }, { + "id" : 2, + "name" : "GMV_MIN", + "function" : { + "expression" : "MIN", + "parameter" : { + "type" : "column", + "value" : "PRICE" + }, + "returntype" : "decimal" + } + }, { + "id" : 3, + "name" : "GMV_MAX", + "function" : { + "expression" : "MAX", + "parameter" : { + "type" : "column", + "value" : "PRICE" + }, + "returntype" : "decimal" + } + }, { + "id" : 4, + "name" : "TRANS_CNT", + "function" : { + "expression" : "COUNT", + "parameter" : { + "type" : "constant", + "value" : "1" + }, + "returntype" : "long" + } + }, { + "id" : 5, + "name" : "SELLER_CNT", + "function" : { + "expression" : "COUNT_DISTINCT", + "parameter" : { + "type" : "column", + "value" : "SELLER_ID" + }, + "returntype" : "hllc10" + } + }, { + "id" : 6, + "name" : "SELLER_FORMAT_CNT", + "function" : { + "expression" : "COUNT_DISTINCT", + "parameter" : { + "type" : "column", + "value" : "LSTG_FORMAT_NAME,SELLER_ID" + }, + "returntype" : "hllc10" + } + } ], + "rowkey" : { + "rowkey_columns" : [ { + "column" : "CAL_DT", + "length" : 0, + "dictionary" : "date(yyyy-mm-dd)", + "mandatory" : true + }, { + "column" : "META_CATEG_NAME", + "length" : 0, + "dictionary" : "string", + "mandatory" : false + }, { + "column" : "CATEG_LVL2_NAME", + "length" : 0, + "dictionary" : "string", + "mandatory" : false + }, { + "column" : "CATEG_LVL3_NAME", + "length" : 0, + "dictionary" : "string", + "mandatory" : false + }, { + "column" : "LSTG_FORMAT_NAME", + "length" : 12, + "dictionary" : null, + "mandatory" : false + }, { + "column" : "SITE_ID", + "length" : 0, + "dictionary" : "string", + "mandatory" : false + }, { + "column" : "SELLER_TYPE_CD", + "length" : 0, + "dictionary" : "string", + "mandatory" : false + } ], + "aggregation_groups" : [ [ "META_CATEG_NAME", "CATEG_LVL3_NAME", "CATEG_LVL2_NAME", "CAL_DT" ], [ "LSTG_FORMAT_NAME", "SITE_ID", "SELLER_TYPE_CD" ] ] + }, + "hbase_mapping" : { + "column_family" : [ { + "name" : "F1", + "columns" : [ { + "qualifier" : "M", + "measure_refs" : [ "GMV_SUM", "GMV_MIN", "GMV_MAX", "TRANS_CNT", "SELLER_CNT", "SELLER_FORMAT_CNT" ] + } ] + } ] + } +} \ No newline at end of file diff --git a/cube/src/test/resources/data/TEST2_desc.json b/cube/src/test/resources/data/TEST2_desc.json new file mode 100644 index 0000000..81bde27 --- /dev/null +++ b/cube/src/test/resources/data/TEST2_desc.json @@ -0,0 +1,192 @@ +{ + "uuid" : "9c53506d-d7b9-4ad4-b3b1-53ea42673c4b", + "last_modified" : 1401429176099, + "name" : "TEST2_desc", + "fact_table" : "TEST_KYLIN_FACT", + "dimensions" : [ { + "id" : 1, + "name" : "CAL_DT", + "join" : { + "type" : "inner", + "primary_key" : [ "CAL_DT" ], + "foreign_key" : [ "CAL_DT" ] + }, + "hierarchy" : null, + "table" : "TEST_CAL_DT", + "column" : "CAL_DT", + "datatype" : "date", + "derived" : [ "WEEK_BEG_DT" ] + }, { + "id" : 2, + "name" : "CATEGORY", + "join" : { + "type" : "inner", + "primary_key" : [ "LEAF_CATEG_ID", "SITE_ID" ], + "foreign_key" : [ "LEAF_CATEG_ID", "LSTG_SITE_ID" ] + }, + "hierarchy" : [ { + "level" : "1", + "column" : "META_CATEG_NAME" + }, { + "level" : "2", + "column" : "CATEG_LVL2_NAME" + }, { + "level" : "3", + "column" : "CATEG_LVL3_NAME" + } ], + "table" : "TEST_CATEGORY_GROUPINGS", + "column" : null, + "datatype" : null, + "derived" : null + }, { + "id" : 3, + "name" : "LSTG_FORMAT_NAME", + "join" : null, + "hierarchy" : null, + "table" : "TEST_KYLIN_FACT", + "column" : "LSTG_FORMAT_NAME", + "datatype" : "string", + "derived" : null + }, { + "id" : 4, + "name" : "SITE_ID", + "join" : { + "type" : "inner", + "primary_key" : [ "SITE_ID" ], + "foreign_key" : [ "LSTG_SITE_ID" ] + }, + "hierarchy" : null, + "table" : "TEST_SITES", + "column" : "SITE_ID", + "datatype" : "string", + "derived" : [ "SITE_NAME", "CRE_USER" ] + }, { + "id" : 5, + "name" : "SELLER_TYPE_CD", + "join" : { + "type" : "inner", + "primary_key" : [ "SELLER_TYPE_CD" ], + "foreign_key" : [ "SLR_SEGMENT_CD" ] + }, + "hierarchy" : null, + "table" : "TEST_SELLER_TYPE_DIM", + "column" : "SELLER_TYPE_CD", + "datatype" : "string", + "derived" : [ "SELLER_TYPE_DESC" ] + } ], + "measures" : [ { + "id" : 1, + "name" : "GMV_SUM", + "function" : { + "expression" : "SUM", + "parameter" : { + "type" : "column", + "value" : "PRICE" + }, + "returntype" : "decimal" + } + }, { + "id" : 2, + "name" : "GMV_MIN", + "function" : { + "expression" : "MIN", + "parameter" : { + "type" : "column", + "value" : "PRICE" + }, + "returntype" : "decimal" + } + }, { + "id" : 3, + "name" : "GMV_MAX", + "function" : { + "expression" : "MAX", + "parameter" : { + "type" : "column", + "value" : "PRICE" + }, + "returntype" : "decimal" + } + }, { + "id" : 4, + "name" : "TRANS_CNT", + "function" : { + "expression" : "COUNT", + "parameter" : { + "type" : "constant", + "value" : "1" + }, + "returntype" : "long" + } + }, { + "id" : 5, + "name" : "SELLER_CNT", + "function" : { + "expression" : "COUNT_DISTINCT", + "parameter" : { + "type" : "column", + "value" : "SELLER_ID" + }, + "returntype" : "hllc10" + } + }, { + "id" : 6, + "name" : "SELLER_FORMAT_CNT", + "function" : { + "expression" : "COUNT_DISTINCT", + "parameter" : { + "type" : "column", + "value" : "LSTG_FORMAT_NAME,SELLER_ID" + }, + "returntype" : "hllc10" + } + } ], + "rowkey" : { + "rowkey_columns" : [ { + "column" : "CAL_DT", + "length" : 0, + "dictionary" : "date(yyyy-mm-dd)", + "mandatory" : true + }, { + "column" : "META_CATEG_NAME", + "length" : 0, + "dictionary" : "string", + "mandatory" : false + }, { + "column" : "CATEG_LVL2_NAME", + "length" : 0, + "dictionary" : "string", + "mandatory" : false + }, { + "column" : "CATEG_LVL3_NAME", + "length" : 0, + "dictionary" : "string", + "mandatory" : false + }, { + "column" : "LSTG_FORMAT_NAME", + "length" : 12, + "dictionary" : null, + "mandatory" : false + }, { + "column" : "SITE_ID", + "length" : 0, + "dictionary" : "string", + "mandatory" : false + }, { + "column" : "SELLER_TYPE_CD", + "length" : 0, + "dictionary" : "string", + "mandatory" : false + } ], + "aggregation_groups" : [ [ "META_CATEG_NAME", "CATEG_LVL3_NAME", "CAL_DT" ], [ "LSTG_FORMAT_NAME", "SITE_ID", "SELLER_TYPE_CD", "CATEG_LVL2_NAME" ] ] + }, + "hbase_mapping" : { + "column_family" : [ { + "name" : "F1", + "columns" : [ { + "qualifier" : "M", + "measure_refs" : [ "GMV_SUM", "GMV_MIN", "GMV_MAX", "TRANS_CNT", "SELLER_CNT", "SELLER_FORMAT_CNT" ] + } ] + } ] + } +} \ No newline at end of file diff --git a/cube/src/test/resources/data/TEST3_desc.json b/cube/src/test/resources/data/TEST3_desc.json new file mode 100644 index 0000000..df4d60b --- /dev/null +++ b/cube/src/test/resources/data/TEST3_desc.json @@ -0,0 +1,192 @@ +{ + "uuid" : "9c53506d-d7b9-4ad4-b3b1-53ea42673c4b", + "last_modified" : 1401429176099, + "name" : "TEST1_desc", + "fact_table" : "TEST_KYLIN_FACT", + "dimensions" : [ { + "id" : 1, + "name" : "CAL_DT", + "join" : { + "type" : "inner", + "primary_key" : [ "CAL_DT" ], + "foreign_key" : [ "CAL_DT" ] + }, + "hierarchy" : null, + "table" : "TEST_CAL_DT", + "column" : "CAL_DT", + "datatype" : "date", + "derived" : [ "WEEK_BEG_DT" ] + }, { + "id" : 2, + "name" : "CATEGORY", + "join" : { + "type" : "inner", + "primary_key" : [ "LEAF_CATEG_ID", "SITE_ID" ], + "foreign_key" : [ "LEAF_CATEG_ID", "LSTG_SITE_ID" ] + }, + "hierarchy" : [ { + "level" : "1", + "column" : "META_CATEG_NAME" + }, { + "level" : "2", + "column" : "CATEG_LVL2_NAME" + }, { + "level" : "3", + "column" : "CATEG_LVL3_NAME" + } ], + "table" : "TEST_CATEGORY_GROUPINGS", + "column" : null, + "datatype" : null, + "derived" : null + }, { + "id" : 3, + "name" : "LSTG_FORMAT_NAME", + "join" : null, + "hierarchy" : null, + "table" : "TEST_KYLIN_FACT", + "column" : "LSTG_FORMAT_NAME", + "datatype" : "string", + "derived" : null + }, { + "id" : 4, + "name" : "SITE_ID", + "join" : { + "type" : "inner", + "primary_key" : [ "SITE_ID" ], + "foreign_key" : [ "LSTG_SITE_ID" ] + }, + "hierarchy" : null, + "table" : "TEST_SITES", + "column" : "SITE_ID", + "datatype" : "string", + "derived" : [ "SITE_NAME", "CRE_USER" ] + }, { + "id" : 5, + "name" : "SELLER_TYPE_CD", + "join" : { + "type" : "inner", + "primary_key" : [ "SELLER_TYPE_CD" ], + "foreign_key" : [ "SLR_SEGMENT_CD" ] + }, + "hierarchy" : null, + "table" : "TEST_SELLER_TYPE_DIM", + "column" : "SELLER_TYPE_CD", + "datatype" : "string", + "derived" : [ "SELLER_TYPE_DESC" ] + } ], + "measures" : [ { + "id" : 1, + "name" : "GMV_SUM", + "function" : { + "expression" : "SUM", + "parameter" : { + "type" : "column", + "value" : "PRICE" + }, + "returntype" : "decimal" + } + }, { + "id" : 2, + "name" : "GMV_MIN", + "function" : { + "expression" : "MIN", + "parameter" : { + "type" : "column", + "value" : "PRICE" + }, + "returntype" : "decimal" + } + }, { + "id" : 3, + "name" : "GMV_MAX", + "function" : { + "expression" : "MAX", + "parameter" : { + "type" : "column", + "value" : "PRICE" + }, + "returntype" : "decimal" + } + }, { + "id" : 4, + "name" : "TRANS_CNT", + "function" : { + "expression" : "COUNT", + "parameter" : { + "type" : "constant", + "value" : "1" + }, + "returntype" : "long" + } + }, { + "id" : 5, + "name" : "SELLER_CNT", + "function" : { + "expression" : "COUNT_DISTINCT", + "parameter" : { + "type" : "column", + "value" : "SELLER_ID" + }, + "returntype" : "hllc10" + } + }, { + "id" : 6, + "name" : "SELLER_FORMAT_CNT", + "function" : { + "expression" : "COUNT_DISTINCT", + "parameter" : { + "type" : "column", + "value" : "LSTG_FORMAT_NAME,SELLER_ID" + }, + "returntype" : "hllc10" + } + } ], + "rowkey" : { + "rowkey_columns" : [ { + "column" : "CAL_DT", + "length" : 10, + "dictionary" : "date(yyyy-mm-dd)", + "mandatory" : false + }, { + "column" : "META_CATEG_NAME", + "length" : 0, + "dictionary" : "string", + "mandatory" : false + }, { + "column" : "CATEG_LVL2_NAME", + "length" : 0, + "dictionary" : "string", + "mandatory" : false + }, { + "column" : "CATEG_LVL3_NAME", + "length" : 0, + "dictionary" : "string", + "mandatory" : false + }, { + "column" : "LSTG_FORMAT_NAME", + "length" : 12, + "dictionary" : null, + "mandatory" : false + }, { + "column" : "SITE_ID", + "length" : 0, + "dictionary" : "string", + "mandatory" : false + }, { + "column" : "SELLER_TYPE_CD", + "length" : 0, + "dictionary" : "string", + "mandatory" : false + } ], + "aggregation_groups" : [ [ "META_CATEG_NAME", "CATEG_LVL3_NAME", "CATEG_LVL2_NAME", "CAL_DT" ], [ "LSTG_FORMAT_NAME", "SITE_ID", "SELLER_TYPE_CD" ] ] + }, + "hbase_mapping" : { + "column_family" : [ { + "name" : "F1", + "columns" : [ { + "qualifier" : "M", + "measure_refs" : [ "GMV_SUM", "GMV_MIN", "GMV_MAX", "TRANS_CNT", "SELLER_CNT", "SELLER_FORMAT_CNT" ] + } ] + } ] + } +} \ No newline at end of file diff --git a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_ii.json b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_ii.json index f79dcf1..87ad1b7 100644 --- a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_ii.json +++ b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_ii.json @@ -1,103 +1,42 @@ { "uuid" : "ac13878c-8767-4454-8aab-1007e274fa23", "name" : "test_kylin_cube_ii", + "model_name" : "test_kylin_ii_model_desc", "description" : null, "dimensions" : [ { - "id" : 1, "name" : "TRANS_ID", - "join" : null, - "hierarchy" : null, - "table" : "TEST_KYLIN_FACT", - "column" : "TRANS_ID", - "datatype" : "bigint", + "column" : ["TEST_KYLIN_FACT.TRANS_ID"], "derived" : null }, { - "id" : 2, "name" : "CAL_DT", - "join" : { - "type" : "left", - "primary_key" : [ "CAL_DT" ], - "foreign_key" : [ "CAL_DT" ] - }, - "hierarchy" : null, - "table" : "TEST_CAL_DT", - "column" : "{FK}", - "datatype" : "date", + "column" : ["TEST_CAL_DT.CAL_DT"], "derived" : [ "CAL_DT", "WEEK_BEG_DT", "YEAR_BEG_DT", "QTR_BEG_DT", "MONTH_BEG_DT" ] }, { - "id" : 3, "name" : "LSTG_FORMAT_NAME", - "join" : null, - "hierarchy" : null, - "table" : "TEST_KYLIN_FACT", - "column" : "LSTG_FORMAT_NAME", - "datatype" : "string", - "derived" : null + "column" : ["TEST_KYLIN_FACT.LSTG_FORMAT_NAME"] }, { - "id" : 4, "name" : "LEAF_CATEG_ID", - "join" : { - "type" : "left", - "primary_key" : [ "LEAF_CATEG_ID", "SITE_ID" ], - "foreign_key" : [ "LEAF_CATEG_ID", "LSTG_SITE_ID" ] - }, - "hierarchy" : null, - "table" : "TEST_CATEGORY_GROUPINGS", - "column" : "{FK}", - "datatype" : null, + "column" : ["TEST_CATEGORY_GROUPINGS.LEAF_CATEG_ID", "TEST_CATEGORY_GROUPINGS.SITE_ID"], "derived" : [ "USER_DEFINED_FIELD1", "USER_DEFINED_FIELD3", "UPD_DATE", "UPD_USER" ] }, { - "id" : 5, "name" : "LSTG_SITE_ID", - "join" : { - "type" : "left", - "primary_key" : [ "SITE_ID" ], - "foreign_key" : [ "LSTG_SITE_ID" ] - }, - "hierarchy" : null, - "table" : "TEST_SITES", - "column" : "{FK}", - "datatype" : "string", + "column" : ["TEST_SITES.SITE_ID"], "derived" : [ "SITE_NAME", "CRE_USER" ] }, { - "id" : 6, "name" : "SLR_SEGMENT_CD", - "join" : { - "type" : "left", - "primary_key" : [ "SELLER_TYPE_CD" ], - "foreign_key" : [ "SLR_SEGMENT_CD" ] - }, - "hierarchy" : null, - "table" : "TEST_SELLER_TYPE_DIM", - "column" : "{FK}", - "datatype" : "string", + "column" : ["TEST_SELLER_TYPE_DIM.SELLER_TYPE_CD"], "derived" : [ "SELLER_TYPE_DESC" ] }, { - "id" : 7, "name" : "PRICE", - "join" : null, - "hierarchy" : null, - "table" : "TEST_KYLIN_FACT", - "column" : "PRICE", - "datatype" : "decimal", + "column" : ["TEST_KYLIN_FACT.PRICE"], "derived" : null }, { - "id" : 8, "name" : "ITEM_COUNT", - "join" : null, - "hierarchy" : null, - "table" : "TEST_KYLIN_FACT", - "column" : "ITEM_COUNT", - "datatype" : "bigint", + "column" : ["TEST_KYLIN_FACT.ITEM_COUNT"], "derived" : null }, { - "id" : 9, "name" : "SELLER_ID", - "join" : null, - "hierarchy" : null, - "table" : "TEST_KYLIN_FACT", - "column" : "SELLER_ID", - "datatype" : "string", + "column" : ["TEST_KYLIN_FACT.SELLER_ID"], "derived" : null } ], "measures" : null, @@ -118,7 +57,6 @@ "signature" : null, "capacity" : "MEDIUM", "last_modified" : 1408328222841, - "fact_table" : "TEST_KYLIN_FACT", "filter_condition" : null, "cube_partition_desc" : { "partition_date_column" : null, diff --git a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json index 8bc0b17..148c315 100644 --- a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json +++ b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json @@ -1,7 +1,7 @@ { "uuid": "a24ca905-1fc6-4f67-985c-38fa5aeafd92", "name": "test_kylin_cube_with_slr_desc", - "model_name": "test_kylin_with_slr_model_desc" + "model_name": "test_kylin_with_slr_model_desc", "filter_condition": null, "cube_partition_desc": { "partition_date_column": "test_kylin_fact.cal_dt", @@ -10,58 +10,33 @@ }, "dimensions": [ { - "id": "1", "name": "cal_dt", - "table": "test_cal_dt", - "column": "{FK}", + "column": ["test_cal_dt.cal_dt"], "derived": ["week_beg_dt"] }, { - "id": "2", "name": "category", - "table": "test_category_groupings", - "column": "{FK}", + "column": ["test_category_groupings.meta_categ_name", "test_category_groupings.categ_lvl2_name", "test_category_groupings.categ_lvl3_name"], "derived": ["USER_DEFINED_FIELD1", "USER_DEFINED_FIELD3", "UPD_DATE", "UPD_USER"], - "hierarchy": [ - { - "level": "1", - "column": "meta_categ_name" - }, - { - "level": "2", - "column": "categ_lvl2_name" - }, - { - "level": "3", - "column": "categ_lvl3_name" - } - ] + "hierarchy": true }, { - "id": "3", "name": "lstg_format_name", - "table": "test_kylin_fact", - "column": "lstg_format_name" + "column": ["test_kylin_fact.lstg_format_name"] }, { - "id": "4", "name": "site_id", - "table": "test_sites", - "column": "{FK}", + "column": ["test_sites.site_id"], "derived": ["site_name", "cre_user"] }, { - "id": "5", "name": "seller_type_cd", - "table": "test_seller_type_dim", - "column": "{FK}", + "column": ["test_seller_type_dim.slr_segment_cd"], "derived": ["seller_type_desc"] }, { - "id": "6", "name": "seller_id", - "table": "test_kylin_fact", - "column": "seller_id" + "column": ["test_kylin_fact.seller_id"] } ], "measures": [ diff --git a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_left_join_desc.json b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_left_join_desc.json index 74f3996..2575f61 100644 --- a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_left_join_desc.json +++ b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_left_join_desc.json @@ -1,7 +1,7 @@ { "uuid": "bbbba905-1fc6-4f67-985c-38fa5aeafd92", "name": "test_kylin_cube_with_slr_left_join_desc", - "fact_table": "test_kylin_fact", + "model_name": "test_kylin_with_slr_left_join_model_desc", "cube_partition_desc": { "partition_date_column": "test_kylin_fact.cal_dt", "partition_date_start": 0, @@ -10,93 +10,37 @@ "filter_condition": null, "dimensions": [ { - "id": "1", "name": "cal_dt", - "datatype": "date", - "table": "test_cal_dt", - "column": "{FK}", - "derived": ["week_beg_dt"], - "join": { - "type": "left", - "primary_key": ["cal_dt"], - "foreign_key": ["cal_dt"] - } + "column": ["test_cal_dt.cal_dt"], + "derived": ["week_beg_dt"] }, { - "id": "2", "name": "category", - "table": "test_category_groupings", - "join": { - "type": "left", - "primary_key": ["leaf_categ_id", "site_id"], - "foreign_key": ["leaf_categ_id", "lstg_site_id"] - }, - "hierarchy": [ - { - "level": "1", - "column": "meta_categ_name" - }, - { - "level": "2", - "column": "categ_lvl2_name" - }, - { - "level": "3", - "column": "categ_lvl3_name" - } - ] + "column": ["test_category_groupings.meta_categ_name", "test_category_groupings.categ_lvl2_name", "test_category_groupings.categ_lvl3_name"], + "hierarchy": true }, { - "id": "3", "name": "category_derived", - "table": "test_category_groupings", - "column": "{FK}", - "derived": ["USER_DEFINED_FIELD1", "USER_DEFINED_FIELD3", "UPD_DATE", "UPD_USER"], - "join": { - "type": "left", - "primary_key": ["leaf_categ_id", "site_id"], - "foreign_key": ["leaf_categ_id", "lstg_site_id"] - } + "column": ["test_category_groupings.leaf_categ_id", "test_category_groupings.site_id"], + "derived": ["USER_DEFINED_FIELD1", "USER_DEFINED_FIELD3", "UPD_DATE", "UPD_USER"] }, { - "id": "4", "name": "lstg_format_name", - "datatype": "string", - "table": "test_kylin_fact", - "column": "lstg_format_name" + "column": ["test_kylin_fact.lstg_format_name"] }, { - "id": "5", "name": "site_id", - "datatype": "string", - "table": "test_sites", - "column": "{FK}", - "derived": ["site_name", "cre_user"], - "join": { - "type": "left", - "primary_key": ["site_id"], - "foreign_key": ["lstg_site_id"] - } + "column": ["test_sites.site_id"], + "derived": ["site_name", "cre_user"] }, { - "id": "6", "name": "seller_type_cd", - "datatype": "string", - "table": "test_seller_type_dim", - "column": "{FK}", - "derived": ["seller_type_desc"], - "join": { - "type": "left", - "primary_key": ["seller_type_cd"], - "foreign_key": ["slr_segment_cd"] - } + "column": ["test_seller_type_dim.seller_type_cd"], + "derived": ["seller_type_desc"] }, { - "id": "7", "name": "seller_id", - "datatype": "string", - "table": "test_kylin_fact", - "column": "seller_id" + "column": ["test_kylin_fact.seller_id"] } ], "measures": [ diff --git a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_desc.json b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_desc.json index 4814020..547f4f6 100644 --- a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_desc.json +++ b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_desc.json @@ -1,8 +1,8 @@ { "uuid": "9ac9b7a8-3929-4dff-b59d-2100aadc8dbf", "name": "test_kylin_cube_without_slr_desc", + "model_name": "test_kylin_without_slr_model_desc", "capacity": "SMALL", - "fact_table": "test_kylin_fact", "cube_partition_desc": { "partition_date_column": null, "partition_date_start": null, @@ -11,106 +11,42 @@ "filter_condition": null, "dimensions": [ { - "id": "1", "name": "cal_dt", - "datatype": "date", - "table": "test_cal_dt", - "column": "{FK}", + "column": ["test_cal_dt.cal_dt"], "derived": [ "week_beg_dt" - ], - "join": { - "type": "inner", - "primary_key": [ - "cal_dt" - ], - "foreign_key": [ - "cal_dt" - ] - } + ] }, { - "id": "2", "name": "category", "table": "test_category_groupings", - "column": "{FK}", + "column": ["test_category_groupings.meta_categ_name", "test_category_groupings.categ_lvl2_name", "test_category_groupings.categ_lvl3_name"], "derived": [ "USER_DEFINED_FIELD1", "USER_DEFINED_FIELD3", "UPD_DATE", "UPD_USER" ], - "join": { - "type": "inner", - "primary_key": [ - "leaf_categ_id", - "site_id" - ], - "foreign_key": [ - "leaf_categ_id", - "lstg_site_id" - ] - }, - "hierarchy": [ - { - "level": "1", - "column": "meta_categ_name" - }, - { - "level": "2", - "column": "categ_lvl2_name" - }, - { - "level": "3", - "column": "categ_lvl3_name" - } - ] + "hierarchy": true }, { - "id": "3", "name": "lstg_format_name", - "datatype": "string", - "table": "test_kylin_fact", - "column": "lstg_format_name" + "column": ["test_kylin_fact.lstg_format_name"] }, { - "id": "4", "name": "site_id", - "datatype": "string", - "table": "test_sites", - "column": "{FK}", + "column": ["test_sites.site_id"], "derived": [ "site_name", "cre_user" - ], - "join": { - "type": "inner", - "primary_key": [ - "site_id" - ], - "foreign_key": [ - "lstg_site_id" - ] - } + ] }, { - "id": "5", "name": "seller_type_cd", - "datatype": "string", - "table": "test_seller_type_dim", - "column": "{FK}", + "column": ["test_seller_type_dim.seller_type_cd"], "derived": [ "seller_type_desc" - ], - "join": { - "type": "inner", - "primary_key": [ - "seller_type_cd" - ], - "foreign_key": [ - "slr_segment_cd" - ] - } + ] } ], "measures": [ diff --git a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_left_join_desc.json b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_left_join_desc.json index d79ae72..15f6e78 100644 --- a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_left_join_desc.json +++ b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_left_join_desc.json @@ -1,7 +1,7 @@ { "uuid": "9ac9b7a8-3929-4dff-b59d-2100aadc8dbf", "name": "test_kylin_cube_without_slr_left_join_desc", - "fact_table": "test_kylin_fact", + "model_name": "test_kylin_without_slr_left_join_model_desc", "cube_partition_desc": { "partition_date_column": "test_kylin_fact.cal_dt", "partition_date_start": 0, @@ -9,106 +9,41 @@ }, "dimensions": [ { - "id": "1", "name": "cal_dt", - "datatype": "date", - "table": "test_cal_dt", - "column": "{FK}", + "column": ["test_cal_dt.cal_dt"], "derived": [ "week_beg_dt" - ], - "join": { - "type": "left", - "primary_key": [ - "cal_dt" - ], - "foreign_key": [ - "cal_dt" - ] - } + ] }, { - "id": "2", "name": "category", - "table": "test_category_groupings", - "column": "{FK}", + "column": ["test_category_groupings.meta_categ_name", "test_category_groupings.categ_lvl2_name", "test_category_groupings.categ_lvl3_name"], "derived": [ "USER_DEFINED_FIELD1", "USER_DEFINED_FIELD3", "UPD_DATE", "UPD_USER" ], - "join": { - "type": "left", - "primary_key": [ - "leaf_categ_id", - "site_id" - ], - "foreign_key": [ - "leaf_categ_id", - "lstg_site_id" - ] - }, - "hierarchy": [ - { - "level": "1", - "column": "meta_categ_name" - }, - { - "level": "2", - "column": "categ_lvl2_name" - }, - { - "level": "3", - "column": "categ_lvl3_name" - } - ] + "hierarchy": true }, { - "id": "3", "name": "lstg_format_name", - "datatype": "string", - "table": "test_kylin_fact", - "column": "lstg_format_name" + "column": ["test_kylin_fact.lstg_format_name"] }, { - "id": "4", "name": "site_id", - "datatype": "string", - "table": "test_sites", - "column": "{FK}", + "column": ["test_sites.site_id"], "derived": [ "site_name", "cre_user" - ], - "join": { - "type": "left", - "primary_key": [ - "site_id" - ], - "foreign_key": [ - "lstg_site_id" - ] - } + ] }, { - "id": "5", "name": "seller_type_cd", - "datatype": "string", - "table": "test_seller_type_dim", - "column": "{FK}", + "column": ["test_seller_type_dim.seller_type_cd"], "derived": [ "seller_type_desc" - ], - "join": { - "type": "left", - "primary_key": [ - "seller_type_cd" - ], - "foreign_key": [ - "slr_segment_cd" - ] - } + ] } ], "measures": [ diff --git a/examples/test_case_data/localmeta/model_desc/test_kylin_ii_model_desc.json b/examples/test_case_data/localmeta/model_desc/test_kylin_ii_model_desc.json new file mode 100644 index 0000000..6c2d7b1 --- /dev/null +++ b/examples/test_case_data/localmeta/model_desc/test_kylin_ii_model_desc.json @@ -0,0 +1,38 @@ +{ + "name" : "test_kylin_ii_model_desc", + "fact_table": "TEST_KYLIN_FACT", + "lookups": [ + { + "table" : "TEST_CAL_DT", + "join" : { + "type" : "left", + "primary_key" : [ "CAL_DT" ], + "foreign_key" : [ "CAL_DT" ] + } + }, + { + "table" : "TEST_CATEGORY_GROUPINGS", + "join" : { + "type" : "left", + "primary_key" : [ "LEAF_CATEG_ID", "SITE_ID" ], + "foreign_key" : [ "LEAF_CATEG_ID", "LSTG_SITE_ID" ] + } + }, + { + "table" : "TEST_SITES", + "join" : { + "type" : "left", + "primary_key" : [ "SITE_ID" ], + "foreign_key" : [ "LSTG_SITE_ID" ] + } + }, + { + "table" : "TEST_SELLER_TYPE_DIM", + "join" : { + "type" : "left", + "primary_key" : [ "SELLER_TYPE_CD" ], + "foreign_key" : [ "SLR_SEGMENT_CD" ] + } + } +] +} \ No newline at end of file diff --git a/examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_left_join_model_desc.json b/examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_left_join_model_desc.json new file mode 100644 index 0000000..acb8e0c --- /dev/null +++ b/examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_left_join_model_desc.json @@ -0,0 +1,46 @@ +{ + "name": "test_kylin_with_slr_left_join_model_desc", + "fact_table": "test_kylin_fact", + "lookups": [ + { + "table": "test_cal_dt", + "join": { + "type": "left", + "primary_key": ["cal_dt"], + "foreign_key": ["cal_dt"] + } + }, + { + "table": "test_category_groupings", + "join": { + "type": "left", + "primary_key": ["leaf_categ_id", "site_id"], + "foreign_key": ["leaf_categ_id", "lstg_site_id"] + } + }, + { + "table": "test_category_groupings", + "join": { + "type": "left", + "primary_key": ["leaf_categ_id", "site_id"], + "foreign_key": ["leaf_categ_id", "lstg_site_id"] + } + }, + { + "table": "test_sites", + "join": { + "type": "left", + "primary_key": ["site_id"], + "foreign_key": ["lstg_site_id"] + } + }, + { + "table": "test_seller_type_dim", + "join": { + "type": "left", + "primary_key": ["seller_type_cd"], + "foreign_key": ["slr_segment_cd"] + } + } + ] +} diff --git a/examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_model_desc.json b/examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_model_desc.json index 7209e88..b1347a1 100644 --- a/examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_model_desc.json +++ b/examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_model_desc.json @@ -1,10 +1,8 @@ { - "uuid": "a24ca905-1fc6-4f67-985c-341fewaeafd92", "name": "test_kylin_with_slr_model_desc", "fact_table": "test_kylin_fact", "lookups": [ { - "id": "1", "table": "test_cal_dt", "join": { "type": "inner", @@ -13,7 +11,6 @@ } }, { - "id": "2", "table": "test_category_groupings", "join": { "type": "inner", @@ -22,7 +19,6 @@ } }, { - "id": "3", "table": "test_sites", "join": { "type": "inner", @@ -31,7 +27,6 @@ } }, { - "id": "4", "table": "test_seller_type_dim", "join": { "type": "inner", diff --git a/examples/test_case_data/localmeta/model_desc/test_kylin_without_slr_left_join_model_desc.json b/examples/test_case_data/localmeta/model_desc/test_kylin_without_slr_left_join_model_desc.json new file mode 100644 index 0000000..5773190 --- /dev/null +++ b/examples/test_case_data/localmeta/model_desc/test_kylin_without_slr_left_join_model_desc.json @@ -0,0 +1,56 @@ +{ + "name": "test_kylin_without_slr_left_join_model_desc", + "fact_table": "test_kylin_fact", + "lookups": [ + { + "table": "test_cal_dt", + "join": { + "type": "left", + "primary_key": [ + "cal_dt" + ], + "foreign_key": [ + "cal_dt" + ] + } + }, + { + "table": "test_category_groupings", + "join": { + "type": "left", + "primary_key": [ + "leaf_categ_id", + "site_id" + ], + "foreign_key": [ + "leaf_categ_id", + "lstg_site_id" + ] + } + }, + { + "table": "test_sites", + "join": { + "type": "left", + "primary_key": [ + "site_id" + ], + "foreign_key": [ + "lstg_site_id" + ] + } + }, + { + "table": "test_seller_type_dim", + "join": { + "type": "left", + "primary_key": [ + "seller_type_cd" + ], + "foreign_key": [ + "slr_segment_cd" + ] + } + } + ] +} \ No newline at end of file diff --git a/examples/test_case_data/localmeta/model_desc/test_kylin_without_slr_model_desc.json b/examples/test_case_data/localmeta/model_desc/test_kylin_without_slr_model_desc.json new file mode 100644 index 0000000..09319ab --- /dev/null +++ b/examples/test_case_data/localmeta/model_desc/test_kylin_without_slr_model_desc.json @@ -0,0 +1,56 @@ +{ + "name": "test_kylin_without_slr_model_desc", + "fact_table": "test_kylin_fact", + "lookups": [ + { + "table" : "test_cal_dt", + "join": { + "type": "inner", + "primary_key": [ + "cal_dt" + ], + "foreign_key": [ + "cal_dt" + ] + } + }, + { + "table": "test_category_groupings", + "join": { + "type": "inner", + "primary_key": [ + "leaf_categ_id", + "site_id" + ], + "foreign_key": [ + "leaf_categ_id", + "lstg_site_id" + ] + } + }, + { + "table": "test_sites", + "join": { + "type": "inner", + "primary_key": [ + "site_id" + ], + "foreign_key": [ + "lstg_site_id" + ] + } + }, + { + "table": "test_seller_type_dim", + "join": { + "type": "inner", + "primary_key": [ + "seller_type_cd" + ], + "foreign_key": [ + "slr_segment_cd" + ] + } + } + ] +} \ No newline at end of file diff --git a/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java b/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java index 5aaf67e..31a0b2e 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java +++ b/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java @@ -25,7 +25,6 @@ import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; -import com.kylinolap.metadata.model.DataModelDesc; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,14 +38,15 @@ import com.kylinolap.common.restclient.Broadcaster; import com.kylinolap.common.restclient.SingleValueCache; import com.kylinolap.common.util.JsonUtil; +import com.kylinolap.metadata.model.DataModelDesc; import com.kylinolap.metadata.model.TableDesc; import com.kylinolap.metadata.model.invertedindex.InvertedIndexDesc; /** - * Serves (and caches) cube metadata for Kylin instance. + * Serves (and caches) metadata for Kylin instance. *

- * Also provides a ResourceStore for general purpose data persistence. Cube - * metadata is serialized as JSON and stored in ResourceStore. + * Also provides a ResourceStore for general purpose data persistence. + * Metadata is serialized as JSON and stored in ResourceStore. * * @author yangli9 */ @@ -56,6 +56,7 @@ private static final Serializer TABLE_SERIALIZER = new JsonSerializer(TableDesc.class); private static final Serializer IIDESC_SERIALIZER = new JsonSerializer(InvertedIndexDesc.class); + private static final Serializer MODELDESC_SERIALIZER = new JsonSerializer(DataModelDesc.class); TypeReference> typeRef = new TypeReference>() { }; @@ -83,7 +84,7 @@ public static MetadataManager getInstance(KylinConfig config) { return r; } catch (IOException e) { - throw new IllegalStateException("Failed to init CubeManager from " + config, e); + throw new IllegalStateException("Failed to init MetadataManager from " + config, e); } } } @@ -105,6 +106,8 @@ public static void dropCache() { private SingleValueCache iiDescMap = new SingleValueCache(Broadcaster.TYPE.METADATA); // name => value private SingleValueCache> srcTableExdMap = new SingleValueCache>(Broadcaster.TYPE.METADATA); + // name => DataModelDesc + private SingleValueCache dataModelDescMap = new SingleValueCache(Broadcaster.TYPE.METADATA); private MetadataManager(KylinConfig config) throws IOException { init(config); @@ -186,6 +189,7 @@ private void init(KylinConfig config) throws IOException { reloadAllSourceTable(); reloadAllSourceTableExd(); reloadAllInvertedIndexDesc(); + reloadAllDataModel(); } private void reloadAllSourceTableExd() throws IOException { @@ -300,7 +304,7 @@ private InvertedIndexDesc loadInvertedIndexDesc(String path) throws IOException } /** - * Tell CubeManager that the cube instance has changed. The cube info will + * Tell MetadataManager that the instance has changed. The cube info will * be stored Reload the cube desc and source table A broadcast must be sent * out * @@ -313,19 +317,112 @@ public void reload() { } public DataModelDesc getDataModelDesc(String name) { - return null; + return dataModelDescMap.get(name); } + + + private void reloadAllDataModel() throws IOException { + ResourceStore store = getStore(); + logger.debug("Reloading DataModel from folder " + store.getReadableResourcePath(ResourceStore.DATA_MODEL_DESC_RESOURCE_ROOT)); - public void updateDataModelDesc(DataModelDesc dataModelDesc) { - throw new UnsupportedOperationException(); + this.dataModelDescMap.clear(); + + List paths = store.collectResourceRecursively(ResourceStore.DATA_MODEL_DESC_RESOURCE_ROOT, MetadataConstances.FILE_SURFIX); + for (String path : paths) { + DataModelDesc modelDesc = this.loadDataModelDesc(path); + dataModelDescMap.putLocal(modelDesc.getName(), modelDesc); + } + + logger.debug("Loaded " + paths.size() + " DataModel(s)"); } - public DataModelDesc createDataModelDesc(DataModelDesc dataModelDesc) { + public DataModelDesc createDataModelDesc(DataModelDesc dataModelDesc) throws IOException { + if (dataModelDescMap.containsKey(dataModelDesc.getName())) + throw new IllegalArgumentException("DataModelDesc '" + dataModelDesc.getName() + "' already exists"); + + try { + dataModelDesc.init(this.getAllTablesMap()); + } catch (IllegalStateException e) { + dataModelDesc.addError(e.getMessage(), true); + } + // Check base validation + if (!dataModelDesc.getError().isEmpty()) { + return dataModelDesc; + } + + String path = dataModelDesc.getResourcePath(); + getStore().putResource(path, dataModelDesc, MODELDESC_SERIALIZER); + dataModelDescMap.put(dataModelDesc.getName(), dataModelDesc); + return dataModelDesc; } + + /** + * Update DataModelDesc with the input. Broadcast the event into cluster + * + * @param desc + * @return + * @throws IOException + */ + public DataModelDesc updateDataModelDesc(DataModelDesc desc) throws IOException { + String name = desc.getName(); + if (!dataModelDescMap.containsKey(name)) { + throw new IllegalArgumentException("DataModelDesc '" + name + "' does not exist."); + } + + try { + desc.init(this.getAllTablesMap()); + } catch (IllegalStateException e) { + desc.addError(e.getMessage(), true); + return desc; + } catch (IllegalArgumentException e) { + desc.addError(e.getMessage(), true); + return desc; + } + + + // Save Source + String path = desc.getResourcePath(); + getStore().putResource(path, desc, MODELDESC_SERIALIZER); + + // Reload the DataModelDesc + DataModelDesc ndesc = loadDataModelDesc(path); + // Here replace the old one + dataModelDescMap.put(ndesc.getName(), desc); + + return ndesc; + } + + private DataModelDesc loadDataModelDesc(String path) throws IOException { + ResourceStore store = getStore(); + logger.debug("Loading DataModelDesc " + store.getReadableResourcePath(path)); + DataModelDesc ndesc = null; + try { + ndesc = store.getResource(path, DataModelDesc.class, MODELDESC_SERIALIZER); + + } catch (IOException e) { + System.err.println("Error to load" + path + ", exception is " + e.toString()); + throw e; + } + if (StringUtils.isBlank(ndesc.getName())) { + throw new IllegalStateException("DataModelDesc name must not be blank"); + } + + ndesc.init(this.getAllTablesMap()); + + if (ndesc.getError().isEmpty() == false) { + throw new IllegalStateException("DataModelDesc at " + path + " has issues: " + ndesc.getError()); + } + + return ndesc; + } + - public boolean deleteDataModelDesc(DataModelDesc dataModelDesc) { - throw new UnsupportedOperationException(); + public void deleteDataModelDesc(DataModelDesc dataModelDesc) throws IOException { + // remove dataModelDesc + String path = dataModelDesc.getResourcePath(); + getStore().deleteResource(path); + dataModelDescMap.remove(dataModelDesc.getName()); } } diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java index 3e95ee9..b0f06ad 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java @@ -1,24 +1,38 @@ package com.kylinolap.metadata.model; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + import org.apache.commons.lang.ArrayUtils; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.common.persistence.ResourceStore; +import com.kylinolap.common.persistence.RootPersistentEntity; +import com.kylinolap.common.util.StringUtil; +import com.kylinolap.metadata.MetadataConstances; import com.kylinolap.metadata.model.realization.TblColRef; @JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) -public class DataModelDesc { - +public class DataModelDesc extends RootPersistentEntity { + @JsonProperty("name") private String name; - + @JsonProperty("fact_table") private String factTable; @JsonProperty("lookups") private LookupDesc[] lookups; + /** + * Error messages during resolving json metadata + */ + private List errors = new ArrayList(); + public String getName() { return name; } @@ -42,11 +56,11 @@ public void setFactTable(String factTable) { public void setLookups(LookupDesc[] lookups) { this.lookups = lookups; } - + public boolean isFactTable(String factTable) { return this.factTable.equalsIgnoreCase(factTable); } - + public TblColRef findPKByFK(TblColRef fk) { assert isFactTable(fk.getTable()); @@ -68,5 +82,92 @@ public TblColRef findPKByFK(TblColRef fk) { } return candidate; } - + + public void init(Map tables) { + this.errors.clear(); + this.factTable = factTable.toUpperCase(); + initJoinColumns(tables); + } + + private void initJoinColumns(Map tables) { + // join columns may or may not present in cube; + // here we don't modify 'allColumns' and 'dimensionColumns'; + // initDimensionColumns() will do the update + for (LookupDesc lookup : this.lookups) { + lookup.setTable(lookup.getTable().toUpperCase()); + TableDesc dimTable = tables.get(lookup.getTable()); + + JoinDesc join = lookup.getJoin(); + if (join == null) + continue; + + StringUtil.toUpperCaseArray(join.getForeignKey(), join.getForeignKey()); + StringUtil.toUpperCaseArray(join.getPrimaryKey(), join.getPrimaryKey()); + // primary key + String[] pks = join.getPrimaryKey(); + TblColRef[] pkCols = new TblColRef[pks.length]; + for (int i = 0; i < pks.length; i++) { + ColumnDesc col = dimTable.findColumnByName(pks[i]); + if (col == null) { + addError("Can't find column " + pks[i] + " in table " + dimTable.getName()); + } + TblColRef colRef = new TblColRef(col); + pks[i] = colRef.getName(); + pkCols[i] = colRef; + } + join.setPrimaryKeyColumns(pkCols); + // foreign key + TableDesc factTable = tables.get(this.getFactTable()); + if (factTable == null) { + addError("Fact table does not exist:" + this.getFactTable()); + } + String[] fks = join.getForeignKey(); + TblColRef[] fkCols = new TblColRef[fks.length]; + for (int i = 0; i < fks.length; i++) { + ColumnDesc col = factTable.findColumnByName(fks[i]); + if (col == null) { + addError("Can't find column " + fks[i] + " in table " + this.getFactTable()); + } + TblColRef colRef = new TblColRef(col); + fks[i] = colRef.getName(); + fkCols[i] = colRef; + } + join.setForeignKeyColumns(fkCols); + // Validate join in dimension + if (pkCols.length != fkCols.length) { + addError("Primary keys(" + lookup.getTable() + ")" + Arrays.toString(pks) + " are not consistent with Foreign keys(" + this.getFactTable() + ") " + Arrays.toString(fks)); + } + for (int i = 0; i < fkCols.length; i++) { + if (!fkCols[i].getDatatype().equals(pkCols[i].getDatatype())) { + addError("Primary key " + lookup.getTable() + "." + pkCols[i].getName() + "." + pkCols[i].getDatatype() + " are not consistent with Foreign key " + this.getFactTable() + "." + fkCols[i].getName() + "." + fkCols[i].getDatatype()); + } + } + + } + } + + public String getResourcePath() { + return getDataModelDescResourcePath(name); + } + + public static String getDataModelDescResourcePath(String descName) { + return ResourceStore.DATA_MODEL_DESC_RESOURCE_ROOT + "/" + descName + MetadataConstances.FILE_SURFIX; + } + + public void addError(String message) { + addError(message, false); + } + + public void addError(String message, boolean silent) { + if (!silent) { + throw new IllegalStateException(message); + } else { + this.errors.add(message); + } + } + + public List getError() { + return this.errors; + } + } diff --git a/metadata/src/test/resources/data/TEST1_desc.json b/metadata/src/test/resources/data/TEST1_desc.json deleted file mode 100644 index 175b105..0000000 --- a/metadata/src/test/resources/data/TEST1_desc.json +++ /dev/null @@ -1,192 +0,0 @@ -{ - "uuid" : "9c53506d-d7b9-4ad4-b3b1-53ea42673c4b", - "last_modified" : 1401429176099, - "name" : "TEST1_desc", - "fact_table" : "TEST_KYLIN_FACT", - "dimensions" : [ { - "id" : 1, - "name" : "CAL_DT", - "join" : { - "type" : "inner", - "primary_key" : [ "CAL_DT" ], - "foreign_key" : [ "CAL_DT" ] - }, - "hierarchy" : null, - "table" : "TEST_CAL_DT", - "column" : "CAL_DT", - "datatype" : "date", - "derived" : [ "WEEK_BEG_DT" ] - }, { - "id" : 2, - "name" : "CATEGORY", - "join" : { - "type" : "inner", - "primary_key" : [ "LEAF_CATEG_ID", "SITE_ID" ], - "foreign_key" : [ "LEAF_CATEG_ID", "LSTG_SITE_ID" ] - }, - "hierarchy" : [ { - "level" : "1", - "column" : "META_CATEG_NAME" - }, { - "level" : "2", - "column" : "CATEG_LVL2_NAME" - }, { - "level" : "3", - "column" : "CATEG_LVL3_NAME" - } ], - "table" : "TEST_CATEGORY_GROUPINGS", - "column" : null, - "datatype" : null, - "derived" : null - }, { - "id" : 3, - "name" : "LSTG_FORMAT_NAME", - "join" : null, - "hierarchy" : null, - "table" : "TEST_KYLIN_FACT", - "column" : "LSTG_FORMAT_NAME", - "datatype" : "string", - "derived" : null - }, { - "id" : 4, - "name" : "SITE_ID", - "join" : { - "type" : "inner", - "primary_key" : [ "SITE_ID" ], - "foreign_key" : [ "LSTG_SITE_ID" ] - }, - "hierarchy" : null, - "table" : "TEST_SITES", - "column" : "SITE_ID", - "datatype" : "string", - "derived" : [ "SITE_NAME", "CRE_USER" ] - }, { - "id" : 5, - "name" : "SELLER_TYPE_CD", - "join" : { - "type" : "inner", - "primary_key" : [ "SELLER_TYPE_CD" ], - "foreign_key" : [ "SLR_SEGMENT_CD" ] - }, - "hierarchy" : null, - "table" : "TEST_SELLER_TYPE_DIM", - "column" : "SELLER_TYPE_CD", - "datatype" : "string", - "derived" : [ "SELLER_TYPE_DESC" ] - } ], - "measures" : [ { - "id" : 1, - "name" : "GMV_SUM", - "function" : { - "expression" : "SUM", - "parameter" : { - "type" : "column", - "value" : "PRICE" - }, - "returntype" : "decimal" - } - }, { - "id" : 2, - "name" : "GMV_MIN", - "function" : { - "expression" : "MIN", - "parameter" : { - "type" : "column", - "value" : "PRICE" - }, - "returntype" : "decimal" - } - }, { - "id" : 3, - "name" : "GMV_MAX", - "function" : { - "expression" : "MAX", - "parameter" : { - "type" : "column", - "value" : "PRICE" - }, - "returntype" : "decimal" - } - }, { - "id" : 4, - "name" : "TRANS_CNT", - "function" : { - "expression" : "COUNT", - "parameter" : { - "type" : "constant", - "value" : "1" - }, - "returntype" : "long" - } - }, { - "id" : 5, - "name" : "SELLER_CNT", - "function" : { - "expression" : "COUNT_DISTINCT", - "parameter" : { - "type" : "column", - "value" : "SELLER_ID" - }, - "returntype" : "hllc10" - } - }, { - "id" : 6, - "name" : "SELLER_FORMAT_CNT", - "function" : { - "expression" : "COUNT_DISTINCT", - "parameter" : { - "type" : "column", - "value" : "LSTG_FORMAT_NAME,SELLER_ID" - }, - "returntype" : "hllc10" - } - } ], - "rowkey" : { - "rowkey_columns" : [ { - "column" : "CAL_DT", - "length" : 0, - "dictionary" : "date(yyyy-mm-dd)", - "mandatory" : true - }, { - "column" : "META_CATEG_NAME", - "length" : 0, - "dictionary" : "string", - "mandatory" : false - }, { - "column" : "CATEG_LVL2_NAME", - "length" : 0, - "dictionary" : "string", - "mandatory" : false - }, { - "column" : "CATEG_LVL3_NAME", - "length" : 0, - "dictionary" : "string", - "mandatory" : false - }, { - "column" : "LSTG_FORMAT_NAME", - "length" : 12, - "dictionary" : null, - "mandatory" : false - }, { - "column" : "SITE_ID", - "length" : 0, - "dictionary" : "string", - "mandatory" : false - }, { - "column" : "SELLER_TYPE_CD", - "length" : 0, - "dictionary" : "string", - "mandatory" : false - } ], - "aggregation_groups" : [ [ "META_CATEG_NAME", "CATEG_LVL3_NAME", "CATEG_LVL2_NAME", "CAL_DT" ], [ "LSTG_FORMAT_NAME", "SITE_ID", "SELLER_TYPE_CD" ] ] - }, - "hbase_mapping" : { - "column_family" : [ { - "name" : "F1", - "columns" : [ { - "qualifier" : "M", - "measure_refs" : [ "GMV_SUM", "GMV_MIN", "GMV_MAX", "TRANS_CNT", "SELLER_CNT", "SELLER_FORMAT_CNT" ] - } ] - } ] - } -} \ No newline at end of file diff --git a/metadata/src/test/resources/data/TEST2_desc.json b/metadata/src/test/resources/data/TEST2_desc.json deleted file mode 100644 index 81bde27..0000000 --- a/metadata/src/test/resources/data/TEST2_desc.json +++ /dev/null @@ -1,192 +0,0 @@ -{ - "uuid" : "9c53506d-d7b9-4ad4-b3b1-53ea42673c4b", - "last_modified" : 1401429176099, - "name" : "TEST2_desc", - "fact_table" : "TEST_KYLIN_FACT", - "dimensions" : [ { - "id" : 1, - "name" : "CAL_DT", - "join" : { - "type" : "inner", - "primary_key" : [ "CAL_DT" ], - "foreign_key" : [ "CAL_DT" ] - }, - "hierarchy" : null, - "table" : "TEST_CAL_DT", - "column" : "CAL_DT", - "datatype" : "date", - "derived" : [ "WEEK_BEG_DT" ] - }, { - "id" : 2, - "name" : "CATEGORY", - "join" : { - "type" : "inner", - "primary_key" : [ "LEAF_CATEG_ID", "SITE_ID" ], - "foreign_key" : [ "LEAF_CATEG_ID", "LSTG_SITE_ID" ] - }, - "hierarchy" : [ { - "level" : "1", - "column" : "META_CATEG_NAME" - }, { - "level" : "2", - "column" : "CATEG_LVL2_NAME" - }, { - "level" : "3", - "column" : "CATEG_LVL3_NAME" - } ], - "table" : "TEST_CATEGORY_GROUPINGS", - "column" : null, - "datatype" : null, - "derived" : null - }, { - "id" : 3, - "name" : "LSTG_FORMAT_NAME", - "join" : null, - "hierarchy" : null, - "table" : "TEST_KYLIN_FACT", - "column" : "LSTG_FORMAT_NAME", - "datatype" : "string", - "derived" : null - }, { - "id" : 4, - "name" : "SITE_ID", - "join" : { - "type" : "inner", - "primary_key" : [ "SITE_ID" ], - "foreign_key" : [ "LSTG_SITE_ID" ] - }, - "hierarchy" : null, - "table" : "TEST_SITES", - "column" : "SITE_ID", - "datatype" : "string", - "derived" : [ "SITE_NAME", "CRE_USER" ] - }, { - "id" : 5, - "name" : "SELLER_TYPE_CD", - "join" : { - "type" : "inner", - "primary_key" : [ "SELLER_TYPE_CD" ], - "foreign_key" : [ "SLR_SEGMENT_CD" ] - }, - "hierarchy" : null, - "table" : "TEST_SELLER_TYPE_DIM", - "column" : "SELLER_TYPE_CD", - "datatype" : "string", - "derived" : [ "SELLER_TYPE_DESC" ] - } ], - "measures" : [ { - "id" : 1, - "name" : "GMV_SUM", - "function" : { - "expression" : "SUM", - "parameter" : { - "type" : "column", - "value" : "PRICE" - }, - "returntype" : "decimal" - } - }, { - "id" : 2, - "name" : "GMV_MIN", - "function" : { - "expression" : "MIN", - "parameter" : { - "type" : "column", - "value" : "PRICE" - }, - "returntype" : "decimal" - } - }, { - "id" : 3, - "name" : "GMV_MAX", - "function" : { - "expression" : "MAX", - "parameter" : { - "type" : "column", - "value" : "PRICE" - }, - "returntype" : "decimal" - } - }, { - "id" : 4, - "name" : "TRANS_CNT", - "function" : { - "expression" : "COUNT", - "parameter" : { - "type" : "constant", - "value" : "1" - }, - "returntype" : "long" - } - }, { - "id" : 5, - "name" : "SELLER_CNT", - "function" : { - "expression" : "COUNT_DISTINCT", - "parameter" : { - "type" : "column", - "value" : "SELLER_ID" - }, - "returntype" : "hllc10" - } - }, { - "id" : 6, - "name" : "SELLER_FORMAT_CNT", - "function" : { - "expression" : "COUNT_DISTINCT", - "parameter" : { - "type" : "column", - "value" : "LSTG_FORMAT_NAME,SELLER_ID" - }, - "returntype" : "hllc10" - } - } ], - "rowkey" : { - "rowkey_columns" : [ { - "column" : "CAL_DT", - "length" : 0, - "dictionary" : "date(yyyy-mm-dd)", - "mandatory" : true - }, { - "column" : "META_CATEG_NAME", - "length" : 0, - "dictionary" : "string", - "mandatory" : false - }, { - "column" : "CATEG_LVL2_NAME", - "length" : 0, - "dictionary" : "string", - "mandatory" : false - }, { - "column" : "CATEG_LVL3_NAME", - "length" : 0, - "dictionary" : "string", - "mandatory" : false - }, { - "column" : "LSTG_FORMAT_NAME", - "length" : 12, - "dictionary" : null, - "mandatory" : false - }, { - "column" : "SITE_ID", - "length" : 0, - "dictionary" : "string", - "mandatory" : false - }, { - "column" : "SELLER_TYPE_CD", - "length" : 0, - "dictionary" : "string", - "mandatory" : false - } ], - "aggregation_groups" : [ [ "META_CATEG_NAME", "CATEG_LVL3_NAME", "CAL_DT" ], [ "LSTG_FORMAT_NAME", "SITE_ID", "SELLER_TYPE_CD", "CATEG_LVL2_NAME" ] ] - }, - "hbase_mapping" : { - "column_family" : [ { - "name" : "F1", - "columns" : [ { - "qualifier" : "M", - "measure_refs" : [ "GMV_SUM", "GMV_MIN", "GMV_MAX", "TRANS_CNT", "SELLER_CNT", "SELLER_FORMAT_CNT" ] - } ] - } ] - } -} \ No newline at end of file diff --git a/metadata/src/test/resources/data/TEST3_desc.json b/metadata/src/test/resources/data/TEST3_desc.json deleted file mode 100644 index df4d60b..0000000 --- a/metadata/src/test/resources/data/TEST3_desc.json +++ /dev/null @@ -1,192 +0,0 @@ -{ - "uuid" : "9c53506d-d7b9-4ad4-b3b1-53ea42673c4b", - "last_modified" : 1401429176099, - "name" : "TEST1_desc", - "fact_table" : "TEST_KYLIN_FACT", - "dimensions" : [ { - "id" : 1, - "name" : "CAL_DT", - "join" : { - "type" : "inner", - "primary_key" : [ "CAL_DT" ], - "foreign_key" : [ "CAL_DT" ] - }, - "hierarchy" : null, - "table" : "TEST_CAL_DT", - "column" : "CAL_DT", - "datatype" : "date", - "derived" : [ "WEEK_BEG_DT" ] - }, { - "id" : 2, - "name" : "CATEGORY", - "join" : { - "type" : "inner", - "primary_key" : [ "LEAF_CATEG_ID", "SITE_ID" ], - "foreign_key" : [ "LEAF_CATEG_ID", "LSTG_SITE_ID" ] - }, - "hierarchy" : [ { - "level" : "1", - "column" : "META_CATEG_NAME" - }, { - "level" : "2", - "column" : "CATEG_LVL2_NAME" - }, { - "level" : "3", - "column" : "CATEG_LVL3_NAME" - } ], - "table" : "TEST_CATEGORY_GROUPINGS", - "column" : null, - "datatype" : null, - "derived" : null - }, { - "id" : 3, - "name" : "LSTG_FORMAT_NAME", - "join" : null, - "hierarchy" : null, - "table" : "TEST_KYLIN_FACT", - "column" : "LSTG_FORMAT_NAME", - "datatype" : "string", - "derived" : null - }, { - "id" : 4, - "name" : "SITE_ID", - "join" : { - "type" : "inner", - "primary_key" : [ "SITE_ID" ], - "foreign_key" : [ "LSTG_SITE_ID" ] - }, - "hierarchy" : null, - "table" : "TEST_SITES", - "column" : "SITE_ID", - "datatype" : "string", - "derived" : [ "SITE_NAME", "CRE_USER" ] - }, { - "id" : 5, - "name" : "SELLER_TYPE_CD", - "join" : { - "type" : "inner", - "primary_key" : [ "SELLER_TYPE_CD" ], - "foreign_key" : [ "SLR_SEGMENT_CD" ] - }, - "hierarchy" : null, - "table" : "TEST_SELLER_TYPE_DIM", - "column" : "SELLER_TYPE_CD", - "datatype" : "string", - "derived" : [ "SELLER_TYPE_DESC" ] - } ], - "measures" : [ { - "id" : 1, - "name" : "GMV_SUM", - "function" : { - "expression" : "SUM", - "parameter" : { - "type" : "column", - "value" : "PRICE" - }, - "returntype" : "decimal" - } - }, { - "id" : 2, - "name" : "GMV_MIN", - "function" : { - "expression" : "MIN", - "parameter" : { - "type" : "column", - "value" : "PRICE" - }, - "returntype" : "decimal" - } - }, { - "id" : 3, - "name" : "GMV_MAX", - "function" : { - "expression" : "MAX", - "parameter" : { - "type" : "column", - "value" : "PRICE" - }, - "returntype" : "decimal" - } - }, { - "id" : 4, - "name" : "TRANS_CNT", - "function" : { - "expression" : "COUNT", - "parameter" : { - "type" : "constant", - "value" : "1" - }, - "returntype" : "long" - } - }, { - "id" : 5, - "name" : "SELLER_CNT", - "function" : { - "expression" : "COUNT_DISTINCT", - "parameter" : { - "type" : "column", - "value" : "SELLER_ID" - }, - "returntype" : "hllc10" - } - }, { - "id" : 6, - "name" : "SELLER_FORMAT_CNT", - "function" : { - "expression" : "COUNT_DISTINCT", - "parameter" : { - "type" : "column", - "value" : "LSTG_FORMAT_NAME,SELLER_ID" - }, - "returntype" : "hllc10" - } - } ], - "rowkey" : { - "rowkey_columns" : [ { - "column" : "CAL_DT", - "length" : 10, - "dictionary" : "date(yyyy-mm-dd)", - "mandatory" : false - }, { - "column" : "META_CATEG_NAME", - "length" : 0, - "dictionary" : "string", - "mandatory" : false - }, { - "column" : "CATEG_LVL2_NAME", - "length" : 0, - "dictionary" : "string", - "mandatory" : false - }, { - "column" : "CATEG_LVL3_NAME", - "length" : 0, - "dictionary" : "string", - "mandatory" : false - }, { - "column" : "LSTG_FORMAT_NAME", - "length" : 12, - "dictionary" : null, - "mandatory" : false - }, { - "column" : "SITE_ID", - "length" : 0, - "dictionary" : "string", - "mandatory" : false - }, { - "column" : "SELLER_TYPE_CD", - "length" : 0, - "dictionary" : "string", - "mandatory" : false - } ], - "aggregation_groups" : [ [ "META_CATEG_NAME", "CATEG_LVL3_NAME", "CATEG_LVL2_NAME", "CAL_DT" ], [ "LSTG_FORMAT_NAME", "SITE_ID", "SELLER_TYPE_CD" ] ] - }, - "hbase_mapping" : { - "column_family" : [ { - "name" : "F1", - "columns" : [ { - "qualifier" : "M", - "measure_refs" : [ "GMV_SUM", "GMV_MIN", "GMV_MAX", "TRANS_CNT", "SELLER_CNT", "SELLER_FORMAT_CNT" ] - } ] - } ] - } -} \ No newline at end of file diff --git a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpoindAggregationTest.java b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpoindAggregationTest.java index 5bd0d1d..04980c3 100644 --- a/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpoindAggregationTest.java +++ b/storage/src/test/java/com/kylinolap/storage/hbase/coprocessor/endpoint/EndpoindAggregationTest.java @@ -2,6 +2,18 @@ import static org.junit.Assert.*; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Map; + +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + import com.kylinolap.common.util.BytesUtil; import com.kylinolap.common.util.LocalFileMetadataTestCase; import com.kylinolap.cube.CubeInstance; @@ -17,16 +29,11 @@ import com.kylinolap.storage.filter.TupleFilter; import com.kylinolap.storage.hbase.coprocessor.CoprocessorFilter; import com.kylinolap.storage.hbase.coprocessor.CoprocessorProjector; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import java.io.IOException; -import java.util.*; /** * Created by Hongbin Ma(Binmahone) on 11/27/14. */ +@Ignore public class EndpoindAggregationTest extends LocalFileMetadataTestCase { CubeInstance cube; TableRecordInfo tableRecordInfo; From 029ed60ab86980d0364c2010c55197cda4688244 Mon Sep 17 00:00:00 2001 From: shaofengshi Date: Tue, 2 Dec 2014 18:08:44 +0800 Subject: [PATCH 34/65] Move test json file from metadata module to cube module. --- cube/src/test/resources/data/TEST1_desc.json | 23 +++++------------ cube/src/test/resources/data/TEST2_desc.json | 38 +++++----------------------- cube/src/test/resources/data/TEST3_desc.json | 24 +++++------------- 3 files changed, 21 insertions(+), 64 deletions(-) diff --git a/cube/src/test/resources/data/TEST1_desc.json b/cube/src/test/resources/data/TEST1_desc.json index 175b105..082a3cf 100644 --- a/cube/src/test/resources/data/TEST1_desc.json +++ b/cube/src/test/resources/data/TEST1_desc.json @@ -2,6 +2,7 @@ "uuid" : "9c53506d-d7b9-4ad4-b3b1-53ea42673c4b", "last_modified" : 1401429176099, "name" : "TEST1_desc", + "model_name": "TEST1_model_desc", "fact_table" : "TEST_KYLIN_FACT", "dimensions" : [ { "id" : 1, @@ -13,8 +14,7 @@ }, "hierarchy" : null, "table" : "TEST_CAL_DT", - "column" : "CAL_DT", - "datatype" : "date", + "column" : ["TEST_CAL_DT.CAL_DT"], "derived" : [ "WEEK_BEG_DT" ] }, { "id" : 2, @@ -24,18 +24,9 @@ "primary_key" : [ "LEAF_CATEG_ID", "SITE_ID" ], "foreign_key" : [ "LEAF_CATEG_ID", "LSTG_SITE_ID" ] }, - "hierarchy" : [ { - "level" : "1", - "column" : "META_CATEG_NAME" - }, { - "level" : "2", - "column" : "CATEG_LVL2_NAME" - }, { - "level" : "3", - "column" : "CATEG_LVL3_NAME" - } ], + "hierarchy" : true, "table" : "TEST_CATEGORY_GROUPINGS", - "column" : null, + "column" : ["TEST_CATEGORY_GROUPINGS.META_CATEG_NAME", "TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME", "TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME"], "datatype" : null, "derived" : null }, { @@ -44,7 +35,7 @@ "join" : null, "hierarchy" : null, "table" : "TEST_KYLIN_FACT", - "column" : "LSTG_FORMAT_NAME", + "column" : ["TEST_KYLIN_FACT.LSTG_FORMAT_NAME"], "datatype" : "string", "derived" : null }, { @@ -57,7 +48,7 @@ }, "hierarchy" : null, "table" : "TEST_SITES", - "column" : "SITE_ID", + "column" : ["TEST_SITES.SITE_ID"], "datatype" : "string", "derived" : [ "SITE_NAME", "CRE_USER" ] }, { @@ -70,7 +61,7 @@ }, "hierarchy" : null, "table" : "TEST_SELLER_TYPE_DIM", - "column" : "SELLER_TYPE_CD", + "column" : ["TEST_SELLER_TYPE_DIM.SELLER_TYPE_CD"], "datatype" : "string", "derived" : [ "SELLER_TYPE_DESC" ] } ], diff --git a/cube/src/test/resources/data/TEST2_desc.json b/cube/src/test/resources/data/TEST2_desc.json index 81bde27..90bd806 100644 --- a/cube/src/test/resources/data/TEST2_desc.json +++ b/cube/src/test/resources/data/TEST2_desc.json @@ -1,20 +1,12 @@ { "uuid" : "9c53506d-d7b9-4ad4-b3b1-53ea42673c4b", "last_modified" : 1401429176099, + "model_name": "TEST2_model_desc", "name" : "TEST2_desc", - "fact_table" : "TEST_KYLIN_FACT", "dimensions" : [ { - "id" : 1, "name" : "CAL_DT", - "join" : { - "type" : "inner", - "primary_key" : [ "CAL_DT" ], - "foreign_key" : [ "CAL_DT" ] - }, "hierarchy" : null, - "table" : "TEST_CAL_DT", - "column" : "CAL_DT", - "datatype" : "date", + "column" : ["TEST_CAL_DT.CAL_DT"], "derived" : [ "WEEK_BEG_DT" ] }, { "id" : 2, @@ -24,28 +16,15 @@ "primary_key" : [ "LEAF_CATEG_ID", "SITE_ID" ], "foreign_key" : [ "LEAF_CATEG_ID", "LSTG_SITE_ID" ] }, - "hierarchy" : [ { - "level" : "1", - "column" : "META_CATEG_NAME" - }, { - "level" : "2", - "column" : "CATEG_LVL2_NAME" - }, { - "level" : "3", - "column" : "CATEG_LVL3_NAME" - } ], - "table" : "TEST_CATEGORY_GROUPINGS", - "column" : null, - "datatype" : null, + "hierarchy" : true, + "column" : ["TEST_CATEGORY_GROUPINGS.META_CATEG_NAME", "TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME", "TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME"], "derived" : null }, { "id" : 3, "name" : "LSTG_FORMAT_NAME", - "join" : null, "hierarchy" : null, "table" : "TEST_KYLIN_FACT", - "column" : "LSTG_FORMAT_NAME", - "datatype" : "string", + "column" : ["TEST_KYLIN_FACT.LSTG_FORMAT_NAME"], "derived" : null }, { "id" : 4, @@ -56,9 +35,7 @@ "foreign_key" : [ "LSTG_SITE_ID" ] }, "hierarchy" : null, - "table" : "TEST_SITES", - "column" : "SITE_ID", - "datatype" : "string", + "column" : ["TEST_SITES.SITE_ID"], "derived" : [ "SITE_NAME", "CRE_USER" ] }, { "id" : 5, @@ -70,8 +47,7 @@ }, "hierarchy" : null, "table" : "TEST_SELLER_TYPE_DIM", - "column" : "SELLER_TYPE_CD", - "datatype" : "string", + "column" : ["TEST_SELLER_TYPE_DIM.SELLER_TYPE_CD"], "derived" : [ "SELLER_TYPE_DESC" ] } ], "measures" : [ { diff --git a/cube/src/test/resources/data/TEST3_desc.json b/cube/src/test/resources/data/TEST3_desc.json index df4d60b..4b0836b 100644 --- a/cube/src/test/resources/data/TEST3_desc.json +++ b/cube/src/test/resources/data/TEST3_desc.json @@ -2,7 +2,7 @@ "uuid" : "9c53506d-d7b9-4ad4-b3b1-53ea42673c4b", "last_modified" : 1401429176099, "name" : "TEST1_desc", - "fact_table" : "TEST_KYLIN_FACT", + "model_name": "TEST1_model_desc", "dimensions" : [ { "id" : 1, "name" : "CAL_DT", @@ -13,7 +13,7 @@ }, "hierarchy" : null, "table" : "TEST_CAL_DT", - "column" : "CAL_DT", + "column" : ["TEST_CAL_DT.CAL_DT"], "datatype" : "date", "derived" : [ "WEEK_BEG_DT" ] }, { @@ -24,19 +24,9 @@ "primary_key" : [ "LEAF_CATEG_ID", "SITE_ID" ], "foreign_key" : [ "LEAF_CATEG_ID", "LSTG_SITE_ID" ] }, - "hierarchy" : [ { - "level" : "1", - "column" : "META_CATEG_NAME" - }, { - "level" : "2", - "column" : "CATEG_LVL2_NAME" - }, { - "level" : "3", - "column" : "CATEG_LVL3_NAME" - } ], + "hierarchy" : true, "table" : "TEST_CATEGORY_GROUPINGS", - "column" : null, - "datatype" : null, + "column" : ["TEST_CATEGORY_GROUPINGS.META_CATEG_NAME", "TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME", "TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME"], "derived" : null }, { "id" : 3, @@ -44,7 +34,7 @@ "join" : null, "hierarchy" : null, "table" : "TEST_KYLIN_FACT", - "column" : "LSTG_FORMAT_NAME", + "column" : ["TEST_KYLIN_FACT.LSTG_FORMAT_NAME"], "datatype" : "string", "derived" : null }, { @@ -57,7 +47,7 @@ }, "hierarchy" : null, "table" : "TEST_SITES", - "column" : "SITE_ID", + "column" : ["TEST_SITES.SITE_ID"], "datatype" : "string", "derived" : [ "SITE_NAME", "CRE_USER" ] }, { @@ -70,7 +60,7 @@ }, "hierarchy" : null, "table" : "TEST_SELLER_TYPE_DIM", - "column" : "SELLER_TYPE_CD", + "column" : ["TEST_SELLER_TYPE_DIM.SELLER_TYPE_CD"], "datatype" : "string", "derived" : [ "SELLER_TYPE_DESC" ] } ], From e972642c26d3e192b31299a3c3da1aaeb0a2927f Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Tue, 2 Dec 2014 18:53:35 +0800 Subject: [PATCH 35/65] use all-in-one htable for meta data --- .settings/org.eclipse.core.resources.prefs | 2 - .../common/persistence/HBaseResourceStore.java | 74 +++++++++------------- .../kylinolap/cube/project/ProjectManagerTest.java | 29 +++++---- 3 files changed, 46 insertions(+), 59 deletions(-) delete mode 100644 .settings/org.eclipse.core.resources.prefs diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 4824b80..0000000 --- a/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/common/src/main/java/com/kylinolap/common/persistence/HBaseResourceStore.java b/common/src/main/java/com/kylinolap/common/persistence/HBaseResourceStore.java index 3e101af..341ee27 100644 --- a/common/src/main/java/com/kylinolap/common/persistence/HBaseResourceStore.java +++ b/common/src/main/java/com/kylinolap/common/persistence/HBaseResourceStore.java @@ -70,7 +70,7 @@ final String tableNameBase; final String hbaseUrl; - final Map tableNameMap; // path prefix ==> HBase table name +// final Map tableNameMap; // path prefix ==> HBase table name private HConnection getConnection() throws IOException { return HBaseConnection.get(hbaseUrl); @@ -85,13 +85,15 @@ public HBaseResourceStore(KylinConfig kylinConfig) throws IOException { tableNameBase = cut < 0 ? DEFAULT_TABLE_NAME : metadataUrl.substring(0, cut); hbaseUrl = cut < 0 ? metadataUrl : metadataUrl.substring(cut + 1); - tableNameMap = new LinkedHashMap(); - for (Entry entry : TABLE_SUFFIX_MAP.entrySet()) { - String pathPrefix = entry.getKey(); - String tableName = tableNameBase + entry.getValue(); - tableNameMap.put(pathPrefix, tableName); - createHTableIfNeeded(tableName); - } + createHTableIfNeeded(getAllInOneTableName()); + +// tableNameMap = new LinkedHashMap(); +// for (Entry entry : TABLE_SUFFIX_MAP.entrySet()) { +// String pathPrefix = entry.getKey(); +// String tableName = tableNameBase + entry.getValue(); +// tableNameMap.put(pathPrefix, tableName); +// createHTableIfNeeded(tableName); +// } } @@ -99,13 +101,8 @@ private void createHTableIfNeeded(String tableName) throws IOException { HBaseConnection.createHTableIfNeeded(getConnection(), tableName, FAMILY); } - private String getTableName(String path) { - for (Entry entry : tableNameMap.entrySet()) { - String pathPrefix = entry.getKey(); - if (path.startsWith(pathPrefix)) - return entry.getValue(); - } - throw new IllegalStateException("failed to find HBase table for path -- " + path); + private String getAllInOneTableName() { + return tableNameBase; } @Override @@ -118,30 +115,21 @@ private String getTableName(String path) { ArrayList result = new ArrayList(); - for (Entry entry : tableNameMap.entrySet()) { - String pathPrefix = entry.getKey(); - String tableName = entry.getValue(); - - if ((pathPrefix.startsWith(lookForPrefix) || lookForPrefix.startsWith(pathPrefix)) == false) - continue; - - HTableInterface table = getConnection().getTable(tableName); - - Scan scan = new Scan(startRow, endRow); - scan.setFilter(new KeyOnlyFilter()); - try { - ResultScanner scanner = table.getScanner(scan); - for (Result r : scanner) { - String path = Bytes.toString(r.getRow()); - assert path.startsWith(lookForPrefix); - int cut = path.indexOf('/', lookForPrefix.length()); - String child = cut < 0 ? path : path.substring(0, cut); - if (result.contains(child) == false) - result.add(child); - } - } finally { - IOUtils.closeQuietly(table); + HTableInterface table = getConnection().getTable(getAllInOneTableName()); + Scan scan = new Scan(startRow, endRow); + scan.setFilter(new KeyOnlyFilter()); + try { + ResultScanner scanner = table.getScanner(scan); + for (Result r : scanner) { + String path = Bytes.toString(r.getRow()); + assert path.startsWith(lookForPrefix); + int cut = path.indexOf('/', lookForPrefix.length()); + String child = cut < 0 ? path : path.substring(0, cut); + if (result.contains(child) == false) + result.add(child); } + } finally { + IOUtils.closeQuietly(table); } // return null to indicate not a folder return result.isEmpty() ? null : result; @@ -186,7 +174,7 @@ protected void putResourceImpl(String resPath, InputStream content, long ts) thr IOUtils.copy(content, bout); bout.close(); - HTableInterface table = getConnection().getTable(getTableName(resPath)); + HTableInterface table = getConnection().getTable(getAllInOneTableName()); try { byte[] row = Bytes.toBytes(resPath); Put put = buildPut(resPath, ts, row, bout.toByteArray(), table); @@ -200,7 +188,7 @@ protected void putResourceImpl(String resPath, InputStream content, long ts) thr @Override protected long checkAndPutResourceImpl(String resPath, byte[] content, long oldTS, long newTS) throws IOException, IllegalStateException { - HTableInterface table = getConnection().getTable(getTableName(resPath)); + HTableInterface table = getConnection().getTable(getAllInOneTableName()); try { byte[] row = Bytes.toBytes(resPath); byte[] bOldTS = oldTS == 0 ? null : Bytes.toBytes(oldTS); @@ -220,7 +208,7 @@ protected long checkAndPutResourceImpl(String resPath, byte[] content, long oldT @Override protected void deleteResourceImpl(String resPath) throws IOException { - HTableInterface table = getConnection().getTable(getTableName(resPath)); + HTableInterface table = getConnection().getTable(getAllInOneTableName()); try { Delete del = new Delete(Bytes.toBytes(resPath)); table.delete(del); @@ -232,7 +220,7 @@ protected void deleteResourceImpl(String resPath) throws IOException { @Override protected String getReadableResourcePathImpl(String resPath) { - return tableNameBase + "(key='" + resPath + "')@" + kylinConfig.getMetadataUrl(); + return getAllInOneTableName() + "(key='" + resPath + "')@" + kylinConfig.getMetadataUrl(); } private Result getByScan(String path, byte[] family, byte[] column) throws IOException { @@ -246,7 +234,7 @@ private Result getByScan(String path, byte[] family, byte[] column) throws IOExc scan.addColumn(family, column); } - HTableInterface table = getConnection().getTable(getTableName(path)); + HTableInterface table = getConnection().getTable(getAllInOneTableName()); try { ResultScanner scanner = table.getScanner(scan); Result result = null; diff --git a/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java b/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java index de54438..6f9067a 100644 --- a/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java +++ b/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java @@ -64,9 +64,10 @@ public void testDropNonemptyProject2() throws IOException { @Test public void testNewProject() throws Exception { - int originalProjectCount = ProjectManager.getInstance(this.getTestConfig()).listAllProjects().size(); + ProjectManager projectmanager = ProjectManager.getInstance(this.getTestConfig()); + int originalProjectCount = projectmanager.listAllProjects().size(); int originalCubeCount = CubeManager.getInstance(this.getTestConfig()).listAllCubes().size(); - int originalCubeCountInDefault = ProjectManager.getInstance(this.getTestConfig()).listAllCubes("default").size(); + int originalCubeCountInDefault = projectmanager.listAllCubes("default").size(); ResourceStore store = getStore(); // clean legacy in case last run failed @@ -80,31 +81,31 @@ public void testNewProject() throws Exception { System.out.println(JsonUtil.writeValueAsIndentString(createdCube)); - assertTrue(ProjectManager.getInstance(this.getTestConfig()).listAllProjects().size() == originalProjectCount + 1); - assertTrue(ProjectManager.getInstance(this.getTestConfig()).listAllCubes("ALIEN").get(0).getName().equalsIgnoreCase("CUBE_IN_ALIEN_PROJECT")); + assertTrue(projectmanager.listAllProjects().size() == originalProjectCount + 1); + assertTrue(projectmanager.listAllCubes("ALIEN").get(0).getName().equalsIgnoreCase("CUBE_IN_ALIEN_PROJECT")); assertTrue(CubeManager.getInstance(this.getTestConfig()).listAllCubes().size() == originalCubeCount + 1); - ProjectManager.getInstance(this.getTestConfig()).updateCubeToProject("cube_in_alien_project", "default", null); - assertTrue(ProjectManager.getInstance(this.getTestConfig()).listAllCubes("ALIEN").size() == 0); - assertTrue(ProjectManager.getInstance(this.getTestConfig()).listAllCubes("default").size() == originalCubeCountInDefault + 1); + projectmanager.updateCubeToProject("cube_in_alien_project", "default", null); + assertTrue(projectmanager.listAllCubes("ALIEN").size() == 0); + assertTrue(projectmanager.listAllCubes("default").size() == originalCubeCountInDefault + 1); assertTrue(ProjectManager.getInstance(getTestConfig()).listAllCubes("default").contains(createdCube)); - ProjectManager.getInstance(this.getTestConfig()).updateCubeToProject("cube_in_alien_project", "alien", null); - assertTrue(ProjectManager.getInstance(this.getTestConfig()).listAllCubes("ALIEN").size() == 1); - assertTrue(ProjectManager.getInstance(this.getTestConfig()).listAllCubes("default").size() == originalCubeCountInDefault); + projectmanager.updateCubeToProject("cube_in_alien_project", "alien", null); + assertTrue(projectmanager.listAllCubes("ALIEN").size() == 1); + assertTrue(projectmanager.listAllCubes("default").size() == originalCubeCountInDefault); assertTrue(ProjectManager.getInstance(getTestConfig()).listAllCubes("alien").contains(createdCube)); - assertTrue(ProjectManager.getInstance(this.getTestConfig()).isCubeInProject("alien", createdCube)); + assertTrue(projectmanager.isCubeInProject("alien", createdCube)); CubeInstance droppedCube = CubeManager.getInstance(this.getTestConfig()).dropCube("cube_in_alien_project", true); assertTrue(createdCube == droppedCube); assertNull(CubeManager.getInstance(this.getTestConfig()).getCube("cube_in_alien_project")); - assertTrue(ProjectManager.getInstance(this.getTestConfig()).listAllProjects().size() == originalProjectCount + 1); + assertTrue(projectmanager.listAllProjects().size() == originalProjectCount + 1); assertTrue(CubeManager.getInstance(this.getTestConfig()).listAllCubes().size() == originalCubeCount); - ProjectManager.getInstance(this.getTestConfig()).dropProject("alien"); - assertTrue(ProjectManager.getInstance(this.getTestConfig()).listAllProjects().size() == originalProjectCount); + projectmanager.dropProject("alien"); + assertTrue(projectmanager.listAllProjects().size() == originalProjectCount); } @Test From 8177cde55f7f690cd8a2fae8a7d0192ea1dbc8a4 Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Tue, 2 Dec 2014 20:05:25 +0800 Subject: [PATCH 36/65] Refactor ShellCmd to reuse CliCommandExecutor --- .../main/java/com/kylinolap/job/cmd/ShellCmd.java | 127 ++------------------- 1 file changed, 9 insertions(+), 118 deletions(-) diff --git a/job/src/main/java/com/kylinolap/job/cmd/ShellCmd.java b/job/src/main/java/com/kylinolap/job/cmd/ShellCmd.java index d8d99c5..7ca8d61 100644 --- a/job/src/main/java/com/kylinolap/job/cmd/ShellCmd.java +++ b/job/src/main/java/com/kylinolap/job/cmd/ShellCmd.java @@ -28,6 +28,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.FutureTask; +import com.kylinolap.common.util.CliCommandExecutor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,26 +50,16 @@ private final String executeCommand; private final ICommandOutput output; - private final String remoteHost; - private final String remoteUser; - private final String remotePassword; - private final String identityPath; private final boolean isAsync; + private final CliCommandExecutor cliCommandExecutor; private FutureTask future; protected ShellCmd(String executeCmd, ICommandOutput out, String host, String user, String password, boolean async) { this.executeCommand = executeCmd; this.output = out; - this.remoteHost = host; - this.remoteUser = user; - if (new File(password).exists()) { - this.identityPath = new File(password).getAbsolutePath(); - this.remotePassword = null; - } else { - this.remotePassword = password; - this.identityPath = null; - } + cliCommandExecutor = new CliCommandExecutor(); + cliCommandExecutor.setRunAtRemote(host, user, password); this.isAsync = async; } @@ -81,7 +72,7 @@ public ICommandOutput execute() throws JobException { final ExecutorService executor = Executors.newSingleThreadExecutor(); future = new FutureTask(new Callable() { - public Integer call() throws JobException { + public Integer call() throws JobException, IOException { executor.shutdown(); return executeCommand(executeCommand); } @@ -112,111 +103,11 @@ public Integer call() throws JobException { return output; } - protected int executeCommand(String command) throws JobException { + protected int executeCommand(String command) throws JobException, IOException { output.reset(); - if (remoteHost != null) { - log.debug("Executing remote cmd: " + command); - return remoteExec(command); - } else { - log.debug("Executing local cmd: " + command); - return localExec(command); - } - } - - private int localExec(String command) throws JobException { - output.setStatus(JobStepStatusEnum.RUNNING); - String[] cmd = new String[3]; - cmd[0] = "/bin/bash"; - cmd[1] = "-c"; - cmd[2] = command; - - BufferedReader reader = null; - int exitCode = -1; - try { - ProcessBuilder builder = new ProcessBuilder(cmd); - builder.redirectErrorStream(true); - Process proc = builder.start(); - - reader = new BufferedReader(new InputStreamReader(proc.getInputStream())); - String line = null; - while ((line = reader.readLine()) != null) { - output.appendOutput(line); - } - - exitCode = proc.waitFor(); - } catch (Exception e) { - throw new JobException(e); - } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException e) { - throw new JobException(e); - } - } - } - return exitCode; - } - - private int remoteExec(String command) throws JobException { - output.setStatus(JobStepStatusEnum.RUNNING); - Session session = null; - Channel channel = null; - int exitCode = -1; - try { - JSch jsch = new JSch(); - if (identityPath != null) { - jsch.addIdentity(identityPath); - } - - session = jsch.getSession(remoteUser, remoteHost, 22); - if (remotePassword != null) { - session.setPassword(remotePassword); - } - session.setConfig("StrictHostKeyChecking", "no"); - session.connect(); - - channel = session.openChannel("exec"); - ((ChannelExec) channel).setCommand(command); - channel.setInputStream(null); - PipedInputStream in = new PipedInputStream(64 * 1024); - PipedOutputStream out = new PipedOutputStream(in); - channel.setOutputStream(out); - ((ChannelExec) channel).setErrStream(out); // redirect error to out - channel.connect(); - - byte[] tmp = new byte[1024]; - while (true) { - while (in.available() > 0) { - int i = in.read(tmp, 0, 1024); - if (i < 0) - break; - output.appendOutput(new String(tmp, 0, i)); - } - if (channel.isClosed()) { - if (in.available() > 0) { - continue; - } - exitCode = channel.getExitStatus(); - break; - } - try { - Thread.sleep(1000); - } catch (Exception ee) { - throw ee; - } - } - } catch (Exception e) { - throw new JobException(e); - } finally { - if (channel != null) { - channel.disconnect(); - } - if (session != null) { - session.disconnect(); - } - } - return exitCode; + String result = cliCommandExecutor.execute(command); + //if cliCommandExecutor doesn't throw IOException, it means command is executed correctly + return 0; } @Override From a5e243bb2946818320f5c13a4314fe22455986e8 Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Tue, 2 Dec 2014 20:07:38 +0800 Subject: [PATCH 37/65] format code --- .../main/java/com/kylinolap/job/cmd/ShellCmd.java | 25 +++++----------------- .../java/com/kylinolap/job/cmd/ShellHadoopCmd.java | 9 ++++---- 2 files changed, 9 insertions(+), 25 deletions(-) diff --git a/job/src/main/java/com/kylinolap/job/cmd/ShellCmd.java b/job/src/main/java/com/kylinolap/job/cmd/ShellCmd.java index 7ca8d61..811c06f 100644 --- a/job/src/main/java/com/kylinolap/job/cmd/ShellCmd.java +++ b/job/src/main/java/com/kylinolap/job/cmd/ShellCmd.java @@ -16,33 +16,18 @@ package com.kylinolap.job.cmd; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PipedInputStream; -import java.io.PipedOutputStream; -import java.util.concurrent.Callable; -import java.util.concurrent.CancellationException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.FutureTask; - import com.kylinolap.common.util.CliCommandExecutor; +import com.kylinolap.job.constant.JobStepStatusEnum; +import com.kylinolap.job.exception.JobException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.jcraft.jsch.Channel; -import com.jcraft.jsch.ChannelExec; -import com.jcraft.jsch.JSch; -import com.jcraft.jsch.Session; -import com.kylinolap.job.constant.JobStepStatusEnum; -import com.kylinolap.job.exception.JobException; +import java.io.IOException; +import java.util.concurrent.*; /** * @author xjiang * - * FIXME should reuse common.util.SSHClient */ public class ShellCmd implements IJobCommand { @@ -105,7 +90,7 @@ public Integer call() throws JobException, IOException { protected int executeCommand(String command) throws JobException, IOException { output.reset(); - String result = cliCommandExecutor.execute(command); + cliCommandExecutor.execute(command); //if cliCommandExecutor doesn't throw IOException, it means command is executed correctly return 0; } diff --git a/job/src/main/java/com/kylinolap/job/cmd/ShellHadoopCmd.java b/job/src/main/java/com/kylinolap/job/cmd/ShellHadoopCmd.java index f0b7a4e..75f34b6 100644 --- a/job/src/main/java/com/kylinolap/job/cmd/ShellHadoopCmd.java +++ b/job/src/main/java/com/kylinolap/job/cmd/ShellHadoopCmd.java @@ -16,15 +16,14 @@ package com.kylinolap.job.cmd; -import java.io.IOException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.kylinolap.job.JobDAO; import com.kylinolap.job.JobInstance; import com.kylinolap.job.engine.JobEngineConfig; import com.kylinolap.job.exception.JobException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; /** * @author xjiang From 847f3859476baac5939fb3540e6d17414e109757 Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Wed, 3 Dec 2014 10:58:36 +0800 Subject: [PATCH 38/65] fix NPE --- .../java/com/kylinolap/job/cmd/JavaHadoopCmdOutput.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/job/src/main/java/com/kylinolap/job/cmd/JavaHadoopCmdOutput.java b/job/src/main/java/com/kylinolap/job/cmd/JavaHadoopCmdOutput.java index 20dd9dd..c3f9236 100644 --- a/job/src/main/java/com/kylinolap/job/cmd/JavaHadoopCmdOutput.java +++ b/job/src/main/java/com/kylinolap/job/cmd/JavaHadoopCmdOutput.java @@ -18,6 +18,7 @@ import java.util.Map; +import org.apache.hadoop.mapreduce.Counters; import org.apache.hadoop.mapreduce.TaskCounter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -159,16 +160,23 @@ private void updateHadoopJobInfo() { private void updateJobCounter() { try { - this.output.append(job.getCounters().toString()).append("\n"); - log.debug(job.getCounters().toString()); + Counters counters = job.getCounters(); + if (counters == null) { + String errorMsg = "no counters for job " + mrJobID; + log.warn(errorMsg); + output.append(errorMsg); + return; + } + this.output.append(counters.toString()).append("\n"); + log.debug(counters.toString()); JobDAO jobDAO = JobDAO.getInstance(config); JobInstance jobInstance = jobDAO.getJob(jobInstanceID); JobStep jobStep = jobInstance.getSteps().get(jobStepID); - long mapInputRecords = job.getCounters().findCounter(TaskCounter.MAP_INPUT_RECORDS).getValue(); + long mapInputRecords = counters.findCounter(TaskCounter.MAP_INPUT_RECORDS).getValue(); jobStep.putInfo(JobInstance.SOURCE_RECORDS_COUNT, String.valueOf(mapInputRecords)); - long hdfsBytesWritten = job.getCounters().findCounter("FileSystemCounters", "HDFS_BYTES_WRITTEN").getValue(); + long hdfsBytesWritten = counters.findCounter("FileSystemCounters", "HDFS_BYTES_WRITTEN").getValue(); jobStep.putInfo(JobInstance.HDFS_BYTES_WRITTEN, String.valueOf(hdfsBytesWritten)); jobDAO.updateJobInstance(jobInstance); From 93fb092b649228a5f5b309c0e839f9f1bce7bbdc Mon Sep 17 00:00:00 2001 From: shaofengshi Date: Wed, 3 Dec 2014 11:25:28 +0800 Subject: [PATCH 39/65] =?UTF-8?q?Need=20attache=20=E2=80=9C/model=5Fdesc?= =?UTF-8?q?=E2=80=9D=20as=20well=20as=20other=20metadata=20resources;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../localmeta/cube_desc/test_kylin_cube_without_slr_desc.json | 1 - .../cube_desc/test_kylin_cube_without_slr_left_join_desc.json | 6 +++--- job/src/main/java/com/kylinolap/job/hadoop/AbstractHadoopJob.java | 3 ++- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_desc.json b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_desc.json index 547f4f6..5716569 100644 --- a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_desc.json +++ b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_desc.json @@ -19,7 +19,6 @@ }, { "name": "category", - "table": "test_category_groupings", "column": ["test_category_groupings.meta_categ_name", "test_category_groupings.categ_lvl2_name", "test_category_groupings.categ_lvl3_name"], "derived": [ "USER_DEFINED_FIELD1", diff --git a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_left_join_desc.json b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_left_join_desc.json index 15f6e78..bab8c2c 100644 --- a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_left_join_desc.json +++ b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_left_join_desc.json @@ -116,9 +116,9 @@ "parameter": { "type": "column", "value": "seller_id" - }, - "dependent_measure_ref" : "seller_cnt_hll" - } + } + }, + "dependent_measure_ref" : "seller_cnt_hll" }, { "id": "7", diff --git a/job/src/main/java/com/kylinolap/job/hadoop/AbstractHadoopJob.java b/job/src/main/java/com/kylinolap/job/hadoop/AbstractHadoopJob.java index 8131a72..5ec2d49 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/AbstractHadoopJob.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/AbstractHadoopJob.java @@ -170,9 +170,10 @@ protected void attachKylinPropsAndMetadata(CubeInstance cube, Configuration conf File kylinPropsFile = new File(metaDir, "kylin.properties"); kylinConfig.writeProperties(kylinPropsFile); - // write cube / cube_desc / dict / table + // write cube / model_desc / cube_desc / dict / table ArrayList dumpList = new ArrayList(); dumpList.add(cube.getResourcePath()); + dumpList.add(cube.getDescriptor().getModel().getResourcePath()); dumpList.add(cube.getDescriptor().getResourcePath()); if (cube.isInvertedIndex()) { dumpList.add(cube.getInvertedIndexDesc().getResourcePath()); From 5c67dddb0ee3caf6588ed510ed9123dd665c7a18 Mon Sep 17 00:00:00 2001 From: shaofengshi Date: Wed, 3 Dec 2014 16:10:36 +0800 Subject: [PATCH 40/65] Allow specify dimension column without table name (if the column name is unique among all tables); Also updated some test case. --- .../kylinolap/cube/dataGen/FactTableGenerator.java | 5 +++ .../java/com/kylinolap/cube/model/CubeDesc.java | 17 ++++++++- .../com/kylinolap/cube/model/DimensionDesc.java | 44 ++++++++++++---------- .../rest/controller/CubeControllerTest.java | 3 +- 4 files changed, 48 insertions(+), 21 deletions(-) diff --git a/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java b/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java index 7781e61..15d435d 100644 --- a/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java +++ b/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java @@ -305,6 +305,11 @@ private String generate() throws Exception { if (jDesc == null) { // column on fact table used directly as a dimension for (String aColumn : dim.getColumn()) { + int lastIndexOfDot = aColumn.lastIndexOf("."); + if (lastIndexOfDot >= 0) { + aColumn = aColumn.substring(lastIndexOfDot + 1); + } + if (!factTableCol2LookupCol.containsKey(aColumn)) usedCols.add(aColumn); } diff --git a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java index 56745ad..688c605 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java @@ -466,9 +466,24 @@ public void init(KylinConfig config, Map tables) { if(this.model == null) { this.addError("No data model found with name '" + modelName + "'."); } + + Map> columnTableMap = new HashMap>(); + + String colName; + for(TableDesc table : tables.values()) { + for(ColumnDesc col : table.getColumns()) { + colName = col.getName(); + List tableNames = columnTableMap.get(colName); + if(tableNames == null) { + tableNames = new ArrayList(3); + columnTableMap.put(colName, tableNames); + } + tableNames.add(table.getName()); + } + } for (DimensionDesc dim : dimensions) { - dim.init(this, tables); + dim.init(this, tables, columnTableMap); } sortDimAndMeasure(); diff --git a/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java b/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java index c041037..47d8361 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java @@ -45,6 +45,7 @@ private HierarchyDesc[] hierarchy; @JsonProperty("hierarchy") private boolean isHierarchy; + @JsonProperty("table") private String table; private String database; @JsonProperty("column") @@ -67,7 +68,6 @@ public boolean isHierarchyColumn(TblColRef col) { return false; } - public String getTable() { return table.toUpperCase(); } @@ -131,7 +131,6 @@ public void setDerived(String[] derived) { public void setDerivedColRefs(TblColRef[] derivedColRefs) { this.derivedColRefs = derivedColRefs; } - @Override public boolean equals(Object o) { @@ -162,42 +161,50 @@ public String toString() { return "DimensionDesc [name=" + name + ", join=" + join + ", hierarchy=" + Arrays.toString(hierarchy) + ", table=" + table + ", column=" + Arrays.toString(column) + ", derived=" + Arrays.toString(derived) + "]"; } - public void init(CubeDesc cubeDesc, Map tables) { + public void init(CubeDesc cubeDesc, Map tables, Map> columnTableMap) { if (name != null) name = name.toUpperCase(); - + this.table = null; this.database = null; this.join = null; - - for(int i=0, n = this.column.length; i 1) { String thisTable = splits[splits.length - 2].toUpperCase(); - if(table == null) { + if (table == null) { table = thisTable; } else if (thisTable != null && !table.equalsIgnoreCase(thisTable)) { - throw new IllegalStateException("One dimension can only refer to the columns on the same table."); + throw new IllegalStateException("One dimension can only refer to the columns on the same table: '" + table + "' and '" + thisTable + "'."); } - + if (database == null && splits.length > 2) { database = splits[splits.length - 3].toUpperCase(); - } - - this.column[i] = splits[splits.length - 1].toUpperCase(); + } + + //this.column[i] = splits[splits.length - 1].toUpperCase(); } else { - // if no table specified, assume it is on fact table - table = cubeDesc.getFactTable(); + // if no table specified, seek the table among all tables + List tableNames = columnTableMap.get(thisColumn); + if (tableNames != null && tableNames.size() == 1) { + table = tableNames.get(0); + } else { + if (tableNames == null) + throw new IllegalStateException("The column '" + thisColumn + "' doesn't belong to any table."); + if (tableNames.size() > 1) + throw new IllegalStateException("The column '" + thisColumn + "' is ambiguous; the name appeared in more than one tables, please specify table name together with the column name."); + } } } - + TableDesc tableDesc = tables.get(table); if (tableDesc == null) throw new IllegalStateException("Can't find table " + table + " on dimension " + name); - - for(LookupDesc lookup : cubeDesc.getModel().getLookups()) { - if(lookup.getTable().equalsIgnoreCase(table)) { + + for (LookupDesc lookup : cubeDesc.getModel().getLookups()) { + if (lookup.getTable().equalsIgnoreCase(table)) { this.join = lookup.getJoin(); break; } @@ -220,7 +227,6 @@ public void init(CubeDesc cubeDesc, Map tables) { hierarchy = null; if (derived != null && derived.length == 0) derived = null; - if (hierarchy != null) { for (HierarchyDesc h : hierarchy) diff --git a/server/src/test/java/com/kylinolap/rest/controller/CubeControllerTest.java b/server/src/test/java/com/kylinolap/rest/controller/CubeControllerTest.java index 3f68729..19bf726 100644 --- a/server/src/test/java/com/kylinolap/rest/controller/CubeControllerTest.java +++ b/server/src/test/java/com/kylinolap/rest/controller/CubeControllerTest.java @@ -66,11 +66,12 @@ public void testBasics() throws IOException { CubeDesc newCube = new CubeDesc(); String newCubeName = cube.getName() + "_test_save"; newCube.setName(newCubeName); + newCube.setModelName(cube.getModelName()); + newCube.setModel(cube.getModel()); newCube.setDimensions(cube.getDimensions()); newCube.setHBaseMapping(cube.getHBaseMapping()); newCube.setMeasures(cube.getMeasures()); newCube.setConfig(cube.getConfig()); - newCube.getModel().setFactTable(cube.getFactTable()); newCube.setRowkey(cube.getRowkey()); ObjectMapper mapper = new ObjectMapper(); From 7877dfddc84b51e7d9b0a7b4782662161d496b2b Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Wed, 3 Dec 2014 16:58:11 +0800 Subject: [PATCH 41/65] use [db.table] to distinguish tables with same name in different db --- .../kylinolap/cube/project/ProjectInstance.java | 7 ++-- .../com/kylinolap/cube/project/ProjectManager.java | 26 +++++++------- .../com/kylinolap/metadata/MetadataManager.java | 31 +++++++++------- .../com/kylinolap/metadata/model/TableDesc.java | 21 +++++++++-- .../kylinolap/metadata/model/TableDescTest.java | 41 ++++++++++++++++++++++ 5 files changed, 94 insertions(+), 32 deletions(-) create mode 100644 metadata/src/test/java/com/kylinolap/metadata/model/TableDescTest.java diff --git a/cube/src/main/java/com/kylinolap/cube/project/ProjectInstance.java b/cube/src/main/java/com/kylinolap/cube/project/ProjectInstance.java index f8939e4..26d4c90 100644 --- a/cube/src/main/java/com/kylinolap/cube/project/ProjectInstance.java +++ b/cube/src/main/java/com/kylinolap/cube/project/ProjectInstance.java @@ -182,14 +182,15 @@ public int getTablesCount() { } public void addTable(String tableName) { - tableName = tableName.toUpperCase(); + tableName = tableName.toUpperCase(); this.getTables().add(tableName); } //will return new Set for null public Set getTables() { - tables = tables==null?new TreeSet():tables; - return tables; } + tables = tables == null ? new TreeSet() : tables; + return tables; + } public String getOwner() { return owner; diff --git a/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java b/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java index fba564a..2a9004e 100644 --- a/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java +++ b/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java @@ -17,11 +17,7 @@ package com.kylinolap.cube.project; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.lang3.StringUtils; @@ -243,7 +239,7 @@ public void removeCubeFromProjects(String cubeName) throws IOException { //sync exposed table to project when list List exposedTables = listExposedTables(project); for (TableDesc table : exposedTables) { - projectInstance.addTable(table.getName()); + projectInstance.addTable(TableDesc.getTableIdentity(table)); } //only save project json if new tables are sync in if (originTableCount < projectInstance.getTablesCount()) { @@ -420,8 +416,9 @@ private synchronized ProjectInstance loadProject(String path, boolean triggerUpd ProjectInstance projectInstance = store.getResource(path, ProjectInstance.class, PROJECT_SERIALIZER); projectInstance.init(); - if (StringUtils.isBlank(projectInstance.getName())) + if (StringUtils.isBlank(projectInstance.getName())) { throw new IllegalStateException("Project name must not be blank"); + } if (triggerUpdate) { projectMap.put(projectInstance.getName().toUpperCase(), projectInstance); @@ -532,15 +529,17 @@ private void markExposedTablesAndColumns(String projectName, CubeInstance cubeIn private void markExposedTableAndColumn(String project, String table, String column, Object refObj) { project = ProjectInstance.getNormalizedProjectName(project); TableDesc t = this.getMetadataManager().getTableDesc(table); - if (t == null) + if (t == null) { throw new IllegalStateException("No SourceTable found by name '" + table + "', ref by " + refObj); + } table = t.getName(); // ensures upper case ProjectTable projTable = getProjectTable(project, table, true); ColumnDesc srcCol = t.findColumnByName(column); - if (srcCol == null) + if (srcCol == null) { throw new IllegalStateException("No SourceColumn found by name '" + table + "/" + column + "', ref by " + refObj); + } if (!projTable.getColumns().contains(srcCol.getName())) { projTable.getColumns().add(srcCol.getName()); @@ -556,11 +555,10 @@ private ProjectTable getProjectTable(String project, final String table, boolean project = ProjectInstance.getNormalizedProjectName(project); if (this.projectTables.containsEntry(project, new ProjectTable(table))) { - Iterator projsIter = this.projectTables.get(project).iterator(); - while (projsIter.hasNext()) { - ProjectTable oneTable = projsIter.next(); - if (oneTable.getName().equalsIgnoreCase(table)) { - projectTable = oneTable; + Collection projects = this.projectTables.get(project); + for (ProjectTable pt : projects) { + if (pt.getName().equalsIgnoreCase(table)) { + projectTable = pt; break; } } diff --git a/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java b/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java index 31a0b2e..53702ac 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java +++ b/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java @@ -140,8 +140,7 @@ public ResourceStore getStore() { * @return */ public TableDesc getTableDesc(String tableName) { - tableName = tableName.toUpperCase(); - return srcTableMap.get(tableName); + return srcTableMap.get(TableDesc.getTableIdentity(tableName)); } /** @@ -151,10 +150,10 @@ public TableDesc getTableDesc(String tableName) { * @return */ public Map getTableDescExd(String tableName) { - tableName = tableName.toUpperCase(); + String tableIdentity = TableDesc.getTableIdentity(tableName); Map result = new HashMap(); - if (srcTableExdMap.containsKey(tableName)) { - Map tmp = srcTableExdMap.get(tableName); + if (srcTableExdMap.containsKey(tableIdentity)) { + Map tmp = srcTableExdMap.get(tableIdentity); Iterator> it = tmp.entrySet().iterator(); while (it.hasNext()) { Entry entry = it.next(); @@ -168,15 +167,18 @@ public TableDesc getTableDesc(String tableName) { } public void createSourceTable(TableDesc srcTable) throws IOException { - if (srcTable.getUuid() == null || srcTable.getName() == null) + if (srcTable.getUuid() == null || srcTable.getName() == null) { throw new IllegalArgumentException(); - if (srcTableMap.containsKey(srcTable.getName())) + } + String tableIdentity = TableDesc.getTableIdentity(srcTable); + if (srcTableMap.containsKey(tableIdentity)) { throw new IllegalArgumentException("SourceTable '" + srcTable.getName() + "' already exists"); + } String path = srcTable.getResourcePath(); getStore().putResource(path, srcTable, TABLE_SERIALIZER); - srcTableMap.put(srcTable.getName(), srcTable); + srcTableMap.put(tableIdentity, srcTable); } public InvertedIndexDesc getInvertedIndexDesc(String name) { @@ -202,7 +204,7 @@ private void reloadAllSourceTableExd() throws IOException { for (String path : paths) { Map attrContainer = new HashMap(); String tableName = loadSourceTableExd(getStore(), path, attrContainer); - srcTableExdMap.putLocal(tableName.toUpperCase(), attrContainer); + srcTableExdMap.putLocal(TableDesc.getTableIdentity(tableName), attrContainer); } logger.debug("Loaded " + paths.size() + " SourceTable EXD(s)"); } @@ -249,12 +251,15 @@ private TableDesc loadSourceTable(String path) throws IOException { TableDesc t = store.getResource(path, TableDesc.class, TABLE_SERIALIZER); t.init(); - if (StringUtils.isBlank(t.getName())) + String tableIdentity = TableDesc.getTableIdentity(t); + if (StringUtils.isBlank(tableIdentity)) { throw new IllegalStateException("SourceTable name must not be blank"); - if (srcTableMap.containsKey(t.getName())) - throw new IllegalStateException("Dup SourceTable name '" + t.getName() + "'"); + } + if (srcTableMap.containsKey(tableIdentity)) { + throw new IllegalStateException("Dup SourceTable name '" + tableIdentity + "'"); + } - srcTableMap.putLocal(t.getName(), t); + srcTableMap.putLocal(tableIdentity, t); return t; } diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java index 917cc60..f1145bf 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java @@ -17,6 +17,7 @@ import java.util.Arrays; import java.util.Comparator; +import java.util.regex.Pattern; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; @@ -56,7 +57,7 @@ public ColumnDesc findColumnByName(String name) { } public String getResourcePath() { - return ResourceStore.TABLE_RESOURCE_ROOT + "/" + name + ".json"; + return ResourceStore.TABLE_RESOURCE_ROOT + "/" + getTableIdentity(this) + ".json"; } // ============================================================================ @@ -129,7 +130,23 @@ public int compare(ColumnDesc col1, ColumnDesc col2) { @Override public String toString() { - return "TableDesc [name=" + name + "]"; + return "TableDesc [database=" + getDatabase() + " name=" + name + "]"; + } + + private static final Pattern TABLE_IDENTITY_PATTERN = Pattern.compile("^\\w+\\.\\w+$"); + + public static String getTableIdentity(TableDesc tableDesc) { + return String.format("%s.%s", tableDesc.getDatabase(), tableDesc.getName()).toUpperCase(); + } + + public static String getTableIdentity(String tableName) { + if (!tableName.contains(".")) { + tableName = "DEFAULT." + tableName; + } + if (!TABLE_IDENTITY_PATTERN.matcher(tableName).matches()) { + throw new IllegalArgumentException("invalid tableName:" + tableName); + } + return tableName.toUpperCase(); } } diff --git a/metadata/src/test/java/com/kylinolap/metadata/model/TableDescTest.java b/metadata/src/test/java/com/kylinolap/metadata/model/TableDescTest.java new file mode 100644 index 0000000..d8a0955 --- /dev/null +++ b/metadata/src/test/java/com/kylinolap/metadata/model/TableDescTest.java @@ -0,0 +1,41 @@ +package com.kylinolap.metadata.model; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +/** + * Created by qianzhou on 12/3/14. + */ +public class TableDescTest { + + @Test + public void testTableIdentity() { + final String tableName = "testtable"; + final String dbName = "testdb"; + TableDesc table = new TableDesc(); + table.setName(tableName); + assertEquals(("DEFAULT." + tableName).toUpperCase(), TableDesc.getTableIdentity(table)); + assertEquals(("DEFAULT." + tableName).toUpperCase(), TableDesc.getTableIdentity(tableName)); + assertEquals(("DEFAULT." + tableName).toUpperCase(), TableDesc.getTableIdentity("DEFAULT." + tableName)); + assertEquals((dbName + "." + tableName).toUpperCase(), TableDesc.getTableIdentity(dbName + "." + tableName)); + + table.setDatabase(dbName); + assertEquals((dbName + "." + tableName).toUpperCase(), TableDesc.getTableIdentity(dbName + "." + tableName)); + + try { + TableDesc.getTableIdentity("1 2"); + fail("should throw IllegalArgumentException"); + } catch (IllegalArgumentException ex) { + System.out.println(ex.getMessage()); + } + try { + TableDesc.getTableIdentity("t.2.abc"); + fail("should throw IllegalArgumentException"); + } catch (IllegalArgumentException ex) { + System.out.println(ex.getMessage()); + } + + } +} From 441add8414ba5990d321a8f409c0c9f653d1f317 Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Wed, 3 Dec 2014 17:41:37 +0800 Subject: [PATCH 42/65] refactor example --- .../model_desc/test_kylin_ii_model_desc.json | 10 +- .../test_kylin_with_slr_left_join_model_desc.json | 12 +- .../model_desc/test_kylin_with_slr_model_desc.json | 10 +- ...est_kylin_without_slr_left_join_model_desc.json | 10 +- .../test_kylin_without_slr_model_desc.json | 10 +- .../table/DEFAULT.TEST_CATEGORY_GROUPINGS.json | 151 ++++++++ .../localmeta/table/DEFAULT.TEST_KYLIN_FACT.json | 43 +++ .../localmeta/table/EDW.TEST_CAL_DT.json | 407 +++++++++++++++++++++ .../localmeta/table/EDW.TEST_SELLER_TYPE_DIM.json | 43 +++ .../localmeta/table/EDW.TEST_SITES.json | 47 +++ .../localmeta/table/TEST_CAL_DT.json | 407 --------------------- .../localmeta/table/TEST_CATEGORY_GROUPINGS.json | 151 -------- .../localmeta/table/TEST_KYLIN_FACT.json | 43 --- .../localmeta/table/TEST_SELLER_TYPE_DIM.json | 43 --- .../test_case_data/localmeta/table/TEST_SITES.json | 47 --- .../kylinolap/metadata/model/DataModelDesc.java | 5 +- 16 files changed, 719 insertions(+), 720 deletions(-) create mode 100644 examples/test_case_data/localmeta/table/DEFAULT.TEST_CATEGORY_GROUPINGS.json create mode 100644 examples/test_case_data/localmeta/table/DEFAULT.TEST_KYLIN_FACT.json create mode 100644 examples/test_case_data/localmeta/table/EDW.TEST_CAL_DT.json create mode 100644 examples/test_case_data/localmeta/table/EDW.TEST_SELLER_TYPE_DIM.json create mode 100644 examples/test_case_data/localmeta/table/EDW.TEST_SITES.json delete mode 100644 examples/test_case_data/localmeta/table/TEST_CAL_DT.json delete mode 100644 examples/test_case_data/localmeta/table/TEST_CATEGORY_GROUPINGS.json delete mode 100644 examples/test_case_data/localmeta/table/TEST_KYLIN_FACT.json delete mode 100644 examples/test_case_data/localmeta/table/TEST_SELLER_TYPE_DIM.json delete mode 100644 examples/test_case_data/localmeta/table/TEST_SITES.json diff --git a/examples/test_case_data/localmeta/model_desc/test_kylin_ii_model_desc.json b/examples/test_case_data/localmeta/model_desc/test_kylin_ii_model_desc.json index 6c2d7b1..6859e04 100644 --- a/examples/test_case_data/localmeta/model_desc/test_kylin_ii_model_desc.json +++ b/examples/test_case_data/localmeta/model_desc/test_kylin_ii_model_desc.json @@ -1,9 +1,9 @@ { "name" : "test_kylin_ii_model_desc", - "fact_table": "TEST_KYLIN_FACT", + "fact_table": "DEFAULT.TEST_KYLIN_FACT", "lookups": [ { - "table" : "TEST_CAL_DT", + "table" : "EDW.TEST_CAL_DT", "join" : { "type" : "left", "primary_key" : [ "CAL_DT" ], @@ -11,7 +11,7 @@ } }, { - "table" : "TEST_CATEGORY_GROUPINGS", + "table" : "DEFAULT.TEST_CATEGORY_GROUPINGS", "join" : { "type" : "left", "primary_key" : [ "LEAF_CATEG_ID", "SITE_ID" ], @@ -19,7 +19,7 @@ } }, { - "table" : "TEST_SITES", + "table" : "EDW.TEST_SITES", "join" : { "type" : "left", "primary_key" : [ "SITE_ID" ], @@ -27,7 +27,7 @@ } }, { - "table" : "TEST_SELLER_TYPE_DIM", + "table" : "EDW.TEST_SELLER_TYPE_DIM", "join" : { "type" : "left", "primary_key" : [ "SELLER_TYPE_CD" ], diff --git a/examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_left_join_model_desc.json b/examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_left_join_model_desc.json index acb8e0c..ca72e05 100644 --- a/examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_left_join_model_desc.json +++ b/examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_left_join_model_desc.json @@ -1,9 +1,9 @@ { "name": "test_kylin_with_slr_left_join_model_desc", - "fact_table": "test_kylin_fact", + "fact_table": "DEFAULT.test_kylin_fact", "lookups": [ { - "table": "test_cal_dt", + "table": "EDW.test_cal_dt", "join": { "type": "left", "primary_key": ["cal_dt"], @@ -11,7 +11,7 @@ } }, { - "table": "test_category_groupings", + "table": "DEFAULT.test_category_groupings", "join": { "type": "left", "primary_key": ["leaf_categ_id", "site_id"], @@ -19,7 +19,7 @@ } }, { - "table": "test_category_groupings", + "table": "DEFAULT.test_category_groupings", "join": { "type": "left", "primary_key": ["leaf_categ_id", "site_id"], @@ -27,7 +27,7 @@ } }, { - "table": "test_sites", + "table": "EDW.test_sites", "join": { "type": "left", "primary_key": ["site_id"], @@ -35,7 +35,7 @@ } }, { - "table": "test_seller_type_dim", + "table": "EDW.test_seller_type_dim", "join": { "type": "left", "primary_key": ["seller_type_cd"], diff --git a/examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_model_desc.json b/examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_model_desc.json index b1347a1..63404df 100644 --- a/examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_model_desc.json +++ b/examples/test_case_data/localmeta/model_desc/test_kylin_with_slr_model_desc.json @@ -1,9 +1,9 @@ { "name": "test_kylin_with_slr_model_desc", - "fact_table": "test_kylin_fact", + "fact_table": "DEFAULT.test_kylin_fact", "lookups": [ { - "table": "test_cal_dt", + "table": "EDW.test_cal_dt", "join": { "type": "inner", "primary_key": ["cal_dt"], @@ -11,7 +11,7 @@ } }, { - "table": "test_category_groupings", + "table": "DEFAULT.test_category_groupings", "join": { "type": "inner", "primary_key": ["leaf_categ_id", "site_id"], @@ -19,7 +19,7 @@ } }, { - "table": "test_sites", + "table": "EDW.test_sites", "join": { "type": "inner", "primary_key": ["site_id"], @@ -27,7 +27,7 @@ } }, { - "table": "test_seller_type_dim", + "table": "EDW.test_seller_type_dim", "join": { "type": "inner", "primary_key": ["seller_type_cd"], diff --git a/examples/test_case_data/localmeta/model_desc/test_kylin_without_slr_left_join_model_desc.json b/examples/test_case_data/localmeta/model_desc/test_kylin_without_slr_left_join_model_desc.json index 5773190..a3380d0 100644 --- a/examples/test_case_data/localmeta/model_desc/test_kylin_without_slr_left_join_model_desc.json +++ b/examples/test_case_data/localmeta/model_desc/test_kylin_without_slr_left_join_model_desc.json @@ -1,9 +1,9 @@ { "name": "test_kylin_without_slr_left_join_model_desc", - "fact_table": "test_kylin_fact", + "fact_table": "DEFAULT.test_kylin_fact", "lookups": [ { - "table": "test_cal_dt", + "table": "EDW.test_cal_dt", "join": { "type": "left", "primary_key": [ @@ -15,7 +15,7 @@ } }, { - "table": "test_category_groupings", + "table": "DEFAULT.test_category_groupings", "join": { "type": "left", "primary_key": [ @@ -29,7 +29,7 @@ } }, { - "table": "test_sites", + "table": "EDW.test_sites", "join": { "type": "left", "primary_key": [ @@ -41,7 +41,7 @@ } }, { - "table": "test_seller_type_dim", + "table": "EDW.test_seller_type_dim", "join": { "type": "left", "primary_key": [ diff --git a/examples/test_case_data/localmeta/model_desc/test_kylin_without_slr_model_desc.json b/examples/test_case_data/localmeta/model_desc/test_kylin_without_slr_model_desc.json index 09319ab..8775b23 100644 --- a/examples/test_case_data/localmeta/model_desc/test_kylin_without_slr_model_desc.json +++ b/examples/test_case_data/localmeta/model_desc/test_kylin_without_slr_model_desc.json @@ -1,9 +1,9 @@ { "name": "test_kylin_without_slr_model_desc", - "fact_table": "test_kylin_fact", + "fact_table": "DEFAULT.test_kylin_fact", "lookups": [ { - "table" : "test_cal_dt", + "table" : "EDW.test_cal_dt", "join": { "type": "inner", "primary_key": [ @@ -15,7 +15,7 @@ } }, { - "table": "test_category_groupings", + "table": "DEFAULT.test_category_groupings", "join": { "type": "inner", "primary_key": [ @@ -29,7 +29,7 @@ } }, { - "table": "test_sites", + "table": "EDW.test_sites", "join": { "type": "inner", "primary_key": [ @@ -41,7 +41,7 @@ } }, { - "table": "test_seller_type_dim", + "table": "EDW.test_seller_type_dim", "join": { "type": "inner", "primary_key": [ diff --git a/examples/test_case_data/localmeta/table/DEFAULT.TEST_CATEGORY_GROUPINGS.json b/examples/test_case_data/localmeta/table/DEFAULT.TEST_CATEGORY_GROUPINGS.json new file mode 100644 index 0000000..7bcd092 --- /dev/null +++ b/examples/test_case_data/localmeta/table/DEFAULT.TEST_CATEGORY_GROUPINGS.json @@ -0,0 +1,151 @@ +{ + "uuid" : "952d11b5-69d9-45d1-92af-227489485e3f", + "name" : "TEST_CATEGORY_GROUPINGS", + "columns" : [ { + "id" : "1", + "name" : "LEAF_CATEG_ID", + "datatype" : "bigint" + }, { + "id" : "2", + "name" : "LEAF_CATEG_NAME", + "datatype" : "string" + }, { + "id" : "3", + "name" : "SITE_ID", + "datatype" : "int" + }, { + "id" : "4", + "name" : "CATEG_BUSN_MGR", + "datatype" : "string" + }, { + "id" : "5", + "name" : "CATEG_BUSN_UNIT", + "datatype" : "string" + }, { + "id" : "6", + "name" : "REGN_CATEG", + "datatype" : "string" + }, { + "id" : "7", + "name" : "USER_DEFINED_FIELD1", + "datatype" : "string" + }, { + "id" : "8", + "name" : "USER_DEFINED_FIELD3", + "datatype" : "string" + }, { + "id" : "9", + "name" : "CRE_DATE", + "datatype" : "string" + }, { + "id" : "10", + "name" : "UPD_DATE", + "datatype" : "string" + }, { + "id" : "11", + "name" : "CRE_USER", + "datatype" : "string" + }, { + "id" : "12", + "name" : "UPD_USER", + "datatype" : "string" + }, { + "id" : "13", + "name" : "META_CATEG_ID", + "datatype" : "decimal" + }, { + "id" : "14", + "name" : "META_CATEG_NAME", + "datatype" : "string" + }, { + "id" : "15", + "name" : "CATEG_LVL2_ID", + "datatype" : "decimal" + }, { + "id" : "16", + "name" : "CATEG_LVL3_ID", + "datatype" : "decimal" + }, { + "id" : "17", + "name" : "CATEG_LVL4_ID", + "datatype" : "decimal" + }, { + "id" : "18", + "name" : "CATEG_LVL5_ID", + "datatype" : "decimal" + }, { + "id" : "19", + "name" : "CATEG_LVL6_ID", + "datatype" : "decimal" + }, { + "id" : "20", + "name" : "CATEG_LVL7_ID", + "datatype" : "decimal" + }, { + "id" : "21", + "name" : "CATEG_LVL2_NAME", + "datatype" : "string" + }, { + "id" : "22", + "name" : "CATEG_LVL3_NAME", + "datatype" : "string" + }, { + "id" : "23", + "name" : "CATEG_LVL4_NAME", + "datatype" : "string" + }, { + "id" : "24", + "name" : "CATEG_LVL5_NAME", + "datatype" : "string" + }, { + "id" : "25", + "name" : "CATEG_LVL6_NAME", + "datatype" : "string" + }, { + "id" : "26", + "name" : "CATEG_LVL7_NAME", + "datatype" : "string" + }, { + "id" : "27", + "name" : "CATEG_FLAGS", + "datatype" : "decimal" + }, { + "id" : "28", + "name" : "ADULT_CATEG_YN", + "datatype" : "string" + }, { + "id" : "29", + "name" : "DOMAIN_ID", + "datatype" : "decimal" + }, { + "id" : "30", + "name" : "USER_DEFINED_FIELD5", + "datatype" : "string" + }, { + "id" : "31", + "name" : "VCS_ID", + "datatype" : "decimal" + }, { + "id" : "32", + "name" : "GCS_ID", + "datatype" : "decimal" + }, { + "id" : "33", + "name" : "MOVE_TO", + "datatype" : "decimal" + }, { + "id" : "34", + "name" : "SAP_CATEGORY_ID", + "datatype" : "decimal" + }, { + "id" : "35", + "name" : "SRC_ID", + "datatype" : "tinyint" + }, { + "id" : "36", + "name" : "BSNS_VRTCL_NAME", + "datatype" : "string" + } ], + "database" : "DEFAULT", + "last_modified" : 0 +} \ No newline at end of file diff --git a/examples/test_case_data/localmeta/table/DEFAULT.TEST_KYLIN_FACT.json b/examples/test_case_data/localmeta/table/DEFAULT.TEST_KYLIN_FACT.json new file mode 100644 index 0000000..732351a --- /dev/null +++ b/examples/test_case_data/localmeta/table/DEFAULT.TEST_KYLIN_FACT.json @@ -0,0 +1,43 @@ +{ + "uuid" : "e286e39e-40d7-44c2-8fa2-41b365522771", + "name" : "TEST_KYLIN_FACT", + "columns" : [ { + "id" : "1", + "name" : "TRANS_ID", + "datatype" : "bigint" + }, { + "id" : "2", + "name" : "CAL_DT", + "datatype" : "date" + }, { + "id" : "3", + "name" : "LSTG_FORMAT_NAME", + "datatype" : "string" + }, { + "id" : "4", + "name" : "LEAF_CATEG_ID", + "datatype" : "bigint" + }, { + "id" : "5", + "name" : "LSTG_SITE_ID", + "datatype" : "int" + }, { + "id" : "6", + "name" : "SLR_SEGMENT_CD", + "datatype" : "smallint" + }, { + "id" : "7", + "name" : "PRICE", + "datatype" : "decimal(18,6)" + }, { + "id" : "8", + "name" : "ITEM_COUNT", + "datatype" : "bigint" + }, { + "id" : "9", + "name" : "SELLER_ID", + "datatype" : "bigint" + } ], + "database" : "DEFAULT", + "last_modified" : 0 +} \ No newline at end of file diff --git a/examples/test_case_data/localmeta/table/EDW.TEST_CAL_DT.json b/examples/test_case_data/localmeta/table/EDW.TEST_CAL_DT.json new file mode 100644 index 0000000..0ad7ee1 --- /dev/null +++ b/examples/test_case_data/localmeta/table/EDW.TEST_CAL_DT.json @@ -0,0 +1,407 @@ +{ + "uuid" : "0ff420eb-79ad-40bd-bca9-12d8cd05c60a", + "name" : "TEST_CAL_DT", + "columns" : [ { + "id" : "1", + "name" : "CAL_DT", + "datatype" : "date" + }, { + "id" : "2", + "name" : "YEAR_BEG_DT", + "datatype" : "date" + }, { + "id" : "3", + "name" : "QTR_BEG_DT", + "datatype" : "date" + }, { + "id" : "4", + "name" : "MONTH_BEG_DT", + "datatype" : "date" + }, { + "id" : "5", + "name" : "WEEK_BEG_DT", + "datatype" : "date" + }, { + "id" : "6", + "name" : "AGE_FOR_YEAR_ID", + "datatype" : "smallint" + }, { + "id" : "7", + "name" : "AGE_FOR_QTR_ID", + "datatype" : "smallint" + }, { + "id" : "8", + "name" : "AGE_FOR_MONTH_ID", + "datatype" : "smallint" + }, { + "id" : "9", + "name" : "AGE_FOR_WEEK_ID", + "datatype" : "smallint" + }, { + "id" : "10", + "name" : "AGE_FOR_DT_ID", + "datatype" : "smallint" + }, { + "id" : "11", + "name" : "AGE_FOR_RTL_YEAR_ID", + "datatype" : "smallint" + }, { + "id" : "12", + "name" : "AGE_FOR_RTL_QTR_ID", + "datatype" : "smallint" + }, { + "id" : "13", + "name" : "AGE_FOR_RTL_MONTH_ID", + "datatype" : "smallint" + }, { + "id" : "14", + "name" : "AGE_FOR_RTL_WEEK_ID", + "datatype" : "smallint" + }, { + "id" : "15", + "name" : "AGE_FOR_CS_WEEK_ID", + "datatype" : "smallint" + }, { + "id" : "16", + "name" : "DAY_OF_CAL_ID", + "datatype" : "int" + }, { + "id" : "17", + "name" : "DAY_OF_YEAR_ID", + "datatype" : "smallint" + }, { + "id" : "18", + "name" : "DAY_OF_QTR_ID", + "datatype" : "smallint" + }, { + "id" : "19", + "name" : "DAY_OF_MONTH_ID", + "datatype" : "smallint" + }, { + "id" : "20", + "name" : "DAY_OF_WEEK_ID", + "datatype" : "int" + }, { + "id" : "21", + "name" : "WEEK_OF_YEAR_ID", + "datatype" : "tinyint" + }, { + "id" : "22", + "name" : "WEEK_OF_CAL_ID", + "datatype" : "int" + }, { + "id" : "23", + "name" : "MONTH_OF_QTR_ID", + "datatype" : "tinyint" + }, { + "id" : "24", + "name" : "MONTH_OF_YEAR_ID", + "datatype" : "tinyint" + }, { + "id" : "25", + "name" : "MONTH_OF_CAL_ID", + "datatype" : "smallint" + }, { + "id" : "26", + "name" : "QTR_OF_YEAR_ID", + "datatype" : "tinyint" + }, { + "id" : "27", + "name" : "QTR_OF_CAL_ID", + "datatype" : "smallint" + }, { + "id" : "28", + "name" : "YEAR_OF_CAL_ID", + "datatype" : "smallint" + }, { + "id" : "29", + "name" : "YEAR_END_DT", + "datatype" : "string" + }, { + "id" : "30", + "name" : "QTR_END_DT", + "datatype" : "string" + }, { + "id" : "31", + "name" : "MONTH_END_DT", + "datatype" : "string" + }, { + "id" : "32", + "name" : "WEEK_END_DT", + "datatype" : "string" + }, { + "id" : "33", + "name" : "CAL_DT_NAME", + "datatype" : "string" + }, { + "id" : "34", + "name" : "CAL_DT_DESC", + "datatype" : "string" + }, { + "id" : "35", + "name" : "CAL_DT_SHORT_NAME", + "datatype" : "string" + }, { + "id" : "36", + "name" : "YTD_YN_ID", + "datatype" : "tinyint" + }, { + "id" : "37", + "name" : "QTD_YN_ID", + "datatype" : "tinyint" + }, { + "id" : "38", + "name" : "MTD_YN_ID", + "datatype" : "tinyint" + }, { + "id" : "39", + "name" : "WTD_YN_ID", + "datatype" : "tinyint" + }, { + "id" : "40", + "name" : "SEASON_BEG_DT", + "datatype" : "string" + }, { + "id" : "41", + "name" : "DAY_IN_YEAR_COUNT", + "datatype" : "smallint" + }, { + "id" : "42", + "name" : "DAY_IN_QTR_COUNT", + "datatype" : "tinyint" + }, { + "id" : "43", + "name" : "DAY_IN_MONTH_COUNT", + "datatype" : "tinyint" + }, { + "id" : "44", + "name" : "DAY_IN_WEEK_COUNT", + "datatype" : "tinyint" + }, { + "id" : "45", + "name" : "RTL_YEAR_BEG_DT", + "datatype" : "string" + }, { + "id" : "46", + "name" : "RTL_QTR_BEG_DT", + "datatype" : "string" + }, { + "id" : "47", + "name" : "RTL_MONTH_BEG_DT", + "datatype" : "string" + }, { + "id" : "48", + "name" : "RTL_WEEK_BEG_DT", + "datatype" : "string" + }, { + "id" : "49", + "name" : "CS_WEEK_BEG_DT", + "datatype" : "string" + }, { + "id" : "50", + "name" : "CAL_DATE", + "datatype" : "string" + }, { + "id" : "51", + "name" : "DAY_OF_WEEK", + "datatype" : "string" + }, { + "id" : "52", + "name" : "MONTH_ID", + "datatype" : "string" + }, { + "id" : "53", + "name" : "PRD_DESC", + "datatype" : "string" + }, { + "id" : "54", + "name" : "PRD_FLAG", + "datatype" : "string" + }, { + "id" : "55", + "name" : "PRD_ID", + "datatype" : "string" + }, { + "id" : "56", + "name" : "PRD_IND", + "datatype" : "string" + }, { + "id" : "57", + "name" : "QTR_DESC", + "datatype" : "string" + }, { + "id" : "58", + "name" : "QTR_ID", + "datatype" : "string" + }, { + "id" : "59", + "name" : "QTR_IND", + "datatype" : "string" + }, { + "id" : "60", + "name" : "RETAIL_WEEK", + "datatype" : "string" + }, { + "id" : "61", + "name" : "RETAIL_YEAR", + "datatype" : "string" + }, { + "id" : "62", + "name" : "RETAIL_START_DATE", + "datatype" : "string" + }, { + "id" : "63", + "name" : "RETAIL_WK_END_DATE", + "datatype" : "string" + }, { + "id" : "64", + "name" : "WEEK_IND", + "datatype" : "string" + }, { + "id" : "65", + "name" : "WEEK_NUM_DESC", + "datatype" : "string" + }, { + "id" : "66", + "name" : "WEEK_BEG_DATE", + "datatype" : "string" + }, { + "id" : "67", + "name" : "WEEK_END_DATE", + "datatype" : "string" + }, { + "id" : "68", + "name" : "WEEK_IN_YEAR_ID", + "datatype" : "string" + }, { + "id" : "69", + "name" : "WEEK_ID", + "datatype" : "string" + }, { + "id" : "70", + "name" : "WEEK_BEG_END_DESC_MDY", + "datatype" : "string" + }, { + "id" : "71", + "name" : "WEEK_BEG_END_DESC_MD", + "datatype" : "string" + }, { + "id" : "72", + "name" : "YEAR_ID", + "datatype" : "string" + }, { + "id" : "73", + "name" : "YEAR_IND", + "datatype" : "string" + }, { + "id" : "74", + "name" : "CAL_DT_MNS_1YEAR_DT", + "datatype" : "string" + }, { + "id" : "75", + "name" : "CAL_DT_MNS_2YEAR_DT", + "datatype" : "string" + }, { + "id" : "76", + "name" : "CAL_DT_MNS_1QTR_DT", + "datatype" : "string" + }, { + "id" : "77", + "name" : "CAL_DT_MNS_2QTR_DT", + "datatype" : "string" + }, { + "id" : "78", + "name" : "CAL_DT_MNS_1MONTH_DT", + "datatype" : "string" + }, { + "id" : "79", + "name" : "CAL_DT_MNS_2MONTH_DT", + "datatype" : "string" + }, { + "id" : "80", + "name" : "CAL_DT_MNS_1WEEK_DT", + "datatype" : "string" + }, { + "id" : "81", + "name" : "CAL_DT_MNS_2WEEK_DT", + "datatype" : "string" + }, { + "id" : "82", + "name" : "CURR_CAL_DT_MNS_1YEAR_YN_ID", + "datatype" : "tinyint" + }, { + "id" : "83", + "name" : "CURR_CAL_DT_MNS_2YEAR_YN_ID", + "datatype" : "tinyint" + }, { + "id" : "84", + "name" : "CURR_CAL_DT_MNS_1QTR_YN_ID", + "datatype" : "tinyint" + }, { + "id" : "85", + "name" : "CURR_CAL_DT_MNS_2QTR_YN_ID", + "datatype" : "tinyint" + }, { + "id" : "86", + "name" : "CURR_CAL_DT_MNS_1MONTH_YN_ID", + "datatype" : "tinyint" + }, { + "id" : "87", + "name" : "CURR_CAL_DT_MNS_2MONTH_YN_ID", + "datatype" : "tinyint" + }, { + "id" : "88", + "name" : "CURR_CAL_DT_MNS_1WEEK_YN_IND", + "datatype" : "tinyint" + }, { + "id" : "89", + "name" : "CURR_CAL_DT_MNS_2WEEK_YN_IND", + "datatype" : "tinyint" + }, { + "id" : "90", + "name" : "RTL_MONTH_OF_RTL_YEAR_ID", + "datatype" : "string" + }, { + "id" : "91", + "name" : "RTL_QTR_OF_RTL_YEAR_ID", + "datatype" : "tinyint" + }, { + "id" : "92", + "name" : "RTL_WEEK_OF_RTL_YEAR_ID", + "datatype" : "tinyint" + }, { + "id" : "93", + "name" : "SEASON_OF_YEAR_ID", + "datatype" : "tinyint" + }, { + "id" : "94", + "name" : "YTM_YN_ID", + "datatype" : "tinyint" + }, { + "id" : "95", + "name" : "YTQ_YN_ID", + "datatype" : "tinyint" + }, { + "id" : "96", + "name" : "YTW_YN_ID", + "datatype" : "tinyint" + }, { + "id" : "97", + "name" : "CRE_DATE", + "datatype" : "string" + }, { + "id" : "98", + "name" : "CRE_USER", + "datatype" : "string" + }, { + "id" : "99", + "name" : "UPD_DATE", + "datatype" : "string" + }, { + "id" : "100", + "name" : "UPD_USER", + "datatype" : "string" + } ], + "database" : "edw", + "last_modified" : 0 +} \ No newline at end of file diff --git a/examples/test_case_data/localmeta/table/EDW.TEST_SELLER_TYPE_DIM.json b/examples/test_case_data/localmeta/table/EDW.TEST_SELLER_TYPE_DIM.json new file mode 100644 index 0000000..42f4d9c --- /dev/null +++ b/examples/test_case_data/localmeta/table/EDW.TEST_SELLER_TYPE_DIM.json @@ -0,0 +1,43 @@ +{ + "uuid" : "9ecc90c4-55df-436f-8602-2fbd4bca72e1", + "name" : "TEST_SELLER_TYPE_DIM", + "columns" : [ { + "id" : "1", + "name" : "SELLER_TYPE_CD", + "datatype" : "smallint" + }, { + "id" : "2", + "name" : "SELLER_TYPE_DESC", + "datatype" : "string" + }, { + "id" : "3", + "name" : "GLBL_RPRT_SLR_SGMNT_CD", + "datatype" : "tinyint" + }, { + "id" : "4", + "name" : "SELLER_GROUP_CD", + "datatype" : "tinyint" + }, { + "id" : "5", + "name" : "SELLER_GROUP_DESC", + "datatype" : "string" + }, { + "id" : "6", + "name" : "CRE_DATE", + "datatype" : "string" + }, { + "id" : "7", + "name" : "CRE_USER", + "datatype" : "string" + }, { + "id" : "8", + "name" : "UPD_DATE", + "datatype" : "string" + }, { + "id" : "9", + "name" : "UPD_USER", + "datatype" : "string" + } ], + "database" : "edw", + "last_modified" : 0 +} \ No newline at end of file diff --git a/examples/test_case_data/localmeta/table/EDW.TEST_SITES.json b/examples/test_case_data/localmeta/table/EDW.TEST_SITES.json new file mode 100644 index 0000000..d451e34 --- /dev/null +++ b/examples/test_case_data/localmeta/table/EDW.TEST_SITES.json @@ -0,0 +1,47 @@ +{ + "uuid" : "338a3325-a947-46d1-9ece-e079b3b8d4a6", + "name" : "TEST_SITES", + "columns" : [ { + "id" : "1", + "name" : "SITE_ID", + "datatype" : "int" + }, { + "id" : "2", + "name" : "SITE_NAME", + "datatype" : "string" + }, { + "id" : "3", + "name" : "SITE_DOMAIN_CODE", + "datatype" : "string" + }, { + "id" : "4", + "name" : "DFAULT_LSTG_CURNCY", + "datatype" : "int" + }, { + "id" : "5", + "name" : "EOA_EMAIL_CSTMZBL_SITE_YN_ID", + "datatype" : "tinyint" + }, { + "id" : "6", + "name" : "SITE_CNTRY_ID", + "datatype" : "int" + }, { + "id" : "7", + "name" : "CRE_DATE", + "datatype" : "string" + }, { + "id" : "8", + "name" : "UPD_DATE", + "datatype" : "string" + }, { + "id" : "9", + "name" : "CRE_USER", + "datatype" : "string" + }, { + "id" : "10", + "name" : "UPD_USER", + "datatype" : "string" + } ], + "database" : "edw", + "last_modified" : 0 +} \ No newline at end of file diff --git a/examples/test_case_data/localmeta/table/TEST_CAL_DT.json b/examples/test_case_data/localmeta/table/TEST_CAL_DT.json deleted file mode 100644 index 0ad7ee1..0000000 --- a/examples/test_case_data/localmeta/table/TEST_CAL_DT.json +++ /dev/null @@ -1,407 +0,0 @@ -{ - "uuid" : "0ff420eb-79ad-40bd-bca9-12d8cd05c60a", - "name" : "TEST_CAL_DT", - "columns" : [ { - "id" : "1", - "name" : "CAL_DT", - "datatype" : "date" - }, { - "id" : "2", - "name" : "YEAR_BEG_DT", - "datatype" : "date" - }, { - "id" : "3", - "name" : "QTR_BEG_DT", - "datatype" : "date" - }, { - "id" : "4", - "name" : "MONTH_BEG_DT", - "datatype" : "date" - }, { - "id" : "5", - "name" : "WEEK_BEG_DT", - "datatype" : "date" - }, { - "id" : "6", - "name" : "AGE_FOR_YEAR_ID", - "datatype" : "smallint" - }, { - "id" : "7", - "name" : "AGE_FOR_QTR_ID", - "datatype" : "smallint" - }, { - "id" : "8", - "name" : "AGE_FOR_MONTH_ID", - "datatype" : "smallint" - }, { - "id" : "9", - "name" : "AGE_FOR_WEEK_ID", - "datatype" : "smallint" - }, { - "id" : "10", - "name" : "AGE_FOR_DT_ID", - "datatype" : "smallint" - }, { - "id" : "11", - "name" : "AGE_FOR_RTL_YEAR_ID", - "datatype" : "smallint" - }, { - "id" : "12", - "name" : "AGE_FOR_RTL_QTR_ID", - "datatype" : "smallint" - }, { - "id" : "13", - "name" : "AGE_FOR_RTL_MONTH_ID", - "datatype" : "smallint" - }, { - "id" : "14", - "name" : "AGE_FOR_RTL_WEEK_ID", - "datatype" : "smallint" - }, { - "id" : "15", - "name" : "AGE_FOR_CS_WEEK_ID", - "datatype" : "smallint" - }, { - "id" : "16", - "name" : "DAY_OF_CAL_ID", - "datatype" : "int" - }, { - "id" : "17", - "name" : "DAY_OF_YEAR_ID", - "datatype" : "smallint" - }, { - "id" : "18", - "name" : "DAY_OF_QTR_ID", - "datatype" : "smallint" - }, { - "id" : "19", - "name" : "DAY_OF_MONTH_ID", - "datatype" : "smallint" - }, { - "id" : "20", - "name" : "DAY_OF_WEEK_ID", - "datatype" : "int" - }, { - "id" : "21", - "name" : "WEEK_OF_YEAR_ID", - "datatype" : "tinyint" - }, { - "id" : "22", - "name" : "WEEK_OF_CAL_ID", - "datatype" : "int" - }, { - "id" : "23", - "name" : "MONTH_OF_QTR_ID", - "datatype" : "tinyint" - }, { - "id" : "24", - "name" : "MONTH_OF_YEAR_ID", - "datatype" : "tinyint" - }, { - "id" : "25", - "name" : "MONTH_OF_CAL_ID", - "datatype" : "smallint" - }, { - "id" : "26", - "name" : "QTR_OF_YEAR_ID", - "datatype" : "tinyint" - }, { - "id" : "27", - "name" : "QTR_OF_CAL_ID", - "datatype" : "smallint" - }, { - "id" : "28", - "name" : "YEAR_OF_CAL_ID", - "datatype" : "smallint" - }, { - "id" : "29", - "name" : "YEAR_END_DT", - "datatype" : "string" - }, { - "id" : "30", - "name" : "QTR_END_DT", - "datatype" : "string" - }, { - "id" : "31", - "name" : "MONTH_END_DT", - "datatype" : "string" - }, { - "id" : "32", - "name" : "WEEK_END_DT", - "datatype" : "string" - }, { - "id" : "33", - "name" : "CAL_DT_NAME", - "datatype" : "string" - }, { - "id" : "34", - "name" : "CAL_DT_DESC", - "datatype" : "string" - }, { - "id" : "35", - "name" : "CAL_DT_SHORT_NAME", - "datatype" : "string" - }, { - "id" : "36", - "name" : "YTD_YN_ID", - "datatype" : "tinyint" - }, { - "id" : "37", - "name" : "QTD_YN_ID", - "datatype" : "tinyint" - }, { - "id" : "38", - "name" : "MTD_YN_ID", - "datatype" : "tinyint" - }, { - "id" : "39", - "name" : "WTD_YN_ID", - "datatype" : "tinyint" - }, { - "id" : "40", - "name" : "SEASON_BEG_DT", - "datatype" : "string" - }, { - "id" : "41", - "name" : "DAY_IN_YEAR_COUNT", - "datatype" : "smallint" - }, { - "id" : "42", - "name" : "DAY_IN_QTR_COUNT", - "datatype" : "tinyint" - }, { - "id" : "43", - "name" : "DAY_IN_MONTH_COUNT", - "datatype" : "tinyint" - }, { - "id" : "44", - "name" : "DAY_IN_WEEK_COUNT", - "datatype" : "tinyint" - }, { - "id" : "45", - "name" : "RTL_YEAR_BEG_DT", - "datatype" : "string" - }, { - "id" : "46", - "name" : "RTL_QTR_BEG_DT", - "datatype" : "string" - }, { - "id" : "47", - "name" : "RTL_MONTH_BEG_DT", - "datatype" : "string" - }, { - "id" : "48", - "name" : "RTL_WEEK_BEG_DT", - "datatype" : "string" - }, { - "id" : "49", - "name" : "CS_WEEK_BEG_DT", - "datatype" : "string" - }, { - "id" : "50", - "name" : "CAL_DATE", - "datatype" : "string" - }, { - "id" : "51", - "name" : "DAY_OF_WEEK", - "datatype" : "string" - }, { - "id" : "52", - "name" : "MONTH_ID", - "datatype" : "string" - }, { - "id" : "53", - "name" : "PRD_DESC", - "datatype" : "string" - }, { - "id" : "54", - "name" : "PRD_FLAG", - "datatype" : "string" - }, { - "id" : "55", - "name" : "PRD_ID", - "datatype" : "string" - }, { - "id" : "56", - "name" : "PRD_IND", - "datatype" : "string" - }, { - "id" : "57", - "name" : "QTR_DESC", - "datatype" : "string" - }, { - "id" : "58", - "name" : "QTR_ID", - "datatype" : "string" - }, { - "id" : "59", - "name" : "QTR_IND", - "datatype" : "string" - }, { - "id" : "60", - "name" : "RETAIL_WEEK", - "datatype" : "string" - }, { - "id" : "61", - "name" : "RETAIL_YEAR", - "datatype" : "string" - }, { - "id" : "62", - "name" : "RETAIL_START_DATE", - "datatype" : "string" - }, { - "id" : "63", - "name" : "RETAIL_WK_END_DATE", - "datatype" : "string" - }, { - "id" : "64", - "name" : "WEEK_IND", - "datatype" : "string" - }, { - "id" : "65", - "name" : "WEEK_NUM_DESC", - "datatype" : "string" - }, { - "id" : "66", - "name" : "WEEK_BEG_DATE", - "datatype" : "string" - }, { - "id" : "67", - "name" : "WEEK_END_DATE", - "datatype" : "string" - }, { - "id" : "68", - "name" : "WEEK_IN_YEAR_ID", - "datatype" : "string" - }, { - "id" : "69", - "name" : "WEEK_ID", - "datatype" : "string" - }, { - "id" : "70", - "name" : "WEEK_BEG_END_DESC_MDY", - "datatype" : "string" - }, { - "id" : "71", - "name" : "WEEK_BEG_END_DESC_MD", - "datatype" : "string" - }, { - "id" : "72", - "name" : "YEAR_ID", - "datatype" : "string" - }, { - "id" : "73", - "name" : "YEAR_IND", - "datatype" : "string" - }, { - "id" : "74", - "name" : "CAL_DT_MNS_1YEAR_DT", - "datatype" : "string" - }, { - "id" : "75", - "name" : "CAL_DT_MNS_2YEAR_DT", - "datatype" : "string" - }, { - "id" : "76", - "name" : "CAL_DT_MNS_1QTR_DT", - "datatype" : "string" - }, { - "id" : "77", - "name" : "CAL_DT_MNS_2QTR_DT", - "datatype" : "string" - }, { - "id" : "78", - "name" : "CAL_DT_MNS_1MONTH_DT", - "datatype" : "string" - }, { - "id" : "79", - "name" : "CAL_DT_MNS_2MONTH_DT", - "datatype" : "string" - }, { - "id" : "80", - "name" : "CAL_DT_MNS_1WEEK_DT", - "datatype" : "string" - }, { - "id" : "81", - "name" : "CAL_DT_MNS_2WEEK_DT", - "datatype" : "string" - }, { - "id" : "82", - "name" : "CURR_CAL_DT_MNS_1YEAR_YN_ID", - "datatype" : "tinyint" - }, { - "id" : "83", - "name" : "CURR_CAL_DT_MNS_2YEAR_YN_ID", - "datatype" : "tinyint" - }, { - "id" : "84", - "name" : "CURR_CAL_DT_MNS_1QTR_YN_ID", - "datatype" : "tinyint" - }, { - "id" : "85", - "name" : "CURR_CAL_DT_MNS_2QTR_YN_ID", - "datatype" : "tinyint" - }, { - "id" : "86", - "name" : "CURR_CAL_DT_MNS_1MONTH_YN_ID", - "datatype" : "tinyint" - }, { - "id" : "87", - "name" : "CURR_CAL_DT_MNS_2MONTH_YN_ID", - "datatype" : "tinyint" - }, { - "id" : "88", - "name" : "CURR_CAL_DT_MNS_1WEEK_YN_IND", - "datatype" : "tinyint" - }, { - "id" : "89", - "name" : "CURR_CAL_DT_MNS_2WEEK_YN_IND", - "datatype" : "tinyint" - }, { - "id" : "90", - "name" : "RTL_MONTH_OF_RTL_YEAR_ID", - "datatype" : "string" - }, { - "id" : "91", - "name" : "RTL_QTR_OF_RTL_YEAR_ID", - "datatype" : "tinyint" - }, { - "id" : "92", - "name" : "RTL_WEEK_OF_RTL_YEAR_ID", - "datatype" : "tinyint" - }, { - "id" : "93", - "name" : "SEASON_OF_YEAR_ID", - "datatype" : "tinyint" - }, { - "id" : "94", - "name" : "YTM_YN_ID", - "datatype" : "tinyint" - }, { - "id" : "95", - "name" : "YTQ_YN_ID", - "datatype" : "tinyint" - }, { - "id" : "96", - "name" : "YTW_YN_ID", - "datatype" : "tinyint" - }, { - "id" : "97", - "name" : "CRE_DATE", - "datatype" : "string" - }, { - "id" : "98", - "name" : "CRE_USER", - "datatype" : "string" - }, { - "id" : "99", - "name" : "UPD_DATE", - "datatype" : "string" - }, { - "id" : "100", - "name" : "UPD_USER", - "datatype" : "string" - } ], - "database" : "edw", - "last_modified" : 0 -} \ No newline at end of file diff --git a/examples/test_case_data/localmeta/table/TEST_CATEGORY_GROUPINGS.json b/examples/test_case_data/localmeta/table/TEST_CATEGORY_GROUPINGS.json deleted file mode 100644 index 7bcd092..0000000 --- a/examples/test_case_data/localmeta/table/TEST_CATEGORY_GROUPINGS.json +++ /dev/null @@ -1,151 +0,0 @@ -{ - "uuid" : "952d11b5-69d9-45d1-92af-227489485e3f", - "name" : "TEST_CATEGORY_GROUPINGS", - "columns" : [ { - "id" : "1", - "name" : "LEAF_CATEG_ID", - "datatype" : "bigint" - }, { - "id" : "2", - "name" : "LEAF_CATEG_NAME", - "datatype" : "string" - }, { - "id" : "3", - "name" : "SITE_ID", - "datatype" : "int" - }, { - "id" : "4", - "name" : "CATEG_BUSN_MGR", - "datatype" : "string" - }, { - "id" : "5", - "name" : "CATEG_BUSN_UNIT", - "datatype" : "string" - }, { - "id" : "6", - "name" : "REGN_CATEG", - "datatype" : "string" - }, { - "id" : "7", - "name" : "USER_DEFINED_FIELD1", - "datatype" : "string" - }, { - "id" : "8", - "name" : "USER_DEFINED_FIELD3", - "datatype" : "string" - }, { - "id" : "9", - "name" : "CRE_DATE", - "datatype" : "string" - }, { - "id" : "10", - "name" : "UPD_DATE", - "datatype" : "string" - }, { - "id" : "11", - "name" : "CRE_USER", - "datatype" : "string" - }, { - "id" : "12", - "name" : "UPD_USER", - "datatype" : "string" - }, { - "id" : "13", - "name" : "META_CATEG_ID", - "datatype" : "decimal" - }, { - "id" : "14", - "name" : "META_CATEG_NAME", - "datatype" : "string" - }, { - "id" : "15", - "name" : "CATEG_LVL2_ID", - "datatype" : "decimal" - }, { - "id" : "16", - "name" : "CATEG_LVL3_ID", - "datatype" : "decimal" - }, { - "id" : "17", - "name" : "CATEG_LVL4_ID", - "datatype" : "decimal" - }, { - "id" : "18", - "name" : "CATEG_LVL5_ID", - "datatype" : "decimal" - }, { - "id" : "19", - "name" : "CATEG_LVL6_ID", - "datatype" : "decimal" - }, { - "id" : "20", - "name" : "CATEG_LVL7_ID", - "datatype" : "decimal" - }, { - "id" : "21", - "name" : "CATEG_LVL2_NAME", - "datatype" : "string" - }, { - "id" : "22", - "name" : "CATEG_LVL3_NAME", - "datatype" : "string" - }, { - "id" : "23", - "name" : "CATEG_LVL4_NAME", - "datatype" : "string" - }, { - "id" : "24", - "name" : "CATEG_LVL5_NAME", - "datatype" : "string" - }, { - "id" : "25", - "name" : "CATEG_LVL6_NAME", - "datatype" : "string" - }, { - "id" : "26", - "name" : "CATEG_LVL7_NAME", - "datatype" : "string" - }, { - "id" : "27", - "name" : "CATEG_FLAGS", - "datatype" : "decimal" - }, { - "id" : "28", - "name" : "ADULT_CATEG_YN", - "datatype" : "string" - }, { - "id" : "29", - "name" : "DOMAIN_ID", - "datatype" : "decimal" - }, { - "id" : "30", - "name" : "USER_DEFINED_FIELD5", - "datatype" : "string" - }, { - "id" : "31", - "name" : "VCS_ID", - "datatype" : "decimal" - }, { - "id" : "32", - "name" : "GCS_ID", - "datatype" : "decimal" - }, { - "id" : "33", - "name" : "MOVE_TO", - "datatype" : "decimal" - }, { - "id" : "34", - "name" : "SAP_CATEGORY_ID", - "datatype" : "decimal" - }, { - "id" : "35", - "name" : "SRC_ID", - "datatype" : "tinyint" - }, { - "id" : "36", - "name" : "BSNS_VRTCL_NAME", - "datatype" : "string" - } ], - "database" : "DEFAULT", - "last_modified" : 0 -} \ No newline at end of file diff --git a/examples/test_case_data/localmeta/table/TEST_KYLIN_FACT.json b/examples/test_case_data/localmeta/table/TEST_KYLIN_FACT.json deleted file mode 100644 index 732351a..0000000 --- a/examples/test_case_data/localmeta/table/TEST_KYLIN_FACT.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "uuid" : "e286e39e-40d7-44c2-8fa2-41b365522771", - "name" : "TEST_KYLIN_FACT", - "columns" : [ { - "id" : "1", - "name" : "TRANS_ID", - "datatype" : "bigint" - }, { - "id" : "2", - "name" : "CAL_DT", - "datatype" : "date" - }, { - "id" : "3", - "name" : "LSTG_FORMAT_NAME", - "datatype" : "string" - }, { - "id" : "4", - "name" : "LEAF_CATEG_ID", - "datatype" : "bigint" - }, { - "id" : "5", - "name" : "LSTG_SITE_ID", - "datatype" : "int" - }, { - "id" : "6", - "name" : "SLR_SEGMENT_CD", - "datatype" : "smallint" - }, { - "id" : "7", - "name" : "PRICE", - "datatype" : "decimal(18,6)" - }, { - "id" : "8", - "name" : "ITEM_COUNT", - "datatype" : "bigint" - }, { - "id" : "9", - "name" : "SELLER_ID", - "datatype" : "bigint" - } ], - "database" : "DEFAULT", - "last_modified" : 0 -} \ No newline at end of file diff --git a/examples/test_case_data/localmeta/table/TEST_SELLER_TYPE_DIM.json b/examples/test_case_data/localmeta/table/TEST_SELLER_TYPE_DIM.json deleted file mode 100644 index 42f4d9c..0000000 --- a/examples/test_case_data/localmeta/table/TEST_SELLER_TYPE_DIM.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "uuid" : "9ecc90c4-55df-436f-8602-2fbd4bca72e1", - "name" : "TEST_SELLER_TYPE_DIM", - "columns" : [ { - "id" : "1", - "name" : "SELLER_TYPE_CD", - "datatype" : "smallint" - }, { - "id" : "2", - "name" : "SELLER_TYPE_DESC", - "datatype" : "string" - }, { - "id" : "3", - "name" : "GLBL_RPRT_SLR_SGMNT_CD", - "datatype" : "tinyint" - }, { - "id" : "4", - "name" : "SELLER_GROUP_CD", - "datatype" : "tinyint" - }, { - "id" : "5", - "name" : "SELLER_GROUP_DESC", - "datatype" : "string" - }, { - "id" : "6", - "name" : "CRE_DATE", - "datatype" : "string" - }, { - "id" : "7", - "name" : "CRE_USER", - "datatype" : "string" - }, { - "id" : "8", - "name" : "UPD_DATE", - "datatype" : "string" - }, { - "id" : "9", - "name" : "UPD_USER", - "datatype" : "string" - } ], - "database" : "edw", - "last_modified" : 0 -} \ No newline at end of file diff --git a/examples/test_case_data/localmeta/table/TEST_SITES.json b/examples/test_case_data/localmeta/table/TEST_SITES.json deleted file mode 100644 index d451e34..0000000 --- a/examples/test_case_data/localmeta/table/TEST_SITES.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "uuid" : "338a3325-a947-46d1-9ece-e079b3b8d4a6", - "name" : "TEST_SITES", - "columns" : [ { - "id" : "1", - "name" : "SITE_ID", - "datatype" : "int" - }, { - "id" : "2", - "name" : "SITE_NAME", - "datatype" : "string" - }, { - "id" : "3", - "name" : "SITE_DOMAIN_CODE", - "datatype" : "string" - }, { - "id" : "4", - "name" : "DFAULT_LSTG_CURNCY", - "datatype" : "int" - }, { - "id" : "5", - "name" : "EOA_EMAIL_CSTMZBL_SITE_YN_ID", - "datatype" : "tinyint" - }, { - "id" : "6", - "name" : "SITE_CNTRY_ID", - "datatype" : "int" - }, { - "id" : "7", - "name" : "CRE_DATE", - "datatype" : "string" - }, { - "id" : "8", - "name" : "UPD_DATE", - "datatype" : "string" - }, { - "id" : "9", - "name" : "CRE_USER", - "datatype" : "string" - }, { - "id" : "10", - "name" : "UPD_USER", - "datatype" : "string" - } ], - "database" : "edw", - "last_modified" : 0 -} \ No newline at end of file diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java index b0f06ad..af4909d 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java @@ -85,7 +85,6 @@ public TblColRef findPKByFK(TblColRef fk) { public void init(Map tables) { this.errors.clear(); - this.factTable = factTable.toUpperCase(); initJoinColumns(tables); } @@ -95,7 +94,7 @@ private void initJoinColumns(Map tables) { // initDimensionColumns() will do the update for (LookupDesc lookup : this.lookups) { lookup.setTable(lookup.getTable().toUpperCase()); - TableDesc dimTable = tables.get(lookup.getTable()); + TableDesc dimTable = tables.get(TableDesc.getTableIdentity(lookup.getTable())); JoinDesc join = lookup.getJoin(); if (join == null) @@ -117,7 +116,7 @@ private void initJoinColumns(Map tables) { } join.setPrimaryKeyColumns(pkCols); // foreign key - TableDesc factTable = tables.get(this.getFactTable()); + TableDesc factTable = tables.get(TableDesc.getTableIdentity(this.factTable)); if (factTable == null) { addError("Fact table does not exist:" + this.getFactTable()); } From 3764a6f1b04f2093f39f44f84fcb4c006ccdfe60 Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Thu, 4 Dec 2014 11:18:11 +0800 Subject: [PATCH 43/65] refactor test examples --- .../common/util/CaseInsensitiveStringMap.java | 87 +++ .../java/com/kylinolap/cube/model/CubeDesc.java | 7 +- .../com/kylinolap/cube/model/DimensionDesc.java | 8 +- .../java/com/kylinolap/cube/model/RowKeyDesc.java | 20 +- .../com/kylinolap/cube/project/ProjectManager.java | 4 +- .../localmeta/cube_desc/test_kylin_cube_ii.json | 68 -- .../cube_desc/test_kylin_cube_with_slr_desc.json | 14 +- .../test_kylin_cube_with_slr_left_join_desc.json | 16 +- .../test_kylin_cube_without_slr_desc.json | 10 +- ...test_kylin_cube_without_slr_left_join_desc.json | 12 +- .../data/DEFAULT.TEST_CATEGORY_GROUPINGS.csv | 144 ++++ .../localmeta/data/DEFAULT.TEST_KYLIN_FACT.csv | 402 +++++++++++ .../localmeta/data/EDW.TEST_CAL_DT.csv | 731 +++++++++++++++++++++ .../localmeta/data/EDW.TEST_SELLER_TYPE_DIM.csv | 8 + .../localmeta/data/EDW.TEST_SITES.csv | 262 ++++++++ .../test_case_data/localmeta/data/TEST_CAL_DT.csv | 731 --------------------- .../localmeta/data/TEST_CATEGORY_GROUPINGS.csv | 144 ---- .../localmeta/data/TEST_KYLIN_FACT.csv | 402 ----------- .../localmeta/data/TEST_SELLER_TYPE_DIM.csv | 8 - .../test_case_data/localmeta/data/TEST_SITES.csv | 262 -------- .../test/java/com/kylinolap/job/DeployUtil.java | 4 +- .../com/kylinolap/metadata/MetadataManager.java | 4 +- .../com/kylinolap/metadata/model/ColumnDesc.java | 2 +- .../kylinolap/metadata/model/DataModelDesc.java | 2 +- .../com/kylinolap/metadata/model/TableDesc.java | 4 + .../metadata/model/realization/TblColRef.java | 8 +- .../metadata/tool/HiveSourceTableLoader.java | 4 +- .../kylinolap/metadata/MetadataManagerTest.java | 2 +- .../com/kylinolap/query/schema/OLAPSchema.java | 2 +- .../java/com/kylinolap/query/schema/OLAPTable.java | 6 +- .../java/com/kylinolap/query/test/H2Database.java | 6 +- .../kylinolap/rest/controller/TableController.java | 2 +- 32 files changed, 1708 insertions(+), 1678 deletions(-) create mode 100644 common/src/main/java/com/kylinolap/common/util/CaseInsensitiveStringMap.java delete mode 100644 examples/test_case_data/localmeta/cube_desc/test_kylin_cube_ii.json create mode 100644 examples/test_case_data/localmeta/data/DEFAULT.TEST_CATEGORY_GROUPINGS.csv create mode 100644 examples/test_case_data/localmeta/data/DEFAULT.TEST_KYLIN_FACT.csv create mode 100644 examples/test_case_data/localmeta/data/EDW.TEST_CAL_DT.csv create mode 100644 examples/test_case_data/localmeta/data/EDW.TEST_SELLER_TYPE_DIM.csv create mode 100644 examples/test_case_data/localmeta/data/EDW.TEST_SITES.csv delete mode 100644 examples/test_case_data/localmeta/data/TEST_CAL_DT.csv delete mode 100644 examples/test_case_data/localmeta/data/TEST_CATEGORY_GROUPINGS.csv delete mode 100644 examples/test_case_data/localmeta/data/TEST_KYLIN_FACT.csv delete mode 100644 examples/test_case_data/localmeta/data/TEST_SELLER_TYPE_DIM.csv delete mode 100644 examples/test_case_data/localmeta/data/TEST_SITES.csv diff --git a/common/src/main/java/com/kylinolap/common/util/CaseInsensitiveStringMap.java b/common/src/main/java/com/kylinolap/common/util/CaseInsensitiveStringMap.java new file mode 100644 index 0000000..785fafe --- /dev/null +++ b/common/src/main/java/com/kylinolap/common/util/CaseInsensitiveStringMap.java @@ -0,0 +1,87 @@ +package com.kylinolap.common.util; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * Created by qianzhou on 12/3/14. + */ +public class CaseInsensitiveStringMap implements Map { + + private Map innerMap; + + public CaseInsensitiveStringMap(){ + this(new HashMap()); + } + public CaseInsensitiveStringMap(Map innerMap){ + this.innerMap = innerMap; + } + + + @Override + public int size() { + return innerMap.size(); + } + + @Override + public boolean isEmpty() { + return innerMap.isEmpty(); + } + + @Override + public boolean containsKey(Object key) { + return key != null?innerMap.containsKey(key.toString().toUpperCase()):false; + } + + @Override + public boolean containsValue(Object value) { + return value != null?innerMap.containsValue(value):false; + } + + @Override + public T get(Object key) { + return key != null?innerMap.get(key.toString().toUpperCase()):null; + } + + @Override + public T put(String key, T value) { + return key != null?innerMap.put(key.toString().toUpperCase(), value):null; + } + + @Override + public T remove(Object key) { + return key != null?innerMap.remove(key.toString().toUpperCase()):null; + } + + @Override + public void putAll(Map m) { + innerMap.putAll(m); + } + + @Override + public void clear() { + innerMap.clear(); + } + + @Override + public Set keySet() { + return innerMap.keySet(); + } + + @Override + public Collection values() { + return innerMap.values(); + } + + @Override + public Set> entrySet() { + return innerMap.entrySet(); + } + + @Override + public String toString() { + return this.innerMap.toString(); + } +} diff --git a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java index 688c605..9e6e39c 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java @@ -30,6 +30,7 @@ import java.util.Map.Entry; import java.util.Set; +import com.kylinolap.common.util.CaseInsensitiveStringMap; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.net.util.Base64; @@ -329,7 +330,7 @@ public void setDescription(String description) { } public String getFactTable() { - return model.getFactTable(); + return model.getFactTable().toUpperCase(); } public String[] getNullStrings() { @@ -447,7 +448,7 @@ public String calculateSignature() { } public Map buildColumnNameAbbreviation() { - Map r = new HashMap(); + Map r = new CaseInsensitiveStringMap(); for (TblColRef col : listDimensionColumnsExcludingDerived()) { r.put(col.getName(), col); } @@ -478,7 +479,7 @@ public void init(KylinConfig config, Map tables) { tableNames = new ArrayList(3); columnTableMap.put(colName, tableNames); } - tableNames.add(table.getName()); + tableNames.add(table.getIdentity()); } } diff --git a/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java b/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java index 47d8361..311b3e6 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java @@ -69,7 +69,11 @@ public boolean isHierarchyColumn(TblColRef col) { } public String getTable() { - return table.toUpperCase(); + if (database == null) { + return ("DEFAULT." + table).toUpperCase(); + } else { + return (database + "." + table).toUpperCase(); + } } public int getId() { @@ -199,7 +203,7 @@ public void init(CubeDesc cubeDesc, Map tables, Map colNameAbbr) { mandatoryColumnMask = 0; for (int i = 0; i < rowkeyColumns.length; i++) { - RowKeyColDesc col = rowkeyColumns[i]; - col.setColumn(col.getColumn().toUpperCase()); - col.setBitIndex(rowkeyColumns.length - i - 1); - col.setColRef(colNameAbbr.get(col.getColumn())); - if (col.getColRef() == null) - throw new IllegalArgumentException("Cannot find rowkey column " + col.getColumn() + " in cube " + cubeRef); + RowKeyColDesc rowKeyColDesc = rowkeyColumns[i]; + String column = rowKeyColDesc.getColumn(); + rowKeyColDesc.setColumn(column.toUpperCase()); + rowKeyColDesc.setBitIndex(rowkeyColumns.length - i - 1); + rowKeyColDesc.setColRef(colNameAbbr.get(column)); + if (rowKeyColDesc.getColRef() == null) { + throw new IllegalArgumentException("Cannot find rowkey column " + column + " in cube " + cubeRef); + } - columnMap.put(col.getColRef(), col); + columnMap.put(rowKeyColDesc.getColRef(), rowKeyColDesc); - if (col.isMandatory()) { - mandatoryColumnMask |= 1L << col.getBitIndex(); + if (rowKeyColDesc.isMandatory()) { + mandatoryColumnMask |= 1L << rowKeyColDesc.getBitIndex(); } } } diff --git a/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java b/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java index 2a9004e..979f773 100644 --- a/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java +++ b/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java @@ -198,7 +198,7 @@ public ProjectInstance updateTableToProject(String tables, String projectName) t List exposedTables = listExposedTables(projectName); for (TableDesc table : exposedTables) { - projectInstance.addTable(table.getName()); + projectInstance.addTable(table.getIdentity()); } saveResource(projectInstance); @@ -532,7 +532,7 @@ private void markExposedTableAndColumn(String project, String table, String colu if (t == null) { throw new IllegalStateException("No SourceTable found by name '" + table + "', ref by " + refObj); } - table = t.getName(); // ensures upper case + table = t.getIdentity(); // ensures upper case ProjectTable projTable = getProjectTable(project, table, true); diff --git a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_ii.json b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_ii.json deleted file mode 100644 index 87ad1b7..0000000 --- a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_ii.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "uuid" : "ac13878c-8767-4454-8aab-1007e274fa23", - "name" : "test_kylin_cube_ii", - "model_name" : "test_kylin_ii_model_desc", - "description" : null, - "dimensions" : [ { - "name" : "TRANS_ID", - "column" : ["TEST_KYLIN_FACT.TRANS_ID"], - "derived" : null - }, { - "name" : "CAL_DT", - "column" : ["TEST_CAL_DT.CAL_DT"], - "derived" : [ "CAL_DT", "WEEK_BEG_DT", "YEAR_BEG_DT", "QTR_BEG_DT", "MONTH_BEG_DT" ] - }, { - "name" : "LSTG_FORMAT_NAME", - "column" : ["TEST_KYLIN_FACT.LSTG_FORMAT_NAME"] - }, { - "name" : "LEAF_CATEG_ID", - "column" : ["TEST_CATEGORY_GROUPINGS.LEAF_CATEG_ID", "TEST_CATEGORY_GROUPINGS.SITE_ID"], - "derived" : [ "USER_DEFINED_FIELD1", "USER_DEFINED_FIELD3", "UPD_DATE", "UPD_USER" ] - }, { - "name" : "LSTG_SITE_ID", - "column" : ["TEST_SITES.SITE_ID"], - "derived" : [ "SITE_NAME", "CRE_USER" ] - }, { - "name" : "SLR_SEGMENT_CD", - "column" : ["TEST_SELLER_TYPE_DIM.SELLER_TYPE_CD"], - "derived" : [ "SELLER_TYPE_DESC" ] - }, { - "name" : "PRICE", - "column" : ["TEST_KYLIN_FACT.PRICE"], - "derived" : null - }, { - "name" : "ITEM_COUNT", - "column" : ["TEST_KYLIN_FACT.ITEM_COUNT"], - "derived" : null - }, { - "name" : "SELLER_ID", - "column" : ["TEST_KYLIN_FACT.SELLER_ID"], - "derived" : null - } ], - "measures" : null, - "rowkey":{ - "rowkey_columns": [ - { "column": "TRANS_ID", "dictionary": "string" }, - { "column": "CAL_DT", "dictionary": "date(yyyy-mm-dd)" }, - { "column": "LSTG_FORMAT_NAME", "dictionary": "string" }, - { "column": "LEAF_CATEG_ID", "dictionary": "string" }, - { "column": "LSTG_SITE_ID", "dictionary": "string" }, - { "column": "SLR_SEGMENT_CD", "dictionary": "string" }, - { "column": "PRICE", "dictionary": "string" }, - { "column": "ITEM_COUNT", "dictionary": "string" }, - { "column": "SELLER_ID", "dictionary": "string" } - ], - "aggregation_groups": null - }, - "signature" : null, - "capacity" : "MEDIUM", - "last_modified" : 1408328222841, - "filter_condition" : null, - "cube_partition_desc" : { - "partition_date_column" : null, - "partition_date_start" : 0, - "cube_partition_type" : "APPEND" - }, - "hbase_mapping" : null, - "notify_list" : null -} \ No newline at end of file diff --git a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json index 148c315..ce3c2bb 100644 --- a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json +++ b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json @@ -4,39 +4,39 @@ "model_name": "test_kylin_with_slr_model_desc", "filter_condition": null, "cube_partition_desc": { - "partition_date_column": "test_kylin_fact.cal_dt", + "partition_date_column": "default.test_kylin_fact.cal_dt", "partition_date_start": 0, "cube_partition_type": "APPEND" }, "dimensions": [ { "name": "cal_dt", - "column": ["test_cal_dt.cal_dt"], + "column": ["edw.test_cal_dt.cal_dt"], "derived": ["week_beg_dt"] }, { "name": "category", - "column": ["test_category_groupings.meta_categ_name", "test_category_groupings.categ_lvl2_name", "test_category_groupings.categ_lvl3_name"], + "column": ["default.test_category_groupings.meta_categ_name", "default.test_category_groupings.categ_lvl2_name", "default.test_category_groupings.categ_lvl3_name"], "derived": ["USER_DEFINED_FIELD1", "USER_DEFINED_FIELD3", "UPD_DATE", "UPD_USER"], "hierarchy": true }, { "name": "lstg_format_name", - "column": ["test_kylin_fact.lstg_format_name"] + "column": ["default.test_kylin_fact.lstg_format_name"] }, { "name": "site_id", - "column": ["test_sites.site_id"], + "column": ["edw.test_sites.site_id"], "derived": ["site_name", "cre_user"] }, { "name": "seller_type_cd", - "column": ["test_seller_type_dim.slr_segment_cd"], + "column": ["edw.test_seller_type_dim.slr_segment_cd"], "derived": ["seller_type_desc"] }, { "name": "seller_id", - "column": ["test_kylin_fact.seller_id"] + "column": ["default.test_kylin_fact.seller_id"] } ], "measures": [ diff --git a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_left_join_desc.json b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_left_join_desc.json index 2575f61..59a0f3e 100644 --- a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_left_join_desc.json +++ b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_left_join_desc.json @@ -3,7 +3,7 @@ "name": "test_kylin_cube_with_slr_left_join_desc", "model_name": "test_kylin_with_slr_left_join_model_desc", "cube_partition_desc": { - "partition_date_column": "test_kylin_fact.cal_dt", + "partition_date_column": "default.test_kylin_fact.cal_dt", "partition_date_start": 0, "cube_partition_type": "APPEND" }, @@ -11,36 +11,36 @@ "dimensions": [ { "name": "cal_dt", - "column": ["test_cal_dt.cal_dt"], + "column": ["edw.test_cal_dt.cal_dt"], "derived": ["week_beg_dt"] }, { "name": "category", - "column": ["test_category_groupings.meta_categ_name", "test_category_groupings.categ_lvl2_name", "test_category_groupings.categ_lvl3_name"], + "column": ["default.test_category_groupings.meta_categ_name", "default.test_category_groupings.categ_lvl2_name", "default.test_category_groupings.categ_lvl3_name"], "hierarchy": true }, { "name": "category_derived", - "column": ["test_category_groupings.leaf_categ_id", "test_category_groupings.site_id"], + "column": ["default.test_category_groupings.leaf_categ_id", "default.test_category_groupings.site_id"], "derived": ["USER_DEFINED_FIELD1", "USER_DEFINED_FIELD3", "UPD_DATE", "UPD_USER"] }, { "name": "lstg_format_name", - "column": ["test_kylin_fact.lstg_format_name"] + "column": ["default.test_kylin_fact.lstg_format_name"] }, { "name": "site_id", - "column": ["test_sites.site_id"], + "column": ["edw.test_sites.site_id"], "derived": ["site_name", "cre_user"] }, { "name": "seller_type_cd", - "column": ["test_seller_type_dim.seller_type_cd"], + "column": ["edw.test_seller_type_dim.seller_type_cd"], "derived": ["seller_type_desc"] }, { "name": "seller_id", - "column": ["test_kylin_fact.seller_id"] + "column": ["default.test_kylin_fact.seller_id"] } ], "measures": [ diff --git a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_desc.json b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_desc.json index 5716569..362127d 100644 --- a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_desc.json +++ b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_desc.json @@ -12,14 +12,14 @@ "dimensions": [ { "name": "cal_dt", - "column": ["test_cal_dt.cal_dt"], + "column": ["edw.test_cal_dt.cal_dt"], "derived": [ "week_beg_dt" ] }, { "name": "category", - "column": ["test_category_groupings.meta_categ_name", "test_category_groupings.categ_lvl2_name", "test_category_groupings.categ_lvl3_name"], + "column": ["default.test_category_groupings.meta_categ_name", "default.test_category_groupings.categ_lvl2_name", "default.test_category_groupings.categ_lvl3_name"], "derived": [ "USER_DEFINED_FIELD1", "USER_DEFINED_FIELD3", @@ -30,11 +30,11 @@ }, { "name": "lstg_format_name", - "column": ["test_kylin_fact.lstg_format_name"] + "column": ["default.test_kylin_fact.lstg_format_name"] }, { "name": "site_id", - "column": ["test_sites.site_id"], + "column": ["edw.test_sites.site_id"], "derived": [ "site_name", "cre_user" @@ -42,7 +42,7 @@ }, { "name": "seller_type_cd", - "column": ["test_seller_type_dim.seller_type_cd"], + "column": ["edw.test_seller_type_dim.seller_type_cd"], "derived": [ "seller_type_desc" ] diff --git a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_left_join_desc.json b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_left_join_desc.json index bab8c2c..d9e832e 100644 --- a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_left_join_desc.json +++ b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_left_join_desc.json @@ -3,21 +3,21 @@ "name": "test_kylin_cube_without_slr_left_join_desc", "model_name": "test_kylin_without_slr_left_join_model_desc", "cube_partition_desc": { - "partition_date_column": "test_kylin_fact.cal_dt", + "partition_date_column": "default.test_kylin_fact.cal_dt", "partition_date_start": 0, "cube_partition_type": "UPDATE_INSERT" }, "dimensions": [ { "name": "cal_dt", - "column": ["test_cal_dt.cal_dt"], + "column": ["edw.test_cal_dt.cal_dt"], "derived": [ "week_beg_dt" ] }, { "name": "category", - "column": ["test_category_groupings.meta_categ_name", "test_category_groupings.categ_lvl2_name", "test_category_groupings.categ_lvl3_name"], + "column": ["default.test_category_groupings.meta_categ_name", "default.test_category_groupings.categ_lvl2_name", "default.test_category_groupings.categ_lvl3_name"], "derived": [ "USER_DEFINED_FIELD1", "USER_DEFINED_FIELD3", @@ -28,11 +28,11 @@ }, { "name": "lstg_format_name", - "column": ["test_kylin_fact.lstg_format_name"] + "column": ["default.test_kylin_fact.lstg_format_name"] }, { "name": "site_id", - "column": ["test_sites.site_id"], + "column": ["edw.test_sites.site_id"], "derived": [ "site_name", "cre_user" @@ -40,7 +40,7 @@ }, { "name": "seller_type_cd", - "column": ["test_seller_type_dim.seller_type_cd"], + "column": ["edw.test_seller_type_dim.seller_type_cd"], "derived": [ "seller_type_desc" ] diff --git a/examples/test_case_data/localmeta/data/DEFAULT.TEST_CATEGORY_GROUPINGS.csv b/examples/test_case_data/localmeta/data/DEFAULT.TEST_CATEGORY_GROUPINGS.csv new file mode 100644 index 0000000..441bf62 --- /dev/null +++ b/examples/test_case_data/localmeta/data/DEFAULT.TEST_CATEGORY_GROUPINGS.csv @@ -0,0 +1,144 @@ +48027,Coins & Paper Money:Paper Money: World:Asia:Japan,0,,,,10,Coins,2008-06-03,2013-07-16 08:23:09,USER_X,USER_Y,11116,Coins & Paper Money,3411,8008,48027,48027,48027,48027,Paper Money: World,Asia,Japan,Japan,Japan,Japan,262144,N,-999,Coins,5837,3069,48027,10,1,Collectibles +164261,Jewelry & Watches:Fashion Jewelry:Earrings:Dangle & Chandelier:Sterling Silver (w/o Stone),0,,,,17,JewelrGemWatches,2008-08-12,2012-09-11 20:26:04,USER_X,USER_Y,281,Jewelry & Watches,10968,50647,50647,50647,50647,50647,Fashion Jewelry,Earrings,Earrings,Earrings,Earrings,Earrings,262144,N,-999,JewelrGemWatches,2928,1873,50647,17,1,Fashion +82494,BookComics & Mags:Comic Books:Modern (1980-now):Superhero:Sandman,15,,,,3,Books,2008-06-03,2010-09-13 07:05:54,USER_X,USER_Y,267,BookMagazines,63,63,63,63,63,63,NULL,Comic Books,Comic Books,Comic Books,Comic Books,Comic Books,262144,N,-999,Books,-999,-999,63,3,1,Media +66767,Home & Lifestyle:Pet Supplies:Dog Supplies:Dog Apparel:Dresses,15,,,,16,Home & Garden,2008-06-03,2011-06-14 07:48:40,USER_X,USER_Y,11700,Home & Garden,1281,20742,1283,1283,1283,1283,NULL,Dogs,Other Supplies,Other Supplies,Other Supplies,Other Supplies,262144,N,-999,Home Improvement,-999,-999,1283,16,1,Home & Garden +152801,Jewelry & Watches:Earrings:Studs:DiamonEnhanced Natural:PrincesSquare,0,,,,17,JewelrGemWatches,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,281,Jewelry & Watches,10968,50647,50647,50647,50647,50647,NULL,Earrings,Earrings,Earrings,Earrings,Earrings,262144,N,-999,JewelrGemWatches,2928,1873,50647,17,1,Fashion +43398,Home & Garden:Food & Beverages:Cheese & Crackers,0,,,,36,Home & Living,2008-06-03,2013-02-20 23:11:43,USER_X,USER_Y,11700,Home & Garden,14308,43398,43398,43398,43398,43398,NULL,Cheese & Crackers,Cheese & Crackers,Cheese & Crackers,Cheese & Crackers,Cheese & Crackers,262144,N,-999,Home Furnishing,-999,-999,43398,36,1,Home & Garden +95173,Health & Beauty:Bath & Body:Bath SetKits:Avon,0,,,,37,Health & Beauty,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,26395,Health & Beauty,11838,67391,67391,67391,67391,67391,Bath & Body,Bath Sets & Kits,Bath Sets & Kits,Bath Sets & Kits,Bath Sets & Kits,Bath Sets & Kits,262144,N,-999,Health & Beauty,2919,1868,67391,37,1,Fashion +158666,ToyHobbies:Action Figures:Anime & Manga,15,,,,28,Toys,2012-09-11,2012-09-11 20:27:22,USER_X,USER_Y,220,ToyHobbies,246,158666,158666,158666,158666,158666,Action Figures,Anime & Manga,Anime & Manga,Anime & Manga,Anime & Manga,Anime & Manga,262144,N,-999,Toys,-999,-999,158666,28,1,Collectibles +12688,eBay Premier:Books & Manuscripts:Books: Other:Icollector,0,,2038,,57,Sothebys,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,2038,eBay Premier,1680,1681,12688,12688,12688,12688,Books & Manuscripts,Books: Other,Icollector,Icollector,Icollector,Icollector,60,N,,Sothebys,-999,-999,0,57,1,Lifestyle +103324,Clothing & Accessories:Women:Shoes:Casual SneakerSkate:Sizes 10+,15,,,,9,Clothing & Accessories,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,11450,ClothinShoeAccessories,3034,63889,63889,63889,63889,63889,Women's Shoes,Mixed Items,Mixed Items,Mixed Items,Mixed Items,Mixed Items,262144,N,-999,Clothing & Accessories,2441,1634,-99,9,1,Fashion +108782,Vehicle Parts & Accessories:CaTruck Parts:Car Care & Cleaning:Air Fresheners,15,,,,8,Auto Parts,2012-09-11,2013-09-10 16:52:46,USER_X,USER_Y,131090,Vehicle Parts & Accessories,6030,72200,108782,108782,108782,108782,CaTruck Parts,Car Care & Cleaning,Air Fresheners,Air Fresheners,Air Fresheners,Air Fresheners,262144,N,-999,Auto - Parts,-999,-999,108782,8,1,Parts & Accessories +80287,Computers & Networking:Software:Business & Productivity:Voice Recognition,0,,,,12,Computers,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,58058,Computers/Tablets & Networking,18793,3768,3768,3768,3768,3768,Software,Office & Business,Office & Business,Office & Business,Office & Business,Office & Business,262144,N,-999,Computers,5893,3093,3768,12,1,Electronics +140746,eBay Motors:Parts & Accessories:Vintage Car & Truck Parts:WheelTire& Hub Caps:Tires,100,,,,8,Auto - Parts,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,6000,eBay Motors,6028,10073,140744,140746,140746,140746,Parts & Accessories,Vintage Car & Truck Parts,WheelTire& Hub Caps,Tires,Tires,Tires,262144,N,-999,Auto - Parts,3517,1794,140746,8,1,Parts & Accessories +87118,Sporting Goods:Paintball:Barrels:Intimidator,0,,,,24,Sporting Goods,2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,888,Sporting Goods,159043,16045,16046,16046,16046,16046,Outdoor Sports,Paintball,Barrels,Barrels,Barrels,Barrels,0,N,-999,Sporting Goods,2919,1868,16046,24,1,Lifestyle +25147,Sports MeCards & Fan Shop:Fan Apparel & Souvenirs:Baseball-MLB:Philadelphia Phillies:Other Items,0,,888,,25,Sports Memorabilia,2008-06-03,2010-02-08 10:51:44,USER_X,USER_Y,64482,Sports MeCards & Fan Shop,24409,24410,24410,24410,24410,24410,Fan Apparel & Souvenirs,Baseball-MLB,Baseball-MLB,Baseball-MLB,Baseball-MLB,Baseball-MLB,262144,N,-999,Sports Memorabilia,2884,1845,24410,25,1,Collectibles +170302,Crafts:Embroidery:Design CDs:Other Design Themes,15,,,,15,Crafts,2009-09-21,2010-09-13 07:13:34,USER_X,USER_Y,14339,Crafts,28141,41383,41383,41383,41383,41383,Embroidery,Design CDs,Design CDs,Design CDs,Design CDs,Design CDs,262144,N,-999,Hobbies & Crafts,-999,-999,41383,15,1,Home & Garden +53064,Business & Industrial:Agriculture & Forestry:Antique Tractors & Equipment:Tractors:Massey HarriFerguson,0,,,,4,Business (Office & Industrial),2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,12576,Business & Industrial,177641,177642,177642,177642,177642,177642,Heavy Equipment,Antique & Vintage Farm Equip,Antique & Vintage Farm Equip,Antique & Vintage Farm Equip,Antique & Vintage Farm Equip,Antique & Vintage Farm Equip,262144,N,-999,Business (Office & Industrial),-999,-999,177642,4,1,Business & Industrial +132939,Jewelry & Watches:Designer Brands:John Atencio,0,,,,17,JewelrGemWatches,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,281,Jewelry & Watches,10968,499,499,499,499,499,Fashion Jewelry,Other,Other,Other,Other,Other,262144,N,-999,JewelrGemWatches,2928,1873,499,17,1,Fashion +113593,Mobiles & Phones:Mobile Phones:Samsung:Samsung D500,15,,,,40,Cell Phones & Portable Electro,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,15032,Phones,9355,9355,9355,9355,9355,9355,Mobile Phones,Mobile Phones,Mobile Phones,Mobile Phones,Mobile Phones,Mobile Phones,262144,N,-999,Cell Phones & Accessories,2246,1609,9355,40,1,Electronics +34273,eBay Motors:Parts & Accessories:Motorcycle:Frame & Suspension:Frames,100,,,,8,Auto - Parts,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,6000,eBay Motors,6028,10063,34272,34273,34273,34273,Parts & Accessories,Motorcycle,Frame & Suspension,Frames,Frames,Frames,0,N,-999,Auto - Parts,-999,-999,0,8,1,Parts & Accessories +106340,Home & Lifestyle:Tools & Building Materials:Hand Tools:Socket Sets,15,,,,16,Home & Garden,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11700,Home & Garden,2032,29515,29515,29515,29515,29515,Gardening,Hand Tools,Hand Tools,Hand Tools,Hand Tools,Hand Tools,262144,N,-999,Home Improvement,-999,-999,29515,16,1,Home & Garden +150265,Baby & Maternity:Baby Clothing & Shoes:Boys:Size 00:Outfits & Sets:Bonds,15,,,,2,Baby,2008-06-03,2011-04-05 08:25:25,USER_X,USER_Y,2984,Baby,3082,147317,147333,147333,147333,147333,Baby Clothing,Boys,OutfitSets,OutfitSets,OutfitSets,OutfitSets,0,N,-999,Baby,3090,1947,147333,2,1,Home & Garden +24760,Sports MeCards & Fan Shop:Fan Apparel & Souvenirs:Hockey-NHL:San Jose Sharks:CapHats,0,,888,,25,Sports Memorabilia,2008-06-03,2010-02-08 10:51:44,USER_X,USER_Y,64482,Sports MeCards & Fan Shop,24409,24510,24510,24510,24510,24510,Fan Apparel & Souvenirs,Hockey-NHL,Hockey-NHL,Hockey-NHL,Hockey-NHL,Hockey-NHL,262144,N,-999,Sports Memorabilia,2884,1845,24510,25,1,Collectibles +37831,Collectibles:Advertising:Merchandise & Memorabilia:Advertising-Print:1910-19,0,,,,11,Collectibles,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,1,Collectibles,34,13623,37828,37831,37831,37831,Advertising,Merchandise & Memorabilia,Advertising-Print,1910-19,1910-19,1910-19,262144,N,-999,Collectibles,-999,-999,37831,11,1,Collectibles +1120,Books:First Editions:Other,3,,267,Other,3,BookComics & Magazines,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,267,Books,2231,1120,1120,1120,1120,1120,First Editions,Other,Other,Other,Other,Other,0,N,-999,Books,,,0,3,1,Media +43972,eBay Motors:Parts & Accessories:ATV Parts:Other,100,,,,8,Auto - Parts,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,6000,eBay Motors,6028,43962,43972,43972,43972,43972,Parts & Accessories,ATV Parts,Other,Other,Other,Other,262144,N,-999,Auto - Parts,5411,2941,43972,8,1,Parts & Accessories +166013,Computers:Apple AccessorieParts:TV Tuners,15,,,,12,Computers,2008-09-09,2012-05-01 08:54:26,USER_X,USER_Y,58058,Computers,175673,3761,3761,3761,3761,3761,Computer Components & Parts,Video Capture & TV Tuner Cards,Video Capture & TV Tuner Cards,Video Capture & TV Tuner Cards,Video Capture & TV Tuner Cards,Video Capture & TV Tuner Cards,262144,N,-999,Computers,-999,-999,3761,12,1,Electronics +15568,Baby:Baby Clothing:Unisex:Sleepwear,15,,,,2,Baby,2008-06-03,2011-04-05 08:25:25,USER_X,USER_Y,2984,Baby,3082,163397,163400,163400,163400,163400,Baby Clothing,Unisex,Sleepwear,Sleepwear,Sleepwear,Sleepwear,0,N,-999,Baby,3090,1947,163400,2,1,Home & Garden +103178,Clothing & Accessories:Women:HandbagBags:Evening Bags,15,,,,9,Clothing & Accessories,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,11450,ClothinShoeAccessories,169291,169291,169291,169291,169291,169291,Women's Bags,Women's Bags,Women's Bags,Women's Bags,Women's Bags,Women's Bags,262144,N,-999,Clothing & Accessories,2487,1098,-99,9,1,Fashion +2023,Sporting Goods:Team Sports:Basketball:Other,0,,888,Sporting Goods,24,Sporting Goods,2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,888,Sporting Goods,159049,21194,2023,2023,2023,2023,Team Sports,Basketball,Other,Other,Other,Other,262144,N,-999,Sporting Goods,-999,-999,2023,24,1,Lifestyle +94847,Consumer Electronics:Car Electronics:Car Video:Car Video Monitors Only:Headrest Monitors:6-6.9 inches,0,,,,13,Consumer Electronics - Other,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,293,Consumer Electronics,3270,48604,48606,48606,48606,48606,Vehicle Electronics & GPS,Car Video,Car Monitors w/o Player,Car Monitors w/o Player,Car Monitors w/o Player,Car Monitors w/o Player,262144,N,-999,Consumer Electronics - Other,2920,1869,48606,13,1,Electronics +15868,Real Estate:Land:Central U.S.:Illinois,0,,10542,,23,Real Estate,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,10542,Real Estate,15841,15841,15841,15841,15841,15841,Land,Land,Land,Land,Land,Land,0,N,-999,Real Estate,-999,-999,15841,23,1,Real Estate +32876,Home & Garden:Home Improvement:Plumbing & Fixtures:Toilet Paper Holders-Mounted,0,,,,36,Home & Living,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11700,Home & Garden,159907,20601,32876,32876,32876,32876,Home Improvement,Plumbing & Fixtures,Toilet Paper Holders-Mounted,Toilet Paper Holders-Mounted,Toilet Paper Holders-Mounted,Toilet Paper Holders-Mounted,262144,N,-999,Home Furnishing,-999,-999,32876,36,1,Home & Garden +62179,Sporting Goods:Skiing & Snowboarding:Apparel:Ski Suits:Women,0,,,,9,Apparel,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,11450,ClothinShoes & Accessories,15724,137085,137085,137085,137085,137085,Women's Clothing,Athletic Apparel,Athletic Apparel,Athletic Apparel,Athletic Apparel,Athletic Apparel,0,N,-999,Clothing & Accessories,2919,1868,137085,9,1,Fashion +45333,ClothinShoes & Accessories:Women's Shoes:Flats & Oxfords,0,,,,9,Apparel,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11450,ClothinShoes & Accessories,3034,45333,45333,45333,45333,45333,Women's Shoes,Flats & Oxfords,Flats & Oxfords,Flats & Oxfords,Flats & Oxfords,Flats & Oxfords,262144,N,-999,Clothing & Accessories,-999,-999,45333,9,1,Fashion +50677,Jewelry & Watches:Fashion Jewelry:Pins & Brooches,0,,,,17,JewelrGemWatches,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,281,Jewelry & Watches,10968,50677,50677,50677,50677,50677,Fashion Jewelry,Pins & Brooches,Pins & Brooches,Pins & Brooches,Pins & Brooches,Pins & Brooches,262144,N,-999,JewelrGemWatches,-999,-999,50677,17,1,Fashion +33038,Musical Instruments:Guitars:Electric:ESP,15,,,,30,Musical Instruments,2008-06-03,2010-06-14 07:48:40,USER_X,USER_Y,619,Musical Instruments,166070,33034,33034,33034,33034,33034,Instruments,Guitars (Electric),Guitars (Electric),Guitars (Electric),Guitars (Electric),Guitars (Electric),262144,N,-999,Musical Instruments,-999,-999,33034,30,1,Lifestyle +156614,Toys & Hobbies:Diecast Toy Vehicles:CarTrucks-Diecast:NASCAR:Revell:Dale Jarrett,0,,,,28,Toys,2008-06-03,2010-03-22 10:34:30,USER_X,USER_Y,220,Toys & Hobbies,222,171127,762,762,762,762,Diecast & Toy Vehicles,Cars: RacinNASCAR,NASCAR,NASCAR,NASCAR,NASCAR,262144,N,-999,Toys,1740,1380,762,28,1,Collectibles +106246,Health & Beauty:Hair Care:Conditioner:Biolage,0,,,,37,Health & Beauty,2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,26395,Health & Beauty,11854,177661,177661,177661,177661,177661,Hair Care & Styling,Shampoo & Conditioning,Shampoo & Conditioning,Shampoo & Conditioning,Shampoo & Conditioning,Shampoo & Conditioning,262144,N,-999,Health & Beauty,2919,1868,177661,37,1,Fashion +20865,Sporting Goods:Soccer:Apparel & Footwear:Jerseys:Other,0,,888,,9,Apparel,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,11450,ClothinShoes & Accessories,1059,137084,137084,137084,137084,137084,Men's Clothing,Athletic Apparel,Athletic Apparel,Athletic Apparel,Athletic Apparel,Athletic Apparel,0,N,-999,Clothing & Accessories,2919,1868,137084,9,1,Fashion +15115,Entertainment:Video Games:Games:Sega Dreamcast:Sports,0,,293,,32,Video Games,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,1249,Video Games & Consoles,139973,139973,139973,139973,139973,139973,Video Games,Video Games,Video Games,Video Games,Video Games,Video Games,0,N,-999,Video Games,-999,-999,139973,32,1,Electronics +3838,JewelrGemstones:Jewelry:Charms:Plated,0,,281,Other,17,JewelrGemWatches,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,281,Jewelry & Watches,10968,140944,140944,140944,140944,140944,Fashion Jewelry,Charms & Charm Bracelets,Charms & Charm Bracelets,Charms & Charm Bracelets,Charms & Charm Bracelets,Charms & Charm Bracelets,0,N,-999,JewelrGemWatches,-999,-999,140944,17,1,Fashion +759,Toys & Hobbies:Diecast Toy Vehicles:CarTrucks-Diecast:Franklin Mint:Modern (1970-Now),0,,220,Other,28,Toys,2008-06-03,2010-03-22 10:34:30,USER_X,USER_Y,220,Toys & Hobbies,222,19036,223,223,223,223,Diecast & Toy Vehicles,CarTrucks & Vans,Diecast-Modern Manufacture,Diecast-Modern Manufacture,Diecast-Modern Manufacture,Diecast-Modern Manufacture,262144,N,-999,Toys,1740,1380,223,28,1,Collectibles +61323,Consumer Electronics:A/V Accessories & Cables:Remote Controls:Universal Remotes,0,,,,13,Consumer Electronics - Other,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,293,Consumer Electronics,32852,14961,61312,61312,61312,61312,TVideo & Home Audio,TVideo & Audio Accessories,Remote Controls,Remote Controls,Remote Controls,Remote Controls,262144,N,-999,Consumer Electronics - Other,5344,2248,61312,13,1,Electronics +121153,Baby:Nursery Decor:Night Lights,0,,,,2,Baby,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,2984,Baby,66697,121153,121153,121153,121153,121153,Nursery Decor,Night Lights,Night Lights,Night Lights,Night Lights,Night Lights,262144,N,-999,Baby,-999,-999,121153,2,1,Home & Garden +88750,Consumer Electronics:Car Electronics:RadaLaser Detectors:Whistler:17174 Series,0,,,,13,Consumer Electronics - Other,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,293,Consumer Electronics,3270,14935,14935,14935,14935,14935,Vehicle Electronics & GPS,Radar & Laser Detectors,Radar & Laser Detectors,Radar & Laser Detectors,Radar & Laser Detectors,Radar & Laser Detectors,262144,N,-999,Consumer Electronics - Other,2920,1869,14935,13,1,Electronics +161567,Computers:Laptop Accessories:Batteries:Hewlett Packard,15,,,,12,Computers,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,58058,Computers,31530,14295,14295,14295,14295,14295,Laptop & Desktop Accessories,Laptop Batteries,Laptop Batteries,Laptop Batteries,Laptop Batteries,Laptop Batteries,262144,N,-999,Computers,3699,2194,14295,12,1,Electronics +113802,Lots More...:Metaphysical:Herbs,15,,,,99,Everything Else,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,99,Lots More...,19266,113802,113802,113802,113802,113802,Metaphysical,Herbs,Herbs,Herbs,Herbs,Herbs,262144,N,-999,Everything Else,-999,-999,113802,99,1,Lifestyle +15808,Clothing & Accessories:Women:Plus Sizes:Tops:Other Tops,15,,,,9,Clothing & Accessories,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11450,ClothinShoeAccessories,15724,53159,53159,53159,53159,53159,Women's Clothing,Tops & Blouses,Tops & Blouses,Tops & Blouses,Tops & Blouses,Tops & Blouses,262144,N,-999,Clothing & Accessories,2264,1551,53159,9,1,Fashion +174053,Vehicle Parts & Accessories:Car Parts:External & Body Parts:SunrooConvertible & Hardtop,3,,,,8,Auto - Parts,2011-08-23,2013-04-28 20:37:19,USER_X,USER_Y,131090,Vehicle Parts & Accessories,9884,14768,174053,174053,174053,174053,Car Parts,External & Body Parts,SunrooConvertible & Hardtop,SunrooConvertible & Hardtop,SunrooConvertible & Hardtop,SunrooConvertible & Hardtop,262144,N,-999,Auto - Parts,4075,2390,174053,8,1,Parts & Accessories +2635,Toys & Hobbies:Toy Soldiers:1970-Now:Plastic,0,,220,Other,28,Toys,2008-06-03,2010-03-22 10:34:30,USER_X,USER_Y,220,Toys & Hobbies,2631,2638,2638,2638,2638,2638,Toy Soldiers,1970-Now,1970-Now,1970-Now,1970-Now,1970-Now,262144,N,-999,Toys,2919,1868,2638,28,1,Collectibles +1161,DVFilm & TV:Other Formats:Videos: NTSC (US):ActioAdventure,3,,267,Other,18,DVDFilm & TV,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,11232,DVFilm & TV,380,1151,1161,1161,1161,1161,Other Formats,Videos: NTSC (US),ActioAdventure,ActioAdventure,ActioAdventure,ActioAdventure,0,N,-999,DVDs & Movies,-999,-999,0,18,1,Media +64076,Computers & Networking:Networking:Switches:3Com:SuperStack,0,,,,12,Computers,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,58058,Computers/Tablets & Networking,175698,175706,51268,51268,51268,51268,Enterprise NetworkinServers,Switches & Hubs,Network Switches,Network Switches,Network Switches,Network Switches,262144,N,-999,Computers,2919,1868,51268,12,1,Electronics +33977,Crafts:Scrapbooking:Albums:12x12 Albums,15,,,,15,Crafts,2008-06-03,2010-06-14 07:56:25,USER_X,USER_Y,14339,Crafts,31253,33875,33875,33875,33875,33875,Scrapbooking,Albums,Albums,Albums,Albums,Albums,262144,N,-999,Hobbies & Crafts,-999,-999,33875,15,1,Home & Garden +31673,Sports:Memorabilia:Racing-NASCAR:Plaques,0,,,,25,Sports Memorabilia,2008-06-03,2010-02-08 10:48:39,USER_X,USER_Y,64482,Sports MeCards & Fan Shop,24409,46156,46156,46156,46156,46156,Fan Apparel & Souvenirs,Racing-NASCAR,Racing-NASCAR,Racing-NASCAR,Racing-NASCAR,Racing-NASCAR,0,N,-999,Sports Memorabilia,-999,-999,46156,25,1,Collectibles +174106,Vehicle Parts & Accessories:Car Parts:Transmission & Drivetrain:Sensors,3,,,,8,Auto - Parts,2011-08-23,2013-04-28 20:37:19,USER_X,USER_Y,131090,Vehicle Parts & Accessories,9884,33726,174106,174106,174106,174106,Car Parts,Transmission & Drivetrain,Sensors,Sensors,Sensors,Sensors,262144,N,-999,Auto - Parts,4075,2390,174106,8,1,Parts & Accessories +26249,Business & Industrial:Printing & Graphic Arts:Commercial Printing Presses:Sheet-fed Offset Presses,0,,9428,,4,Business (Office & Industrial),2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,12576,Business & Industrial,26238,26247,26249,26249,26249,26249,Printing & Graphic Arts,Commercial Printing Presses,Sheet-fed Offset Presses,Sheet-fed Offset Presses,Sheet-fed Offset Presses,Sheet-fed Offset Presses,262144,N,-999,Business (Office & Industrial),-999,-999,26249,4,1,Business & Industrial +159184,Sporting Goods:Winter Sports:Snowboarding:Stomp Pads,0,,,,24,Sporting Goods,2008-06-03,2013-09-10 16:52:46,USER_X,USER_Y,888,Sporting Goods,36259,21247,159184,159184,159184,159184,Winter Sports,Snowboarding,Stomp Pads,Stomp Pads,Stomp Pads,Stomp Pads,262144,N,-999,Sporting Goods,-999,-999,159184,24,1,Lifestyle +10058,Tickets & Travel:Tickets:Sporting Events:Wrestling,3,,11730,,27,Tickets,2008-06-03,2013-09-10 16:52:46,USER_X,USER_Y,1305,Events Tickets,1306,1306,1306,1306,1306,1306,Other Tickets,Other Tickets,Other Tickets,Other Tickets,Other Tickets,Other Tickets,262144,N,-999,Tickets,2937,1879,1306,27,1,Lifestyle +48904,ClothinShoes & Accessories:Vintage:Women's Vintage Clothing:1977-89 (PunNew Wav80s):Sweaters,0,,,,9,Apparel,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,11450,ClothinShoes & Accessories,175759,175762,52451,48904,48904,48904,Vintage,Women's Vintage Clothing,1977-89 (PunNew Wav80s),Sweaters,Sweaters,Sweaters,262144,N,-999,Clothing & Accessories,-999,-999,48904,9,1,Fashion +145970,Toys & Hobbies:ModelKits:Automotive:Vintage:Plymouth,0,,,,28,Toys,2008-06-03,2008-10-08 07:18:40,USER_X,USER_Y,220,Toys & Hobbies,1188,2580,2585,2585,2585,2585,Models & Kits,Automotive,Vintage,Vintage,Vintage,Vintage,262144,N,-999,Toys,2974,1905,2585,28,1,Collectibles +963,ClothinShoes & Accessories:Vintage:Clothing (Pre-1980):Women:ClothinShoes & Accessories:Shoes,0,,1,Other,9,Apparel,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,11450,ClothinShoes & Accessories,175759,74976,48561,48561,48561,48561,Vintage,Women's Vintage Shoes,Other,Other,Other,Other,0,N,-999,Clothing & Accessories,-999,-999,48561,9,1,Fashion +118687,Health & Beauty:Fragrances:Women's Fragrances:Benetton,3,,,,37,Health & Beauty,2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,26395,Health & Beauty,26396,11848,11848,11848,11848,11848,Fragrances,Women's Fragrances,Women's Fragrances,Women's Fragrances,Women's Fragrances,Women's Fragrances,262144,N,-999,Health & Beauty,6778,3189,11848,37,1,Fashion +20886,Toys & Hobbies:Diecast Toy Vehicles:CarTrucks-Diecast:NASCAR:Action/ Motorsports Authentic:Darrell Waltrip,0,,220,,28,Toys,2008-06-03,2010-03-22 10:34:30,USER_X,USER_Y,220,Toys & Hobbies,222,171127,762,762,762,762,Diecast & Toy Vehicles,Cars: RacinNASCAR,NASCAR,NASCAR,NASCAR,NASCAR,262144,N,-999,Toys,1740,1380,762,28,1,Collectibles +148324,Mobiles & Phones:Mobile Accessories:Covers / Faceplates:Sony Ericsson:W900i,15,,,,31,Phones,2008-06-03,2012-09-18 00:08:03,USER_X,USER_XIANZHU,15032,Phones,9394,20349,20349,20349,20349,20349,Mobile Accessories,CaseCoverSkins,CaseCoverSkins,CaseCoverSkins,CaseCoverSkins,CaseCoverSkins,262144,N,-999,Telecomm,-999,-999,20349,31,1,Electronics +139255,JewellerGemWatches:Fine Jewellery:Earrings:Gemstone - Created:Lapis,15,,,,17,JewelrGemWatches,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,281,Jewellery & Watches,4196,10985,10985,10985,10985,10985,Fine Jewellery,Earrings,Earrings,Earrings,Earrings,Earrings,262144,N,-999,JewelrGemWatches,-999,-999,-99,17,1,Fashion +20213,Collectibles:Postcards:US StateCities & Towns:Maine,0,,1,,11,Collectibles,2008-06-03,2008-09-09 22:08:47,USER_X,USER_Y,1,Collectibles,914,20193,20213,20213,20213,20213,Postcards,US StateCities & Towns,Maine,Maine,Maine,Maine,262144,N,-999,Collectibles,-999,-999,20213,11,1,Collectibles +32996,Movies:Television Memorabilia:Clippings,15,,,,42,Entertainment Memorabilia,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11232,Movies,1424,32996,32996,32996,32996,32996,Television Memorabilia,Clippings,Clippings,Clippings,Clippings,Clippings,262144,N,-999,Entertainment Memorabilia,-999,-999,32996,42,1,Collectibles +99985,Collectibles:Trading Cards:Sci-FFantasy:Star Wars:Sets:Other,0,,,,11,Collectibles,2008-06-03,2008-09-09 22:08:47,USER_X,USER_Y,1,Collectibles,868,37897,100899,99980,99985,99985,Trading Cards,Sci-FFantasy,Star Wars,Sets,Other,Other,262144,N,-999,Collectibles,-999,-999,99985,11,1,Collectibles +67703,Jewellery & Watches:Jewellery Boxes & Supplies:Jewellery Display,3,,,,17,Jewellery & Watches,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,281,Jewellery & Watches,10321,67703,67703,67703,67703,67703,Jewellery Boxes & Supplies,Jewellery Display,Jewellery Display,Jewellery Display,Jewellery Display,Jewellery Display,262144,N,-999,JewelrGemWatches,4435,2261,67703,17,1,Fashion +164,Computers/Tablets & Networking:Computer Components & Parts:CPUProcessors,0,,160,Computer Hardware,12,Computers,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,58058,Computers/Tablets & Networking,175673,164,164,164,164,164,Computer Components & Parts,CPUProcessors,CPUProcessors,CPUProcessors,CPUProcessors,CPUProcessors,262144,N,-999,Computers,5730,2011,164,12,1,Electronics +279,BookMagazines:Children's Books,15,,267,Other,3,Books,2008-06-03,2013-09-10 16:52:46,USER_X,USER_Y,267,BookMagazines,1093,1093,1093,1093,1093,1093,Children's Books,Children's Books,Children's Books,Children's Books,Children's Books,Children's Books,262144,N,-999,Books,1415,1128,1093,3,1,Media +65,Collectibles:Comics:Platinum Age (1897-1937),0,,1,Other,11,Collectibles,2008-06-03,2013-02-20 23:11:43,USER_X,USER_Y,1,Collectibles,63,65,65,65,65,65,Comics,Platinum Age (1897-1937),Platinum Age (1897-1937),Platinum Age (1897-1937),Platinum Age (1897-1937),Platinum Age (1897-1937),262144,N,-999,Collectibles,6014,2967,65,11,1,Collectibles +24541,Sports MeCards & Fan Shop:Fan Apparel & Souvenirs:College-NCAA,0,,,,25,Sports Memorabilia,2010-02-08,2013-07-16 08:23:09,USER_X,USER_Y,64482,Sports MeCards & Fan Shop,24409,24541,24541,24541,24541,24541,Fan Apparel & Souvenirs,College-NCAA,College-NCAA,College-NCAA,College-NCAA,College-NCAA,262144,N,-999,Sports Memorabilia,7721,2482,24541,25,1,Collectibles +23446,Mode & Accessoires:Chaussures de femme:Sandales & Sandalettes:Taille 37-38,23,,,,9,Vtements et Accessoires,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,11450,Mode & Accessoires,35107,23418,23446,23446,23446,23446,Chaussures de femme,Sandales & Sandalettes,Taille 37-38,Taille 37-38,Taille 37-38,Taille 37-38,262144,N,-999,Clothing & Accessories,2438,1634,23446,9,1,Fashion +130,Collectibles:Transportation:Railroadiana & Trains:Other,0,,1,Other,11,Collectibles,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,1,Collectibles,417,1444,130,130,130,130,Transportation,Railroadiana & Trains,Other,Other,Other,Other,262144,N,-999,Collectibles,-999,-999,130,11,1,Collectibles +216,Sports MeCards & Fan Shop:Cards:Hockey,0,,11800,Other,25,Sports Memorabilia,2008-06-03,2013-02-20 23:11:43,USER_X,USER_Y,64482,Sports MeCards & Fan Shop,212,216,216,216,216,216,Cards,Hockey,Hockey,Hockey,Hockey,Hockey,262144,N,-999,Sports Memorabilia,3636,2152,216,25,1,Collectibles +10866,Collectibles:Animals:Farm & Countryside:Pigs,0,,1,,11,Collectibles,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,1,Collectibles,1335,45602,10866,10866,10866,10866,Animals,Farm & Countryside,Pigs,Pigs,Pigs,Pigs,262144,N,-999,Collectibles,-999,-999,10866,11,1,Collectibles +57013,Business & Industrial:MRO & Industrial Supply:Pumps & Plumbing:Pumps:Pump Accessories & Parts,0,,,,4,Business (Office & Industrial),2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,12576,Business & Industrial,1266,109619,42928,57013,57013,57013,MRO & Industrial Supply,Pumps & Plumbing,Pumps,Pump Accessories & Parts,Pump Accessories & Parts,Pump Accessories & Parts,262144,N,-999,Business (Office & Industrial),-999,-999,57013,4,1,Business & Industrial +15687,ClothinShoes & Accessories:Men's Clothing:T-Shirts,0,,11450,,9,Apparel,2008-06-03,2013-07-16 08:23:09,USER_X,USER_Y,11450,ClothinShoes & Accessories,1059,15687,15687,15687,15687,15687,Men's Clothing,T-Shirts,T-Shirts,T-Shirts,T-Shirts,T-Shirts,262144,N,2515,Clothing & Accessories,7692,1115,15687,9,1,Fashion +80135,Computers/Tablets & Networking:DriveStorage & Blank Media:Blank Media & Accessories:CDVD & Blu-ray Discs,0,,,,12,Computers,2008-06-03,2013-07-16 08:23:09,USER_X,USER_Y,58058,Computers/Tablets & Networking,165,80133,80135,80135,80135,80135,DriveStorage & Blank Media,Blank Media & Accessories,CDVD & Blu-ray Discs,CDVD & Blu-ray Discs,CDVD & Blu-ray Discs,CDVD & Blu-ray Discs,262144,N,-999,Computers,3374,2018,80135,12,1,Electronics +31519,Computers/Tablets & Networking:Laptop & Desktop Accessories:Laptop Cases & Bags,0,,,,12,Computers,2012-05-01,2012-06-19 21:15:09,USER_X,USER_Y,58058,Computers/Tablets & Networking,31530,31519,31519,31519,31519,31519,Laptop & Desktop Accessories,Laptop Cases & Bags,Laptop Cases & Bags,Laptop Cases & Bags,Laptop Cases & Bags,Laptop Cases & Bags,262144,N,-999,Computers,6404,3189,31519,12,1,Electronics +175750,Home & Garden:Bedding:Blankets & Throws,0,,,,36,Home & Living,2012-05-01,2012-05-01 08:57:38,USER_X,USER_Y,11700,Home & Garden,20444,175750,175750,175750,175750,175750,Bedding,Blankets & Throws,Blankets & Throws,Blankets & Throws,Blankets & Throws,Blankets & Throws,262144,N,-999,Home Furnishing,-999,-999,175750,36,1,Home & Garden +63864,ClotheShoes & Accessories:Women's Clothing:Skirts,3,,,,9,Clothing & Accessories,2009-06-15,2012-06-19 21:15:09,USER_X,USER_Y,11450,ClotheShoes & Accessories,15724,63864,63864,63864,63864,63864,Women's Clothing,Skirts,Skirts,Skirts,Skirts,Skirts,262144,N,-999,Clothing & Accessories,6334,1551,63864,9,1,Fashion +13836,Collectibles:Decorative Collectibles:Spoons,0,,1,,11,Collectibles,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,1,Collectibles,13777,13836,13836,13836,13836,13836,Decorative Collectibles,Spoons,Spoons,Spoons,Spoons,Spoons,262144,N,-999,Collectibles,-999,-999,13836,11,1,Collectibles +63861,ClothinShoes & Accessories:Women's Clothing:Dresses,0,,,,9,Apparel,2008-06-03,2013-07-16 08:23:09,USER_X,USER_Y,11450,ClothinShoes & Accessories,15724,63861,63861,63861,63861,63861,Women's Clothing,Dresses,Dresses,Dresses,Dresses,Dresses,262144,N,-999,Clothing & Accessories,1263,1112,63861,9,1,Fashion +150047,Crafts:Jewellery Making:Findings:Bails,3,,,,15,Hobbies & Crafts,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,14339,Crafts,150045,150046,150047,150047,150047,150047,Jewellery Making,Findings,Bails,Bails,Bails,Bails,262144,N,-999,Hobbies & Crafts,4618,2740,150047,15,1,Home & Garden +95672,ClotheShoes & Accessories:Women's Shoes:Trainers,3,,,,9,Clothing & Accessories,2011-04-05,2013-07-16 08:23:09,USER_X,USER_Y,11450,ClotheShoes & Accessories,3034,95672,95672,95672,95672,95672,Women's Shoes,Trainers,Trainers,Trainers,Trainers,Trainers,262144,N,-999,Clothing & Accessories,2314,1634,95672,9,1,Fashion +57990,ClotheShoes & Accessories:Men's Clothing:Casual Shirts & Tops,3,,,,9,Clothing & Accessories,2009-06-15,2012-06-19 21:15:09,USER_X,USER_Y,11450,ClotheShoes & Accessories,1059,57990,57990,57990,57990,57990,Men's Clothing,Casual Shirts & Tops,Casual Shirts & Tops,Casual Shirts & Tops,Casual Shirts & Tops,Casual Shirts & Tops,262144,N,-999,Clothing & Accessories,6331,1623,57990,9,1,Fashion +75708,Toys & Games:Action Figures:TMovies & Video Games,3,,,,28,Toys & Games,2012-05-01,2012-05-01 08:57:38,USER_X,USER_Y,220,Toys & Games,246,75708,75708,75708,75708,75708,Action Figures,TMovies & Video Games,TMovies & Video Games,TMovies & Video Games,TMovies & Video Games,TMovies & Video Games,262144,N,-999,Toys,-999,-999,75708,28,1,Collectibles +4943,Toys & Hobbies:Diecast & Toy Vehicles:CarTrucks & Vans:Plastic:Vintage Manufacture (Pre-1970),0,,220,Other,28,Toys,2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,220,Toys & Hobbies,222,19036,19060,4943,4943,4943,Diecast & Toy Vehicles,CarTrucks & Vans,Plastic,Vintage Manufacture (Pre-1970),Vintage Manufacture (Pre-1970),Vintage Manufacture (Pre-1970),262144,N,-999,Toys,1740,1380,4943,28,1,Collectibles +40059,Mobile Phones & Communication:Radio Communication Equipment:Parts & Accessories:Other Parts & Accessories,3,,,,33,Consumer Electronics - Audio,2012-05-01,2012-05-01 08:57:38,USER_X,USER_Y,15032,Mobile Phones & Communication,1500,175734,40059,40059,40059,40059,Radio Communication Equipment,Parts & Accessories,Other Parts & Accessories,Other Parts & Accessories,Other Parts & Accessories,Other Parts & Accessories,262144,N,-999,Consumer Electronics - Audio,-999,-999,40059,33,1,Electronics +43479,Cameras & Photo:Film Photography:Other,0,,,,21,Photo,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,625,Cameras & Photo,69323,43479,43479,43479,43479,43479,Film Photography,Other,Other,Other,Other,Other,262144,N,-999,Photo,-999,-999,43479,21,1,Electronics +11848,Health & Beauty:Fragrances:Women,0,,,,37,Health & Beauty,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,26395,Health & Beauty,26396,11848,11848,11848,11848,11848,Fragrances,Women,Women,Women,Women,Women,262144,N,-999,Health & Beauty,5884,3087,11848,37,1,Fashion +165888,Jewelry & Watches:Vintage & Antique Jewelry:Costume:RetrVintage 1930s-1980s:PinBrooches,0,,,,17,JewelrGemWatches,2008-09-09,2009-01-12 07:05:17,USER_X,USER_Y,281,Jewelry & Watches,48579,500,58559,165888,165888,165888,Vintage & Antique Jewelry,Costume,RetrVintage 1930s-1980s,PinBrooches,PinBrooches,PinBrooches,262144,N,-999,JewelrGemWatches,-999,-999,165888,17,1,Fashion +26262,Collectibles:Advertising:Food & Beverage:Distillery:Bacardi,0,,1,,11,Collectibles,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,1,Collectibles,34,13587,820,26262,26262,26262,Advertising,Food & Beverage,Distillery,Bacardi,Bacardi,Bacardi,262144,N,-999,Collectibles,-999,-999,26262,11,1,Collectibles +67698,Business & Industrial:Retail & Services:Jewellery Packaging & Display:Cases & Displays:Bracelet,2,,,,4,Business (Office & Industrial),2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,12576,Business & Industrial,11890,67694,67697,67698,67698,67698,Retail & Services,Jewellery Packaging & Display,Cases & Displays,Bracelet,Bracelet,Bracelet,262144,N,-999,Business (Office & Industrial),-999,-999,67698,4,1,Business & Industrial +57990,ClothinShoes & Accessories:Men's Clothing:Casual Shirts,0,,,,9,Apparel,2008-06-03,2013-09-10 16:52:46,USER_X,USER_Y,11450,ClothinShoes & Accessories,1059,57990,57990,57990,57990,57990,Men's Clothing,Casual Shirts,Casual Shirts,Casual Shirts,Casual Shirts,Casual Shirts,262144,N,-999,Clothing & Accessories,-999,-999,57990,9,1,Fashion +67698,Business & Industrial:Retail & Services:Jewelry Packaging & Display:Cases & Displays:Bracelet,0,,,,4,Business (Office & Industrial),2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,12576,Business & Industrial,11890,67694,67697,67698,67698,67698,Retail & Services,Jewelry Packaging & Display,Cases & Displays,Bracelet,Bracelet,Bracelet,262144,N,-999,Business (Office & Industrial),-999,-999,67698,4,1,Business & Industrial +46575,Business & Industrial:Light Equipment & Tools:Air Tools:Air Tool Accessories,0,,,,4,Business (Office & Industrial),2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,12576,Business & Industrial,61573,46573,46575,46575,46575,46575,Light Equipment & Tools,Air Tools,Air Tool Accessories,Air Tool Accessories,Air Tool Accessories,Air Tool Accessories,262144,N,-999,Business (Office & Industrial),-999,-999,46575,4,1,Business & Industrial +41940,Business & Industrial:Manufacturing & Metalworking:Metalworking Tooling:Toolholding:Indexable Inserts,0,,,,4,Business (Office & Industrial),2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,12576,Business & Industrial,11804,92084,45017,41940,41940,41940,Manufacturing & Metalworking,Metalworking Tooling,Toolholding,Indexable Inserts,Indexable Inserts,Indexable Inserts,262144,N,-999,Business (Office & Industrial),-999,-999,41940,4,1,Business & Industrial +51582,ClothinShoes & Accessories:Kids' ClothinShoes & Accs:Girls' Clothing (Sizes 4 & Up):Sweaters,0,,,,9,Apparel,2012-05-01,2012-09-11 20:26:04,USER_X,USER_Y,11450,ClothinShoes & Accessories,171146,11462,51582,51582,51582,51582,Kids' ClothinShoes & Accs,Girls' Clothing (Sizes 4 & Up),Sweaters,Sweaters,Sweaters,Sweaters,262144,N,-999,Clothing & Accessories,-999,-999,51582,9,1,Fashion +80053,Computers/Tablets & Networking:MonitorProjectors & Accs:Monitors,0,,,,12,Computers,2009-09-21,2012-06-19 21:15:09,USER_X,USER_Y,58058,Computers/Tablets & Networking,162497,80053,80053,80053,80053,80053,MonitorProjectors & Accs,Monitors,Monitors,Monitors,Monitors,Monitors,262144,N,-999,Computers,2982,1911,80053,12,1,Electronics +31387,Jewellery & Watches:Watches:Wristwatches,3,,,,17,Jewellery & Watches,2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,281,Jewellery & Watches,14324,31387,31387,31387,31387,31387,Watches,Wristwatches,Wristwatches,Wristwatches,Wristwatches,Wristwatches,262144,N,-999,JewelrGemWatches,7489,32,31387,17,1,Fashion +20485,Home & Garden:Inside the Home:Furniture:Dining Room:Other,0,,11700,,36,Home & Living,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,11700,Home & Garden,3197,175752,175752,175752,175752,175752,Furniture,Other,Other,Other,Other,Other,262144,N,-999,Home Furnishing,2919,1868,175752,36,1,Home & Garden +44079,Sporting Goods:Exercise & Fitness:GyWorkout & Yoga:Fitness Equipment:Exercise Mats,0,,,,24,Sporting Goods,2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,888,Sporting Goods,15273,158932,28064,44079,44079,44079,Exercise & Fitness,GyWorkout & Yoga,Fitness Equipment,Exercise Mats,Exercise Mats,Exercise Mats,262144,N,-999,Sporting Goods,-999,-999,44079,24,1,Lifestyle +175750,HomFurniture & DIY:Bedding:Blankets,3,,,,16,Home,2012-05-01,2012-09-11 20:26:04,USER_X,USER_Y,11700,HomFurniture & DIY,20444,175750,175750,175750,175750,175750,Bedding,Blankets,Blankets,Blankets,Blankets,Blankets,262144,N,-999,Home Improvement,-999,-999,175750,16,1,Home & Garden +16509,Toys & Hobbies:Model Railroads & Trains:S Scale:Other,0,,220,,28,Toys,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,220,Toys & Hobbies,479,19143,16509,16509,16509,16509,Model Railroads & Trains,S Scale,Other,Other,Other,Other,262144,N,-999,Toys,-999,-999,16509,28,1,Collectibles +139973,Video Games & Consoles:Games,3,,,,32,PC & Video Gaming,2011-04-05,2012-09-11 20:26:04,USER_X,USER_Y,1249,Video Games & Consoles,139973,139973,139973,139973,139973,139973,Games,Games,Games,Games,Games,Games,262144,N,-999,Video Games,1655,1135,139973,32,1,Electronics +170083,Computers/Tablets & Networking:Computer Components & Parts:Memory (RAM),3,,,,12,Computers,2012-05-01,2012-06-19 21:15:09,USER_X,USER_Y,58058,Computers/Tablets & Networking,175673,170083,170083,170083,170083,170083,Computer Components & Parts,Memory (RAM),Memory (RAM),Memory (RAM),Memory (RAM),Memory (RAM),262144,N,-999,Computers,3369,2042,170083,12,1,Electronics +16145,Computers/Tablets & Networking:Computer Components & Parts:Other Components & Parts,3,,160,,12,Computers,2008-06-03,2013-02-20 23:11:43,USER_X,USER_Y,58058,Computers/Tablets & Networking,175673,16145,16145,16145,16145,16145,Computer Components & Parts,Other Components & Parts,Other Components & Parts,Other Components & Parts,Other Components & Parts,Other Components & Parts,262144,N,-999,Computers,6976,3189,16145,12,1,Electronics +158798,Toys & Hobbies:Vintage & Antique Toys:Spinning Tops,0,,,,28,Toys,2008-06-03,2008-09-09 22:08:47,USER_X,USER_Y,220,Toys & Hobbies,717,158798,158798,158798,158798,158798,Vintage & Antique Toys,Spinning Tops,Spinning Tops,Spinning Tops,Spinning Tops,Spinning Tops,262144,N,-999,Toys,-999,-999,158798,28,1,Collectibles +20485,CasArredamento e Bricolage:Cucina:Altro per cucina,101,,,,36,Mobili per la casa,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,11700,CasArredamento e Bricolage,20625,20485,20485,20485,20485,20485,Cucina,Altro per cucina,Altro per cucina,Altro per cucina,Altro per cucina,Altro per cucina,0,N,-999,Home Furnishing,-999,-999,20485,36,1,Home & Garden +100847,Half Books,0,,,,3,Books,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,100847,Half Books,100847,100847,100847,100847,100847,100847,Half Books,Half Books,Half Books,Half Books,Half Books,Half Books,0,N,-999,Books,-999,-999,100847,3,2,Media +156356,Collectibles:Postcards:BuildingArchitecture,0,,,,11,Collectibles,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,1,Collectibles,914,156356,156356,156356,156356,156356,Postcards,BuildingArchitecture,BuildingArchitecture,BuildingArchitecture,BuildingArchitecture,BuildingArchitecture,262144,N,-999,Collectibles,-999,-999,156356,11,1,Collectibles +60606,Collectables:Badges/ Patches:Golly Badges:Robertsons:Modern (Post-1990),3,,,,11,Collectables,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,1,Collectables,32615,98793,106160,60606,60606,60606,Badges/ Patches,Golly Badges,Robertsons,Modern (Post-1990),Modern (Post-1990),Modern (Post-1990),262144,N,-999,Collectibles,4390,2640,60606,11,1,Collectibles +36250,Sporting Goods:Outdoor Sports:Hunting:Decoys:Duck,0,,,,24,Sporting Goods,2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,888,Sporting Goods,7301,36249,36249,36249,36249,36249,Hunting,Decoys,Decoys,Decoys,Decoys,Decoys,262144,N,-999,Sporting Goods,-999,-999,36249,24,1,Lifestyle +50508,Cameras & Photo:Camera & Photo Accessories:LCD Hoods,0,,,,21,Photo,2008-06-03,2013-02-20 23:11:43,USER_X,USER_Y,625,Cameras & Photo,15200,50508,50508,50508,50508,50508,Camera & Photo Accessories,LCD Hoods,LCD Hoods,LCD Hoods,LCD Hoods,LCD Hoods,262144,N,-999,Photo,6256,3170,50508,21,1,Electronics +9426,Mobile Phones & Communication:Home Phones & Accessories:Phone Accessories:Other Phone Accessories,3,,,,31,Mobile & Home Phones,2011-04-05,2012-05-01 08:54:26,USER_X,USER_Y,15032,Mobile Phones & Communication,3286,9422,9426,9426,9426,9426,Home Phones & Accessories,Phone Accessories,Other Phone Accessories,Other Phone Accessories,Other Phone Accessories,Other Phone Accessories,262144,N,-999,Telecomm,-999,-999,9426,31,1,Electronics +45238,Abbigliamento e accessori:Donna: Accessori:SciarpFoulard e Scialli,101,,,,9,Vestiti ed Accessori,2012-09-11,2012-09-11 20:27:22,USER_X,USER_Y,11450,Abbigliamento e accessori,4251,45238,45238,45238,45238,45238,Donna: Accessori,SciarpFoulard e Scialli,SciarpFoulard e Scialli,SciarpFoulard e Scialli,SciarpFoulard e Scialli,SciarpFoulard e Scialli,0,N,-999,Clothing & Accessories,-999,-999,45238,9,1,Fashion +75665,Home & Garden:YarGarden & Outdoor Living:Gardening Supplies:Garden Tools & Equipment:Composting,0,,,,16,Home Improvement,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11700,Home & Garden,159912,2032,29515,75665,75665,75665,YarGarden & Outdoor Living,Gardening Supplies,Garden Tools & Equipment,Composting,Composting,Composting,262144,N,-999,Home Improvement,-999,-999,75665,16,1,Home & Garden +57784,ClothinShoes & Accessories:Baby & Toddler Clothing:Boys' Clothing (Newborn-5T):One-Pieces,0,,,,9,Apparel,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11450,ClothinShoes & Accessories,3082,147317,57784,57784,57784,57784,Baby & Toddler Clothing,Boys' Clothing (Newborn-5T),One-Pieces,One-Pieces,One-Pieces,One-Pieces,262144,N,-999,Clothing & Accessories,-999,-999,57784,9,1,Fashion +6762,eBay Motors:Parts & Accessories:Manuals:Manuals:Other Makes,0,,6001,Other,-999,Unknown,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,-999,Unknown,-999,-999,-999,-999,-999,-999,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,0,N,-999,Unknown,-999,-999,-999,-999,1,Unknown +60340,Entertainment Memorabilia:Movie Memorabilia:Pressbooks:1970-79,0,,,,42,Entertainment Memorabilia,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,45100,Entertainment Memorabilia,196,18830,60340,60340,60340,60340,Movie Memorabilia,Pressbooks,1970-79,1970-79,1970-79,1970-79,262144,N,-999,Entertainment Memorabilia,-999,-999,60340,42,1,Collectibles +35570,eBay Motors:Parts & Accessories:Motorcycle Parts:DecalEmblems,100,,,,8,Auto - Parts,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,6000,eBay Motors,6028,10063,35570,35570,35570,35570,Parts & Accessories,Motorcycle Parts,DecalEmblems,DecalEmblems,DecalEmblems,DecalEmblems,262144,N,-999,Auto - Parts,5407,2940,35570,8,1,Parts & Accessories +11554,ClothinShoes & Accessories:Women's Clothing:Jeans,0,,11450,,9,Apparel,2008-06-03,2013-07-16 08:23:09,USER_X,USER_Y,11450,ClothinShoes & Accessories,15724,11554,11554,11554,11554,11554,Women's Clothing,Jeans,Jeans,Jeans,Jeans,Jeans,262144,N,-999,Clothing & Accessories,7720,1113,11554,9,1,Fashion +1357,Collectibles:Decorative Collectibles:Decorative Collectible Brands:Hamilton Collector Plates,0,,1,Other,11,Collectibles,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,1,Collectibles,13777,156286,1357,1357,1357,1357,Decorative Collectibles,Decorative Collectible Brands,Hamilton Collector Plates,Hamilton Collector Plates,Hamilton Collector Plates,Hamilton Collector Plates,262144,N,-999,Collectibles,-999,-999,1357,11,1,Collectibles +13987,Collectibles:Paper:Booklets:1920-39,0,,1,,11,Collectibles,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,1,Collectibles,124,13985,13987,13987,13987,13987,Paper,Booklets,1920-39,1920-39,1920-39,1920-39,262144,N,-999,Collectibles,-999,-999,13987,11,1,Collectibles +63861,ClotheShoes & Accessories:Women's Clothing:Dresses,3,,,,9,Clothing & Accessories,2009-06-15,2013-07-16 08:23:09,USER_X,USER_Y,11450,ClotheShoes & Accessories,15724,63861,63861,63861,63861,63861,Women's Clothing,Dresses,Dresses,Dresses,Dresses,Dresses,262144,N,-999,Clothing & Accessories,-999,-999,63861,9,1,Fashion +314,ClothinShoes & Accessories:Womens' Clothing:Other,211,,,,9,ClothinShoes & Accessories,2008-06-03,2013-02-20 23:11:43,USER_X,USER_Y,11450,ClothinShoes & Accessories,15724,314,314,314,314,314,Womens' Clothing,Other,Other,Other,Other,Other,0,N,-999,Clothing & Accessories,-999,-999,314,9,1,Fashion +139973,Video Games & Consoles:Video Games,0,,,,32,Video Games,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,1249,Video Games & Consoles,139973,139973,139973,139973,139973,139973,Video Games,Video Games,Video Games,Video Games,Video Games,Video Games,262144,N,-999,Video Games,1453,1135,139973,32,1,Electronics +30059,Cameras & Photography:Lenses & Filters:Lens AdapterMounts & Tubes,3,,,,21,Photography,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,625,Cameras & Photography,78997,30059,30059,30059,30059,30059,Lenses & Filters,Lens AdapterMounts & Tubes,Lens AdapterMounts & Tubes,Lens AdapterMounts & Tubes,Lens AdapterMounts & Tubes,Lens AdapterMounts & Tubes,262144,N,-999,Photo,4379,2630,30059,21,1,Electronics +16145,Computers/Tablets & Networking:Computer Components & Parts:Other,0,,,,12,Computers,2008-06-03,2013-02-20 23:11:43,USER_X,USER_Y,58058,Computers/Tablets & Networking,175673,16145,16145,16145,16145,16145,Computer Components & Parts,Other,Other,Other,Other,Other,262144,N,-999,Computers,7312,3189,16145,12,1,Electronics +95672,ClothinShoes & Accessories:Women's Shoes:Athletic,0,,,,9,Apparel,2011-04-05,2013-02-20 23:11:43,USER_X,USER_Y,11450,ClothinShoes & Accessories,3034,95672,95672,95672,95672,95672,Women's Shoes,Athletic,Athletic,Athletic,Athletic,Athletic,262144,N,-999,Clothing & Accessories,1251,1100,95672,9,1,Fashion +1349,Collectibles:Decorative Collectibles:Decorative Collectible Brands:Avon:Bottles,0,,1,Other,11,Collectibles,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,1,Collectibles,13777,156286,13779,1349,1349,1349,Decorative Collectibles,Decorative Collectible Brands,Avon,Bottles,Bottles,Bottles,262144,N,-999,Collectibles,-999,-999,1349,11,1,Collectibles +1504,Business & Industrial:Electrical & Test Equipment:Test Equipment:Other,0,,9428,Other,4,Business (Office & Industrial),2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,12576,Business & Industrial,92074,4676,1504,1504,1504,1504,Electrical & Test Equipment,Test Equipment,Other,Other,Other,Other,262144,N,-999,Business (Office & Industrial),-999,-999,1504,4,1,Business & Industrial +73506,Collectibles:Decorative Collectibles:Tea PotSets,0,,,,11,Collectibles,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,1,Collectibles,13777,73506,73506,73506,73506,73506,Decorative Collectibles,Tea PotSets,Tea PotSets,Tea PotSets,Tea PotSets,Tea PotSets,262144,N,-999,Collectibles,-999,-999,73506,11,1,Collectibles +38238,Home & Garden:Home Decor & Accents:Wall Decor:Other,0,,,,36,Home & Living,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11700,Home & Garden,10033,10034,10034,10034,10034,10034,Home Decor,Other,Other,Other,Other,Other,262144,N,-999,Home Furnishing,2919,1868,10034,36,1,Home & Garden +533,Coins & Paper Money:Coins: World:Africa:Other,0,,11116,Other,10,Coins,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,11116,Coins & Paper Money,256,127144,533,533,533,533,Coins: World,Africa,Other,Other,Other,Other,262144,N,2431,Coins,6213,1620,533,10,1,Collectibles +223,Toys & Hobbies:Diecast & Toy Vehicles:CarTrucks & Vans:Diecast-Modern Manufacture,0,,220,Other,28,Toys,2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,220,Toys & Hobbies,222,19036,223,223,223,223,Diecast & Toy Vehicles,CarTrucks & Vans,Diecast-Modern Manufacture,Diecast-Modern Manufacture,Diecast-Modern Manufacture,Diecast-Modern Manufacture,262144,N,-999,Toys,1740,1380,223,28,1,Collectibles +31519,Computers/Tablets & Networking:Laptop & Desktop Accessories:Laptop Cases & Bags,3,,,,12,Computers,2012-05-01,2012-06-19 21:15:09,USER_X,USER_Y,58058,Computers/Tablets & Networking,31530,31519,31519,31519,31519,31519,Laptop & Desktop Accessories,Laptop Cases & Bags,Laptop Cases & Bags,Laptop Cases & Bags,Laptop Cases & Bags,Laptop Cases & Bags,262144,N,-999,Computers,6592,3189,31519,12,1,Electronics +155226,ClothinShoes & Accessories:Women's Clothing:Sweats & Hoodies,0,,,,9,Apparel,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11450,ClothinShoes & Accessories,15724,155226,155226,155226,155226,155226,Women's Clothing,Sweats & Hoodies,Sweats & Hoodies,Sweats & Hoodies,Sweats & Hoodies,Sweats & Hoodies,262144,N,-999,Clothing & Accessories,-999,-999,155226,9,1,Fashion +63889,ClothinShoes & Accessories:Women's Shoes:Mixed Items & Lots,0,,,,9,Apparel,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11450,ClothinShoes & Accessories,3034,63889,63889,63889,63889,63889,Women's Shoes,Mixed Items & Lots,Mixed Items & Lots,Mixed Items & Lots,Mixed Items & Lots,Mixed Items & Lots,262144,N,-999,Clothing & Accessories,-999,-999,63889,9,1,Fashion +314,ClothinShoes & Accessories:Women's Clothing:Other,0,,11450,Other,9,Apparel,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11450,ClothinShoes & Accessories,15724,314,314,314,314,314,Women's Clothing,Other,Other,Other,Other,Other,262144,N,-999,Clothing & Accessories,-999,-999,314,9,1,Fashion diff --git a/examples/test_case_data/localmeta/data/DEFAULT.TEST_KYLIN_FACT.csv b/examples/test_case_data/localmeta/data/DEFAULT.TEST_KYLIN_FACT.csv new file mode 100644 index 0000000..e03d72c --- /dev/null +++ b/examples/test_case_data/localmeta/data/DEFAULT.TEST_KYLIN_FACT.csv @@ -0,0 +1,402 @@ +10000000157,2013-03-31,Auction,48028,0,12,184.21,1,10000001 +10000000158,2013-11-12,Others,164262,0,5,172.03,1,10000002 +10000000161,2013-04-06,Auction,82494,15,14,66.6,1,10000003 +10000000137,2013-05-17,Auction,66767,15,12,92.98,1,10000004 +10000000147,2013-05-20,FP-GTC,152801,0,5,132.33,1,10000005 +10000000155,2013-06-16,FP-GTC,43398,0,13,7.12,1,10000006 +10000000170,2013-06-14,Auction,95173,0,14,204.28,1,10000007 +10000000173,2013-03-22,Auction,158666,15,13,35.72,1,10000008 +10000000178,2013-03-10,Auction,12688,0,12,4.13,1,10000009 +10000000163,2013-11-01,FP-GTC,103324,15,5,27.48,1,10000010 +10000000166,2013-06-16,FP-GTC,108782,15,14,9.26,1,10000011 +10000000167,2013-09-12,Auction,80287,0,12,3.18,1,10000012 +10000000086,2013-09-28,Others,140746,100,13,3.18,1,10000013 +10000000110,2013-06-15,ABIN,87118,0,14,377.94,1,10000014 +10000000113,2013-03-14,Auction,25147,0,12,146.33,1,10000015 +10000000069,2013-09-01,FP-GTC,170302,15,5,51.23,1,10000016 +10000000079,2013-05-29,FP-non GTC,53064,0,13,72.65,1,10000017 +10000000080,2013-05-31,Auction,132939,0,13,66.6,1,10000018 +10000000130,2013-03-18,Auction,113593,15,12,9.26,1,10000019 +10000000268,2013-07-19,Auction,34273,100,14,583.44,1,10000020 +10000000132,2013-06-23,FP-GTC,106340,15,14,638.72,1,10000021 +10000000115,2013-05-20,FP-GTC,150265,15,14,4.54,1,10000022 +10000000117,2013-05-17,FP-GTC,24760,0,12,319.79,1,10000023 +10000000118,2013-03-11,Auction,37831,0,12,20.35,1,10000024 +10000000223,2013-01-30,FP-non GTC,1120,3,5,223.63,1,10000025 +10000000224,2013-01-26,FP-GTC,43972,100,13,204.28,1,10000026 +10000000243,2013-03-22,Auction,166013,15,14,5.48,1,10000027 +10000000217,2013-07-23,Auction,15568,15,14,27.48,1,10000028 +10000000218,2013-07-27,FP-GTC,103178,15,5,21.72,1,10000029 +10000000221,2013-10-29,ABIN,2023,0,12,3.18,1,10000030 +10000000256,2013-10-08,FP-GTC,94847,0,11,491.32,1,10000031 +10000000257,2013-04-26,Auction,15868,0,14,448.8,1,10000032 +10000000263,2013-01-01,Auction,32876,0,13,415.73,1,10000033 +10000000245,2013-01-15,Auction,62179,0,13,377.94,1,10000034 +10000000248,2013-05-27,FP-GTC,33038,15,14,146.33,1,10000035 +10000000254,2013-11-11,FP-GTC,156614,0,5,7.12,1,10000036 +10000000192,2013-03-08,Auction,106246,0,13,42.99,1,10000037 +10000000196,2013-03-25,Auction,20865,0,13,12.85,1,10000038 +10000000203,2013-08-20,FP-GTC,15115,0,13,55.89,1,10000039 +10000000179,2013-05-17,FP-GTC,3838,0,14,73.26,1,10000040 +10000000183,2013-06-05,Auction,759,0,11,112.56,1,10000041 +10000000185,2013-10-08,FP-non GTC,61323,0,11,3.49,1,10000042 +10000000211,2013-08-14,Auction,121153,0,13,184.21,1,10000043 +10000000213,2013-08-14,Auction,88750,0,13,157.14,1,10000044 +10000000214,2013-05-17,FP-GTC,161567,15,14,72.65,1,10000045 +10000000204,2013-08-09,FP-GTC,113802,15,14,51.23,1,10000046 +10000000208,2013-06-30,FP-non GTC,15808,15,14,15.85,1,10000047 +10000000209,2013-06-03,FP-GTC,174053,3,13,7.12,1,10000048 +10000000042,2013-12-31,Auction,2635,0,14,12.04,1,10000049 +10000000044,2013-12-25,Auction,1161,3,13,73.26,1,10000050 +10000000022,2013-03-28,FP-non GTC,64076,0,5,184.21,1,10000051 +10000000023,2013-01-30,FP-GTC,33977,15,13,172.03,1,10000052 +10000000047,2013-12-05,FP-GTC,31673,0,14,122.78,1,10000053 +10000000056,2013-10-08,Auction,174106,3,14,92.98,1,10000054 +10000000062,2013-12-27,Auction,26249,0,13,12.19,1,10000055 +10000000053,2013-12-16,FP-GTC,159184,0,5,15.65,1,10000056 +10000000055,2013-10-17,FP-GTC,10058,3,11,101.79,1,10000057 +10000000020,2013-11-17,ABIN,48904,0,12,7.12,1,10000058 +10000000007,2013-09-18,FP-non GTC,145970,0,14,12.85,1,10000059 +10000000008,2013-06-30,FP-GTC,963,0,13,12.19,1,10000060 +10000000002,2013-10-12,FP-GTC,118687,3,13,92.98,1,10000061 +10000000003,2013-08-20,FP-GTC,20886,0,14,42.99,1,10000062 +10000000010,2013-08-29,Auction,148324,15,13,1.88,1,10000063 +10000000016,2013-07-17,Auction,139255,15,14,21.14,1,10000064 +10000000017,2013-07-23,FP-GTC,20213,0,5,21.14,1,10000065 +10000000012,2013-01-06,Auction,32996,15,13,132.33,1,10000066 +10000000013,2013-08-14,FP-GTC,99985,0,14,120.87,1,10000067 +10000000067,2013-08-10,Auction,67703,3,14,120.87,1,10000068 +10000000085,2013-09-28,FP-non GTC,65,0,11,9.26,1,10000069 +10000000141,2013-08-21,FP-non GTC,130,0,14,16.26,1,10000070 +10000000078,2013-03-11,FP-GTC,164,0,14,157.14,1,10000071 +10000000109,2013-05-06,FP-GTC,216,0,11,1.88,1,10000072 +10000000096,2013-05-17,FP-non GTC,223,0,5,12.04,1,10000073 +10000000095,2013-01-10,FP-non GTC,223,0,14,189.23,1,10000074 +10000000098,2013-05-05,FP-non GTC,223,0,5,73.26,1,10000075 +10000000097,2013-02-03,FP-non GTC,223,0,5,4.13,1,10000076 +10000000099,2013-11-26,FP-non GTC,223,0,5,290.72,1,10000077 +10000000100,2013-08-30,FP-non GTC,223,0,5,265.56,1,10000078 +10000000126,2013-04-26,FP-GTC,279,15,5,5.91,1,10000079 +10000000252,2013-06-30,Auction,314,0,5,319.79,1,10000080 +10000000052,2013-06-30,Auction,314,211,5,246,1,10000081 +10000000253,2013-12-16,Auction,314,211,5,20.35,1,10000082 +10000000051,2013-12-15,Auction,314,0,5,36.7,1,10000083 +10000000190,2013-08-17,Auction,533,0,13,101.79,1,10000084 +10000000251,2013-12-15,ABIN,1349,0,5,47.71,1,10000085 +10000000050,2013-02-04,ABIN,1349,0,5,3.49,1,10000086 +10000000049,2013-01-11,ABIN,1349,0,13,46.44,1,10000087 +10000000250,2013-02-04,ABIN,1349,0,13,4.54,1,10000088 +10000000131,2013-05-17,ABIN,1357,0,14,3.18,1,10000089 +10000000172,2013-11-12,FP-GTC,1504,0,14,86.58,1,10000090 +10000000142,2013-08-21,FP-GTC,4943,0,13,12.85,1,10000091 +10000000195,2013-05-09,ABIN,6762,0,13,16.26,1,10000092 +10000000070,2013-09-19,Auction,9426,3,13,21.14,1,10000093 +10000000165,2013-02-06,FP-non GTC,10866,0,14,20.6,1,10000094 +10000000187,2013-02-02,Auction,11554,0,13,246,1,10000095 +10000000189,2013-08-23,FP-GTC,11848,0,14,109,1,10000096 +10000000139,2013-08-03,Auction,13836,0,13,39.41,1,10000097 +10000000140,2013-05-17,Auction,13836,0,14,16.26,1,10000098 +10000000102,2013-06-06,FP-GTC,13987,0,13,112.56,1,10000099 +10000000076,2013-07-02,Auction,15687,0,14,184.21,1,10000100 +10000000082,2013-10-25,Auction,15687,0,11,27.48,1,10000001 +10000000129,2013-04-20,FP-non GTC,16145,3,12,26.45,1,10000002 +10000000128,2013-03-12,FP-non GTC,16145,0,13,415.73,1,10000003 +10000000222,2013-03-28,ABIN,16509,0,5,56.36,1,10000004 +10000000021,2013-10-29,ABIN,16509,0,5,2.44,1,10000005 +10000000134,2013-05-22,FP-GTC,20485,0,14,269.76,1,10000006 +10000000135,2013-01-25,FP-GTC,20485,101,12,109,1,10000007 +10000000136,2013-06-12,FP-GTC,20485,101,12,101.79,1,10000008 +10000000241,2013-12-26,Auction,23446,23,14,246,1,10000009 +10000000041,2013-12-26,Auction,23446,23,14,189.23,1,10000010 +10000000242,2013-12-31,Auction,23446,23,14,15.65,1,10000011 +10000000040,2013-10-04,Auction,23446,23,14,28.23,1,10000012 +10000000194,2013-03-16,FP-GTC,24541,0,5,16.26,1,10000013 +10000000101,2013-05-21,FP-GTC,26262,0,5,122.78,1,10000014 +10000000077,2013-01-28,FP-GTC,30059,3,14,172.03,1,10000015 +10000000057,2013-04-26,Auction,31387,3,14,42.99,1,10000016 +10000000258,2013-10-06,Auction,31387,3,14,207.5,1,10000017 +10000000261,2013-11-06,FP-GTC,31519,0,14,5.91,1,10000018 +10000000058,2013-10-06,FP-GTC,31519,3,14,39.41,1,10000019 +10000000059,2013-12-28,FP-GTC,31519,0,14,16.26,1,10000020 +10000000060,2013-11-06,FP-GTC,31519,0,14,16.26,1,10000021 +10000000260,2013-11-06,FP-GTC,31519,0,14,78.48,1,10000022 +10000000259,2013-12-28,FP-GTC,31519,3,14,190.22,1,10000023 +10000000156,2013-06-11,FP-GTC,35570,100,12,2.44,1,10000024 +10000000119,2013-01-10,Auction,36250,0,5,7.12,1,10000025 +10000000186,2013-09-17,FP-non GTC,38238,0,14,36.7,1,10000026 +10000000038,2013-08-14,FP-GTC,40059,3,14,35.72,1,10000027 +10000000239,2013-08-09,FP-GTC,40059,3,14,3.49,1,10000028 +10000000034,2013-12-02,FP-GTC,41940,0,13,223.63,1,10000029 +10000000235,2013-02-01,FP-GTC,41940,0,13,265.56,1,10000030 +10000000127,2013-07-28,FP-non GTC,43479,0,13,62.02,1,10000031 +10000000103,2013-06-16,FP-GTC,44079,0,12,46.44,1,10000032 +10000000201,2013-08-23,Auction,45238,101,14,132.33,1,10000033 +10000000122,2013-06-15,Auction,45333,0,13,448.8,1,10000034 +10000000123,2013-06-15,FP-non GTC,45333,0,14,207.5,1,10000035 +10000000124,2013-06-01,FP-non GTC,45333,0,14,190.22,1,10000036 +10000000072,2013-08-10,FP-GTC,46575,0,14,16.71,1,10000037 +10000000043,2013-03-22,FP-non GTC,50508,0,13,4.13,1,10000038 +10000000244,2013-12-25,FP-non GTC,50508,0,13,1.88,1,10000039 +10000000121,2013-07-22,FP-GTC,50677,0,13,491.32,1,10000040 +10000000120,2013-04-13,FP-GTC,50677,0,5,2.44,1,10000041 +10000000168,2013-04-16,Auction,51582,0,14,56.36,1,10000042 +10000000073,2013-08-21,FP-GTC,57013,0,13,15.85,1,10000043 +10000000075,2013-04-22,FP-non GTC,57013,0,14,2.44,1,10000044 +10000000074,2013-08-29,FP-GTC,57013,0,14,7.12,1,10000045 +10000000093,2013-05-16,Auction,57784,0,14,35.72,1,10000046 +10000000265,2013-08-23,Auction,57990,3,11,9.26,1,10000047 +10000000266,2013-07-10,Auction,57990,3,14,3.18,1,10000048 +10000000267,2013-08-10,Auction,57990,3,14,638.72,1,10000049 +10000000065,2013-08-23,Auction,57990,3,14,141.7,1,10000050 +10000000143,2013-04-18,ABIN,57990,0,13,12.19,1,10000051 +10000000066,2013-07-10,Auction,57990,3,14,132.33,1,10000052 +10000000144,2013-06-16,ABIN,57990,3,5,5.48,1,10000053 +10000000064,2013-07-15,Auction,57990,3,11,1.88,1,10000054 +10000000061,2013-11-06,FP-GTC,60340,0,14,12.85,1,10000055 +10000000262,2013-12-27,FP-GTC,60340,0,14,62.02,1,10000056 +10000000019,2013-07-29,FP-GTC,60606,3,12,15.85,1,10000057 +10000000220,2013-11-17,FP-GTC,60606,3,12,9.26,1,10000058 +10000000018,2013-07-27,FP-GTC,60606,3,12,16.71,1,10000059 +10000000219,2013-07-29,FP-GTC,60606,3,12,20.6,1,10000060 +10000000145,2013-01-09,Auction,63861,3,5,1.88,1,10000061 +10000000200,2013-06-11,ABIN,63861,0,5,141.7,1,10000062 +10000000199,2013-01-10,ABIN,63861,0,5,1.88,1,10000063 +10000000237,2013-09-16,Others,63861,0,11,112.56,1,10000064 +10000000036,2013-01-14,Others,63861,0,11,94.45,1,10000065 +10000000125,2013-05-17,Auction,63861,0,14,78.48,1,10000066 +10000000198,2013-06-05,ABIN,63861,0,13,5.48,1,10000067 +10000000094,2013-05-24,Auction,63864,3,14,28.23,1,10000068 +10000000104,2013-05-15,Others,63889,0,13,3.49,1,10000069 +10000000107,2013-03-25,FP-GTC,67698,2,11,15.65,1,10000070 +10000000108,2013-03-09,FP-GTC,67698,0,11,5.48,1,10000071 +10000000106,2013-12-05,FP-GTC,67698,0,11,246,1,10000072 +10000000182,2013-04-18,FP-non GTC,73506,0,13,122.78,1,10000073 +10000000169,2013-11-01,FP-GTC,75665,0,14,223.63,1,10000074 +10000000146,2013-05-03,ABIN,75708,3,5,141.7,1,10000075 +10000000151,2013-04-21,FP-non GTC,80053,0,11,21.14,1,10000076 +10000000149,2013-03-12,FP-non GTC,80053,0,11,55.89,1,10000077 +10000000150,2013-05-19,FP-non GTC,80053,0,11,51.23,1,10000078 +10000000083,2013-11-23,Auction,80135,0,14,21.72,1,10000079 +10000000089,2013-10-19,Auction,95672,3,14,204.28,1,10000080 +10000000152,2013-05-18,Others,95672,0,11,21.14,1,10000081 +10000000035,2013-02-01,Others,100847,0,5,204.28,1,10000082 +10000000236,2013-01-14,Others,100847,0,5,122.78,1,10000083 +10000000090,2013-08-05,ABIN,139973,3,14,94.45,1,10000084 +10000000091,2013-05-19,ABIN,139973,0,11,86.58,1,10000085 +10000000033,2013-12-01,Auction,150047,3,14,56.36,1,10000086 +10000000234,2013-12-02,Auction,150047,3,14,290.72,1,10000087 +10000000249,2013-01-11,FP-GTC,155226,0,13,60.37,1,10000088 +10000000048,2013-05-27,FP-GTC,155226,0,13,112.56,1,10000089 +10000000181,2013-09-01,FP-GTC,156356,0,13,265.56,1,10000090 +10000000092,2013-04-11,FP-GTC,158798,0,11,35.72,1,10000091 +10000000191,2013-05-05,FP-non GTC,165888,0,13,92.98,1,10000092 +10000000229,2013-11-21,Auction,170083,3,11,28.23,1,10000093 +10000000028,2013-10-07,Auction,170083,3,11,27.48,1,10000094 +10000000031,2013-07-12,Auction,175750,3,14,9.26,1,10000095 +10000000032,2013-06-07,Auction,175750,3,14,3.18,1,10000096 +10000000177,2013-05-22,FP-GTC,175750,0,14,12.04,1,10000097 +10000000030,2013-11-28,Auction,175750,3,13,20.6,1,10000098 +10000000231,2013-07-12,Auction,175750,3,13,12.04,1,10000099 +10000000232,2013-06-07,Auction,175750,3,14,4.13,1,10000100 +10000000233,2013-12-01,Auction,175750,3,14,73.26,1,10000201 +10000000002,2012-10-12,Auction,48027,0,12,184.21,1,10000001 +10000000003,2012-08-20,Others,164261,0,5,172.03,1,10000002 +10000000007,2012-09-18,Auction,82494,15,14,66.6,1,10000003 +10000000008,2012-06-30,Auction,66767,15,12,92.98,1,10000004 +10000000010,2012-08-29,FP-GTC,152801,0,5,132.33,1,10000005 +10000000012,2012-01-06,FP-GTC,43398,0,13,7.12,1,10000006 +10000000013,2012-08-14,Auction,95173,0,14,204.28,1,10000007 +10000000016,2012-07-17,Auction,158666,15,13,35.72,1,10000008 +10000000017,2012-07-23,Auction,12688,0,12,4.13,1,10000009 +10000000018,2012-07-27,FP-GTC,103324,15,5,27.48,1,10000010 +10000000019,2012-07-29,FP-GTC,108782,15,14,9.26,1,10000011 +10000000020,2012-11-17,Auction,80287,0,12,3.18,1,10000012 +10000000021,2012-10-29,Others,140746,100,13,3.18,1,10000013 +10000000022,2012-03-28,ABIN,87118,0,14,377.94,1,10000014 +10000000023,2012-01-30,Auction,25147,0,12,146.33,1,10000015 +10000000028,2012-10-07,FP-GTC,170302,15,5,51.23,1,10000016 +10000000030,2012-11-28,FP-non GTC,53064,0,13,72.65,1,10000017 +10000000031,2012-07-12,Auction,132939,0,13,66.6,1,10000018 +10000000032,2012-06-07,Auction,113593,15,12,9.26,1,10000019 +10000000033,2012-12-01,Auction,34273,100,14,583.44,1,10000020 +10000000034,2012-12-02,FP-GTC,106340,15,14,638.72,1,10000021 +10000000035,2012-02-01,FP-GTC,150265,15,14,4.54,1,10000022 +10000000036,2012-01-14,FP-GTC,24760,0,12,319.79,1,10000023 +10000000038,2012-08-14,Auction,37831,0,12,20.35,1,10000024 +10000000040,2012-10-04,FP-non GTC,1120,3,5,223.63,1,10000025 +10000000041,2012-12-26,FP-GTC,43972,100,13,204.28,1,10000026 +10000000042,2012-12-31,Auction,166013,15,14,5.48,1,10000027 +10000000043,2012-03-22,Auction,15568,15,14,27.48,1,10000028 +10000000044,2012-12-25,FP-GTC,103178,15,5,21.72,1,10000029 +10000000047,2012-12-05,ABIN,2023,0,12,3.18,1,10000030 +10000000048,2012-05-27,FP-GTC,94847,0,11,491.32,1,10000031 +10000000049,2012-01-11,Auction,15868,0,14,448.8,1,10000032 +10000000050,2012-02-04,Auction,32876,0,13,415.73,1,10000033 +10000000051,2012-12-15,Auction,62179,0,13,377.94,1,10000034 +10000000052,2012-06-30,FP-GTC,33038,15,14,146.33,1,10000035 +10000000053,2012-12-16,FP-GTC,156614,0,5,7.12,1,10000036 +10000000055,2012-10-17,Auction,106246,0,13,42.99,1,10000037 +10000000056,2012-10-08,Auction,20865,0,13,12.85,1,10000038 +10000000057,2012-04-26,FP-GTC,15115,0,13,55.89,1,10000039 +10000000058,2012-10-06,FP-GTC,3838,0,14,73.26,1,10000040 +10000000059,2012-12-28,Auction,759,0,11,112.56,1,10000041 +10000000060,2012-11-06,FP-non GTC,61323,0,11,3.49,1,10000042 +10000000061,2012-11-06,Auction,121153,0,13,184.21,1,10000043 +10000000062,2012-12-27,Auction,88750,0,13,157.14,1,10000044 +10000000064,2012-07-15,FP-GTC,161567,15,14,72.65,1,10000045 +10000000065,2012-08-23,FP-GTC,113802,15,14,51.23,1,10000046 +10000000066,2012-07-10,FP-non GTC,15808,15,14,15.85,1,10000047 +10000000067,2012-08-10,FP-GTC,174053,3,13,7.12,1,10000048 +10000000069,2012-09-01,Auction,2635,0,14,12.04,1,10000049 +10000000070,2012-09-19,Auction,1161,3,13,73.26,1,10000050 +10000000072,2012-08-10,FP-non GTC,64076,0,5,184.21,1,10000051 +10000000073,2012-08-21,FP-GTC,33977,15,13,172.03,1,10000052 +10000000074,2012-08-29,FP-GTC,31673,0,14,122.78,1,10000053 +10000000075,2012-04-22,Auction,174106,3,14,92.98,1,10000054 +10000000076,2012-07-02,Auction,26249,0,13,12.19,1,10000055 +10000000077,2012-01-28,FP-GTC,159184,0,5,15.65,1,10000056 +10000000078,2012-03-11,FP-GTC,10058,3,11,101.79,1,10000057 +10000000079,2012-05-29,ABIN,48904,0,12,7.12,1,10000058 +10000000080,2012-05-31,FP-non GTC,145970,0,14,12.85,1,10000059 +10000000082,2012-10-25,FP-GTC,963,0,13,12.19,1,10000060 +10000000083,2012-11-23,FP-GTC,118687,3,13,92.98,1,10000061 +10000000085,2012-09-28,FP-GTC,20886,0,14,42.99,1,10000062 +10000000086,2012-09-28,Auction,148324,15,13,1.88,1,10000063 +10000000089,2012-10-19,Auction,139255,15,14,21.14,1,10000064 +10000000090,2012-08-05,FP-GTC,20213,0,5,21.14,1,10000065 +10000000091,2012-05-19,Auction,32996,15,13,132.33,1,10000066 +10000000092,2012-04-11,FP-GTC,99985,0,14,120.87,1,10000067 +10000000093,2012-05-16,Auction,67703,3,14,120.87,1,10000068 +10000000094,2012-05-24,FP-non GTC,65,0,11,9.26,1,10000069 +10000000095,2012-01-10,FP-non GTC,130,0,14,16.26,1,10000070 +10000000096,2012-05-17,FP-GTC,164,0,14,157.14,1,10000071 +10000000097,2012-02-03,FP-GTC,216,0,11,1.88,1,10000072 +10000000098,2012-05-05,FP-non GTC,223,0,5,12.04,1,10000073 +10000000099,2012-11-26,FP-non GTC,223,0,14,189.23,1,10000074 +10000000100,2012-08-30,FP-non GTC,223,0,5,73.26,1,10000075 +10000000101,2012-05-21,FP-non GTC,223,0,5,4.13,1,10000076 +10000000102,2012-06-06,FP-non GTC,223,0,5,290.72,1,10000077 +10000000103,2012-06-16,FP-non GTC,223,0,5,265.56,1,10000078 +10000000104,2012-05-15,FP-GTC,279,15,5,5.91,1,10000079 +10000000106,2012-12-05,Auction,314,0,5,319.79,1,10000080 +10000000107,2012-03-25,Auction,314,211,5,246,1,10000081 +10000000108,2012-03-09,Auction,314,211,5,20.35,1,10000082 +10000000109,2012-05-06,Auction,314,0,5,36.7,1,10000083 +10000000110,2012-06-15,Auction,533,0,13,101.79,1,10000084 +10000000113,2012-03-14,ABIN,1349,0,5,47.71,1,10000085 +10000000115,2012-05-20,ABIN,1349,0,5,3.49,1,10000086 +10000000117,2012-05-17,ABIN,1349,0,13,46.44,1,10000087 +10000000118,2012-03-11,ABIN,1349,0,13,4.54,1,10000088 +10000000119,2012-01-10,ABIN,1357,0,14,3.18,1,10000089 +10000000120,2012-04-13,FP-GTC,1504,0,14,86.58,1,10000090 +10000000121,2012-07-22,FP-GTC,4943,0,13,12.85,1,10000091 +10000000122,2012-06-15,ABIN,6762,0,13,16.26,1,10000092 +10000000123,2012-06-15,Auction,9426,3,13,21.14,1,10000093 +10000000124,2012-06-01,FP-non GTC,10866,0,14,20.6,1,10000094 +10000000125,2012-05-17,Auction,11554,0,13,246,1,10000095 +10000000126,2012-04-26,FP-GTC,11848,0,14,109,1,10000096 +10000000127,2012-07-28,Auction,13836,0,13,39.41,1,10000097 +10000000128,2012-03-12,Auction,13836,0,14,16.26,1,10000098 +10000000129,2012-04-20,FP-GTC,13987,0,13,112.56,1,10000099 +10000000130,2012-03-18,Auction,15687,0,14,184.21,1,10000100 +10000000131,2012-05-17,Auction,15687,0,11,27.48,1,10000001 +10000000132,2012-06-23,FP-non GTC,16145,3,12,26.45,1,10000002 +10000000134,2012-05-22,FP-non GTC,16145,0,13,415.73,1,10000003 +10000000135,2012-01-25,ABIN,16509,0,5,56.36,1,10000004 +10000000136,2012-06-12,ABIN,16509,0,5,2.44,1,10000005 +10000000137,2012-05-17,FP-GTC,20485,0,14,269.76,1,10000006 +10000000139,2012-08-03,FP-GTC,20485,101,12,109,1,10000007 +10000000140,2012-05-17,FP-GTC,20485,101,12,101.79,1,10000008 +10000000141,2012-08-21,Auction,23446,23,14,246,1,10000009 +10000000142,2012-08-21,Auction,23446,23,14,189.23,1,10000010 +10000000143,2012-04-18,Auction,23446,23,14,15.65,1,10000011 +10000000144,2012-06-16,Auction,23446,23,14,28.23,1,10000012 +10000000145,2012-01-09,FP-GTC,24541,0,5,16.26,1,10000013 +10000000146,2012-05-03,FP-GTC,26262,0,5,122.78,1,10000014 +10000000147,2012-05-20,FP-GTC,30059,3,14,172.03,1,10000015 +10000000149,2012-03-12,Auction,31387,3,14,42.99,1,10000016 +10000000150,2012-05-19,Auction,31387,3,14,207.5,1,10000017 +10000000151,2012-04-21,FP-GTC,31519,0,14,5.91,1,10000018 +10000000152,2012-05-18,FP-GTC,31519,3,14,39.41,1,10000019 +10000000155,2012-06-16,FP-GTC,31519,0,14,16.26,1,10000020 +10000000156,2012-06-11,FP-GTC,31519,0,14,16.26,1,10000021 +10000000157,2012-03-31,FP-GTC,31519,0,14,78.48,1,10000022 +10000000158,2012-11-12,FP-GTC,31519,3,14,190.22,1,10000023 +10000000161,2012-04-06,FP-GTC,35570,100,12,2.44,1,10000024 +10000000163,2012-11-01,Auction,36250,0,5,7.12,1,10000025 +10000000165,2012-02-06,FP-non GTC,38238,0,14,36.7,1,10000026 +10000000166,2012-06-16,FP-GTC,40059,3,14,35.72,1,10000027 +10000000167,2012-09-12,FP-GTC,40059,3,14,3.49,1,10000028 +10000000168,2012-04-16,FP-GTC,41940,0,13,223.63,1,10000029 +10000000169,2012-11-01,FP-GTC,41940,0,13,265.56,1,10000030 +10000000170,2012-06-14,FP-non GTC,43479,0,13,62.02,1,10000031 +10000000172,2012-11-12,FP-GTC,44079,0,12,46.44,1,10000032 +10000000173,2012-03-22,Auction,45238,101,14,132.33,1,10000033 +10000000177,2012-05-22,Auction,45333,0,13,448.8,1,10000034 +10000000178,2012-03-10,FP-non GTC,45333,0,14,207.5,1,10000035 +10000000179,2012-05-17,FP-non GTC,45333,0,14,190.22,1,10000036 +10000000181,2012-09-01,FP-GTC,46575,0,14,16.71,1,10000037 +10000000182,2012-04-18,FP-non GTC,50508,0,13,4.13,1,10000038 +10000000183,2012-06-05,FP-non GTC,50508,0,13,1.88,1,10000039 +10000000185,2012-10-08,FP-GTC,50677,0,13,491.32,1,10000040 +10000000186,2012-09-17,FP-GTC,50677,0,5,2.44,1,10000041 +10000000187,2012-02-02,Auction,51582,0,14,56.36,1,10000042 +10000000189,2012-08-23,FP-GTC,57013,0,13,15.85,1,10000043 +10000000190,2012-08-17,FP-non GTC,57013,0,14,2.44,1,10000044 +10000000191,2012-05-05,FP-GTC,57013,0,14,7.12,1,10000045 +10000000192,2012-03-08,Auction,57784,0,14,35.72,1,10000046 +10000000194,2012-03-16,Auction,57990,3,11,9.26,1,10000047 +10000000195,2012-05-09,Auction,57990,3,14,3.18,1,10000048 +10000000196,2012-03-25,Auction,57990,3,14,638.72,1,10000049 +10000000198,2012-06-05,Auction,57990,3,14,141.7,1,10000050 +10000000199,2012-01-10,ABIN,57990,0,13,12.19,1,10000051 +10000000200,2012-06-11,Auction,57990,3,14,132.33,1,10000052 +10000000201,2012-08-23,ABIN,57990,3,5,5.48,1,10000053 +10000000203,2012-08-20,Auction,57990,3,11,1.88,1,10000054 +10000000204,2012-08-09,FP-GTC,60340,0,14,12.85,1,10000055 +10000000208,2012-06-30,FP-GTC,60340,0,14,62.02,1,10000056 +10000000209,2012-06-03,FP-GTC,60606,3,12,15.85,1,10000057 +10000000211,2012-08-14,FP-GTC,60606,3,12,9.26,1,10000058 +10000000213,2012-08-14,FP-GTC,60606,3,12,16.71,1,10000059 +10000000214,2012-05-17,FP-GTC,60606,3,12,20.6,1,10000060 +10000000217,2012-07-23,Auction,63861,3,5,1.88,1,10000061 +10000000218,2012-07-27,ABIN,63861,0,5,141.7,1,10000062 +10000000219,2012-07-29,ABIN,63861,0,5,1.88,1,10000063 +10000000220,2012-11-17,Others,63861,0,11,112.56,1,10000064 +10000000221,2012-10-29,Others,63861,0,11,94.45,1,10000065 +10000000222,2012-03-28,Auction,63861,0,14,78.48,1,10000066 +10000000223,2012-01-30,ABIN,63861,0,13,5.48,1,10000067 +10000000224,2012-01-26,Auction,63864,3,14,28.23,1,10000068 +10000000229,2012-11-21,Others,63889,0,13,3.49,1,10000069 +10000000231,2012-07-12,FP-GTC,67698,2,11,15.65,1,10000070 +10000000232,2012-06-07,FP-GTC,67698,0,11,5.48,1,10000071 +10000000233,2012-12-01,FP-GTC,67698,0,11,246,1,10000072 +10000000234,2012-12-02,FP-non GTC,73506,0,13,122.78,1,10000073 +10000000235,2012-02-01,FP-GTC,75665,0,14,223.63,1,10000074 +10000000236,2012-01-14,ABIN,75708,3,5,141.7,1,10000075 +10000000237,2012-09-16,FP-non GTC,80053,0,11,21.14,1,10000076 +10000000239,2012-08-09,FP-non GTC,80053,0,11,55.89,1,10000077 +10000000241,2012-12-26,FP-non GTC,80053,0,11,51.23,1,10000078 +10000000242,2012-12-31,Auction,80135,0,14,21.72,1,10000079 +10000000243,2012-03-22,Auction,95672,3,14,204.28,1,10000080 +10000000244,2012-12-25,Others,95672,0,11,21.14,1,10000081 +10000000245,2012-01-15,Others,100847,0,5,204.28,1,10000082 +10000000248,2012-05-27,Others,100847,0,5,122.78,1,10000083 +10000000249,2012-01-11,ABIN,139973,3,14,94.45,1,10000084 +10000000250,2012-02-04,ABIN,139973,0,11,86.58,1,10000085 +10000000251,2012-12-15,Auction,150047,3,14,56.36,1,10000086 +10000000252,2012-06-30,Auction,150047,3,14,290.72,1,10000087 +10000000253,2012-12-16,FP-GTC,155226,0,13,60.37,1,10000088 +10000000254,2012-11-11,FP-GTC,155226,0,13,112.56,1,10000089 +10000000256,2012-10-08,FP-GTC,156356,0,13,265.56,1,10000090 +10000000257,2012-04-26,FP-GTC,158798,0,11,35.72,1,10000091 +10000000258,2012-10-06,FP-non GTC,165888,0,13,92.98,1,10000092 +10000000259,2012-12-28,Auction,170083,3,11,28.23,1,10000093 +10000000260,2012-11-06,Auction,170083,3,11,27.48,1,10000094 +10000000261,2012-11-06,Auction,175750,3,14,9.26,1,10000095 +10000000262,2012-12-27,Auction,175750,3,14,3.18,1,10000096 +10000000263,2012-01-01,FP-GTC,175750,0,14,12.04,1,10000097 +10000000265,2012-08-23,Auction,175750,3,13,20.6,1,10000098 +10000000266,2012-07-10,Auction,175750,3,13,12.04,1,10000099 +10000000267,2012-08-10,Auction,175750,3,14,4.13,1,10000100 +10000000268,2012-07-19,Auction,175750,3,14,73.26,1,10000201 diff --git a/examples/test_case_data/localmeta/data/EDW.TEST_CAL_DT.csv b/examples/test_case_data/localmeta/data/EDW.TEST_CAL_DT.csv new file mode 100644 index 0000000..67efe23 --- /dev/null +++ b/examples/test_case_data/localmeta/data/EDW.TEST_CAL_DT.csv @@ -0,0 +1,731 @@ +2012-08-16,2012-01-01,2012-07-01,2012-08-01,2012-08-11,0,-1,-3,-15,-103,0,-1,-4,-15,-15,41501,228,47,16,6,33,5928,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-17,16-Aug-2012,Aug 16th 2012,Fri 08-16-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-11,2012-08-12,2012-08-16,Fri ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,33,2012,2012-08-11,2012-08-17,N,Wk.33 - 13,2012-08-11 00:00:00,2012-08-17 00:00:00,2012W33 ,2012W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2012,N,2012-08-16,2011-08-16,2012-05-16,2012-02-16,2012-07-16,2012-06-16,2012-08-09,2012-08-02,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-03,2012-01-01,2012-01-01,2012-01-01,2012-01-01,0,-3,-10,-47,-328,0,-3,-11,-47,-47,41276,3,3,3,5,1,5896,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-05,03-Jan-2012,Jan 3rd 2012,Thu 01-03-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2012-01-03,Thu ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,1,2012,2012-12-30,2012-01-05,N,Wk.01 - 13,2012-01-01 00:00:00,2012-01-05 00:00:00,2012W01 ,2012W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2012,N,2012-01-03,2011-01-03,2012-10-03,2012-07-03,2012-12-03,2012-11-03,2012-12-27,2012-12-20,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-10,2012-01-01,2012-04-01,2012-04-01,2012-04-07,0,-2,-7,-33,-231,0,-2,-8,-33,-33,41373,100,10,10,4,15,5910,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-13,10-Apr-2012,Apr 10th 2012,Wed 04-10-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-07,2012-04-08,2012-04-10,Wed ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,15,2012,2012-04-07,2012-04-13,N,Wk.15 - 13,2012-04-07 00:00:00,2012-04-13 00:00:00,2012W15 ,2012W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2012,N,2012-04-10,2011-04-10,2012-01-10,2012-10-10,2012-03-10,2012-02-10,2012-04-03,2012-03-27,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-12,2012-01-01,2012-04-01,2012-06-01,2012-06-09,0,-2,-5,-24,-168,0,-2,-6,-24,-24,41436,163,73,12,4,24,5919,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-15,12-Jun-2012,Jun 12th 2012,Wed 06-12-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-09,2012-06-10,2012-06-12,Wed ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,24,2012,2012-06-09,2012-06-15,N,Wk.24 - 13,2012-06-09 00:00:00,2012-06-15 00:00:00,2012W24 ,2012W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2012,N,2012-06-12,2011-06-12,2012-03-12,2012-12-12,2012-05-12,2012-04-12,2012-06-05,2012-05-29,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-27,2012-01-01,2012-04-01,2012-04-01,2012-04-21,0,-2,-7,-31,-214,0,-2,-8,-31,-31,41390,117,27,27,7,17,5912,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-27,27-Apr-2012,Apr 27th 2012,Sat 04-27-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-21,2012-04-22,2012-04-27,Sat ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,17,2012,2012-04-21,2012-04-27,N,Wk.17 - 13,2012-04-21 00:00:00,2012-04-27 00:00:00,2012W17 ,2012W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2012,N,2012-04-27,2011-04-27,2012-01-27,2012-10-27,2012-03-27,2012-02-27,2012-04-20,2012-04-13,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-19,2012-01-01,2012-07-01,2012-09-01,2012-09-15,0,-1,-2,-10,-69,0,-1,-3,-10,-10,41535,262,81,19,5,38,5933,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-21,19-Sep-2012,Sep 19th 2012,Thu 09-19-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-15,2012-09-16,2012-09-19,Thu ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,38,2012,2012-09-15,2012-09-21,N,Wk.38 - 13,2012-09-15 00:00:00,2012-09-21 00:00:00,2012W38 ,2012W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2012,N,2012-09-19,2011-09-19,2012-06-19,2012-03-19,2012-08-19,2012-07-19,2012-09-12,2012-09-05,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-07,2012-01-01,2012-01-01,2012-03-01,2012-03-03,0,-3,-8,-38,-265,0,-3,-9,-38,-38,41339,66,66,7,5,10,5905,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-09,07-Mar-2012,Mar 7th 2012,Thu 03-07-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-03,2012-03-04,2012-03-07,Thu ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,10,2012,2012-03-03,2012-03-09,N,Wk.10 - 13,2012-03-03 00:00:00,2012-03-09 00:00:00,2012W10 ,2012W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2012,N,2012-03-07,2011-03-07,2012-12-07,2012-09-07,2012-02-07,2012-01-07,2012-02-28,2012-02-21,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-28,2012-01-01,2012-01-01,2012-03-01,2012-03-24,0,-3,-8,-35,-244,0,-3,-9,-35,-35,41360,87,87,28,5,13,5908,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-30,28-Mar-2012,Mar 28th 2012,Thu 03-28-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-24,2012-03-25,2012-03-28,Thu ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,13,2012,2012-03-24,2012-03-30,N,Wk.13 - 13,2012-03-24 00:00:00,2012-03-30 00:00:00,2012W13 ,2012W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2012,N,2012-03-28,2011-03-28,2012-12-28,2012-09-28,2012-02-28,2012-01-28,2012-03-21,2012-03-14,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-23,2012-01-01,2012-10-01,2012-11-01,2012-11-17,0,0,0,-1,-4,0,0,-1,-1,-1,41600,327,54,23,7,47,5942,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-23,23-Nov-2012,Nov 23rd 2012,Sat 11-23-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-17,2012-11-18,2012-11-23,Sat ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,47,2012,2012-11-17,2012-11-23,N,Wk.47 - 13,2012-11-17 00:00:00,2012-11-23 00:00:00,2012W47 ,2012W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2012,N,2012-11-23,2011-11-23,2012-08-23,2012-05-23,2012-10-23,2012-09-23,2012-11-16,2012-11-09,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-09,2012-01-01,2012-01-01,2012-03-01,2012-03-03,0,-3,-8,-38,-263,0,-3,-9,-38,-38,41341,68,68,9,7,10,5905,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-09,09-Mar-2012,Mar 9th 2012,Sat 03-09-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-03,2012-03-04,2012-03-09,Sat ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,10,2012,2012-03-03,2012-03-09,N,Wk.10 - 13,2012-03-03 00:00:00,2012-03-09 00:00:00,2012W10 ,2012W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2012,N,2012-03-09,2011-03-09,2012-12-09,2012-09-09,2012-02-09,2012-01-09,2012-03-02,2012-02-23,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-21,2012-01-01,2012-10-01,2012-11-01,2012-11-17,0,0,0,-1,-6,0,0,-1,-1,-1,41598,325,52,21,5,47,5942,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-23,21-Nov-2012,Nov 21st 2012,Thu 11-21-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-17,2012-11-18,2012-11-21,Thu ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,47,2012,2012-11-17,2012-11-23,N,Wk.47 - 13,2012-11-17 00:00:00,2012-11-23 00:00:00,2012W47 ,2012W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2012,N,2012-11-21,2011-11-21,2012-08-21,2012-05-21,2012-10-21,2012-09-21,2012-11-14,2012-11-07,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-26,2012-01-01,2012-01-01,2012-03-01,2012-03-24,0,-3,-8,-35,-246,0,-3,-9,-35,-35,41358,85,85,26,3,13,5908,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-30,26-Mar-2012,Mar 26th 2012,Tue 03-26-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-24,2012-03-25,2012-03-26,Tue ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,13,2012,2012-03-24,2012-03-30,N,Wk.13 - 13,2012-03-24 00:00:00,2012-03-30 00:00:00,2012W13 ,2012W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2012,N,2012-03-26,2011-03-26,2012-12-26,2012-09-26,2012-02-26,2012-01-26,2012-03-19,2012-03-12,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-24,2012-01-01,2012-01-01,2012-01-01,2012-01-20,0,-3,-10,-44,-307,0,-3,-11,-44,-44,41297,24,24,24,5,4,5899,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-26,24-Jan-2012,Jan 24th 2012,Thu 01-24-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-20,2012-01-21,2012-01-24,Thu ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,4,2012,2012-01-20,2012-01-26,N,Wk.04 - 13,2012-01-20 00:00:00,2012-01-26 00:00:00,2012W04 ,2012W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2012,N,2012-01-24,2011-01-24,2012-10-24,2012-07-24,2012-12-24,2012-11-24,2012-01-17,2012-01-10,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-01,2012-01-01,2012-01-01,2012-01-01,2012-01-01,0,-3,-10,-47,-330,0,-3,-11,-47,-47,41274,1,1,1,3,1,5896,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-05,01-Jan-2012,Jan 1st 2012,Tue 01-01-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2012-01-01,Tue ,2012M01,Jan-2012,Y,2012M01 ,Y,Year 2012 - Quarter 01,2012Q01 ,Y,1,2012,2012-12-30,2012-01-05,Y,Wk.01 - 13,2012-01-01 00:00:00,2012-01-05 00:00:00,2012W01 ,2012W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2012,Y,2012-01-01,2011-01-01,2012-10-01,2012-07-01,2012-12-01,2012-11-01,2012-12-25,2012-12-18,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-29,2012-01-01,2012-04-01,2012-04-01,2012-04-28,0,-2,-7,-30,-212,0,-2,-7,-30,-30,41392,119,29,29,2,18,5913,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-05-04,29-Apr-2012,Apr 29th 2012,Mon 04-29-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-04-28,2012-04-28,2012-04-29,2012-04-29,Mon ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,18,2012,2012-04-28,2012-05-04,N,Wk.18 - 13,2012-04-28 00:00:00,2012-05-04 00:00:00,2012W18 ,2012W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2012,N,2012-04-29,2011-04-29,2012-01-29,2012-10-29,2012-03-29,2012-02-28,2012-04-22,2012-04-15,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-11,2012-01-01,2012-04-01,2012-05-01,2012-05-05,0,-2,-6,-29,-200,0,-2,-7,-29,-29,41404,131,41,11,7,19,5914,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-11,11-May-2012,May 11th 2012,Sat 05-11-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-05,2012-05-06,2012-05-11,Sat ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,19,2012,2012-05-05,2012-05-11,N,Wk.19 - 13,2012-05-05 00:00:00,2012-05-11 00:00:00,2012W19 ,2012W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2012,N,2012-05-11,2011-05-11,2012-02-11,2012-11-11,2012-04-11,2012-03-11,2012-05-04,2012-04-27,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-01,2012-01-01,2012-10-01,2012-10-01,2012-09-29,0,0,-1,-8,-57,0,0,-2,-8,-8,41547,274,1,1,3,40,5935,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-05,01-Oct-2012,Oct 1st 2012,Tue 10-01-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-09-29,2012-09-30,2012-10-01,Tue ,2012M10,Oct-2012,Y,2012M10 ,Y,Year 2012 - Quarter 04,2012Q04 ,Y,40,2012,2012-09-29,2012-10-05,N,Wk.40 - 13,2012-09-29 00:00:00,2012-10-05 00:00:00,2012W40 ,2012W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2012,N,2012-10-01,2011-10-01,2012-07-01,2012-04-01,2012-09-01,2012-08-01,2012-09-24,2012-09-17,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-05,2012-01-01,2012-10-01,2012-12-01,2012-12-01,0,0,1,1,8,0,0,0,1,1,41612,339,66,5,5,49,5944,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-07,05-Dec-2012,Dec 5th 2012,Thu 12-05-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-01,2012-12-02,2012-12-05,Thu ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,49,2012,2012-12-01,2012-12-07,N,Wk.49 - 13,2012-12-01 00:00:00,2012-12-07 00:00:00,2012W49 ,2012W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2012,N,2012-12-05,2011-12-05,2012-09-05,2012-06-05,2012-11-05,2012-10-05,2012-11-28,2012-11-21,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-05,2012-01-01,2012-01-01,2012-03-01,2012-03-03,0,-3,-8,-38,-267,0,-3,-9,-38,-38,41337,64,64,5,3,10,5905,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-09,05-Mar-2012,Mar 5th 2012,Tue 03-05-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-03,2012-03-04,2012-03-05,Tue ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,10,2012,2012-03-03,2012-03-09,N,Wk.10 - 13,2012-03-03 00:00:00,2012-03-09 00:00:00,2012W10 ,2012W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2012,N,2012-03-05,2011-03-05,2012-12-05,2012-09-05,2012-02-05,2012-01-05,2012-02-26,2012-02-19,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-03,2012-01-01,2012-10-01,2012-10-01,2012-09-29,0,0,-1,-8,-55,0,0,-2,-8,-8,41549,276,3,3,5,40,5935,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-05,03-Oct-2012,Oct 3rd 2012,Thu 10-03-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-09-29,2012-09-30,2012-10-03,Thu ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,40,2012,2012-09-29,2012-10-05,N,Wk.40 - 13,2012-09-29 00:00:00,2012-10-05 00:00:00,2012W40 ,2012W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2012,N,2012-10-03,2011-10-03,2012-07-03,2012-04-03,2012-09-03,2012-08-03,2012-09-26,2012-09-19,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-22,2012-01-01,2012-01-01,2012-01-01,2012-01-20,0,-3,-10,-44,-309,0,-3,-11,-44,-44,41295,22,22,22,3,4,5899,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-26,22-Jan-2012,Jan 22nd 2012,Tue 01-22-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-20,2012-01-21,2012-01-22,Tue ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,4,2012,2012-01-20,2012-01-26,N,Wk.04 - 13,2012-01-20 00:00:00,2012-01-26 00:00:00,2012W04 ,2012W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2012,N,2012-01-22,2011-01-22,2012-10-22,2012-07-22,2012-12-22,2012-11-22,2012-01-15,2012-01-08,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-26,2012-01-01,2012-10-01,2012-12-01,2012-12-22,0,0,1,4,29,0,0,0,4,4,41633,360,87,26,5,52,5947,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-28,26-Dec-2012,Dec 26th 2012,Thu 12-26-13,0,0,0,0,2012-12-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-22,2012-12-23,2012-12-26,Thu ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,52,2012,2012-12-22,2012-12-28,N,Wk.52 - 13,2012-12-22 00:00:00,2012-12-28 00:00:00,2012W52 ,2012W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2012,N,2012-12-26,2011-12-26,2012-09-26,2012-06-26,2012-11-26,2012-10-26,2012-12-19,2012-12-12,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-17,2012-01-01,2012-07-01,2012-09-01,2012-09-15,0,-1,-2,-10,-71,0,-1,-3,-10,-10,41533,260,79,17,3,38,5933,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-21,17-Sep-2012,Sep 17th 2012,Tue 09-17-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-15,2012-09-16,2012-09-17,Tue ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,38,2012,2012-09-15,2012-09-21,N,Wk.38 - 13,2012-09-15 00:00:00,2012-09-21 00:00:00,2012W38 ,2012W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2012,N,2012-09-17,2011-09-17,2012-06-17,2012-03-17,2012-08-17,2012-07-17,2012-09-10,2012-09-03,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-20,2012-01-01,2012-10-01,2012-10-01,2012-10-20,0,0,-1,-5,-38,0,0,-2,-5,-6,41566,293,20,20,1,43,5938,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-26,20-Oct-2012,Oct 20th 2012,Sun 10-20-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-20,2012-10-14,2012-10-20,Sun ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,43,2012,2012-10-20,2012-10-26,Y,Wk.43 - 13,2012-10-20 00:00:00,2012-10-26 00:00:00,2012W43 ,2012W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2012,N,2012-10-20,2011-10-20,2012-07-20,2012-04-20,2012-09-20,2012-08-20,2012-10-13,2012-10-06,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-25,2012-01-01,2012-10-01,2012-11-01,2012-11-24,0,0,0,0,-2,0,0,0,0,0,41602,329,56,25,2,48,5943,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-30,25-Nov-2012,Nov 25th 2012,Mon 11-25-13,1,1,1,1,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-11-24,2012-11-24,2012-11-25,2012-11-25,Mon ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,48,2012,2012-11-24,2012-11-30,N,Wk.48 - 13,2012-11-24 00:00:00,2012-11-30 00:00:00,2012W48 ,2012W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2012,N,2012-11-25,2011-11-25,2012-08-25,2012-05-25,2012-10-25,2012-09-25,2012-11-18,2012-11-11,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-26,2012-01-01,2012-01-01,2012-01-01,2012-01-20,0,-3,-10,-44,-305,0,-3,-11,-44,-44,41299,26,26,26,7,4,5899,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-26,26-Jan-2012,Jan 26th 2012,Sat 01-26-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-20,2012-01-21,2012-01-26,Sat ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,4,2012,2012-01-20,2012-01-26,N,Wk.04 - 13,2012-01-20 00:00:00,2012-01-26 00:00:00,2012W04 ,2012W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2012,N,2012-01-26,2011-01-26,2012-10-26,2012-07-26,2012-12-26,2012-11-26,2012-01-19,2012-01-12,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-24,2012-01-01,2012-10-01,2012-12-01,2012-12-22,0,0,1,4,27,0,0,0,4,4,41631,358,85,24,3,52,5947,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-28,24-Dec-2012,Dec 24th 2012,Tue 12-24-13,0,0,0,0,2012-12-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-22,2012-12-23,2012-12-24,Tue ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,52,2012,2012-12-22,2012-12-28,N,Wk.52 - 13,2012-12-22 00:00:00,2012-12-28 00:00:00,2012W52 ,2012W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2012,N,2012-12-24,2011-12-24,2012-09-24,2012-06-24,2012-11-24,2012-10-24,2012-12-17,2012-12-10,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-04,2012-01-01,2012-01-01,2012-02-01,2012-02-03,0,-3,-9,-42,-296,0,-3,-10,-42,-42,41308,35,35,4,2,6,5901,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-09,04-Feb-2012,Feb 4th 2012,Mon 02-04-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-03,2012-02-04,2012-02-04,Mon ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,6,2012,2012-02-03,2012-02-09,N,Wk.06 - 13,2012-02-03 00:00:00,2012-02-09 00:00:00,2012W06 ,2012W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2012,N,2012-02-04,2011-02-04,2012-11-04,2012-08-04,2012-01-04,2012-12-04,2012-01-28,2012-01-21,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-30,2012-01-01,2012-04-01,2012-05-01,2012-05-26,0,-2,-6,-26,-181,0,-2,-6,-26,-26,41423,150,60,30,5,22,5917,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-06-01,30-May-2012,May 30th 2012,Thu 05-30-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-05-26,2012-05-26,2012-05-27,2012-05-30,Thu ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,22,2012,2012-05-26,2012-06-01,N,Wk.22 - 13,2012-05-26 00:00:00,2012-06-01 00:00:00,2012W22 ,2012W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2012,N,2012-05-30,2011-05-30,2012-02-28,2012-11-30,2012-04-30,2012-03-30,2012-05-23,2012-05-16,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-12,2012-01-01,2012-04-01,2012-04-01,2012-04-07,0,-2,-7,-33,-229,0,-2,-8,-33,-33,41375,102,12,12,6,15,5910,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-13,12-Apr-2012,Apr 12th 2012,Fri 04-12-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-07,2012-04-08,2012-04-12,Fri ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,15,2012,2012-04-07,2012-04-13,N,Wk.15 - 13,2012-04-07 00:00:00,2012-04-13 00:00:00,2012W15 ,2012W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2012,N,2012-04-12,2011-04-12,2012-01-12,2012-10-12,2012-03-12,2012-02-12,2012-04-05,2012-03-29,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-08,2012-01-01,2012-04-01,2012-04-01,2012-04-07,0,-2,-7,-33,-233,0,-2,-8,-33,-33,41371,98,8,8,2,15,5910,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-13,08-Apr-2012,Apr 8th 2012,Mon 04-08-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-07,2012-04-08,2012-04-08,Mon ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,15,2012,2012-04-07,2012-04-13,N,Wk.15 - 13,2012-04-07 00:00:00,2012-04-13 00:00:00,2012W15 ,2012W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2012,N,2012-04-08,2011-04-08,2012-01-08,2012-10-08,2012-03-08,2012-02-08,2012-04-01,2012-03-25,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-28,2012-01-01,2012-10-01,2012-12-01,2012-12-22,0,0,1,4,31,0,0,0,4,4,41635,362,89,28,7,52,5947,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-28,28-Dec-2012,Dec 28th 2012,Sat 12-28-13,0,0,0,0,2012-12-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-22,2012-12-23,2012-12-28,Sat ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,52,2012,2012-12-22,2012-12-28,N,Wk.52 - 13,2012-12-22 00:00:00,2012-12-28 00:00:00,2012W52 ,2012W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2012,N,2012-12-28,2011-12-28,2012-09-28,2012-06-28,2012-11-28,2012-10-28,2012-12-21,2012-12-14,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-03,2012-01-01,2012-10-01,2012-12-01,2012-12-01,0,0,1,1,6,0,0,0,1,1,41610,337,64,3,3,49,5944,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-07,03-Dec-2012,Dec 3rd 2012,Tue 12-03-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-01,2012-12-02,2012-12-03,Tue ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,49,2012,2012-12-01,2012-12-07,N,Wk.49 - 13,2012-12-01 00:00:00,2012-12-07 00:00:00,2012W49 ,2012W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2012,N,2012-12-03,2011-12-03,2012-09-03,2012-06-03,2012-11-03,2012-10-03,2012-11-26,2012-11-19,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-15,2012-01-01,2012-07-01,2012-07-01,2012-07-14,0,-1,-4,-19,-135,0,-1,-5,-19,-19,41469,196,15,15,2,29,5924,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-20,15-Jul-2012,Jul 15th 2012,Mon 07-15-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-14,2012-07-15,2012-07-15,Mon ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,29,2012,2012-07-14,2012-07-20,N,Wk.29 - 13,2012-07-14 00:00:00,2012-07-20 00:00:00,2012W29 ,2012W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2012,N,2012-07-15,2011-07-15,2012-04-15,2012-01-15,2012-06-15,2012-05-15,2012-07-08,2012-07-01,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-13,2012-01-01,2012-04-01,2012-05-01,2012-05-12,0,-2,-6,-28,-198,0,-2,-7,-28,-28,41406,133,43,13,2,20,5915,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-18,13-May-2012,May 13th 2012,Mon 05-13-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-12,2012-05-13,2012-05-13,Mon ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,20,2012,2012-05-12,2012-05-18,N,Wk.20 - 13,2012-05-12 00:00:00,2012-05-18 00:00:00,2012W20 ,2012W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2012,N,2012-05-13,2011-05-13,2012-02-13,2012-11-13,2012-04-13,2012-03-13,2012-05-06,2012-04-29,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-30,2012-01-01,2012-01-01,2012-03-01,2012-03-24,0,-3,-8,-35,-242,0,-3,-9,-35,-35,41362,89,89,30,7,13,5908,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-30,30-Mar-2012,Mar 30th 2012,Sat 03-30-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-24,2012-03-25,2012-03-30,Sat ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,13,2012,2012-03-24,2012-03-30,N,Wk.13 - 13,2012-03-24 00:00:00,2012-03-30 00:00:00,2012W13 ,2012W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2012,N,2012-03-30,2011-03-30,2012-12-30,2012-09-30,2012-02-28,2012-01-30,2012-03-23,2012-03-16,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-09,2012-01-01,2012-10-01,2012-12-01,2012-12-08,0,0,1,2,12,0,0,0,2,2,41616,343,70,9,2,50,5945,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-14,09-Dec-2012,Dec 9th 2012,Mon 12-09-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-08,2012-12-09,2012-12-09,Mon ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,50,2012,2012-12-08,2012-12-14,N,Wk.50 - 13,2012-12-08 00:00:00,2012-12-14 00:00:00,2012W50 ,2012W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2012,N,2012-12-09,2011-12-09,2012-09-09,2012-06-09,2012-11-09,2012-10-09,2012-12-02,2012-11-25,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-25,2012-01-01,2012-01-01,2012-02-01,2012-02-24,0,-3,-9,-39,-275,0,-3,-9,-39,-39,41329,56,56,25,2,9,5904,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-03-02,25-Feb-2012,Feb 25th 2012,Mon 02-25-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-02-24,2012-02-24,2012-02-25,2012-02-25,Mon ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,9,2012,2012-02-24,2012-03-02,N,Wk.09 - 13,2012-02-24 00:00:00,2012-03-02 00:00:00,2012W09 ,2012W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2012,N,2012-02-25,2011-02-25,2012-11-25,2012-08-25,2012-01-25,2012-12-25,2012-02-18,2012-02-11,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-04,2012-01-01,2012-10-01,2012-11-01,2012-11-03,0,0,0,-3,-23,0,0,-1,-3,-3,41581,308,35,4,2,45,5940,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-09,04-Nov-2012,Nov 4th 2012,Mon 11-04-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-03,2012-11-04,2012-11-04,Mon ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,45,2012,2012-11-03,2012-11-09,N,Wk.45 - 13,2012-11-03 00:00:00,2012-11-09 00:00:00,2012W45 ,2012W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2012,N,2012-11-04,2011-11-04,2012-08-04,2012-05-04,2012-10-04,2012-09-04,2012-10-28,2012-10-21,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-08,2012-01-01,2012-10-01,2012-11-01,2012-11-03,0,0,0,-3,-19,0,0,-1,-3,-3,41585,312,39,8,6,45,5940,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-09,08-Nov-2012,Nov 8th 2012,Fri 11-08-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-03,2012-11-04,2012-11-08,Fri ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,45,2012,2012-11-03,2012-11-09,N,Wk.45 - 13,2012-11-03 00:00:00,2012-11-09 00:00:00,2012W45 ,2012W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2012,N,2012-11-08,2011-11-08,2012-08-08,2012-05-08,2012-10-08,2012-09-08,2012-11-01,2012-10-25,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-22,2012-01-01,2012-07-01,2012-08-01,2012-08-18,0,-1,-3,-14,-97,0,-1,-4,-14,-14,41507,234,53,22,5,34,5929,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-24,22-Aug-2012,Aug 22nd 2012,Thu 08-22-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-18,2012-08-19,2012-08-22,Thu ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,34,2012,2012-08-18,2012-08-24,N,Wk.34 - 13,2012-08-18 00:00:00,2012-08-24 00:00:00,2012W34 ,2012W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2012,N,2012-08-22,2011-08-22,2012-05-22,2012-02-22,2012-07-22,2012-06-22,2012-08-15,2012-08-08,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-18,2012-01-01,2012-04-01,2012-06-01,2012-06-16,0,-2,-5,-23,-162,0,-2,-6,-23,-23,41442,169,79,18,3,25,5920,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-22,18-Jun-2012,Jun 18th 2012,Tue 06-18-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-16,2012-06-17,2012-06-18,Tue ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,25,2012,2012-06-16,2012-06-22,N,Wk.25 - 13,2012-06-16 00:00:00,2012-06-22 00:00:00,2012W25 ,2012W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2012,N,2012-06-18,2011-06-18,2012-03-18,2012-12-18,2012-05-18,2012-04-18,2012-06-11,2012-06-04,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-19,2012-01-01,2012-07-01,2012-07-01,2012-07-14,0,-1,-4,-19,-131,0,-1,-5,-19,-19,41473,200,19,19,6,29,5924,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-20,19-Jul-2012,Jul 19th 2012,Fri 07-19-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-14,2012-07-15,2012-07-19,Fri ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,29,2012,2012-07-14,2012-07-20,N,Wk.29 - 13,2012-07-14 00:00:00,2012-07-20 00:00:00,2012W29 ,2012W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2012,N,2012-07-19,2011-07-19,2012-04-19,2012-01-19,2012-06-19,2012-05-19,2012-07-12,2012-07-05,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-20,2012-01-01,2012-07-01,2012-08-01,2012-08-18,0,-1,-3,-14,-99,0,-1,-4,-14,-14,41505,232,51,20,3,34,5929,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-24,20-Aug-2012,Aug 20th 2012,Tue 08-20-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-18,2012-08-19,2012-08-20,Tue ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,34,2012,2012-08-18,2012-08-24,N,Wk.34 - 13,2012-08-18 00:00:00,2012-08-24 00:00:00,2012W34 ,2012W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2012,N,2012-08-20,2011-08-20,2012-05-20,2012-02-20,2012-07-20,2012-06-20,2012-08-13,2012-08-06,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-24,2012-01-01,2012-07-01,2012-08-01,2012-08-18,0,-1,-3,-14,-95,0,-1,-4,-14,-14,41509,236,55,24,7,34,5929,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-24,24-Aug-2012,Aug 24th 2012,Sat 08-24-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-18,2012-08-19,2012-08-24,Sat ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,34,2012,2012-08-18,2012-08-24,N,Wk.34 - 13,2012-08-18 00:00:00,2012-08-24 00:00:00,2012W34 ,2012W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2012,N,2012-08-24,2011-08-24,2012-05-24,2012-02-24,2012-07-24,2012-06-24,2012-08-17,2012-08-10,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-13,2012-01-01,2012-07-01,2012-07-01,2012-07-07,0,-1,-4,-20,-137,0,-1,-5,-20,-20,41467,194,13,13,7,28,5923,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-13,13-Jul-2012,Jul 13th 2012,Sat 07-13-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-07,2012-07-08,2012-07-13,Sat ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,28,2012,2012-07-07,2012-07-13,N,Wk.28 - 13,2012-07-07 00:00:00,2012-07-13 00:00:00,2012W28 ,2012W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2012,N,2012-07-13,2011-07-13,2012-04-13,2012-01-13,2012-06-13,2012-05-13,2012-07-06,2012-06-29,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-06,2012-01-01,2012-10-01,2012-11-01,2012-11-03,0,0,0,-3,-21,0,0,-1,-3,-3,41583,310,37,6,4,45,5940,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-09,06-Nov-2012,Nov 6th 2012,Wed 11-06-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-03,2012-11-04,2012-11-06,Wed ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,45,2012,2012-11-03,2012-11-09,N,Wk.45 - 13,2012-11-03 00:00:00,2012-11-09 00:00:00,2012W45 ,2012W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2012,N,2012-11-06,2011-11-06,2012-08-06,2012-05-06,2012-10-06,2012-09-06,2012-10-30,2012-10-23,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-07,2012-01-01,2012-10-01,2012-12-01,2012-12-01,0,0,1,1,10,0,0,0,1,1,41614,341,68,7,7,49,5944,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-07,07-Dec-2012,Dec 7th 2012,Sat 12-07-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-01,2012-12-02,2012-12-07,Sat ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,49,2012,2012-12-01,2012-12-07,N,Wk.49 - 13,2012-12-01 00:00:00,2012-12-07 00:00:00,2012W49 ,2012W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2012,N,2012-12-07,2011-12-07,2012-09-07,2012-06-07,2012-11-07,2012-10-07,2012-11-30,2012-11-23,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-04,2012-01-01,2012-07-01,2012-07-01,2012-06-30,0,-1,-4,-21,-146,0,-1,-5,-21,-21,41458,185,4,4,5,27,5922,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-06,04-Jul-2012,Jul 4th 2012,Thu 07-04-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-06-30,2012-07-01,2012-07-04,Thu ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,27,2012,2012-06-30,2012-07-06,N,Wk.27 - 13,2012-06-30 00:00:00,2012-07-06 00:00:00,2012W27 ,2012W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2012,N,2012-07-04,2011-07-04,2012-04-04,2012-01-04,2012-06-04,2012-05-04,2012-06-27,2012-06-20,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-07,2012-01-01,2012-10-01,2012-10-01,2012-10-06,0,0,-1,-7,-51,0,0,-2,-7,-7,41553,280,7,7,2,41,5936,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-12,07-Oct-2012,Oct 7th 2012,Mon 10-07-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-06,2012-10-07,2012-10-07,Mon ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,41,2012,2012-10-06,2012-10-12,N,Wk.41 - 13,2012-10-06 00:00:00,2012-10-12 00:00:00,2012W41 ,2012W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2012,N,2012-10-07,2011-10-07,2012-07-07,2012-04-07,2012-09-07,2012-08-07,2012-09-30,2012-09-23,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-10,2012-01-01,2012-10-01,2012-11-01,2012-11-10,0,0,0,-2,-17,0,0,-1,-2,-3,41587,314,41,10,1,46,5941,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-16,10-Nov-2012,Nov 10th 2012,Sun 11-10-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-10,2012-11-04,2012-11-10,Sun ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,46,2012,2012-11-10,2012-11-16,Y,Wk.46 - 13,2012-11-10 00:00:00,2012-11-16 00:00:00,2012W46 ,2012W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2012,N,2012-11-10,2011-11-10,2012-08-10,2012-05-10,2012-10-10,2012-09-10,2012-11-03,2012-10-27,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-07,2012-01-01,2012-07-01,2012-08-01,2012-08-04,0,-1,-3,-16,-112,0,-1,-4,-16,-16,41492,219,38,7,4,32,5927,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-10,07-Aug-2012,Aug 7th 2012,Wed 08-07-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-04,2012-08-05,2012-08-07,Wed ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,32,2012,2012-08-04,2012-08-10,N,Wk.32 - 13,2012-08-04 00:00:00,2012-08-10 00:00:00,2012W32 ,2012W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2012,N,2012-08-07,2011-08-07,2012-05-07,2012-02-07,2012-07-07,2012-06-07,2012-07-31,2012-07-24,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-25,2012-01-01,2012-07-01,2012-09-01,2012-09-22,0,-1,-2,-9,-63,0,-1,-3,-9,-9,41541,268,87,25,4,39,5934,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-28,25-Sep-2012,Sep 25th 2012,Wed 09-25-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-22,2012-09-23,2012-09-25,Wed ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,39,2012,2012-09-22,2012-09-28,N,Wk.39 - 13,2012-09-22 00:00:00,2012-09-28 00:00:00,2012W39 ,2012W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2012,N,2012-09-25,2011-09-25,2012-06-25,2012-03-25,2012-08-25,2012-07-25,2012-09-18,2012-09-11,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-05,2012-01-01,2012-10-01,2012-10-01,2012-09-29,0,0,-1,-8,-53,0,0,-2,-8,-8,41551,278,5,5,7,40,5935,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-05,05-Oct-2012,Oct 5th 2012,Sat 10-05-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-09-29,2012-09-30,2012-10-05,Sat ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,40,2012,2012-09-29,2012-10-05,N,Wk.40 - 13,2012-09-29 00:00:00,2012-10-05 00:00:00,2012W40 ,2012W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2012,N,2012-10-05,2011-10-05,2012-07-05,2012-04-05,2012-09-05,2012-08-05,2012-09-28,2012-09-21,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-02,2012-01-01,2012-07-01,2012-09-01,2012-09-01,0,-1,-2,-12,-86,0,-1,-3,-12,-12,41518,245,64,2,2,36,5931,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-07,02-Sep-2012,Sep 2nd 2012,Mon 09-02-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-01,2012-09-02,2012-09-02,Mon ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,36,2012,2012-09-01,2012-09-07,N,Wk.36 - 13,2012-09-01 00:00:00,2012-09-07 00:00:00,2012W36 ,2012W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2012,N,2012-09-02,2011-09-02,2012-06-02,2012-03-02,2012-08-02,2012-07-02,2012-08-26,2012-08-19,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-15,2012-01-01,2012-04-01,2012-05-01,2012-05-12,0,-2,-6,-28,-196,0,-2,-7,-28,-28,41408,135,45,15,4,20,5915,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-18,15-May-2012,May 15th 2012,Wed 05-15-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-12,2012-05-13,2012-05-15,Wed ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,20,2012,2012-05-12,2012-05-18,N,Wk.20 - 13,2012-05-12 00:00:00,2012-05-18 00:00:00,2012W20 ,2012W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2012,N,2012-05-15,2011-05-15,2012-02-15,2012-11-15,2012-04-15,2012-03-15,2012-05-08,2012-05-01,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-10,2012-01-01,2012-01-01,2012-02-01,2012-02-10,0,-3,-9,-41,-290,0,-3,-10,-41,-42,41314,41,41,10,1,7,5902,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-16,10-Feb-2012,Feb 10th 2012,Sun 02-10-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-10,2012-02-04,2012-02-10,Sun ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,7,2012,2012-02-10,2012-02-16,Y,Wk.07 - 13,2012-02-10 00:00:00,2012-02-16 00:00:00,2012W07 ,2012W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2012,N,2012-02-10,2011-02-10,2012-11-10,2012-08-10,2012-01-10,2012-12-10,2012-02-03,2012-01-27,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-21,2012-01-01,2012-10-01,2012-12-01,2012-12-15,0,0,1,3,24,0,0,0,3,3,41628,355,82,21,7,51,5946,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-21,21-Dec-2012,Dec 21st 2012,Sat 12-21-13,0,0,0,0,2012-12-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-15,2012-12-16,2012-12-21,Sat ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,51,2012,2012-12-15,2012-12-21,N,Wk.51 - 13,2012-12-15 00:00:00,2012-12-21 00:00:00,2012W51 ,2012W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2012,N,2012-12-21,2011-12-21,2012-09-21,2012-06-21,2012-11-21,2012-10-21,2012-12-14,2012-12-07,0,0,0,0,0,0,0,0,12,4,51,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-22,2012-01-01,2012-10-01,2012-10-01,2012-10-20,0,0,-1,-5,-36,0,0,-2,-5,-5,41568,295,22,22,3,43,5938,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-26,22-Oct-2012,Oct 22nd 2012,Tue 10-22-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-20,2012-10-21,2012-10-22,Tue ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,43,2012,2012-10-20,2012-10-26,N,Wk.43 - 13,2012-10-20 00:00:00,2012-10-26 00:00:00,2012W43 ,2012W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2012,N,2012-10-22,2011-10-22,2012-07-22,2012-04-22,2012-09-22,2012-08-22,2012-10-15,2012-10-08,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-24,2012-01-01,2012-10-01,2012-10-01,2012-10-20,0,0,-1,-5,-34,0,0,-2,-5,-5,41570,297,24,24,5,43,5938,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-26,24-Oct-2012,Oct 24th 2012,Thu 10-24-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-20,2012-10-21,2012-10-24,Thu ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,43,2012,2012-10-20,2012-10-26,N,Wk.43 - 13,2012-10-20 00:00:00,2012-10-26 00:00:00,2012W43 ,2012W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2012,N,2012-10-24,2011-10-24,2012-07-24,2012-04-24,2012-09-24,2012-08-24,2012-10-17,2012-10-10,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-10,2012-01-01,2012-07-01,2012-07-01,2012-07-07,0,-1,-4,-20,-140,0,-1,-5,-20,-20,41464,191,10,10,4,28,5923,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-13,10-Jul-2012,Jul 10th 2012,Wed 07-10-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-07,2012-07-08,2012-07-10,Wed ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,28,2012,2012-07-07,2012-07-13,N,Wk.28 - 13,2012-07-07 00:00:00,2012-07-13 00:00:00,2012W28 ,2012W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2012,N,2012-07-10,2011-07-10,2012-04-10,2012-01-10,2012-06-10,2012-05-10,2012-07-03,2012-06-26,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-27,2012-01-01,2012-01-01,2012-02-01,2012-02-24,0,-3,-9,-39,-273,0,-3,-9,-39,-39,41331,58,58,27,4,9,5904,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-03-02,27-Feb-2012,Feb 27th 2012,Wed 02-27-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-02-24,2012-02-24,2012-02-25,2012-02-27,Wed ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,9,2012,2012-02-24,2012-03-02,N,Wk.09 - 13,2012-02-24 00:00:00,2012-03-02 00:00:00,2012W09 ,2012W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2012,N,2012-02-27,2011-02-27,2012-11-27,2012-08-27,2012-01-27,2012-12-27,2012-02-20,2012-02-13,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-02,2012-01-01,2012-01-01,2012-03-01,2012-02-24,0,-3,-8,-39,-270,0,-3,-9,-39,-39,41334,61,61,2,7,9,5904,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-02,02-Mar-2012,Mar 2nd 2012,Sat 03-02-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-02-24,2012-02-25,2012-03-02,Sat ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,9,2012,2012-02-24,2012-03-02,N,Wk.09 - 13,2012-02-24 00:00:00,2012-03-02 00:00:00,2012W09 ,2012W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2012,N,2012-03-02,2011-03-02,2012-12-02,2012-09-02,2012-02-02,2012-01-02,2012-02-23,2012-02-16,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-02,2012-01-01,2012-10-01,2012-11-01,2012-10-27,0,0,0,-4,-25,0,0,-1,-4,-4,41579,306,33,2,7,44,5939,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-02,02-Nov-2012,Nov 2nd 2012,Sat 11-02-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-10-27,2012-10-28,2012-11-02,Sat ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,44,2012,2012-10-27,2012-11-02,N,Wk.44 - 13,2012-10-27 00:00:00,2012-11-02 00:00:00,2012W44 ,2012W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2012,N,2012-11-02,2011-11-02,2012-08-02,2012-05-02,2012-10-02,2012-09-02,2012-10-26,2012-10-19,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-21,2012-01-01,2012-01-01,2012-03-01,2012-03-17,0,-3,-8,-36,-251,0,-3,-9,-36,-36,41353,80,80,21,5,12,5907,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-23,21-Mar-2012,Mar 21st 2012,Thu 03-21-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-17,2012-03-18,2012-03-21,Thu ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,12,2012,2012-03-17,2012-03-23,N,Wk.12 - 13,2012-03-17 00:00:00,2012-03-23 00:00:00,2012W12 ,2012W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2012,N,2012-03-21,2011-03-21,2012-12-21,2012-09-21,2012-02-21,2012-01-21,2012-03-14,2012-03-07,0,0,0,0,0,0,0,0,3,1,12,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-03,2012-01-01,2012-04-01,2012-04-01,2012-03-31,0,-2,-7,-34,-238,0,-2,-8,-34,-34,41366,93,3,3,4,14,5909,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-06,03-Apr-2012,Apr 3rd 2012,Wed 04-03-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-03-31,2012-04-01,2012-04-03,Wed ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,14,2012,2012-03-31,2012-04-06,N,Wk.14 - 13,2012-03-31 00:00:00,2012-04-06 00:00:00,2012W14 ,2012W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2012,N,2012-04-03,2011-04-03,2012-01-03,2012-10-03,2012-03-03,2012-02-03,2012-03-27,2012-03-20,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-06,2012-01-01,2012-07-01,2012-07-01,2012-06-30,0,-1,-4,-21,-144,0,-1,-5,-21,-21,41460,187,6,6,7,27,5922,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-06,06-Jul-2012,Jul 6th 2012,Sat 07-06-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-06-30,2012-07-01,2012-07-06,Sat ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,27,2012,2012-06-30,2012-07-06,N,Wk.27 - 13,2012-06-30 00:00:00,2012-07-06 00:00:00,2012W27 ,2012W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2012,N,2012-07-06,2011-07-06,2012-04-06,2012-01-06,2012-06-06,2012-05-06,2012-06-29,2012-06-22,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-26,2012-01-01,2012-04-01,2012-06-01,2012-06-23,0,-2,-5,-22,-154,0,-2,-6,-22,-22,41450,177,87,26,4,26,5921,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-29,26-Jun-2012,Jun 26th 2012,Wed 06-26-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-23,2012-06-24,2012-06-26,Wed ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,26,2012,2012-06-23,2012-06-29,N,Wk.26 - 13,2012-06-23 00:00:00,2012-06-29 00:00:00,2012W26 ,2012W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2012,N,2012-06-26,2011-06-26,2012-03-26,2012-12-26,2012-05-26,2012-04-26,2012-06-19,2012-06-12,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-26,2012-01-01,2012-07-01,2012-08-01,2012-08-25,0,-1,-3,-13,-93,0,-1,-3,-13,-13,41511,238,57,26,2,35,5930,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-31,26-Aug-2012,Aug 26th 2012,Mon 08-26-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-08-25,2012-08-25,2012-08-26,2012-08-26,Mon ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,35,2012,2012-08-25,2012-08-31,N,Wk.35 - 13,2012-08-25 00:00:00,2012-08-31 00:00:00,2012W35 ,2012W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2012,N,2012-08-26,2011-08-26,2012-05-26,2012-02-26,2012-07-26,2012-06-26,2012-08-19,2012-08-12,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-13,2012-01-01,2012-10-01,2012-12-01,2012-12-08,0,0,1,2,16,0,0,0,2,2,41620,347,74,13,6,50,5945,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-14,13-Dec-2012,Dec 13th 2012,Fri 12-13-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-08,2012-12-09,2012-12-13,Fri ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,50,2012,2012-12-08,2012-12-14,N,Wk.50 - 13,2012-12-08 00:00:00,2012-12-14 00:00:00,2012W50 ,2012W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2012,N,2012-12-13,2011-12-13,2012-09-13,2012-06-13,2012-11-13,2012-10-13,2012-12-06,2012-11-29,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-02,2012-01-01,2012-07-01,2012-07-01,2012-06-30,0,-1,-4,-21,-148,0,-1,-5,-21,-21,41456,183,2,2,3,27,5922,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-06,02-Jul-2012,Jul 2nd 2012,Tue 07-02-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-06-30,2012-07-01,2012-07-02,Tue ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,27,2012,2012-06-30,2012-07-06,N,Wk.27 - 13,2012-06-30 00:00:00,2012-07-06 00:00:00,2012W27 ,2012W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2012,N,2012-07-02,2011-07-02,2012-04-02,2012-01-02,2012-06-02,2012-05-02,2012-06-25,2012-06-18,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-05,2012-01-01,2012-07-01,2012-08-01,2012-08-04,0,-1,-3,-16,-114,0,-1,-4,-16,-16,41490,217,36,5,2,32,5927,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-10,05-Aug-2012,Aug 5th 2012,Mon 08-05-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-04,2012-08-05,2012-08-05,Mon ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,32,2012,2012-08-04,2012-08-10,N,Wk.32 - 13,2012-08-04 00:00:00,2012-08-10 00:00:00,2012W32 ,2012W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2012,N,2012-08-05,2011-08-05,2012-05-05,2012-02-05,2012-07-05,2012-06-05,2012-07-29,2012-07-22,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-08,2012-01-01,2012-01-01,2012-02-01,2012-02-03,0,-3,-9,-42,-292,0,-3,-10,-42,-42,41312,39,39,8,6,6,5901,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-09,08-Feb-2012,Feb 8th 2012,Fri 02-08-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-03,2012-02-04,2012-02-08,Fri ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,6,2012,2012-02-03,2012-02-09,N,Wk.06 - 13,2012-02-03 00:00:00,2012-02-09 00:00:00,2012W06 ,2012W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2012,N,2012-02-08,2011-02-08,2012-11-08,2012-08-08,2012-01-08,2012-12-08,2012-02-01,2012-01-25,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-14,2012-01-01,2012-01-01,2012-02-01,2012-02-10,0,-3,-9,-41,-286,0,-3,-10,-41,-41,41318,45,45,14,5,7,5902,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-16,14-Feb-2012,Feb 14th 2012,Thu 02-14-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-10,2012-02-11,2012-02-14,Thu ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,7,2012,2012-02-10,2012-02-16,N,Wk.07 - 13,2012-02-10 00:00:00,2012-02-16 00:00:00,2012W07 ,2012W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2012,N,2012-02-14,2011-02-14,2012-11-14,2012-08-14,2012-01-14,2012-12-14,2012-02-07,2012-01-31,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-21,2012-01-01,2012-07-01,2012-09-01,2012-09-15,0,-1,-2,-10,-67,0,-1,-3,-10,-10,41537,264,83,21,7,38,5933,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-21,21-Sep-2012,Sep 21st 2012,Sat 09-21-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-15,2012-09-16,2012-09-21,Sat ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,38,2012,2012-09-15,2012-09-21,N,Wk.38 - 13,2012-09-15 00:00:00,2012-09-21 00:00:00,2012W38 ,2012W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2012,N,2012-09-21,2011-09-21,2012-06-21,2012-03-21,2012-08-21,2012-07-21,2012-09-14,2012-09-07,0,0,0,0,0,0,0,0,9,3,38,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-19,2012-01-01,2012-01-01,2012-03-01,2012-03-17,0,-3,-8,-36,-253,0,-3,-9,-36,-36,41351,78,78,19,3,12,5907,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-23,19-Mar-2012,Mar 19th 2012,Tue 03-19-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-17,2012-03-18,2012-03-19,Tue ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,12,2012,2012-03-17,2012-03-23,N,Wk.12 - 13,2012-03-17 00:00:00,2012-03-23 00:00:00,2012W12 ,2012W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2012,N,2012-03-19,2011-03-19,2012-12-19,2012-09-19,2012-02-19,2012-01-19,2012-03-12,2012-03-05,0,0,0,0,0,0,0,0,3,1,12,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-28,2012-01-01,2012-01-01,2012-01-01,2012-01-27,0,-3,-10,-43,-303,0,-3,-10,-43,-43,41301,28,28,28,2,5,5900,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-02-02,28-Jan-2012,Jan 28th 2012,Mon 01-28-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-01-27,2012-01-27,2012-01-28,2012-01-28,Mon ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,5,2012,2012-01-27,2012-02-02,N,Wk.05 - 13,2012-01-27 00:00:00,2012-02-02 00:00:00,2012W05 ,2012W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2012,N,2012-01-28,2011-01-28,2012-10-28,2012-07-28,2012-12-28,2012-11-28,2012-01-21,2012-01-14,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-03,2012-01-01,2012-07-01,2012-08-01,2012-07-28,0,-1,-3,-17,-116,0,-1,-4,-17,-17,41488,215,34,3,7,31,5926,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-03,03-Aug-2012,Aug 3rd 2012,Sat 08-03-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-07-28,2012-07-29,2012-08-03,Sat ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,31,2012,2012-07-28,2012-08-03,N,Wk.31 - 13,2012-07-28 00:00:00,2012-08-03 00:00:00,2012W31 ,2012W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2012,N,2012-08-03,2011-08-03,2012-05-03,2012-02-03,2012-07-03,2012-06-03,2012-07-27,2012-07-20,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-14,2012-01-01,2012-04-01,2012-06-01,2012-06-09,0,-2,-5,-24,-166,0,-2,-6,-24,-24,41438,165,75,14,6,24,5919,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-15,14-Jun-2012,Jun 14th 2012,Fri 06-14-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-09,2012-06-10,2012-06-14,Fri ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,24,2012,2012-06-09,2012-06-15,N,Wk.24 - 13,2012-06-09 00:00:00,2012-06-15 00:00:00,2012W24 ,2012W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2012,N,2012-06-14,2011-06-14,2012-03-14,2012-12-14,2012-05-14,2012-04-14,2012-06-07,2012-05-31,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-08,2012-01-01,2012-07-01,2012-07-01,2012-07-07,0,-1,-4,-20,-142,0,-1,-5,-20,-20,41462,189,8,8,2,28,5923,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-13,08-Jul-2012,Jul 8th 2012,Mon 07-08-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-07,2012-07-08,2012-07-08,Mon ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,28,2012,2012-07-07,2012-07-13,N,Wk.28 - 13,2012-07-07 00:00:00,2012-07-13 00:00:00,2012W28 ,2012W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2012,N,2012-07-08,2011-07-08,2012-04-08,2012-01-08,2012-06-08,2012-05-08,2012-07-01,2012-06-24,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-30,2012-01-01,2012-10-01,2012-11-01,2012-11-24,0,0,0,0,3,0,0,0,0,0,41607,334,61,30,7,48,5943,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-30,30-Nov-2012,Nov 30th 2012,Sat 11-30-13,0,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-11-24,2012-11-24,2012-11-25,2012-11-30,Sat ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,48,2012,2012-11-24,2012-11-30,N,Wk.48 - 13,2012-11-24 00:00:00,2012-11-30 00:00:00,2012W48 ,2012W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2012,N,2012-11-30,2011-11-30,2012-08-30,2012-05-30,2012-10-30,2012-09-30,2012-11-23,2012-11-16,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-10,2012-01-01,2012-01-01,2012-01-01,2012-01-06,0,-3,-10,-46,-321,0,-3,-11,-46,-46,41283,10,10,10,5,2,5897,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-12,10-Jan-2012,Jan 10th 2012,Thu 01-10-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-06,2012-01-07,2012-01-10,Thu ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,2,2012,2012-01-06,2012-01-12,N,Wk.02 - 13,2012-01-06 00:00:00,2012-01-12 00:00:00,2012W02 ,2012W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2012,N,2012-01-10,2011-01-10,2012-10-10,2012-07-10,2012-12-10,2012-11-10,2012-01-03,2012-12-27,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-18,2012-01-01,2012-04-01,2012-05-01,2012-05-12,0,-2,-6,-28,-193,0,-2,-7,-28,-28,41411,138,48,18,7,20,5915,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-18,18-May-2012,May 18th 2012,Sat 05-18-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-12,2012-05-13,2012-05-18,Sat ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,20,2012,2012-05-12,2012-05-18,N,Wk.20 - 13,2012-05-12 00:00:00,2012-05-18 00:00:00,2012W20 ,2012W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2012,N,2012-05-18,2011-05-18,2012-02-18,2012-11-18,2012-04-18,2012-03-18,2012-05-11,2012-05-04,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-15,2012-01-01,2012-04-01,2012-04-01,2012-04-14,0,-2,-7,-32,-226,0,-2,-8,-32,-32,41378,105,15,15,2,16,5911,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-20,15-Apr-2012,Apr 15th 2012,Mon 04-15-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-14,2012-04-15,2012-04-15,Mon ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,16,2012,2012-04-14,2012-04-20,N,Wk.16 - 13,2012-04-14 00:00:00,2012-04-20 00:00:00,2012W16 ,2012W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2012,N,2012-04-15,2011-04-15,2012-01-15,2012-10-15,2012-03-15,2012-02-15,2012-04-08,2012-04-01,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-12,2012-01-01,2012-01-01,2012-03-01,2012-03-10,0,-3,-8,-37,-260,0,-3,-9,-37,-37,41344,71,71,12,3,11,5906,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-16,12-Mar-2012,Mar 12th 2012,Tue 03-12-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-10,2012-03-11,2012-03-12,Tue ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,11,2012,2012-03-10,2012-03-16,N,Wk.11 - 13,2012-03-10 00:00:00,2012-03-16 00:00:00,2012W11 ,2012W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2012,N,2012-03-12,2011-03-12,2012-12-12,2012-09-12,2012-02-12,2012-01-12,2012-03-05,2012-02-26,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-09,2012-01-01,2012-10-01,2012-11-01,2012-11-03,0,0,0,-3,-18,0,0,-1,-3,-3,41586,313,40,9,7,45,5940,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-09,09-Nov-2012,Nov 9th 2012,Sat 11-09-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-03,2012-11-04,2012-11-09,Sat ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,45,2012,2012-11-03,2012-11-09,N,Wk.45 - 13,2012-11-03 00:00:00,2012-11-09 00:00:00,2012W45 ,2012W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2012,N,2012-11-09,2011-11-09,2012-08-09,2012-05-09,2012-10-09,2012-09-09,2012-11-02,2012-10-26,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-14,2012-01-01,2012-01-01,2012-03-01,2012-03-10,0,-3,-8,-37,-258,0,-3,-9,-37,-37,41346,73,73,14,5,11,5906,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-16,14-Mar-2012,Mar 14th 2012,Thu 03-14-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-10,2012-03-11,2012-03-14,Thu ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,11,2012,2012-03-10,2012-03-16,N,Wk.11 - 13,2012-03-10 00:00:00,2012-03-16 00:00:00,2012W11 ,2012W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2012,N,2012-03-14,2011-03-14,2012-12-14,2012-09-14,2012-02-14,2012-01-14,2012-03-07,2012-02-28,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-03,2012-01-01,2012-07-01,2012-09-01,2012-09-01,0,-1,-2,-12,-85,0,-1,-3,-12,-12,41519,246,65,3,3,36,5931,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-07,03-Sep-2012,Sep 3rd 2012,Tue 09-03-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-01,2012-09-02,2012-09-03,Tue ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,36,2012,2012-09-01,2012-09-07,N,Wk.36 - 13,2012-09-01 00:00:00,2012-09-07 00:00:00,2012W36 ,2012W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2012,N,2012-09-03,2011-09-03,2012-06-03,2012-03-03,2012-08-03,2012-07-03,2012-08-27,2012-08-20,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-16,2012-01-01,2012-04-01,2012-05-01,2012-05-12,0,-2,-6,-28,-195,0,-2,-7,-28,-28,41409,136,46,16,5,20,5915,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-18,16-May-2012,May 16th 2012,Thu 05-16-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-12,2012-05-13,2012-05-16,Thu ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,20,2012,2012-05-12,2012-05-18,N,Wk.20 - 13,2012-05-12 00:00:00,2012-05-18 00:00:00,2012W20 ,2012W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2012,N,2012-05-16,2011-05-16,2012-02-16,2012-11-16,2012-04-16,2012-03-16,2012-05-09,2012-05-02,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-27,2012-01-01,2012-10-01,2012-10-01,2012-10-27,0,0,-1,-4,-31,0,0,-1,-4,-5,41573,300,27,27,1,44,5939,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-11-02,27-Oct-2012,Oct 27th 2012,Sun 10-27-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-10-27,2012-10-27,2012-10-21,2012-10-27,Sun ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,44,2012,2012-10-27,2012-11-02,Y,Wk.44 - 13,2012-10-27 00:00:00,2012-11-02 00:00:00,2012W44 ,2012W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2012,N,2012-10-27,2011-10-27,2012-07-27,2012-04-27,2012-09-27,2012-08-27,2012-10-20,2012-10-13,0,0,0,0,1,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-21,2012-01-01,2012-07-01,2012-08-01,2012-08-18,0,-1,-3,-14,-98,0,-1,-4,-14,-14,41506,233,52,21,4,34,5929,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-24,21-Aug-2012,Aug 21st 2012,Wed 08-21-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-18,2012-08-19,2012-08-21,Wed ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,34,2012,2012-08-18,2012-08-24,N,Wk.34 - 13,2012-08-18 00:00:00,2012-08-24 00:00:00,2012W34 ,2012W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2012,N,2012-08-21,2011-08-21,2012-05-21,2012-02-21,2012-07-21,2012-06-21,2012-08-14,2012-08-07,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-25,2012-01-01,2012-10-01,2012-10-01,2012-10-20,0,0,-1,-5,-33,0,0,-2,-5,-5,41571,298,25,25,6,43,5938,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-26,25-Oct-2012,Oct 25th 2012,Fri 10-25-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-20,2012-10-21,2012-10-25,Fri ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,43,2012,2012-10-20,2012-10-26,N,Wk.43 - 13,2012-10-20 00:00:00,2012-10-26 00:00:00,2012W43 ,2012W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2012,N,2012-10-25,2011-10-25,2012-07-25,2012-04-25,2012-09-25,2012-08-25,2012-10-18,2012-10-11,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-24,2012-01-01,2012-07-01,2012-09-01,2012-09-22,0,-1,-2,-9,-64,0,-1,-3,-9,-9,41540,267,86,24,3,39,5934,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-28,24-Sep-2012,Sep 24th 2012,Tue 09-24-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-22,2012-09-23,2012-09-24,Tue ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,39,2012,2012-09-22,2012-09-28,N,Wk.39 - 13,2012-09-22 00:00:00,2012-09-28 00:00:00,2012W39 ,2012W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2012,N,2012-09-24,2011-09-24,2012-06-24,2012-03-24,2012-08-24,2012-07-24,2012-09-17,2012-09-10,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-27,2012-01-01,2012-01-01,2012-01-01,2012-01-27,0,-3,-10,-43,-304,0,-3,-10,-43,-44,41300,27,27,27,1,5,5900,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-02-02,27-Jan-2012,Jan 27th 2012,Sun 01-27-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-01-27,2012-01-27,2012-01-21,2012-01-27,Sun ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,5,2012,2012-01-27,2012-02-02,Y,Wk.05 - 13,2012-01-27 00:00:00,2012-02-02 00:00:00,2012W05 ,2012W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2012,N,2012-01-27,2011-01-27,2012-10-27,2012-07-27,2012-12-27,2012-11-27,2012-01-20,2012-01-13,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-10,2012-01-01,2012-01-01,2012-03-01,2012-03-10,0,-3,-8,-37,-262,0,-3,-9,-37,-38,41342,69,69,10,1,11,5906,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-16,10-Mar-2012,Mar 10th 2012,Sun 03-10-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-10,2012-03-04,2012-03-10,Sun ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,11,2012,2012-03-10,2012-03-16,Y,Wk.11 - 13,2012-03-10 00:00:00,2012-03-16 00:00:00,2012W11 ,2012W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2012,N,2012-03-10,2011-03-10,2012-12-10,2012-09-10,2012-02-10,2012-01-10,2012-03-03,2012-02-24,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-14,2012-01-01,2012-04-01,2012-05-01,2012-05-12,0,-2,-6,-28,-197,0,-2,-7,-28,-28,41407,134,44,14,3,20,5915,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-18,14-May-2012,May 14th 2012,Tue 05-14-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-12,2012-05-13,2012-05-14,Tue ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,20,2012,2012-05-12,2012-05-18,N,Wk.20 - 13,2012-05-12 00:00:00,2012-05-18 00:00:00,2012W20 ,2012W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2012,N,2012-05-14,2011-05-14,2012-02-14,2012-11-14,2012-04-14,2012-03-14,2012-05-07,2012-04-30,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-31,2012-01-01,2012-10-01,2012-12-01,2012-12-29,0,0,1,5,34,1,1,1,5,5,41638,365,92,31,3,53,5948,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-31,31-Dec-2012,Dec 31st 2012,Tue 12-31-13,0,0,0,0,2012-12-21,365,92,31,3,2012-12-29,2012-12-29,2012-12-29,2012-12-29,2012-12-30,2012-12-31,Tue ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,1,2014,2012-12-29,2014-01-04,N,Wk.53 - 13,2012-12-29 00:00:00,2012-12-31 00:00:00,2012W53 ,2012W53 ,12/29/13 - 12/31/13,12/29 - 12/31,2012,N,2012-12-31,2011-12-31,2012-09-30,2012-06-30,2012-11-30,2012-10-31,2012-12-24,2012-12-17,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-01,2012-01-01,2012-07-01,2012-09-01,2012-09-01,0,-1,-2,-12,-87,0,-1,-3,-12,-13,41517,244,63,1,1,36,5931,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-07,01-Sep-2012,Sep 1st 2012,Sun 09-01-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-01,2012-08-26,2012-09-01,Sun ,2012M09,Sep-2012,Y,2012M09 ,Y,Year 2012 - Quarter 03,2012Q03 ,N,36,2012,2012-09-01,2012-09-07,Y,Wk.36 - 13,2012-09-01 00:00:00,2012-09-07 00:00:00,2012W36 ,2012W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2012,N,2012-09-01,2011-09-01,2012-06-01,2012-03-01,2012-08-01,2012-07-01,2012-08-25,2012-08-18,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-13,2012-01-01,2012-04-01,2012-04-01,2012-04-07,0,-2,-7,-33,-228,0,-2,-8,-33,-33,41376,103,13,13,7,15,5910,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-13,13-Apr-2012,Apr 13th 2012,Sat 04-13-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-07,2012-04-08,2012-04-13,Sat ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,15,2012,2012-04-07,2012-04-13,N,Wk.15 - 13,2012-04-07 00:00:00,2012-04-13 00:00:00,2012W15 ,2012W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2012,N,2012-04-13,2011-04-13,2012-01-13,2012-10-13,2012-03-13,2012-02-13,2012-04-06,2012-03-30,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-09,2012-01-01,2012-01-01,2012-02-01,2012-02-03,0,-3,-9,-42,-291,0,-3,-10,-42,-42,41313,40,40,9,7,6,5901,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-09,09-Feb-2012,Feb 9th 2012,Sat 02-09-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-03,2012-02-04,2012-02-09,Sat ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,6,2012,2012-02-03,2012-02-09,N,Wk.06 - 13,2012-02-03 00:00:00,2012-02-09 00:00:00,2012W06 ,2012W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2012,N,2012-02-09,2011-02-09,2012-11-09,2012-08-09,2012-01-09,2012-12-09,2012-02-02,2012-01-26,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-27,2012-01-01,2012-10-01,2012-12-01,2012-12-22,0,0,1,4,30,0,0,0,4,4,41634,361,88,27,6,52,5947,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-28,27-Dec-2012,Dec 27th 2012,Fri 12-27-13,0,0,0,0,2012-12-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-22,2012-12-23,2012-12-27,Fri ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,52,2012,2012-12-22,2012-12-28,N,Wk.52 - 13,2012-12-22 00:00:00,2012-12-28 00:00:00,2012W52 ,2012W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2012,N,2012-12-27,2011-12-27,2012-09-27,2012-06-27,2012-11-27,2012-10-27,2012-12-20,2012-12-13,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-19,2012-01-01,2012-07-01,2012-08-01,2012-08-18,0,-1,-3,-14,-100,0,-1,-4,-14,-14,41504,231,50,19,2,34,5929,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-24,19-Aug-2012,Aug 19th 2012,Mon 08-19-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-18,2012-08-19,2012-08-19,Mon ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,34,2012,2012-08-18,2012-08-24,N,Wk.34 - 13,2012-08-18 00:00:00,2012-08-24 00:00:00,2012W34 ,2012W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2012,N,2012-08-19,2011-08-19,2012-05-19,2012-02-19,2012-07-19,2012-06-19,2012-08-12,2012-08-05,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-11,2012-01-01,2012-04-01,2012-04-01,2012-04-07,0,-2,-7,-33,-230,0,-2,-8,-33,-33,41374,101,11,11,5,15,5910,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-13,11-Apr-2012,Apr 11th 2012,Thu 04-11-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-07,2012-04-08,2012-04-11,Thu ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,15,2012,2012-04-07,2012-04-13,N,Wk.15 - 13,2012-04-07 00:00:00,2012-04-13 00:00:00,2012W15 ,2012W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2012,N,2012-04-11,2011-04-11,2012-01-11,2012-10-11,2012-03-11,2012-02-11,2012-04-04,2012-03-28,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-06,2012-01-01,2012-10-01,2012-12-01,2012-12-01,0,0,1,1,9,0,0,0,1,1,41613,340,67,6,6,49,5944,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-07,06-Dec-2012,Dec 6th 2012,Fri 12-06-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-01,2012-12-02,2012-12-06,Fri ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,49,2012,2012-12-01,2012-12-07,N,Wk.49 - 13,2012-12-01 00:00:00,2012-12-07 00:00:00,2012W49 ,2012W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2012,N,2012-12-06,2011-12-06,2012-09-06,2012-06-06,2012-11-06,2012-10-06,2012-11-29,2012-11-22,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-31,2012-01-01,2012-01-01,2012-03-01,2012-03-31,0,-3,-8,-34,-241,0,-2,-8,-34,-35,41363,90,90,31,1,14,5909,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-04-06,31-Mar-2012,Mar 31st 2012,Sun 03-31-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-03-31,2012-03-31,2012-03-31,2012-03-25,2012-03-31,Sun ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,14,2012,2012-03-31,2012-04-06,Y,Wk.14 - 13,2012-03-31 00:00:00,2012-04-06 00:00:00,2012W14 ,2012W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2012,N,2012-03-31,2011-03-31,2012-12-31,2012-09-30,2012-02-28,2012-01-31,2012-03-24,2012-03-17,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-22,2012-01-01,2012-07-01,2012-09-01,2012-09-22,0,-1,-2,-9,-66,0,-1,-3,-9,-10,41538,265,84,22,1,39,5934,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-28,22-Sep-2012,Sep 22nd 2012,Sun 09-22-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-22,2012-09-16,2012-09-22,Sun ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,39,2012,2012-09-22,2012-09-28,Y,Wk.39 - 13,2012-09-22 00:00:00,2012-09-28 00:00:00,2012W39 ,2012W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2012,N,2012-09-22,2011-09-22,2012-06-22,2012-03-22,2012-08-22,2012-07-22,2012-09-15,2012-09-08,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-06,2012-01-01,2012-01-01,2012-01-01,2012-01-06,0,-3,-10,-46,-325,0,-3,-11,-46,-47,41279,6,6,6,1,2,5897,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-12,06-Jan-2012,Jan 6th 2012,Sun 01-06-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-06,2012-12-31,2012-01-06,Sun ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,2,2012,2012-01-06,2012-01-12,Y,Wk.02 - 13,2012-01-06 00:00:00,2012-01-12 00:00:00,2012W02 ,2012W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2012,N,2012-01-06,2011-01-06,2012-10-06,2012-07-06,2012-12-06,2012-11-06,2012-12-30,2012-12-23,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-04,2012-01-01,2012-01-01,2012-01-01,2012-01-01,0,-3,-10,-47,-327,0,-3,-11,-47,-47,41277,4,4,4,6,1,5896,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-05,04-Jan-2012,Jan 4th 2012,Fri 01-04-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2012-01-04,Fri ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,1,2012,2012-12-30,2012-01-05,N,Wk.01 - 13,2012-01-01 00:00:00,2012-01-05 00:00:00,2012W01 ,2012W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2012,N,2012-01-04,2011-01-04,2012-10-04,2012-07-04,2012-12-04,2012-11-04,2012-12-28,2012-12-21,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-16,2012-01-01,2012-07-01,2012-07-01,2012-07-14,0,-1,-4,-19,-134,0,-1,-5,-19,-19,41470,197,16,16,3,29,5924,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-20,16-Jul-2012,Jul 16th 2012,Tue 07-16-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-14,2012-07-15,2012-07-16,Tue ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,29,2012,2012-07-14,2012-07-20,N,Wk.29 - 13,2012-07-14 00:00:00,2012-07-20 00:00:00,2012W29 ,2012W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2012,N,2012-07-16,2011-07-16,2012-04-16,2012-01-16,2012-06-16,2012-05-16,2012-07-09,2012-07-02,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-03,2012-01-01,2012-10-01,2012-11-01,2012-11-03,0,0,0,-3,-24,0,0,-1,-3,-4,41580,307,34,3,1,45,5940,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-09,03-Nov-2012,Nov 3rd 2012,Sun 11-03-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-03,2012-10-28,2012-11-03,Sun ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,45,2012,2012-11-03,2012-11-09,Y,Wk.45 - 13,2012-11-03 00:00:00,2012-11-09 00:00:00,2012W45 ,2012W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2012,N,2012-11-03,2011-11-03,2012-08-03,2012-05-03,2012-10-03,2012-09-03,2012-10-27,2012-10-20,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-25,2012-01-01,2012-07-01,2012-08-01,2012-08-25,0,-1,-3,-13,-94,0,-1,-3,-13,-14,41510,237,56,25,1,35,5930,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-31,25-Aug-2012,Aug 25th 2012,Sun 08-25-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-08-25,2012-08-25,2012-08-19,2012-08-25,Sun ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,35,2012,2012-08-25,2012-08-31,Y,Wk.35 - 13,2012-08-25 00:00:00,2012-08-31 00:00:00,2012W35 ,2012W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2012,N,2012-08-25,2011-08-25,2012-05-25,2012-02-25,2012-07-25,2012-06-25,2012-08-18,2012-08-11,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-24,2012-01-01,2012-10-01,2012-11-01,2012-11-24,0,0,0,0,-3,0,0,0,0,-1,41601,328,55,24,1,48,5943,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-30,24-Nov-2012,Nov 24th 2012,Sun 11-24-13,1,1,1,1,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-11-24,2012-11-24,2012-11-18,2012-11-24,Sun ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,48,2012,2012-11-24,2012-11-30,Y,Wk.48 - 13,2012-11-24 00:00:00,2012-11-30 00:00:00,2012W48 ,2012W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2012,N,2012-11-24,2011-11-24,2012-08-24,2012-05-24,2012-10-24,2012-09-24,2012-11-17,2012-11-10,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-12,2012-01-01,2012-04-01,2012-05-01,2012-05-12,0,-2,-6,-28,-199,0,-2,-7,-28,-29,41405,132,42,12,1,20,5915,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-18,12-May-2012,May 12th 2012,Sun 05-12-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-12,2012-05-06,2012-05-12,Sun ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,20,2012,2012-05-12,2012-05-18,Y,Wk.20 - 13,2012-05-12 00:00:00,2012-05-18 00:00:00,2012W20 ,2012W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2012,N,2012-05-12,2011-05-12,2012-02-12,2012-11-12,2012-04-12,2012-03-12,2012-05-05,2012-04-28,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-17,2012-01-01,2012-07-01,2012-08-01,2012-08-11,0,-1,-3,-15,-102,0,-1,-4,-15,-15,41502,229,48,17,7,33,5928,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-17,17-Aug-2012,Aug 17th 2012,Sat 08-17-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-11,2012-08-12,2012-08-17,Sat ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,33,2012,2012-08-11,2012-08-17,N,Wk.33 - 13,2012-08-11 00:00:00,2012-08-17 00:00:00,2012W33 ,2012W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2012,N,2012-08-17,2011-08-17,2012-05-17,2012-02-17,2012-07-17,2012-06-17,2012-08-10,2012-08-03,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-21,2012-01-01,2012-10-01,2012-10-01,2012-10-20,0,0,-1,-5,-37,0,0,-2,-5,-5,41567,294,21,21,2,43,5938,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-26,21-Oct-2012,Oct 21st 2012,Mon 10-21-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-20,2012-10-21,2012-10-21,Mon ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,43,2012,2012-10-20,2012-10-26,N,Wk.43 - 13,2012-10-20 00:00:00,2012-10-26 00:00:00,2012W43 ,2012W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2012,N,2012-10-21,2011-10-21,2012-07-21,2012-04-21,2012-09-21,2012-08-21,2012-10-14,2012-10-07,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-27,2012-01-01,2012-01-01,2012-03-01,2012-03-24,0,-3,-8,-35,-245,0,-3,-9,-35,-35,41359,86,86,27,4,13,5908,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-30,27-Mar-2012,Mar 27th 2012,Wed 03-27-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-24,2012-03-25,2012-03-27,Wed ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,13,2012,2012-03-24,2012-03-30,N,Wk.13 - 13,2012-03-24 00:00:00,2012-03-30 00:00:00,2012W13 ,2012W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2012,N,2012-03-27,2011-03-27,2012-12-27,2012-09-27,2012-02-27,2012-01-27,2012-03-20,2012-03-13,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-22,2012-01-01,2012-10-01,2012-11-01,2012-11-17,0,0,0,-1,-5,0,0,-1,-1,-1,41599,326,53,22,6,47,5942,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-23,22-Nov-2012,Nov 22nd 2012,Fri 11-22-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-17,2012-11-18,2012-11-22,Fri ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,47,2012,2012-11-17,2012-11-23,N,Wk.47 - 13,2012-11-17 00:00:00,2012-11-23 00:00:00,2012W47 ,2012W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2012,N,2012-11-22,2011-11-22,2012-08-22,2012-05-22,2012-10-22,2012-09-22,2012-11-15,2012-11-08,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-07,2012-01-01,2012-07-01,2012-07-01,2012-07-07,0,-1,-4,-20,-143,0,-1,-5,-20,-21,41461,188,7,7,1,28,5923,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-13,07-Jul-2012,Jul 7th 2012,Sun 07-07-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-07,2012-07-01,2012-07-07,Sun ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,28,2012,2012-07-07,2012-07-13,Y,Wk.28 - 13,2012-07-07 00:00:00,2012-07-13 00:00:00,2012W28 ,2012W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2012,N,2012-07-07,2011-07-07,2012-04-07,2012-01-07,2012-06-07,2012-05-07,2012-06-30,2012-06-23,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-11,2012-01-01,2012-07-01,2012-09-01,2012-09-08,0,-1,-2,-11,-77,0,-1,-3,-11,-11,41527,254,73,11,4,37,5932,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-14,11-Sep-2012,Sep 11th 2012,Wed 09-11-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-08,2012-09-09,2012-09-11,Wed ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,37,2012,2012-09-08,2012-09-14,N,Wk.37 - 13,2012-09-08 00:00:00,2012-09-14 00:00:00,2012W37 ,2012W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2012,N,2012-09-11,2011-09-11,2012-06-11,2012-03-11,2012-08-11,2012-07-11,2012-09-04,2012-08-28,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-19,2012-01-01,2012-10-01,2012-10-01,2012-10-13,0,0,-1,-6,-39,0,0,-2,-6,-6,41565,292,19,19,7,42,5937,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-19,19-Oct-2012,Oct 19th 2012,Sat 10-19-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-13,2012-10-14,2012-10-19,Sat ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,42,2012,2012-10-13,2012-10-19,N,Wk.42 - 13,2012-10-13 00:00:00,2012-10-19 00:00:00,2012W42 ,2012W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2012,N,2012-10-19,2011-10-19,2012-07-19,2012-04-19,2012-09-19,2012-08-19,2012-10-12,2012-10-05,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-23,2012-01-01,2012-10-01,2012-12-01,2012-12-22,0,0,1,4,26,0,0,0,4,4,41630,357,84,23,2,52,5947,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-28,23-Dec-2012,Dec 23rd 2012,Mon 12-23-13,0,0,0,0,2012-12-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-22,2012-12-23,2012-12-23,Mon ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,52,2012,2012-12-22,2012-12-28,N,Wk.52 - 13,2012-12-22 00:00:00,2012-12-28 00:00:00,2012W52 ,2012W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2012,N,2012-12-23,2011-12-23,2012-09-23,2012-06-23,2012-11-23,2012-10-23,2012-12-16,2012-12-09,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-24,2012-01-01,2012-04-01,2012-05-01,2012-05-19,0,-2,-6,-27,-187,0,-2,-7,-27,-27,41417,144,54,24,6,21,5916,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-25,24-May-2012,May 24th 2012,Fri 05-24-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-19,2012-05-20,2012-05-24,Fri ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,21,2012,2012-05-19,2012-05-25,N,Wk.21 - 13,2012-05-19 00:00:00,2012-05-25 00:00:00,2012W21 ,2012W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2012,N,2012-05-24,2011-05-24,2012-02-24,2012-11-24,2012-04-24,2012-03-24,2012-05-17,2012-05-10,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-05,2012-01-01,2012-10-01,2012-11-01,2012-11-03,0,0,0,-3,-22,0,0,-1,-3,-3,41582,309,36,5,3,45,5940,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-09,05-Nov-2012,Nov 5th 2012,Tue 11-05-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-03,2012-11-04,2012-11-05,Tue ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,45,2012,2012-11-03,2012-11-09,N,Wk.45 - 13,2012-11-03 00:00:00,2012-11-09 00:00:00,2012W45 ,2012W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2012,N,2012-11-05,2011-11-05,2012-08-05,2012-05-05,2012-10-05,2012-09-05,2012-10-29,2012-10-22,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-29,2012-01-01,2012-04-01,2012-05-01,2012-05-26,0,-2,-6,-26,-182,0,-2,-6,-26,-26,41422,149,59,29,4,22,5917,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-06-01,29-May-2012,May 29th 2012,Wed 05-29-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-05-26,2012-05-26,2012-05-27,2012-05-29,Wed ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,22,2012,2012-05-26,2012-06-01,N,Wk.22 - 13,2012-05-26 00:00:00,2012-06-01 00:00:00,2012W22 ,2012W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2012,N,2012-05-29,2011-05-29,2012-02-28,2012-11-29,2012-04-29,2012-03-29,2012-05-22,2012-05-15,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-02,2012-01-01,2012-01-01,2012-01-01,2012-01-01,0,-3,-10,-47,-329,0,-3,-11,-47,-47,41275,2,2,2,4,1,5896,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-05,02-Jan-2012,Jan 2nd 2012,Wed 01-02-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2012-01-02,Wed ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,1,2012,2012-12-30,2012-01-05,N,Wk.01 - 13,2012-01-01 00:00:00,2012-01-05 00:00:00,2012W01 ,2012W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2012,N,2012-01-02,2011-01-02,2012-10-02,2012-07-02,2012-12-02,2012-11-02,2012-12-26,2012-12-19,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-02,2012-01-01,2012-10-01,2012-12-01,2012-12-01,0,0,1,1,5,0,0,0,1,1,41609,336,63,2,2,49,5944,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-07,02-Dec-2012,Dec 2nd 2012,Mon 12-02-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-01,2012-12-02,2012-12-02,Mon ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,49,2012,2012-12-01,2012-12-07,N,Wk.49 - 13,2012-12-01 00:00:00,2012-12-07 00:00:00,2012W49 ,2012W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2012,N,2012-12-02,2011-12-02,2012-09-02,2012-06-02,2012-11-02,2012-10-02,2012-11-25,2012-11-18,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-24,2012-01-01,2012-01-01,2012-02-01,2012-02-24,0,-3,-9,-39,-276,0,-3,-9,-39,-40,41328,55,55,24,1,9,5904,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-03-02,24-Feb-2012,Feb 24th 2012,Sun 02-24-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-02-24,2012-02-24,2012-02-18,2012-02-24,Sun ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,9,2012,2012-02-24,2012-03-02,Y,Wk.09 - 13,2012-02-24 00:00:00,2012-03-02 00:00:00,2012W09 ,2012W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2012,N,2012-02-24,2011-02-24,2012-11-24,2012-08-24,2012-01-24,2012-12-24,2012-02-17,2012-02-10,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-23,2012-01-01,2012-01-01,2012-01-01,2012-01-20,0,-3,-10,-44,-308,0,-3,-11,-44,-44,41296,23,23,23,4,4,5899,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-26,23-Jan-2012,Jan 23rd 2012,Wed 01-23-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-20,2012-01-21,2012-01-23,Wed ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,4,2012,2012-01-20,2012-01-26,N,Wk.04 - 13,2012-01-20 00:00:00,2012-01-26 00:00:00,2012W04 ,2012W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2012,N,2012-01-23,2011-01-23,2012-10-23,2012-07-23,2012-12-23,2012-11-23,2012-01-16,2012-01-09,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-16,2012-01-01,2012-01-01,2012-01-01,2012-01-13,0,-3,-10,-45,-315,0,-3,-11,-45,-45,41289,16,16,16,4,3,5898,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-19,16-Jan-2012,Jan 16th 2012,Wed 01-16-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-13,2012-01-14,2012-01-16,Wed ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,3,2012,2012-01-13,2012-01-19,N,Wk.03 - 13,2012-01-13 00:00:00,2012-01-19 00:00:00,2012W03 ,2012W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2012,N,2012-01-16,2011-01-16,2012-10-16,2012-07-16,2012-12-16,2012-11-16,2012-01-09,2012-01-02,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-05,2012-01-01,2012-04-01,2012-04-01,2012-03-31,0,-2,-7,-34,-236,0,-2,-8,-34,-34,41368,95,5,5,6,14,5909,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-06,05-Apr-2012,Apr 5th 2012,Fri 04-05-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-03-31,2012-04-01,2012-04-05,Fri ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,14,2012,2012-03-31,2012-04-06,N,Wk.14 - 13,2012-03-31 00:00:00,2012-04-06 00:00:00,2012W14 ,2012W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2012,N,2012-04-05,2011-04-05,2012-01-05,2012-10-05,2012-03-05,2012-02-05,2012-03-29,2012-03-22,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-27,2012-01-01,2012-04-01,2012-05-01,2012-05-26,0,-2,-6,-26,-184,0,-2,-6,-26,-26,41420,147,57,27,2,22,5917,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-06-01,27-May-2012,May 27th 2012,Mon 05-27-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-05-26,2012-05-26,2012-05-27,2012-05-27,Mon ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,22,2012,2012-05-26,2012-06-01,N,Wk.22 - 13,2012-05-26 00:00:00,2012-06-01 00:00:00,2012W22 ,2012W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2012,N,2012-05-27,2011-05-27,2012-02-27,2012-11-27,2012-04-27,2012-03-27,2012-05-20,2012-05-13,0,0,0,1,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-12,2012-01-01,2012-10-01,2012-10-01,2012-10-06,0,0,-1,-7,-46,0,0,-2,-7,-7,41558,285,12,12,7,41,5936,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-12,12-Oct-2012,Oct 12th 2012,Sat 10-12-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-06,2012-10-07,2012-10-12,Sat ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,41,2012,2012-10-06,2012-10-12,N,Wk.41 - 13,2012-10-06 00:00:00,2012-10-12 00:00:00,2012W41 ,2012W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2012,N,2012-10-12,2011-10-12,2012-07-12,2012-04-12,2012-09-12,2012-08-12,2012-10-05,2012-09-28,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-01,2012-01-01,2012-01-01,2012-03-01,2012-02-24,0,-3,-8,-39,-271,0,-3,-9,-39,-39,41333,60,60,1,6,9,5904,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-02,01-Mar-2012,Mar 1st 2012,Fri 03-01-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-02-24,2012-02-25,2012-03-01,Fri ,2012M03,Mar-2012,Y,2012M03 ,Y,Year 2012 - Quarter 01,2012Q01 ,N,9,2012,2012-02-24,2012-03-02,N,Wk.09 - 13,2012-02-24 00:00:00,2012-03-02 00:00:00,2012W09 ,2012W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2012,N,2012-03-01,2011-03-01,2012-12-01,2012-09-01,2012-02-01,2012-01-01,2012-02-22,2012-02-15,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-26,2012-01-01,2012-04-01,2012-04-01,2012-04-21,0,-2,-7,-31,-215,0,-2,-8,-31,-31,41389,116,26,26,6,17,5912,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-27,26-Apr-2012,Apr 26th 2012,Fri 04-26-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-21,2012-04-22,2012-04-26,Fri ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,17,2012,2012-04-21,2012-04-27,N,Wk.17 - 13,2012-04-21 00:00:00,2012-04-27 00:00:00,2012W17 ,2012W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2012,N,2012-04-26,2011-04-26,2012-01-26,2012-10-26,2012-03-26,2012-02-26,2012-04-19,2012-04-12,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-20,2012-01-01,2012-10-01,2012-11-01,2012-11-17,0,0,0,-1,-7,0,0,-1,-1,-1,41597,324,51,20,4,47,5942,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-23,20-Nov-2012,Nov 20th 2012,Wed 11-20-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-17,2012-11-18,2012-11-20,Wed ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,47,2012,2012-11-17,2012-11-23,N,Wk.47 - 13,2012-11-17 00:00:00,2012-11-23 00:00:00,2012W47 ,2012W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2012,N,2012-11-20,2011-11-20,2012-08-20,2012-05-20,2012-10-20,2012-09-20,2012-11-13,2012-11-06,0,0,0,0,0,0,1,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-04,2012-01-01,2012-04-01,2012-06-01,2012-06-02,0,-2,-5,-25,-176,0,-2,-6,-25,-25,41428,155,65,4,3,23,5918,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-08,04-Jun-2012,Jun 4th 2012,Tue 06-04-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-02,2012-06-03,2012-06-04,Tue ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,23,2012,2012-06-02,2012-06-08,N,Wk.23 - 13,2012-06-02 00:00:00,2012-06-08 00:00:00,2012W23 ,2012W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2012,N,2012-06-04,2011-06-04,2012-03-04,2012-12-04,2012-05-04,2012-04-04,2012-05-28,2012-05-21,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-14,2012-01-01,2012-07-01,2012-09-01,2012-09-08,0,-1,-2,-11,-74,0,-1,-3,-11,-11,41530,257,76,14,7,37,5932,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-14,14-Sep-2012,Sep 14th 2012,Sat 09-14-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-08,2012-09-09,2012-09-14,Sat ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,37,2012,2012-09-08,2012-09-14,N,Wk.37 - 13,2012-09-08 00:00:00,2012-09-14 00:00:00,2012W37 ,2012W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2012,N,2012-09-14,2011-09-14,2012-06-14,2012-03-14,2012-08-14,2012-07-14,2012-09-07,2012-08-31,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-06,2012-01-01,2012-04-01,2012-05-01,2012-05-05,0,-2,-6,-29,-205,0,-2,-7,-29,-29,41399,126,36,6,2,19,5914,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-11,06-May-2012,May 6th 2012,Mon 05-06-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-05,2012-05-06,2012-05-06,Mon ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,19,2012,2012-05-05,2012-05-11,N,Wk.19 - 13,2012-05-05 00:00:00,2012-05-11 00:00:00,2012W19 ,2012W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2012,N,2012-05-06,2011-05-06,2012-02-06,2012-11-06,2012-04-06,2012-03-06,2012-04-29,2012-04-22,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-25,2012-01-01,2012-04-01,2012-06-01,2012-06-23,0,-2,-5,-22,-155,0,-2,-6,-22,-22,41449,176,86,25,3,26,5921,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-29,25-Jun-2012,Jun 25th 2012,Tue 06-25-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-23,2012-06-24,2012-06-25,Tue ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,26,2012,2012-06-23,2012-06-29,N,Wk.26 - 13,2012-06-23 00:00:00,2012-06-29 00:00:00,2012W26 ,2012W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2012,N,2012-06-25,2011-06-25,2012-03-25,2012-12-25,2012-05-25,2012-04-25,2012-06-18,2012-06-11,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-22,2012-01-01,2012-01-01,2012-02-01,2012-02-17,0,-3,-9,-40,-278,0,-3,-10,-40,-40,41326,53,53,22,6,8,5903,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-23,22-Feb-2012,Feb 22nd 2012,Fri 02-22-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-17,2012-02-18,2012-02-22,Fri ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,8,2012,2012-02-17,2012-02-23,N,Wk.08 - 13,2012-02-17 00:00:00,2012-02-23 00:00:00,2012W08 ,2012W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2012,N,2012-02-22,2011-02-22,2012-11-22,2012-08-22,2012-01-22,2012-12-22,2012-02-15,2012-02-08,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-19,2012-01-01,2012-10-01,2012-12-01,2012-12-15,0,0,1,3,22,0,0,0,3,3,41626,353,80,19,5,51,5946,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-21,19-Dec-2012,Dec 19th 2012,Thu 12-19-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-15,2012-12-16,2012-12-19,Thu ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,51,2012,2012-12-15,2012-12-21,N,Wk.51 - 13,2012-12-15 00:00:00,2012-12-21 00:00:00,2012W51 ,2012W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2012,N,2012-12-19,2011-12-19,2012-09-19,2012-06-19,2012-11-19,2012-10-19,2012-12-12,2012-12-05,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-30,2012-01-01,2012-07-01,2012-09-01,2012-09-29,0,-1,-2,-8,-58,0,0,-2,-8,-8,41546,273,92,30,2,40,5935,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-10-05,30-Sep-2012,Sep 30th 2012,Mon 09-30-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-09-29,2012-09-29,2012-09-30,2012-09-30,Mon ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,40,2012,2012-09-29,2012-10-05,N,Wk.40 - 13,2012-09-29 00:00:00,2012-10-05 00:00:00,2012W40 ,2012W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2012,N,2012-09-30,2011-09-30,2012-06-30,2012-03-30,2012-08-30,2012-07-30,2012-09-23,2012-09-16,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-26,2012-01-01,2012-10-01,2012-11-01,2012-11-24,0,0,0,0,-1,0,0,0,0,0,41603,330,57,26,3,48,5943,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-30,26-Nov-2012,Nov 26th 2012,Tue 11-26-13,1,1,1,1,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-11-24,2012-11-24,2012-11-25,2012-11-26,Tue ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,48,2012,2012-11-24,2012-11-30,N,Wk.48 - 13,2012-11-24 00:00:00,2012-11-30 00:00:00,2012W48 ,2012W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2012,N,2012-11-26,2011-11-26,2012-08-26,2012-05-26,2012-10-26,2012-09-26,2012-11-19,2012-11-12,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-25,2012-01-01,2012-04-01,2012-05-01,2012-05-19,0,-2,-6,-27,-186,0,-2,-7,-27,-27,41418,145,55,25,7,21,5916,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-25,25-May-2012,May 25th 2012,Sat 05-25-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-19,2012-05-20,2012-05-25,Sat ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,21,2012,2012-05-19,2012-05-25,N,Wk.21 - 13,2012-05-19 00:00:00,2012-05-25 00:00:00,2012W21 ,2012W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2012,N,2012-05-25,2011-05-25,2012-02-25,2012-11-25,2012-04-25,2012-03-25,2012-05-18,2012-05-11,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-14,2012-01-01,2012-10-01,2012-10-01,2012-10-13,0,0,-1,-6,-44,0,0,-2,-6,-6,41560,287,14,14,2,42,5937,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-19,14-Oct-2012,Oct 14th 2012,Mon 10-14-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-13,2012-10-14,2012-10-14,Mon ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,42,2012,2012-10-13,2012-10-19,N,Wk.42 - 13,2012-10-13 00:00:00,2012-10-19 00:00:00,2012W42 ,2012W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2012,N,2012-10-14,2011-10-14,2012-07-14,2012-04-14,2012-09-14,2012-08-14,2012-10-07,2012-09-30,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-30,2012-01-01,2012-04-01,2012-06-01,2012-06-30,0,-2,-5,-21,-150,0,-1,-5,-21,-22,41454,181,91,30,1,27,5922,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-07-06,30-Jun-2012,Jun 30th 2012,Sun 06-30-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-06-30,2012-06-30,2012-06-30,2012-06-24,2012-06-30,Sun ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,27,2012,2012-06-30,2012-07-06,Y,Wk.27 - 13,2012-06-30 00:00:00,2012-07-06 00:00:00,2012W27 ,2012W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2012,N,2012-06-30,2011-06-30,2012-03-30,2012-12-30,2012-05-30,2012-04-30,2012-06-23,2012-06-16,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-21,2012-01-01,2012-04-01,2012-04-01,2012-04-21,0,-2,-7,-31,-220,0,-2,-8,-31,-32,41384,111,21,21,1,17,5912,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-27,21-Apr-2012,Apr 21st 2012,Sun 04-21-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-21,2012-04-15,2012-04-21,Sun ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,17,2012,2012-04-21,2012-04-27,Y,Wk.17 - 13,2012-04-21 00:00:00,2012-04-27 00:00:00,2012W17 ,2012W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2012,N,2012-04-21,2011-04-21,2012-01-21,2012-10-21,2012-03-21,2012-02-21,2012-04-14,2012-04-07,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-16,2012-01-01,2012-10-01,2012-11-01,2012-11-10,0,0,0,-2,-11,0,0,-1,-2,-2,41593,320,47,16,7,46,5941,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-16,16-Nov-2012,Nov 16th 2012,Sat 11-16-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-10,2012-11-11,2012-11-16,Sat ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,46,2012,2012-11-10,2012-11-16,N,Wk.46 - 13,2012-11-10 00:00:00,2012-11-16 00:00:00,2012W46 ,2012W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2012,N,2012-11-16,2011-11-16,2012-08-16,2012-05-16,2012-10-16,2012-09-16,2012-11-09,2012-11-02,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-26,2012-01-01,2012-07-01,2012-07-01,2012-07-21,0,-1,-4,-18,-124,0,-1,-5,-18,-18,41480,207,26,26,6,30,5925,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-27,26-Jul-2012,Jul 26th 2012,Fri 07-26-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-21,2012-07-22,2012-07-26,Fri ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,30,2012,2012-07-21,2012-07-27,N,Wk.30 - 13,2012-07-21 00:00:00,2012-07-27 00:00:00,2012W30 ,2012W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2012,N,2012-07-26,2011-07-26,2012-04-26,2012-01-26,2012-06-26,2012-05-26,2012-07-19,2012-07-12,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-04,2012-01-01,2012-04-01,2012-05-01,2012-04-28,0,-2,-6,-30,-207,0,-2,-7,-30,-30,41397,124,34,4,7,18,5913,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-04,04-May-2012,May 4th 2012,Sat 05-04-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-04-28,2012-04-29,2012-05-04,Sat ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,18,2012,2012-04-28,2012-05-04,N,Wk.18 - 13,2012-04-28 00:00:00,2012-05-04 00:00:00,2012W18 ,2012W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2012,N,2012-05-04,2011-05-04,2012-02-04,2012-11-04,2012-04-04,2012-03-04,2012-04-27,2012-04-20,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-21,2012-01-01,2012-01-01,2012-01-01,2012-01-20,0,-3,-10,-44,-310,0,-3,-11,-44,-44,41294,21,21,21,2,4,5899,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-26,21-Jan-2012,Jan 21st 2012,Mon 01-21-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-20,2012-01-21,2012-01-21,Mon ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,4,2012,2012-01-20,2012-01-26,N,Wk.04 - 13,2012-01-20 00:00:00,2012-01-26 00:00:00,2012W04 ,2012W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2012,N,2012-01-21,2011-01-21,2012-10-21,2012-07-21,2012-12-21,2012-11-21,2012-01-14,2012-01-07,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-17,2012-01-01,2012-10-01,2012-12-01,2012-12-15,0,0,1,3,20,0,0,0,3,3,41624,351,78,17,3,51,5946,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-21,17-Dec-2012,Dec 17th 2012,Tue 12-17-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-15,2012-12-16,2012-12-17,Tue ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,51,2012,2012-12-15,2012-12-21,N,Wk.51 - 13,2012-12-15 00:00:00,2012-12-21 00:00:00,2012W51 ,2012W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2012,N,2012-12-17,2011-12-17,2012-09-17,2012-06-17,2012-11-17,2012-10-17,2012-12-10,2012-12-03,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-12,2012-01-01,2012-07-01,2012-09-01,2012-09-08,0,-1,-2,-11,-76,0,-1,-3,-11,-11,41528,255,74,12,5,37,5932,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-14,12-Sep-2012,Sep 12th 2012,Thu 09-12-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-08,2012-09-09,2012-09-12,Thu ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,37,2012,2012-09-08,2012-09-14,N,Wk.37 - 13,2012-09-08 00:00:00,2012-09-14 00:00:00,2012W37 ,2012W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2012,N,2012-09-12,2011-09-12,2012-06-12,2012-03-12,2012-08-12,2012-07-12,2012-09-05,2012-08-29,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-22,2012-01-01,2012-07-01,2012-07-01,2012-07-21,0,-1,-4,-18,-128,0,-1,-5,-18,-18,41476,203,22,22,2,30,5925,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-27,22-Jul-2012,Jul 22nd 2012,Mon 07-22-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-21,2012-07-22,2012-07-22,Mon ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,30,2012,2012-07-21,2012-07-27,N,Wk.30 - 13,2012-07-21 00:00:00,2012-07-27 00:00:00,2012W30 ,2012W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2012,N,2012-07-22,2011-07-22,2012-04-22,2012-01-22,2012-06-22,2012-05-22,2012-07-15,2012-07-08,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-13,2012-01-01,2012-10-01,2012-10-01,2012-10-13,0,0,-1,-6,-45,0,0,-2,-6,-7,41559,286,13,13,1,42,5937,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-19,13-Oct-2012,Oct 13th 2012,Sun 10-13-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-13,2012-10-07,2012-10-13,Sun ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,42,2012,2012-10-13,2012-10-19,Y,Wk.42 - 13,2012-10-13 00:00:00,2012-10-19 00:00:00,2012W42 ,2012W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2012,N,2012-10-13,2011-10-13,2012-07-13,2012-04-13,2012-09-13,2012-08-13,2012-10-06,2012-09-29,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-11,2012-01-01,2012-07-01,2012-08-01,2012-08-11,0,-1,-3,-15,-108,0,-1,-4,-15,-16,41496,223,42,11,1,33,5928,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-17,11-Aug-2012,Aug 11th 2012,Sun 08-11-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-11,2012-08-05,2012-08-11,Sun ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,33,2012,2012-08-11,2012-08-17,Y,Wk.33 - 13,2012-08-11 00:00:00,2012-08-17 00:00:00,2012W33 ,2012W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2012,N,2012-08-11,2011-08-11,2012-05-11,2012-02-11,2012-07-11,2012-06-11,2012-08-04,2012-07-28,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-08,2012-01-01,2012-07-01,2012-08-01,2012-08-04,0,-1,-3,-16,-111,0,-1,-4,-16,-16,41493,220,39,8,5,32,5927,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-10,08-Aug-2012,Aug 8th 2012,Thu 08-08-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-04,2012-08-05,2012-08-08,Thu ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,32,2012,2012-08-04,2012-08-10,N,Wk.32 - 13,2012-08-04 00:00:00,2012-08-10 00:00:00,2012W32 ,2012W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2012,N,2012-08-08,2011-08-08,2012-05-08,2012-02-08,2012-07-08,2012-06-08,2012-08-01,2012-07-25,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-28,2012-01-01,2012-04-01,2012-06-01,2012-06-23,0,-2,-5,-22,-152,0,-2,-6,-22,-22,41452,179,89,28,6,26,5921,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-29,28-Jun-2012,Jun 28th 2012,Fri 06-28-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-23,2012-06-24,2012-06-28,Fri ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,26,2012,2012-06-23,2012-06-29,N,Wk.26 - 13,2012-06-23 00:00:00,2012-06-29 00:00:00,2012W26 ,2012W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2012,N,2012-06-28,2011-06-28,2012-03-28,2012-12-28,2012-05-28,2012-04-28,2012-06-21,2012-06-14,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-17,2012-01-01,2012-01-01,2012-02-01,2012-02-17,0,-3,-9,-40,-283,0,-3,-10,-40,-41,41321,48,48,17,1,8,5903,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-23,17-Feb-2012,Feb 17th 2012,Sun 02-17-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-17,2012-02-11,2012-02-17,Sun ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,8,2012,2012-02-17,2012-02-23,Y,Wk.08 - 13,2012-02-17 00:00:00,2012-02-23 00:00:00,2012W08 ,2012W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2012,N,2012-02-17,2011-02-17,2012-11-17,2012-08-17,2012-01-17,2012-12-17,2012-02-10,2012-02-03,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-03,2012-01-01,2012-07-01,2012-07-01,2012-06-30,0,-1,-4,-21,-147,0,-1,-5,-21,-21,41457,184,3,3,4,27,5922,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-06,03-Jul-2012,Jul 3rd 2012,Wed 07-03-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-06-30,2012-07-01,2012-07-03,Wed ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,27,2012,2012-06-30,2012-07-06,N,Wk.27 - 13,2012-06-30 00:00:00,2012-07-06 00:00:00,2012W27 ,2012W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2012,N,2012-07-03,2011-07-03,2012-04-03,2012-01-03,2012-06-03,2012-05-03,2012-06-26,2012-06-19,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-05,2012-01-01,2012-04-01,2012-06-01,2012-06-02,0,-2,-5,-25,-175,0,-2,-6,-25,-25,41429,156,66,5,4,23,5918,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-08,05-Jun-2012,Jun 5th 2012,Wed 06-05-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-02,2012-06-03,2012-06-05,Wed ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,23,2012,2012-06-02,2012-06-08,N,Wk.23 - 13,2012-06-02 00:00:00,2012-06-08 00:00:00,2012W23 ,2012W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2012,N,2012-06-05,2011-06-05,2012-03-05,2012-12-05,2012-05-05,2012-04-05,2012-05-29,2012-05-22,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-23,2012-01-01,2012-04-01,2012-05-01,2012-05-19,0,-2,-6,-27,-188,0,-2,-7,-27,-27,41416,143,53,23,5,21,5916,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-25,23-May-2012,May 23rd 2012,Thu 05-23-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-19,2012-05-20,2012-05-23,Thu ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,21,2012,2012-05-19,2012-05-25,N,Wk.21 - 13,2012-05-19 00:00:00,2012-05-25 00:00:00,2012W21 ,2012W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2012,N,2012-05-23,2011-05-23,2012-02-23,2012-11-23,2012-04-23,2012-03-23,2012-05-16,2012-05-09,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-06,2012-01-01,2012-04-01,2012-06-01,2012-06-02,0,-2,-5,-25,-174,0,-2,-6,-25,-25,41430,157,67,6,5,23,5918,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-08,06-Jun-2012,Jun 6th 2012,Thu 06-06-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-02,2012-06-03,2012-06-06,Thu ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,23,2012,2012-06-02,2012-06-08,N,Wk.23 - 13,2012-06-02 00:00:00,2012-06-08 00:00:00,2012W23 ,2012W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2012,N,2012-06-06,2011-06-06,2012-03-06,2012-12-06,2012-05-06,2012-04-06,2012-05-30,2012-05-23,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-23,2012-01-01,2012-04-01,2012-04-01,2012-04-21,0,-2,-7,-31,-218,0,-2,-8,-31,-31,41386,113,23,23,3,17,5912,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-27,23-Apr-2012,Apr 23rd 2012,Tue 04-23-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-21,2012-04-22,2012-04-23,Tue ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,17,2012,2012-04-21,2012-04-27,N,Wk.17 - 13,2012-04-21 00:00:00,2012-04-27 00:00:00,2012W17 ,2012W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2012,N,2012-04-23,2011-04-23,2012-01-23,2012-10-23,2012-03-23,2012-02-23,2012-04-16,2012-04-09,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-13,2012-01-01,2012-07-01,2012-08-01,2012-08-11,0,-1,-3,-15,-106,0,-1,-4,-15,-15,41498,225,44,13,3,33,5928,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-17,13-Aug-2012,Aug 13th 2012,Tue 08-13-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-11,2012-08-12,2012-08-13,Tue ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,33,2012,2012-08-11,2012-08-17,N,Wk.33 - 13,2012-08-11 00:00:00,2012-08-17 00:00:00,2012W33 ,2012W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2012,N,2012-08-13,2011-08-13,2012-05-13,2012-02-13,2012-07-13,2012-06-13,2012-08-06,2012-07-30,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-14,2012-01-01,2012-10-01,2012-11-01,2012-11-10,0,0,0,-2,-13,0,0,-1,-2,-2,41591,318,45,14,5,46,5941,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-16,14-Nov-2012,Nov 14th 2012,Thu 11-14-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-10,2012-11-11,2012-11-14,Thu ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,46,2012,2012-11-10,2012-11-16,N,Wk.46 - 13,2012-11-10 00:00:00,2012-11-16 00:00:00,2012W46 ,2012W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2012,N,2012-11-14,2011-11-14,2012-08-14,2012-05-14,2012-10-14,2012-09-14,2012-11-07,2012-10-31,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-09,2012-01-01,2012-07-01,2012-08-01,2012-08-04,0,-1,-3,-16,-110,0,-1,-4,-16,-16,41494,221,40,9,6,32,5927,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-10,09-Aug-2012,Aug 9th 2012,Fri 08-09-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-04,2012-08-05,2012-08-09,Fri ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,32,2012,2012-08-04,2012-08-10,N,Wk.32 - 13,2012-08-04 00:00:00,2012-08-10 00:00:00,2012W32 ,2012W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2012,N,2012-08-09,2011-08-09,2012-05-09,2012-02-09,2012-07-09,2012-06-09,2012-08-02,2012-07-26,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-10,2012-01-01,2012-07-01,2012-09-01,2012-09-08,0,-1,-2,-11,-78,0,-1,-3,-11,-11,41526,253,72,10,3,37,5932,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-14,10-Sep-2012,Sep 10th 2012,Tue 09-10-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-08,2012-09-09,2012-09-10,Tue ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,37,2012,2012-09-08,2012-09-14,N,Wk.37 - 13,2012-09-08 00:00:00,2012-09-14 00:00:00,2012W37 ,2012W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2012,N,2012-09-10,2011-09-10,2012-06-10,2012-03-10,2012-08-10,2012-07-10,2012-09-03,2012-08-27,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-08,2012-01-01,2012-01-01,2012-03-01,2012-03-03,0,-3,-8,-38,-264,0,-3,-9,-38,-38,41340,67,67,8,6,10,5905,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-09,08-Mar-2012,Mar 8th 2012,Fri 03-08-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-03,2012-03-04,2012-03-08,Fri ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,10,2012,2012-03-03,2012-03-09,N,Wk.10 - 13,2012-03-03 00:00:00,2012-03-09 00:00:00,2012W10 ,2012W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2012,N,2012-03-08,2011-03-08,2012-12-08,2012-09-08,2012-02-08,2012-01-08,2012-03-01,2012-02-22,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-01,2012-01-01,2012-04-01,2012-04-01,2012-03-31,0,-2,-7,-34,-240,0,-2,-8,-34,-34,41364,91,1,1,2,14,5909,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-06,01-Apr-2012,Apr 1st 2012,Mon 04-01-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-03-31,2012-04-01,2012-04-01,Mon ,2012M04,Apr-2012,Y,2012M04 ,Y,Year 2012 - Quarter 02,2012Q02 ,Y,14,2012,2012-03-31,2012-04-06,N,Wk.14 - 13,2012-03-31 00:00:00,2012-04-06 00:00:00,2012W14 ,2012W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2012,N,2012-04-01,2011-04-01,2012-01-01,2012-10-01,2012-03-01,2012-02-01,2012-03-25,2012-03-18,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-25,2012-01-01,2012-01-01,2012-01-01,2012-01-20,0,-3,-10,-44,-306,0,-3,-11,-44,-44,41298,25,25,25,6,4,5899,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-26,25-Jan-2012,Jan 25th 2012,Fri 01-25-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-20,2012-01-21,2012-01-25,Fri ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,4,2012,2012-01-20,2012-01-26,N,Wk.04 - 13,2012-01-20 00:00:00,2012-01-26 00:00:00,2012W04 ,2012W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2012,N,2012-01-25,2011-01-25,2012-10-25,2012-07-25,2012-12-25,2012-11-25,2012-01-18,2012-01-11,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-24,2012-01-01,2012-04-01,2012-06-01,2012-06-23,0,-2,-5,-22,-156,0,-2,-6,-22,-22,41448,175,85,24,2,26,5921,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-29,24-Jun-2012,Jun 24th 2012,Mon 06-24-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-23,2012-06-24,2012-06-24,Mon ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,26,2012,2012-06-23,2012-06-29,N,Wk.26 - 13,2012-06-23 00:00:00,2012-06-29 00:00:00,2012W26 ,2012W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2012,N,2012-06-24,2011-06-24,2012-03-24,2012-12-24,2012-05-24,2012-04-24,2012-06-17,2012-06-10,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-15,2012-01-01,2012-07-01,2012-08-01,2012-08-11,0,-1,-3,-15,-104,0,-1,-4,-15,-15,41500,227,46,15,5,33,5928,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-17,15-Aug-2012,Aug 15th 2012,Thu 08-15-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-11,2012-08-12,2012-08-15,Thu ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,33,2012,2012-08-11,2012-08-17,N,Wk.33 - 13,2012-08-11 00:00:00,2012-08-17 00:00:00,2012W33 ,2012W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2012,N,2012-08-15,2011-08-15,2012-05-15,2012-02-15,2012-07-15,2012-06-15,2012-08-08,2012-08-01,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-17,2012-01-01,2012-01-01,2012-01-01,2012-01-13,0,-3,-10,-45,-314,0,-3,-11,-45,-45,41290,17,17,17,5,3,5898,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-19,17-Jan-2012,Jan 17th 2012,Thu 01-17-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-13,2012-01-14,2012-01-17,Thu ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,3,2012,2012-01-13,2012-01-19,N,Wk.03 - 13,2012-01-13 00:00:00,2012-01-19 00:00:00,2012W03 ,2012W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2012,N,2012-01-17,2011-01-17,2012-10-17,2012-07-17,2012-12-17,2012-11-17,2012-01-10,2012-01-03,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-11,2012-01-01,2012-10-01,2012-10-01,2012-10-06,0,0,-1,-7,-47,0,0,-2,-7,-7,41557,284,11,11,6,41,5936,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-12,11-Oct-2012,Oct 11th 2012,Fri 10-11-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-06,2012-10-07,2012-10-11,Fri ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,41,2012,2012-10-06,2012-10-12,N,Wk.41 - 13,2012-10-06 00:00:00,2012-10-12 00:00:00,2012W41 ,2012W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2012,N,2012-10-11,2011-10-11,2012-07-11,2012-04-11,2012-09-11,2012-08-11,2012-10-04,2012-09-27,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-22,2012-01-01,2012-04-01,2012-05-01,2012-05-19,0,-2,-6,-27,-189,0,-2,-7,-27,-27,41415,142,52,22,4,21,5916,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-25,22-May-2012,May 22nd 2012,Wed 05-22-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-19,2012-05-20,2012-05-22,Wed ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,21,2012,2012-05-19,2012-05-25,N,Wk.21 - 13,2012-05-19 00:00:00,2012-05-25 00:00:00,2012W21 ,2012W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2012,N,2012-05-22,2011-05-22,2012-02-22,2012-11-22,2012-04-22,2012-03-22,2012-05-15,2012-05-08,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-18,2012-01-01,2012-10-01,2012-12-01,2012-12-15,0,0,1,3,21,0,0,0,3,3,41625,352,79,18,4,51,5946,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-21,18-Dec-2012,Dec 18th 2012,Wed 12-18-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-15,2012-12-16,2012-12-18,Wed ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,51,2012,2012-12-15,2012-12-21,N,Wk.51 - 13,2012-12-15 00:00:00,2012-12-21 00:00:00,2012W51 ,2012W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2012,N,2012-12-18,2011-12-18,2012-09-18,2012-06-18,2012-11-18,2012-10-18,2012-12-11,2012-12-04,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-27,2012-01-01,2012-07-01,2012-08-01,2012-08-25,0,-1,-3,-13,-92,0,-1,-3,-13,-13,41512,239,58,27,3,35,5930,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-31,27-Aug-2012,Aug 27th 2012,Tue 08-27-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-08-25,2012-08-25,2012-08-26,2012-08-27,Tue ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,35,2012,2012-08-25,2012-08-31,N,Wk.35 - 13,2012-08-25 00:00:00,2012-08-31 00:00:00,2012W35 ,2012W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2012,N,2012-08-27,2011-08-27,2012-05-27,2012-02-27,2012-07-27,2012-06-27,2012-08-20,2012-08-13,0,0,1,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-28,2012-01-01,2012-07-01,2012-08-01,2012-08-25,0,-1,-3,-13,-91,0,-1,-3,-13,-13,41513,240,59,28,4,35,5930,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-31,28-Aug-2012,Aug 28th 2012,Wed 08-28-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-08-25,2012-08-25,2012-08-26,2012-08-28,Wed ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,35,2012,2012-08-25,2012-08-31,N,Wk.35 - 13,2012-08-25 00:00:00,2012-08-31 00:00:00,2012W35 ,2012W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2012,N,2012-08-28,2011-08-28,2012-05-28,2012-02-28,2012-07-28,2012-06-28,2012-08-21,2012-08-14,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-29,2012-01-01,2012-01-01,2012-01-01,2012-01-27,0,-3,-10,-43,-302,0,-3,-10,-43,-43,41302,29,29,29,3,5,5900,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-02-02,29-Jan-2012,Jan 29th 2012,Tue 01-29-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-01-27,2012-01-27,2012-01-28,2012-01-29,Tue ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,5,2012,2012-01-27,2012-02-02,N,Wk.05 - 13,2012-01-27 00:00:00,2012-02-02 00:00:00,2012W05 ,2012W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2012,N,2012-01-29,2011-01-29,2012-10-29,2012-07-29,2012-12-29,2012-11-29,2012-01-22,2012-01-15,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-20,2012-01-01,2012-01-01,2012-03-01,2012-03-17,0,-3,-8,-36,-252,0,-3,-9,-36,-36,41352,79,79,20,4,12,5907,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-23,20-Mar-2012,Mar 20th 2012,Wed 03-20-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-17,2012-03-18,2012-03-20,Wed ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,12,2012,2012-03-17,2012-03-23,N,Wk.12 - 13,2012-03-17 00:00:00,2012-03-23 00:00:00,2012W12 ,2012W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2012,N,2012-03-20,2011-03-20,2012-12-20,2012-09-20,2012-02-20,2012-01-20,2012-03-13,2012-03-06,0,0,0,0,0,0,0,0,3,1,12,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-28,2012-01-01,2012-07-01,2012-09-01,2012-09-22,0,-1,-2,-9,-60,0,-1,-3,-9,-9,41544,271,90,28,7,39,5934,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-28,28-Sep-2012,Sep 28th 2012,Sat 09-28-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-22,2012-09-23,2012-09-28,Sat ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,39,2012,2012-09-22,2012-09-28,N,Wk.39 - 13,2012-09-22 00:00:00,2012-09-28 00:00:00,2012W39 ,2012W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2012,N,2012-09-28,2011-09-28,2012-06-28,2012-03-28,2012-08-28,2012-07-28,2012-09-21,2012-09-14,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-02,2012-01-01,2012-04-01,2012-04-01,2012-03-31,0,-2,-7,-34,-239,0,-2,-8,-34,-34,41365,92,2,2,3,14,5909,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-06,02-Apr-2012,Apr 2nd 2012,Tue 04-02-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-03-31,2012-04-01,2012-04-02,Tue ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,14,2012,2012-03-31,2012-04-06,N,Wk.14 - 13,2012-03-31 00:00:00,2012-04-06 00:00:00,2012W14 ,2012W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2012,N,2012-04-02,2011-04-02,2012-01-02,2012-10-02,2012-03-02,2012-02-02,2012-03-26,2012-03-19,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-12,2012-01-01,2012-10-01,2012-12-01,2012-12-08,0,0,1,2,15,0,0,0,2,2,41619,346,73,12,5,50,5945,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-14,12-Dec-2012,Dec 12th 2012,Thu 12-12-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-08,2012-12-09,2012-12-12,Thu ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,50,2012,2012-12-08,2012-12-14,N,Wk.50 - 13,2012-12-08 00:00:00,2012-12-14 00:00:00,2012W50 ,2012W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2012,N,2012-12-12,2011-12-12,2012-09-12,2012-06-12,2012-11-12,2012-10-12,2012-12-05,2012-11-28,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-31,2012-01-01,2012-01-01,2012-01-01,2012-01-27,0,-3,-10,-43,-300,0,-3,-10,-43,-43,41304,31,31,31,5,5,5900,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-02-02,31-Jan-2012,Jan 31st 2012,Thu 01-31-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-01-27,2012-01-27,2012-01-28,2012-01-31,Thu ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,5,2012,2012-01-27,2012-02-02,N,Wk.05 - 13,2012-01-27 00:00:00,2012-02-02 00:00:00,2012W05 ,2012W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2012,N,2012-01-31,2011-01-31,2012-10-31,2012-07-31,2012-12-31,2012-11-30,2012-01-24,2012-01-17,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-22,2012-01-01,2012-04-01,2012-06-01,2012-06-16,0,-2,-5,-23,-158,0,-2,-6,-23,-23,41446,173,83,22,7,25,5920,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-22,22-Jun-2012,Jun 22nd 2012,Sat 06-22-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-16,2012-06-17,2012-06-22,Sat ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,25,2012,2012-06-16,2012-06-22,N,Wk.25 - 13,2012-06-16 00:00:00,2012-06-22 00:00:00,2012W25 ,2012W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2012,N,2012-06-22,2011-06-22,2012-03-22,2012-12-22,2012-05-22,2012-04-22,2012-06-15,2012-06-08,0,0,0,0,0,0,0,0,6,2,25,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-08,2012-01-01,2012-07-01,2012-09-01,2012-09-08,0,-1,-2,-11,-80,0,-1,-3,-11,-12,41524,251,70,8,1,37,5932,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-14,08-Sep-2012,Sep 8th 2012,Sun 09-08-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-08,2012-09-02,2012-09-08,Sun ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,37,2012,2012-09-08,2012-09-14,Y,Wk.37 - 13,2012-09-08 00:00:00,2012-09-14 00:00:00,2012W37 ,2012W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2012,N,2012-09-08,2011-09-08,2012-06-08,2012-03-08,2012-08-08,2012-07-08,2012-09-01,2012-08-25,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-15,2012-01-01,2012-01-01,2012-02-01,2012-02-10,0,-3,-9,-41,-285,0,-3,-10,-41,-41,41319,46,46,15,6,7,5902,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-16,15-Feb-2012,Feb 15th 2012,Fri 02-15-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-10,2012-02-11,2012-02-15,Fri ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,7,2012,2012-02-10,2012-02-16,N,Wk.07 - 13,2012-02-10 00:00:00,2012-02-16 00:00:00,2012W07 ,2012W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2012,N,2012-02-15,2011-02-15,2012-11-15,2012-08-15,2012-01-15,2012-12-15,2012-02-08,2012-02-01,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-20,2012-01-01,2012-01-01,2012-02-01,2012-02-17,0,-3,-9,-40,-280,0,-3,-10,-40,-40,41324,51,51,20,4,8,5903,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-23,20-Feb-2012,Feb 20th 2012,Wed 02-20-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-17,2012-02-18,2012-02-20,Wed ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,8,2012,2012-02-17,2012-02-23,N,Wk.08 - 13,2012-02-17 00:00:00,2012-02-23 00:00:00,2012W08 ,2012W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2012,N,2012-02-20,2011-02-20,2012-11-20,2012-08-20,2012-01-20,2012-12-20,2012-02-13,2012-02-06,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-18,2012-01-01,2012-04-01,2012-04-01,2012-04-14,0,-2,-7,-32,-223,0,-2,-8,-32,-32,41381,108,18,18,5,16,5911,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-20,18-Apr-2012,Apr 18th 2012,Thu 04-18-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-14,2012-04-15,2012-04-18,Thu ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,16,2012,2012-04-14,2012-04-20,N,Wk.16 - 13,2012-04-14 00:00:00,2012-04-20 00:00:00,2012W16 ,2012W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2012,N,2012-04-18,2011-04-18,2012-01-18,2012-10-18,2012-03-18,2012-02-18,2012-04-11,2012-04-04,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-03,2012-01-01,2012-04-01,2012-06-01,2012-06-02,0,-2,-5,-25,-177,0,-2,-6,-25,-25,41427,154,64,3,2,23,5918,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-08,03-Jun-2012,Jun 3rd 2012,Mon 06-03-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-02,2012-06-03,2012-06-03,Mon ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,23,2012,2012-06-02,2012-06-08,N,Wk.23 - 13,2012-06-02 00:00:00,2012-06-08 00:00:00,2012W23 ,2012W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2012,N,2012-06-03,2011-06-03,2012-03-03,2012-12-03,2012-05-03,2012-04-03,2012-05-27,2012-05-20,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-18,2012-01-01,2012-07-01,2012-09-01,2012-09-15,0,-1,-2,-10,-70,0,-1,-3,-10,-10,41534,261,80,18,4,38,5933,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-21,18-Sep-2012,Sep 18th 2012,Wed 09-18-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-15,2012-09-16,2012-09-18,Wed ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,38,2012,2012-09-15,2012-09-21,N,Wk.38 - 13,2012-09-15 00:00:00,2012-09-21 00:00:00,2012W38 ,2012W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2012,N,2012-09-18,2011-09-18,2012-06-18,2012-03-18,2012-08-18,2012-07-18,2012-09-11,2012-09-04,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-29,2012-01-01,2012-01-01,2012-03-01,2012-03-24,0,-3,-8,-35,-243,0,-3,-9,-35,-35,41361,88,88,29,6,13,5908,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-30,29-Mar-2012,Mar 29th 2012,Fri 03-29-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-24,2012-03-25,2012-03-29,Fri ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,13,2012,2012-03-24,2012-03-30,N,Wk.13 - 13,2012-03-24 00:00:00,2012-03-30 00:00:00,2012W13 ,2012W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2012,N,2012-03-29,2011-03-29,2012-12-29,2012-09-29,2012-02-28,2012-01-29,2012-03-22,2012-03-15,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-30,2012-01-01,2012-07-01,2012-08-01,2012-08-25,0,-1,-3,-13,-89,0,-1,-3,-13,-13,41515,242,61,30,6,35,5930,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-31,30-Aug-2012,Aug 30th 2012,Fri 08-30-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-08-25,2012-08-25,2012-08-26,2012-08-30,Fri ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,35,2012,2012-08-25,2012-08-31,N,Wk.35 - 13,2012-08-25 00:00:00,2012-08-31 00:00:00,2012W35 ,2012W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2012,N,2012-08-30,2011-08-30,2012-05-30,2012-02-28,2012-07-30,2012-06-30,2012-08-23,2012-08-16,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-29,2012-01-01,2012-07-01,2012-08-01,2012-08-25,0,-1,-3,-13,-90,0,-1,-3,-13,-13,41514,241,60,29,5,35,5930,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-31,29-Aug-2012,Aug 29th 2012,Thu 08-29-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-08-25,2012-08-25,2012-08-26,2012-08-29,Thu ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,35,2012,2012-08-25,2012-08-31,N,Wk.35 - 13,2012-08-25 00:00:00,2012-08-31 00:00:00,2012W35 ,2012W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2012,N,2012-08-29,2011-08-29,2012-05-29,2012-02-28,2012-07-29,2012-06-29,2012-08-22,2012-08-15,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-20,2012-01-01,2012-07-01,2012-07-01,2012-07-14,0,-1,-4,-19,-130,0,-1,-5,-19,-19,41474,201,20,20,7,29,5924,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-20,20-Jul-2012,Jul 20th 2012,Sat 07-20-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-14,2012-07-15,2012-07-20,Sat ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,29,2012,2012-07-14,2012-07-20,N,Wk.29 - 13,2012-07-14 00:00:00,2012-07-20 00:00:00,2012W29 ,2012W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2012,N,2012-07-20,2011-07-20,2012-04-20,2012-01-20,2012-06-20,2012-05-20,2012-07-13,2012-07-06,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-20,2012-01-01,2012-07-01,2012-09-01,2012-09-15,0,-1,-2,-10,-68,0,-1,-3,-10,-10,41536,263,82,20,6,38,5933,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-21,20-Sep-2012,Sep 20th 2012,Fri 09-20-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-15,2012-09-16,2012-09-20,Fri ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,38,2012,2012-09-15,2012-09-21,N,Wk.38 - 13,2012-09-15 00:00:00,2012-09-21 00:00:00,2012W38 ,2012W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2012,N,2012-09-20,2011-09-20,2012-06-20,2012-03-20,2012-08-20,2012-07-20,2012-09-13,2012-09-06,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-23,2012-01-01,2012-07-01,2012-07-01,2012-07-21,0,-1,-4,-18,-127,0,-1,-5,-18,-18,41477,204,23,23,3,30,5925,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-27,23-Jul-2012,Jul 23rd 2012,Tue 07-23-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-21,2012-07-22,2012-07-23,Tue ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,30,2012,2012-07-21,2012-07-27,N,Wk.30 - 13,2012-07-21 00:00:00,2012-07-27 00:00:00,2012W30 ,2012W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2012,N,2012-07-23,2011-07-23,2012-04-23,2012-01-23,2012-06-23,2012-05-23,2012-07-16,2012-07-09,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-19,2012-01-01,2012-04-01,2012-05-01,2012-05-19,0,-2,-6,-27,-192,0,-2,-7,-27,-28,41412,139,49,19,1,21,5916,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-25,19-May-2012,May 19th 2012,Sun 05-19-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-19,2012-05-13,2012-05-19,Sun ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,21,2012,2012-05-19,2012-05-25,Y,Wk.21 - 13,2012-05-19 00:00:00,2012-05-25 00:00:00,2012W21 ,2012W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2012,N,2012-05-19,2011-05-19,2012-02-19,2012-11-19,2012-04-19,2012-03-19,2012-05-12,2012-05-05,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-05,2012-01-01,2012-04-01,2012-05-01,2012-05-05,0,-2,-6,-29,-206,0,-2,-7,-29,-30,41398,125,35,5,1,19,5914,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-11,05-May-2012,May 5th 2012,Sun 05-05-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-05,2012-04-29,2012-05-05,Sun ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,19,2012,2012-05-05,2012-05-11,Y,Wk.19 - 13,2012-05-05 00:00:00,2012-05-11 00:00:00,2012W19 ,2012W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2012,N,2012-05-05,2011-05-05,2012-02-05,2012-11-05,2012-04-05,2012-03-05,2012-04-28,2012-04-21,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-16,2012-01-01,2012-10-01,2012-10-01,2012-10-13,0,0,-1,-6,-42,0,0,-2,-6,-6,41562,289,16,16,4,42,5937,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-19,16-Oct-2012,Oct 16th 2012,Wed 10-16-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-13,2012-10-14,2012-10-16,Wed ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,42,2012,2012-10-13,2012-10-19,N,Wk.42 - 13,2012-10-13 00:00:00,2012-10-19 00:00:00,2012W42 ,2012W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2012,N,2012-10-16,2011-10-16,2012-07-16,2012-04-16,2012-09-16,2012-08-16,2012-10-09,2012-10-02,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-01,2012-01-01,2012-10-01,2012-11-01,2012-10-27,0,0,0,-4,-26,0,0,-1,-4,-4,41578,305,32,1,6,44,5939,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-02,01-Nov-2012,Nov 1st 2012,Fri 11-01-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-10-27,2012-10-28,2012-11-01,Fri ,2012M11,Nov-2012,Y,2012M11 ,Y,Year 2012 - Quarter 04,2012Q04 ,N,44,2012,2012-10-27,2012-11-02,N,Wk.44 - 13,2012-10-27 00:00:00,2012-11-02 00:00:00,2012W44 ,2012W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2012,N,2012-11-01,2011-11-01,2012-08-01,2012-05-01,2012-10-01,2012-09-01,2012-10-25,2012-10-18,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-08,2012-01-01,2012-04-01,2012-05-01,2012-05-05,0,-2,-6,-29,-203,0,-2,-7,-29,-29,41401,128,38,8,4,19,5914,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-11,08-May-2012,May 8th 2012,Wed 05-08-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-05,2012-05-06,2012-05-08,Wed ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,19,2012,2012-05-05,2012-05-11,N,Wk.19 - 13,2012-05-05 00:00:00,2012-05-11 00:00:00,2012W19 ,2012W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2012,N,2012-05-08,2011-05-08,2012-02-08,2012-11-08,2012-04-08,2012-03-08,2012-05-01,2012-04-24,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-21,2012-01-01,2012-01-01,2012-02-01,2012-02-17,0,-3,-9,-40,-279,0,-3,-10,-40,-40,41325,52,52,21,5,8,5903,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-23,21-Feb-2012,Feb 21st 2012,Thu 02-21-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-17,2012-02-18,2012-02-21,Thu ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,8,2012,2012-02-17,2012-02-23,N,Wk.08 - 13,2012-02-17 00:00:00,2012-02-23 00:00:00,2012W08 ,2012W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2012,N,2012-02-21,2011-02-21,2012-11-21,2012-08-21,2012-01-21,2012-12-21,2012-02-14,2012-02-07,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-27,2012-01-01,2012-07-01,2012-09-01,2012-09-22,0,-1,-2,-9,-61,0,-1,-3,-9,-9,41543,270,89,27,6,39,5934,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-28,27-Sep-2012,Sep 27th 2012,Fri 09-27-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-22,2012-09-23,2012-09-27,Fri ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,39,2012,2012-09-22,2012-09-28,N,Wk.39 - 13,2012-09-22 00:00:00,2012-09-28 00:00:00,2012W39 ,2012W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2012,N,2012-09-27,2011-09-27,2012-06-27,2012-03-27,2012-08-27,2012-07-27,2012-09-20,2012-09-13,0,0,0,0,0,1,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-09,2012-01-01,2012-07-01,2012-07-01,2012-07-07,0,-1,-4,-20,-141,0,-1,-5,-20,-20,41463,190,9,9,3,28,5923,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-13,09-Jul-2012,Jul 9th 2012,Tue 07-09-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-07,2012-07-08,2012-07-09,Tue ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,28,2012,2012-07-07,2012-07-13,N,Wk.28 - 13,2012-07-07 00:00:00,2012-07-13 00:00:00,2012W28 ,2012W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2012,N,2012-07-09,2011-07-09,2012-04-09,2012-01-09,2012-06-09,2012-05-09,2012-07-02,2012-06-25,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-04,2012-01-01,2012-10-01,2012-10-01,2012-09-29,0,0,-1,-8,-54,0,0,-2,-8,-8,41550,277,4,4,6,40,5935,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-05,04-Oct-2012,Oct 4th 2012,Fri 10-04-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-09-29,2012-09-30,2012-10-04,Fri ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,40,2012,2012-09-29,2012-10-05,N,Wk.40 - 13,2012-09-29 00:00:00,2012-10-05 00:00:00,2012W40 ,2012W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2012,N,2012-10-04,2011-10-04,2012-07-04,2012-04-04,2012-09-04,2012-08-04,2012-09-27,2012-09-20,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-09,2012-01-01,2012-07-01,2012-09-01,2012-09-08,0,-1,-2,-11,-79,0,-1,-3,-11,-11,41525,252,71,9,2,37,5932,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-14,09-Sep-2012,Sep 9th 2012,Mon 09-09-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-08,2012-09-09,2012-09-09,Mon ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,37,2012,2012-09-08,2012-09-14,N,Wk.37 - 13,2012-09-08 00:00:00,2012-09-14 00:00:00,2012W37 ,2012W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2012,N,2012-09-09,2011-09-09,2012-06-09,2012-03-09,2012-08-09,2012-07-09,2012-09-02,2012-08-26,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-01,2012-01-01,2012-04-01,2012-05-01,2012-04-28,0,-2,-6,-30,-210,0,-2,-7,-30,-30,41394,121,31,1,4,18,5913,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-04,01-May-2012,May 1st 2012,Wed 05-01-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-04-28,2012-04-29,2012-05-01,Wed ,2012M05,May-2012,Y,2012M05 ,Y,Year 2012 - Quarter 02,2012Q02 ,N,18,2012,2012-04-28,2012-05-04,N,Wk.18 - 13,2012-04-28 00:00:00,2012-05-04 00:00:00,2012W18 ,2012W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2012,N,2012-05-01,2011-05-01,2012-02-01,2012-11-01,2012-04-01,2012-03-01,2012-04-24,2012-04-17,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-29,2012-01-01,2012-07-01,2012-09-01,2012-09-29,0,-1,-2,-8,-59,0,0,-2,-8,-9,41545,272,91,29,1,40,5935,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-10-05,29-Sep-2012,Sep 29th 2012,Sun 09-29-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-09-29,2012-09-29,2012-09-23,2012-09-29,Sun ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,40,2012,2012-09-29,2012-10-05,Y,Wk.40 - 13,2012-09-29 00:00:00,2012-10-05 00:00:00,2012W40 ,2012W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2012,N,2012-09-29,2011-09-29,2012-06-29,2012-03-29,2012-08-29,2012-07-29,2012-09-22,2012-09-15,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-02,2012-01-01,2012-04-01,2012-05-01,2012-04-28,0,-2,-6,-30,-209,0,-2,-7,-30,-30,41395,122,32,2,5,18,5913,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-04,02-May-2012,May 2nd 2012,Thu 05-02-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-04-28,2012-04-29,2012-05-02,Thu ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,18,2012,2012-04-28,2012-05-04,N,Wk.18 - 13,2012-04-28 00:00:00,2012-05-04 00:00:00,2012W18 ,2012W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2012,N,2012-05-02,2011-05-02,2012-02-02,2012-11-02,2012-04-02,2012-03-02,2012-04-25,2012-04-18,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-17,2012-01-01,2012-10-01,2012-10-01,2012-10-13,0,0,-1,-6,-41,0,0,-2,-6,-6,41563,290,17,17,5,42,5937,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-19,17-Oct-2012,Oct 17th 2012,Thu 10-17-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-13,2012-10-14,2012-10-17,Thu ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,42,2012,2012-10-13,2012-10-19,N,Wk.42 - 13,2012-10-13 00:00:00,2012-10-19 00:00:00,2012W42 ,2012W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2012,N,2012-10-17,2011-10-17,2012-07-17,2012-04-17,2012-09-17,2012-08-17,2012-10-10,2012-10-03,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-01,2012-01-01,2012-04-01,2012-06-01,2012-05-26,0,-2,-5,-26,-179,0,-2,-6,-26,-26,41425,152,62,1,7,22,5917,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-01,01-Jun-2012,Jun 1st 2012,Sat 06-01-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-05-26,2012-05-27,2012-06-01,Sat ,2012M06,Jun-2012,Y,2012M06 ,Y,Year 2012 - Quarter 02,2012Q02 ,N,22,2012,2012-05-26,2012-06-01,N,Wk.22 - 13,2012-05-26 00:00:00,2012-06-01 00:00:00,2012W22 ,2012W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2012,N,2012-06-01,2011-06-01,2012-03-01,2012-12-01,2012-05-01,2012-04-01,2012-05-25,2012-05-18,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-21,2012-01-01,2012-04-01,2012-05-01,2012-05-19,0,-2,-6,-27,-190,0,-2,-7,-27,-27,41414,141,51,21,3,21,5916,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-25,21-May-2012,May 21st 2012,Tue 05-21-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-19,2012-05-20,2012-05-21,Tue ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,21,2012,2012-05-19,2012-05-25,N,Wk.21 - 13,2012-05-19 00:00:00,2012-05-25 00:00:00,2012W21 ,2012W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2012,N,2012-05-21,2011-05-21,2012-02-21,2012-11-21,2012-04-21,2012-03-21,2012-05-14,2012-05-07,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-30,2012-01-01,2012-10-01,2012-10-01,2012-10-27,0,0,-1,-4,-28,0,0,-1,-4,-4,41576,303,30,30,4,44,5939,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-11-02,30-Oct-2012,Oct 30th 2012,Wed 10-30-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-10-27,2012-10-27,2012-10-28,2012-10-30,Wed ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,44,2012,2012-10-27,2012-11-02,N,Wk.44 - 13,2012-10-27 00:00:00,2012-11-02 00:00:00,2012W44 ,2012W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2012,N,2012-10-30,2011-10-30,2012-07-30,2012-04-30,2012-09-30,2012-08-30,2012-10-23,2012-10-16,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-11,2012-01-01,2012-01-01,2012-01-01,2012-01-06,0,-3,-10,-46,-320,0,-3,-11,-46,-46,41284,11,11,11,6,2,5897,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-12,11-Jan-2012,Jan 11th 2012,Fri 01-11-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-06,2012-01-07,2012-01-11,Fri ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,2,2012,2012-01-06,2012-01-12,N,Wk.02 - 13,2012-01-06 00:00:00,2012-01-12 00:00:00,2012W02 ,2012W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2012,N,2012-01-11,2011-01-11,2012-10-11,2012-07-11,2012-12-11,2012-11-11,2012-01-04,2012-12-28,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-25,2012-01-01,2012-01-01,2012-03-01,2012-03-24,0,-3,-8,-35,-247,0,-3,-9,-35,-35,41357,84,84,25,2,13,5908,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-30,25-Mar-2012,Mar 25th 2012,Mon 03-25-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-24,2012-03-25,2012-03-25,Mon ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,13,2012,2012-03-24,2012-03-30,N,Wk.13 - 13,2012-03-24 00:00:00,2012-03-30 00:00:00,2012W13 ,2012W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2012,N,2012-03-25,2011-03-25,2012-12-25,2012-09-25,2012-02-25,2012-01-25,2012-03-18,2012-03-11,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-16,2012-01-01,2012-04-01,2012-04-01,2012-04-14,0,-2,-7,-32,-225,0,-2,-8,-32,-32,41379,106,16,16,3,16,5911,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-20,16-Apr-2012,Apr 16th 2012,Tue 04-16-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-14,2012-04-15,2012-04-16,Tue ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,16,2012,2012-04-14,2012-04-20,N,Wk.16 - 13,2012-04-14 00:00:00,2012-04-20 00:00:00,2012W16 ,2012W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2012,N,2012-04-16,2011-04-16,2012-01-16,2012-10-16,2012-03-16,2012-02-16,2012-04-09,2012-04-02,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-20,2012-01-01,2012-04-01,2012-06-01,2012-06-16,0,-2,-5,-23,-160,0,-2,-6,-23,-23,41444,171,81,20,5,25,5920,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-22,20-Jun-2012,Jun 20th 2012,Thu 06-20-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-16,2012-06-17,2012-06-20,Thu ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,25,2012,2012-06-16,2012-06-22,N,Wk.25 - 13,2012-06-16 00:00:00,2012-06-22 00:00:00,2012W25 ,2012W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2012,N,2012-06-20,2011-06-20,2012-03-20,2012-12-20,2012-05-20,2012-04-20,2012-06-13,2012-06-06,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-19,2012-01-01,2012-01-01,2012-02-01,2012-02-17,0,-3,-9,-40,-281,0,-3,-10,-40,-40,41323,50,50,19,3,8,5903,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-23,19-Feb-2012,Feb 19th 2012,Tue 02-19-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-17,2012-02-18,2012-02-19,Tue ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,8,2012,2012-02-17,2012-02-23,N,Wk.08 - 13,2012-02-17 00:00:00,2012-02-23 00:00:00,2012W08 ,2012W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2012,N,2012-02-19,2011-02-19,2012-11-19,2012-08-19,2012-01-19,2012-12-19,2012-02-12,2012-02-05,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-09,2012-01-01,2012-04-01,2012-04-01,2012-04-07,0,-2,-7,-33,-232,0,-2,-8,-33,-33,41372,99,9,9,3,15,5910,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-13,09-Apr-2012,Apr 9th 2012,Tue 04-09-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-07,2012-04-08,2012-04-09,Tue ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,15,2012,2012-04-07,2012-04-13,N,Wk.15 - 13,2012-04-07 00:00:00,2012-04-13 00:00:00,2012W15 ,2012W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2012,N,2012-04-09,2011-04-09,2012-01-09,2012-10-09,2012-03-09,2012-02-09,2012-04-02,2012-03-26,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-03,2012-01-01,2012-01-01,2012-02-01,2012-02-03,0,-3,-9,-42,-297,0,-3,-10,-42,-43,41307,34,34,3,1,6,5901,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-09,03-Feb-2012,Feb 3rd 2012,Sun 02-03-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-03,2012-01-28,2012-02-03,Sun ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,6,2012,2012-02-03,2012-02-09,Y,Wk.06 - 13,2012-02-03 00:00:00,2012-02-09 00:00:00,2012W06 ,2012W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2012,N,2012-02-03,2011-02-03,2012-11-03,2012-08-03,2012-01-03,2012-12-03,2012-01-27,2012-01-20,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-27,2012-01-01,2012-07-01,2012-07-01,2012-07-21,0,-1,-4,-18,-123,0,-1,-5,-18,-18,41481,208,27,27,7,30,5925,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-27,27-Jul-2012,Jul 27th 2012,Sat 07-27-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-21,2012-07-22,2012-07-27,Sat ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,30,2012,2012-07-21,2012-07-27,N,Wk.30 - 13,2012-07-21 00:00:00,2012-07-27 00:00:00,2012W30 ,2012W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2012,N,2012-07-27,2011-07-27,2012-04-27,2012-01-27,2012-06-27,2012-05-27,2012-07-20,2012-07-13,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-20,2012-01-01,2012-04-01,2012-05-01,2012-05-19,0,-2,-6,-27,-191,0,-2,-7,-27,-27,41413,140,50,20,2,21,5916,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-25,20-May-2012,May 20th 2012,Mon 05-20-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-19,2012-05-20,2012-05-20,Mon ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,21,2012,2012-05-19,2012-05-25,N,Wk.21 - 13,2012-05-19 00:00:00,2012-05-25 00:00:00,2012W21 ,2012W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2012,N,2012-05-20,2011-05-20,2012-02-20,2012-11-20,2012-04-20,2012-03-20,2012-05-13,2012-05-06,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-25,2012-01-01,2012-04-01,2012-04-01,2012-04-21,0,-2,-7,-31,-216,0,-2,-8,-31,-31,41388,115,25,25,5,17,5912,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-27,25-Apr-2012,Apr 25th 2012,Thu 04-25-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-21,2012-04-22,2012-04-25,Thu ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,17,2012,2012-04-21,2012-04-27,N,Wk.17 - 13,2012-04-21 00:00:00,2012-04-27 00:00:00,2012W17 ,2012W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2012,N,2012-04-25,2011-04-25,2012-01-25,2012-10-25,2012-03-25,2012-02-25,2012-04-18,2012-04-11,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-07,2012-01-01,2012-04-01,2012-05-01,2012-05-05,0,-2,-6,-29,-204,0,-2,-7,-29,-29,41400,127,37,7,3,19,5914,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-11,07-May-2012,May 7th 2012,Tue 05-07-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-05,2012-05-06,2012-05-07,Tue ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,19,2012,2012-05-05,2012-05-11,N,Wk.19 - 13,2012-05-05 00:00:00,2012-05-11 00:00:00,2012W19 ,2012W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2012,N,2012-05-07,2011-05-07,2012-02-07,2012-11-07,2012-04-07,2012-03-07,2012-04-30,2012-04-23,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-05,2012-01-01,2012-07-01,2012-09-01,2012-09-01,0,-1,-2,-12,-83,0,-1,-3,-12,-12,41521,248,67,5,5,36,5931,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-07,05-Sep-2012,Sep 5th 2012,Thu 09-05-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-01,2012-09-02,2012-09-05,Thu ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,36,2012,2012-09-01,2012-09-07,N,Wk.36 - 13,2012-09-01 00:00:00,2012-09-07 00:00:00,2012W36 ,2012W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2012,N,2012-09-05,2011-09-05,2012-06-05,2012-03-05,2012-08-05,2012-07-05,2012-08-29,2012-08-22,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-16,2012-01-01,2012-01-01,2012-03-01,2012-03-10,0,-3,-8,-37,-256,0,-3,-9,-37,-37,41348,75,75,16,7,11,5906,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-16,16-Mar-2012,Mar 16th 2012,Sat 03-16-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-10,2012-03-11,2012-03-16,Sat ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,11,2012,2012-03-10,2012-03-16,N,Wk.11 - 13,2012-03-10 00:00:00,2012-03-16 00:00:00,2012W11 ,2012W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2012,N,2012-03-16,2011-03-16,2012-12-16,2012-09-16,2012-02-16,2012-01-16,2012-03-09,2012-03-02,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-17,2012-01-01,2012-04-01,2012-05-01,2012-05-12,0,-2,-6,-28,-194,0,-2,-7,-28,-28,41410,137,47,17,6,20,5915,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-18,17-May-2012,May 17th 2012,Fri 05-17-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-12,2012-05-13,2012-05-17,Fri ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,20,2012,2012-05-12,2012-05-18,N,Wk.20 - 13,2012-05-12 00:00:00,2012-05-18 00:00:00,2012W20 ,2012W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2012,N,2012-05-17,2011-05-17,2012-02-17,2012-11-17,2012-04-17,2012-03-17,2012-05-10,2012-05-03,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-23,2012-01-01,2012-07-01,2012-08-01,2012-08-18,0,-1,-3,-14,-96,0,-1,-4,-14,-14,41508,235,54,23,6,34,5929,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-24,23-Aug-2012,Aug 23rd 2012,Fri 08-23-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-18,2012-08-19,2012-08-23,Fri ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,34,2012,2012-08-18,2012-08-24,N,Wk.34 - 13,2012-08-18 00:00:00,2012-08-24 00:00:00,2012W34 ,2012W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2012,N,2012-08-23,2011-08-23,2012-05-23,2012-02-23,2012-07-23,2012-06-23,2012-08-16,2012-08-09,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-07,2012-01-01,2012-07-01,2012-09-01,2012-09-01,0,-1,-2,-12,-81,0,-1,-3,-12,-12,41523,250,69,7,7,36,5931,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-07,07-Sep-2012,Sep 7th 2012,Sat 09-07-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-01,2012-09-02,2012-09-07,Sat ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,36,2012,2012-09-01,2012-09-07,N,Wk.36 - 13,2012-09-01 00:00:00,2012-09-07 00:00:00,2012W36 ,2012W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2012,N,2012-09-07,2011-09-07,2012-06-07,2012-03-07,2012-08-07,2012-07-07,2012-08-31,2012-08-24,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-06,2012-01-01,2012-07-01,2012-09-01,2012-09-01,0,-1,-2,-12,-82,0,-1,-3,-12,-12,41522,249,68,6,6,36,5931,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-07,06-Sep-2012,Sep 6th 2012,Fri 09-06-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-01,2012-09-02,2012-09-06,Fri ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,36,2012,2012-09-01,2012-09-07,N,Wk.36 - 13,2012-09-01 00:00:00,2012-09-07 00:00:00,2012W36 ,2012W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2012,N,2012-09-06,2011-09-06,2012-06-06,2012-03-06,2012-08-06,2012-07-06,2012-08-30,2012-08-23,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-03,2012-01-01,2012-04-01,2012-05-01,2012-04-28,0,-2,-6,-30,-208,0,-2,-7,-30,-30,41396,123,33,3,6,18,5913,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-04,03-May-2012,May 3rd 2012,Fri 05-03-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-04-28,2012-04-29,2012-05-03,Fri ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,18,2012,2012-04-28,2012-05-04,N,Wk.18 - 13,2012-04-28 00:00:00,2012-05-04 00:00:00,2012W18 ,2012W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2012,N,2012-05-03,2011-05-03,2012-02-03,2012-11-03,2012-04-03,2012-03-03,2012-04-26,2012-04-19,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-04,2012-01-01,2012-10-01,2012-12-01,2012-12-01,0,0,1,1,7,0,0,0,1,1,41611,338,65,4,4,49,5944,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-07,04-Dec-2012,Dec 4th 2012,Wed 12-04-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-01,2012-12-02,2012-12-04,Wed ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,49,2012,2012-12-01,2012-12-07,N,Wk.49 - 13,2012-12-01 00:00:00,2012-12-07 00:00:00,2012W49 ,2012W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2012,N,2012-12-04,2011-12-04,2012-09-04,2012-06-04,2012-11-04,2012-10-04,2012-11-27,2012-11-20,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-19,2012-01-01,2012-10-01,2012-11-01,2012-11-17,0,0,0,-1,-8,0,0,-1,-1,-1,41596,323,50,19,3,47,5942,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-23,19-Nov-2012,Nov 19th 2012,Tue 11-19-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-17,2012-11-18,2012-11-19,Tue ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,47,2012,2012-11-17,2012-11-23,N,Wk.47 - 13,2012-11-17 00:00:00,2012-11-23 00:00:00,2012W47 ,2012W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2012,N,2012-11-19,2011-11-19,2012-08-19,2012-05-19,2012-10-19,2012-09-19,2012-11-12,2012-11-05,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-18,2012-01-01,2012-01-01,2012-03-01,2012-03-17,0,-3,-8,-36,-254,0,-3,-9,-36,-36,41350,77,77,18,2,12,5907,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-23,18-Mar-2012,Mar 18th 2012,Mon 03-18-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-17,2012-03-18,2012-03-18,Mon ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,12,2012,2012-03-17,2012-03-23,N,Wk.12 - 13,2012-03-17 00:00:00,2012-03-23 00:00:00,2012W12 ,2012W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2012,N,2012-03-18,2011-03-18,2012-12-18,2012-09-18,2012-02-18,2012-01-18,2012-03-11,2012-03-04,0,0,0,0,0,0,0,0,3,1,12,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-11,2012-01-01,2012-07-01,2012-07-01,2012-07-07,0,-1,-4,-20,-139,0,-1,-5,-20,-20,41465,192,11,11,5,28,5923,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-13,11-Jul-2012,Jul 11th 2012,Thu 07-11-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-07,2012-07-08,2012-07-11,Thu ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,28,2012,2012-07-07,2012-07-13,N,Wk.28 - 13,2012-07-07 00:00:00,2012-07-13 00:00:00,2012W28 ,2012W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2012,N,2012-07-11,2011-07-11,2012-04-11,2012-01-11,2012-06-11,2012-05-11,2012-07-04,2012-06-27,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-07,2012-01-01,2012-04-01,2012-04-01,2012-04-07,0,-2,-7,-33,-234,0,-2,-8,-33,-34,41370,97,7,7,1,15,5910,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-13,07-Apr-2012,Apr 7th 2012,Sun 04-07-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-07,2012-04-01,2012-04-07,Sun ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,15,2012,2012-04-07,2012-04-13,Y,Wk.15 - 13,2012-04-07 00:00:00,2012-04-13 00:00:00,2012W15 ,2012W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2012,N,2012-04-07,2011-04-07,2012-01-07,2012-10-07,2012-03-07,2012-02-07,2012-03-31,2012-03-24,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-11,2012-01-01,2012-10-01,2012-12-01,2012-12-08,0,0,1,2,14,0,0,0,2,2,41618,345,72,11,4,50,5945,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-14,11-Dec-2012,Dec 11th 2012,Wed 12-11-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-08,2012-12-09,2012-12-11,Wed ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,50,2012,2012-12-08,2012-12-14,N,Wk.50 - 13,2012-12-08 00:00:00,2012-12-14 00:00:00,2012W50 ,2012W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2012,N,2012-12-11,2011-12-11,2012-09-11,2012-06-11,2012-11-11,2012-10-11,2012-12-04,2012-11-27,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-26,2012-01-01,2012-10-01,2012-10-01,2012-10-20,0,0,-1,-5,-32,0,0,-2,-5,-5,41572,299,26,26,7,43,5938,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-26,26-Oct-2012,Oct 26th 2012,Sat 10-26-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-20,2012-10-21,2012-10-26,Sat ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,43,2012,2012-10-20,2012-10-26,N,Wk.43 - 13,2012-10-20 00:00:00,2012-10-26 00:00:00,2012W43 ,2012W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2012,N,2012-10-26,2011-10-26,2012-07-26,2012-04-26,2012-09-26,2012-08-26,2012-10-19,2012-10-12,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-20,2012-01-01,2012-01-01,2012-01-01,2012-01-20,0,-3,-10,-44,-311,0,-3,-11,-44,-45,41293,20,20,20,1,4,5899,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-26,20-Jan-2012,Jan 20th 2012,Sun 01-20-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-20,2012-01-14,2012-01-20,Sun ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,4,2012,2012-01-20,2012-01-26,Y,Wk.04 - 13,2012-01-20 00:00:00,2012-01-26 00:00:00,2012W04 ,2012W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2012,N,2012-01-20,2011-01-20,2012-10-20,2012-07-20,2012-12-20,2012-11-20,2012-01-13,2012-01-06,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-27,2012-01-01,2012-04-01,2012-06-01,2012-06-23,0,-2,-5,-22,-153,0,-2,-6,-22,-22,41451,178,88,27,5,26,5921,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-29,27-Jun-2012,Jun 27th 2012,Thu 06-27-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-23,2012-06-24,2012-06-27,Thu ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,26,2012,2012-06-23,2012-06-29,N,Wk.26 - 13,2012-06-23 00:00:00,2012-06-29 00:00:00,2012W26 ,2012W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2012,N,2012-06-27,2011-06-27,2012-03-27,2012-12-27,2012-05-27,2012-04-27,2012-06-20,2012-06-13,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-16,2012-01-01,2012-07-01,2012-09-01,2012-09-15,0,-1,-2,-10,-72,0,-1,-3,-10,-10,41532,259,78,16,2,38,5933,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-21,16-Sep-2012,Sep 16th 2012,Mon 09-16-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-15,2012-09-16,2012-09-16,Mon ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,38,2012,2012-09-15,2012-09-21,N,Wk.38 - 13,2012-09-15 00:00:00,2012-09-21 00:00:00,2012W38 ,2012W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2012,N,2012-09-16,2011-09-16,2012-06-16,2012-03-16,2012-08-16,2012-07-16,2012-09-09,2012-09-02,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-20,2012-01-01,2012-04-01,2012-04-01,2012-04-14,0,-2,-7,-32,-221,0,-2,-8,-32,-32,41383,110,20,20,7,16,5911,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-20,20-Apr-2012,Apr 20th 2012,Sat 04-20-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-14,2012-04-15,2012-04-20,Sat ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,16,2012,2012-04-14,2012-04-20,N,Wk.16 - 13,2012-04-14 00:00:00,2012-04-20 00:00:00,2012W16 ,2012W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2012,N,2012-04-20,2011-04-20,2012-01-20,2012-10-20,2012-03-20,2012-02-20,2012-04-13,2012-04-06,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-14,2012-01-01,2012-04-01,2012-04-01,2012-04-14,0,-2,-7,-32,-227,0,-2,-8,-32,-33,41377,104,14,14,1,16,5911,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-20,14-Apr-2012,Apr 14th 2012,Sun 04-14-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-14,2012-04-08,2012-04-14,Sun ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,16,2012,2012-04-14,2012-04-20,Y,Wk.16 - 13,2012-04-14 00:00:00,2012-04-20 00:00:00,2012W16 ,2012W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2012,N,2012-04-14,2011-04-14,2012-01-14,2012-10-14,2012-03-14,2012-02-14,2012-04-07,2012-03-31,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-28,2012-01-01,2012-10-01,2012-10-01,2012-10-27,0,0,-1,-4,-30,0,0,-1,-4,-4,41574,301,28,28,2,44,5939,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-11-02,28-Oct-2012,Oct 28th 2012,Mon 10-28-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-10-27,2012-10-27,2012-10-28,2012-10-28,Mon ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,44,2012,2012-10-27,2012-11-02,N,Wk.44 - 13,2012-10-27 00:00:00,2012-11-02 00:00:00,2012W44 ,2012W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2012,N,2012-10-28,2011-10-28,2012-07-28,2012-04-28,2012-09-28,2012-08-28,2012-10-21,2012-10-14,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-08,2012-01-01,2012-01-01,2012-01-01,2012-01-06,0,-3,-10,-46,-323,0,-3,-11,-46,-46,41281,8,8,8,3,2,5897,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-12,08-Jan-2012,Jan 8th 2012,Tue 01-08-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-06,2012-01-07,2012-01-08,Tue ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,2,2012,2012-01-06,2012-01-12,N,Wk.02 - 13,2012-01-06 00:00:00,2012-01-12 00:00:00,2012W02 ,2012W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2012,N,2012-01-08,2011-01-08,2012-10-08,2012-07-08,2012-12-08,2012-11-08,2012-01-01,2012-12-25,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-13,2012-01-01,2012-01-01,2012-03-01,2012-03-10,0,-3,-8,-37,-259,0,-3,-9,-37,-37,41345,72,72,13,4,11,5906,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-16,13-Mar-2012,Mar 13th 2012,Wed 03-13-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-10,2012-03-11,2012-03-13,Wed ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,11,2012,2012-03-10,2012-03-16,N,Wk.11 - 13,2012-03-10 00:00:00,2012-03-16 00:00:00,2012W11 ,2012W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2012,N,2012-03-13,2011-03-13,2012-12-13,2012-09-13,2012-02-13,2012-01-13,2012-03-06,2012-02-27,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-28,2012-01-01,2012-04-01,2012-05-01,2012-05-26,0,-2,-6,-26,-183,0,-2,-6,-26,-26,41421,148,58,28,3,22,5917,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-06-01,28-May-2012,May 28th 2012,Tue 05-28-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-05-26,2012-05-26,2012-05-27,2012-05-28,Tue ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,22,2012,2012-05-26,2012-06-01,N,Wk.22 - 13,2012-05-26 00:00:00,2012-06-01 00:00:00,2012W22 ,2012W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2012,N,2012-05-28,2011-05-28,2012-02-28,2012-11-28,2012-04-28,2012-03-28,2012-05-21,2012-05-14,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-14,2012-01-01,2012-01-01,2012-01-01,2012-01-13,0,-3,-10,-45,-317,0,-3,-11,-45,-45,41287,14,14,14,2,3,5898,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-19,14-Jan-2012,Jan 14th 2012,Mon 01-14-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-13,2012-01-14,2012-01-14,Mon ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,3,2012,2012-01-13,2012-01-19,N,Wk.03 - 13,2012-01-13 00:00:00,2012-01-19 00:00:00,2012W03 ,2012W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2012,N,2012-01-14,2011-01-14,2012-10-14,2012-07-14,2012-12-14,2012-11-14,2012-01-07,2012-12-31,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-30,2012-01-01,2012-04-01,2012-04-01,2012-04-28,0,-2,-7,-30,-211,0,-2,-7,-30,-30,41393,120,30,30,3,18,5913,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-05-04,30-Apr-2012,Apr 30th 2012,Tue 04-30-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-04-28,2012-04-28,2012-04-29,2012-04-30,Tue ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,18,2012,2012-04-28,2012-05-04,N,Wk.18 - 13,2012-04-28 00:00:00,2012-05-04 00:00:00,2012W18 ,2012W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2012,N,2012-04-30,2011-04-30,2012-01-30,2012-10-30,2012-03-30,2012-02-28,2012-04-23,2012-04-16,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-14,2012-01-01,2012-07-01,2012-07-01,2012-07-14,0,-1,-4,-19,-136,0,-1,-5,-19,-20,41468,195,14,14,1,29,5924,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-20,14-Jul-2012,Jul 14th 2012,Sun 07-14-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-14,2012-07-08,2012-07-14,Sun ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,29,2012,2012-07-14,2012-07-20,Y,Wk.29 - 13,2012-07-14 00:00:00,2012-07-20 00:00:00,2012W29 ,2012W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2012,N,2012-07-14,2011-07-14,2012-04-14,2012-01-14,2012-06-14,2012-05-14,2012-07-07,2012-06-30,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-24,2012-01-01,2012-07-01,2012-07-01,2012-07-21,0,-1,-4,-18,-126,0,-1,-5,-18,-18,41478,205,24,24,4,30,5925,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-27,24-Jul-2012,Jul 24th 2012,Wed 07-24-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-21,2012-07-22,2012-07-24,Wed ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,30,2012,2012-07-21,2012-07-27,N,Wk.30 - 13,2012-07-21 00:00:00,2012-07-27 00:00:00,2012W30 ,2012W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2012,N,2012-07-24,2011-07-24,2012-04-24,2012-01-24,2012-06-24,2012-05-24,2012-07-17,2012-07-10,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-04,2012-01-01,2012-07-01,2012-09-01,2012-09-01,0,-1,-2,-12,-84,0,-1,-3,-12,-12,41520,247,66,4,4,36,5931,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-07,04-Sep-2012,Sep 4th 2012,Wed 09-04-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-01,2012-09-02,2012-09-04,Wed ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,36,2012,2012-09-01,2012-09-07,N,Wk.36 - 13,2012-09-01 00:00:00,2012-09-07 00:00:00,2012W36 ,2012W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2012,N,2012-09-04,2011-09-04,2012-06-04,2012-03-04,2012-08-04,2012-07-04,2012-08-28,2012-08-21,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-18,2012-01-01,2012-10-01,2012-11-01,2012-11-17,0,0,0,-1,-9,0,0,-1,-1,-1,41595,322,49,18,2,47,5942,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-23,18-Nov-2012,Nov 18th 2012,Mon 11-18-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-17,2012-11-18,2012-11-18,Mon ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,47,2012,2012-11-17,2012-11-23,N,Wk.47 - 13,2012-11-17 00:00:00,2012-11-23 00:00:00,2012W47 ,2012W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2012,N,2012-11-18,2011-11-18,2012-08-18,2012-05-18,2012-10-18,2012-09-18,2012-11-11,2012-11-04,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-18,2012-01-01,2012-01-01,2012-02-01,2012-02-17,0,-3,-9,-40,-282,0,-3,-10,-40,-40,41322,49,49,18,2,8,5903,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-23,18-Feb-2012,Feb 18th 2012,Mon 02-18-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-17,2012-02-18,2012-02-18,Mon ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,8,2012,2012-02-17,2012-02-23,N,Wk.08 - 13,2012-02-17 00:00:00,2012-02-23 00:00:00,2012W08 ,2012W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2012,N,2012-02-18,2011-02-18,2012-11-18,2012-08-18,2012-01-18,2012-12-18,2012-02-11,2012-02-04,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-13,2012-01-01,2012-10-01,2012-11-01,2012-11-10,0,0,0,-2,-14,0,0,-1,-2,-2,41590,317,44,13,4,46,5941,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-16,13-Nov-2012,Nov 13th 2012,Wed 11-13-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-10,2012-11-11,2012-11-13,Wed ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,46,2012,2012-11-10,2012-11-16,N,Wk.46 - 13,2012-11-10 00:00:00,2012-11-16 00:00:00,2012W46 ,2012W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2012,N,2012-11-13,2011-11-13,2012-08-13,2012-05-13,2012-10-13,2012-09-13,2012-11-06,2012-10-30,0,0,0,0,0,0,0,1,11,4,46,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-02,2012-01-01,2012-10-01,2012-10-01,2012-09-29,0,0,-1,-8,-56,0,0,-2,-8,-8,41548,275,2,2,4,40,5935,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-05,02-Oct-2012,Oct 2nd 2012,Wed 10-02-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-09-29,2012-09-30,2012-10-02,Wed ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,40,2012,2012-09-29,2012-10-05,N,Wk.40 - 13,2012-09-29 00:00:00,2012-10-05 00:00:00,2012W40 ,2012W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2012,N,2012-10-02,2011-10-02,2012-07-02,2012-04-02,2012-09-02,2012-08-02,2012-09-25,2012-09-18,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-05,2012-01-01,2012-01-01,2012-02-01,2012-02-03,0,-3,-9,-42,-295,0,-3,-10,-42,-42,41309,36,36,5,3,6,5901,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-09,05-Feb-2012,Feb 5th 2012,Tue 02-05-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-03,2012-02-04,2012-02-05,Tue ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,6,2012,2012-02-03,2012-02-09,N,Wk.06 - 13,2012-02-03 00:00:00,2012-02-09 00:00:00,2012W06 ,2012W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2012,N,2012-02-05,2011-02-05,2012-11-05,2012-08-05,2012-01-05,2012-12-05,2012-01-29,2012-01-22,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-02,2012-01-01,2012-04-01,2012-06-01,2012-06-02,0,-2,-5,-25,-178,0,-2,-6,-25,-26,41426,153,63,2,1,23,5918,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-08,02-Jun-2012,Jun 2nd 2012,Sun 06-02-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-02,2012-05-27,2012-06-02,Sun ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,23,2012,2012-06-02,2012-06-08,Y,Wk.23 - 13,2012-06-02 00:00:00,2012-06-08 00:00:00,2012W23 ,2012W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2012,N,2012-06-02,2011-06-02,2012-03-02,2012-12-02,2012-05-02,2012-04-02,2012-05-26,2012-05-19,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-12,2012-01-01,2012-01-01,2012-02-01,2012-02-10,0,-3,-9,-41,-288,0,-3,-10,-41,-41,41316,43,43,12,3,7,5902,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-16,12-Feb-2012,Feb 12th 2012,Tue 02-12-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-10,2012-02-11,2012-02-12,Tue ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,7,2012,2012-02-10,2012-02-16,N,Wk.07 - 13,2012-02-10 00:00:00,2012-02-16 00:00:00,2012W07 ,2012W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2012,N,2012-02-12,2011-02-12,2012-11-12,2012-08-12,2012-01-12,2012-12-12,2012-02-05,2012-01-29,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-23,2012-01-01,2012-10-01,2012-10-01,2012-10-20,0,0,-1,-5,-35,0,0,-2,-5,-5,41569,296,23,23,4,43,5938,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-26,23-Oct-2012,Oct 23rd 2012,Wed 10-23-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-20,2012-10-21,2012-10-23,Wed ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,43,2012,2012-10-20,2012-10-26,N,Wk.43 - 13,2012-10-20 00:00:00,2012-10-26 00:00:00,2012W43 ,2012W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2012,N,2012-10-23,2011-10-23,2012-07-23,2012-04-23,2012-09-23,2012-08-23,2012-10-16,2012-10-09,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-12,2012-01-01,2012-01-01,2012-01-01,2012-01-06,0,-3,-10,-46,-319,0,-3,-11,-46,-46,41285,12,12,12,7,2,5897,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-12,12-Jan-2012,Jan 12th 2012,Sat 01-12-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-06,2012-01-07,2012-01-12,Sat ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,2,2012,2012-01-06,2012-01-12,N,Wk.02 - 13,2012-01-06 00:00:00,2012-01-12 00:00:00,2012W02 ,2012W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2012,N,2012-01-12,2011-01-12,2012-10-12,2012-07-12,2012-12-12,2012-11-12,2012-01-05,2012-12-29,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-04,2012-01-01,2012-04-01,2012-04-01,2012-03-31,0,-2,-7,-34,-237,0,-2,-8,-34,-34,41367,94,4,4,5,14,5909,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-06,04-Apr-2012,Apr 4th 2012,Thu 04-04-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-03-31,2012-04-01,2012-04-04,Thu ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,14,2012,2012-03-31,2012-04-06,N,Wk.14 - 13,2012-03-31 00:00:00,2012-04-06 00:00:00,2012W14 ,2012W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2012,N,2012-04-04,2011-04-04,2012-01-04,2012-10-04,2012-03-04,2012-02-04,2012-03-28,2012-03-21,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-17,2012-01-01,2012-04-01,2012-04-01,2012-04-14,0,-2,-7,-32,-224,0,-2,-8,-32,-32,41380,107,17,17,4,16,5911,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-20,17-Apr-2012,Apr 17th 2012,Wed 04-17-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-14,2012-04-15,2012-04-17,Wed ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,16,2012,2012-04-14,2012-04-20,N,Wk.16 - 13,2012-04-14 00:00:00,2012-04-20 00:00:00,2012W16 ,2012W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2012,N,2012-04-17,2011-04-17,2012-01-17,2012-10-17,2012-03-17,2012-02-17,2012-04-10,2012-04-03,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-21,2012-01-01,2012-04-01,2012-06-01,2012-06-16,0,-2,-5,-23,-159,0,-2,-6,-23,-23,41445,172,82,21,6,25,5920,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-22,21-Jun-2012,Jun 21st 2012,Fri 06-21-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-16,2012-06-17,2012-06-21,Fri ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,25,2012,2012-06-16,2012-06-22,N,Wk.25 - 13,2012-06-16 00:00:00,2012-06-22 00:00:00,2012W25 ,2012W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2012,N,2012-06-21,2011-06-21,2012-03-21,2012-12-21,2012-05-21,2012-04-21,2012-06-14,2012-06-07,0,0,0,0,0,0,0,0,6,2,25,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-15,2012-01-01,2012-10-01,2012-10-01,2012-10-13,0,0,-1,-6,-43,0,0,-2,-6,-6,41561,288,15,15,3,42,5937,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-19,15-Oct-2012,Oct 15th 2012,Tue 10-15-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-13,2012-10-14,2012-10-15,Tue ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,42,2012,2012-10-13,2012-10-19,N,Wk.42 - 13,2012-10-13 00:00:00,2012-10-19 00:00:00,2012W42 ,2012W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2012,N,2012-10-15,2011-10-15,2012-07-15,2012-04-15,2012-09-15,2012-08-15,2012-10-08,2012-10-01,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-01,2012-01-01,2012-07-01,2012-07-01,2012-06-30,0,-1,-4,-21,-149,0,-1,-5,-21,-21,41455,182,1,1,2,27,5922,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-06,01-Jul-2012,Jul 1st 2012,Mon 07-01-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-06-30,2012-07-01,2012-07-01,Mon ,2012M07,Jul-2012,Y,2012M07 ,Y,Year 2012 - Quarter 03,2012Q03 ,Y,27,2012,2012-06-30,2012-07-06,N,Wk.27 - 13,2012-06-30 00:00:00,2012-07-06 00:00:00,2012W27 ,2012W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2012,N,2012-07-01,2011-07-01,2012-04-01,2012-01-01,2012-06-01,2012-05-01,2012-06-24,2012-06-17,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-05,2012-01-01,2012-07-01,2012-07-01,2012-06-30,0,-1,-4,-21,-145,0,-1,-5,-21,-21,41459,186,5,5,6,27,5922,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-06,05-Jul-2012,Jul 5th 2012,Fri 07-05-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-06-30,2012-07-01,2012-07-05,Fri ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,27,2012,2012-06-30,2012-07-06,N,Wk.27 - 13,2012-06-30 00:00:00,2012-07-06 00:00:00,2012W27 ,2012W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2012,N,2012-07-05,2011-07-05,2012-04-05,2012-01-05,2012-06-05,2012-05-05,2012-06-28,2012-06-21,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-25,2012-01-01,2012-07-01,2012-07-01,2012-07-21,0,-1,-4,-18,-125,0,-1,-5,-18,-18,41479,206,25,25,5,30,5925,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-27,25-Jul-2012,Jul 25th 2012,Thu 07-25-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-21,2012-07-22,2012-07-25,Thu ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,30,2012,2012-07-21,2012-07-27,N,Wk.30 - 13,2012-07-21 00:00:00,2012-07-27 00:00:00,2012W30 ,2012W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2012,N,2012-07-25,2011-07-25,2012-04-25,2012-01-25,2012-06-25,2012-05-25,2012-07-18,2012-07-11,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-13,2012-01-01,2012-07-01,2012-09-01,2012-09-08,0,-1,-2,-11,-75,0,-1,-3,-11,-11,41529,256,75,13,6,37,5932,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-14,13-Sep-2012,Sep 13th 2012,Fri 09-13-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-08,2012-09-09,2012-09-13,Fri ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,37,2012,2012-09-08,2012-09-14,N,Wk.37 - 13,2012-09-08 00:00:00,2012-09-14 00:00:00,2012W37 ,2012W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2012,N,2012-09-13,2011-09-13,2012-06-13,2012-03-13,2012-08-13,2012-07-13,2012-09-06,2012-08-30,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-23,2012-01-01,2012-07-01,2012-09-01,2012-09-22,0,-1,-2,-9,-65,0,-1,-3,-9,-9,41539,266,85,23,2,39,5934,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-28,23-Sep-2012,Sep 23rd 2012,Mon 09-23-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-22,2012-09-23,2012-09-23,Mon ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,39,2012,2012-09-22,2012-09-28,N,Wk.39 - 13,2012-09-22 00:00:00,2012-09-28 00:00:00,2012W39 ,2012W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2012,N,2012-09-23,2011-09-23,2012-06-23,2012-03-23,2012-08-23,2012-07-23,2012-09-16,2012-09-09,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-24,2012-01-01,2012-01-01,2012-03-01,2012-03-24,0,-3,-8,-35,-248,0,-3,-9,-35,-36,41356,83,83,24,1,13,5908,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-30,24-Mar-2012,Mar 24th 2012,Sun 03-24-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-24,2012-03-18,2012-03-24,Sun ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,13,2012,2012-03-24,2012-03-30,Y,Wk.13 - 13,2012-03-24 00:00:00,2012-03-30 00:00:00,2012W13 ,2012W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2012,N,2012-03-24,2011-03-24,2012-12-24,2012-09-24,2012-02-24,2012-01-24,2012-03-17,2012-03-10,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-15,2012-01-01,2012-01-01,2012-01-01,2012-01-13,0,-3,-10,-45,-316,0,-3,-11,-45,-45,41288,15,15,15,3,3,5898,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-19,15-Jan-2012,Jan 15th 2012,Tue 01-15-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-13,2012-01-14,2012-01-15,Tue ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,3,2012,2012-01-13,2012-01-19,N,Wk.03 - 13,2012-01-13 00:00:00,2012-01-19 00:00:00,2012W03 ,2012W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2012,N,2012-01-15,2011-01-15,2012-10-15,2012-07-15,2012-12-15,2012-11-15,2012-01-08,2012-01-01,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-07,2012-01-01,2012-10-01,2012-11-01,2012-11-03,0,0,0,-3,-20,0,0,-1,-3,-3,41584,311,38,7,5,45,5940,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-09,07-Nov-2012,Nov 7th 2012,Thu 11-07-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-03,2012-11-04,2012-11-07,Thu ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,45,2012,2012-11-03,2012-11-09,N,Wk.45 - 13,2012-11-03 00:00:00,2012-11-09 00:00:00,2012W45 ,2012W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2012,N,2012-11-07,2011-11-07,2012-08-07,2012-05-07,2012-10-07,2012-09-07,2012-10-31,2012-10-24,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-31,2012-01-01,2012-07-01,2012-08-01,2012-08-25,0,-1,-3,-13,-88,0,-1,-3,-13,-13,41516,243,62,31,7,35,5930,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-31,31-Aug-2012,Aug 31st 2012,Sat 08-31-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-08-25,2012-08-25,2012-08-26,2012-08-31,Sat ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,35,2012,2012-08-25,2012-08-31,N,Wk.35 - 13,2012-08-25 00:00:00,2012-08-31 00:00:00,2012W35 ,2012W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2012,N,2012-08-31,2011-08-31,2012-05-31,2012-02-28,2012-07-31,2012-06-30,2012-08-24,2012-08-17,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-20,2012-01-01,2012-10-01,2012-12-01,2012-12-15,0,0,1,3,23,0,0,0,3,3,41627,354,81,20,6,51,5946,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-21,20-Dec-2012,Dec 20th 2012,Fri 12-20-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-15,2012-12-16,2012-12-20,Fri ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,51,2012,2012-12-15,2012-12-21,N,Wk.51 - 13,2012-12-15 00:00:00,2012-12-21 00:00:00,2012W51 ,2012W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2012,N,2012-12-20,2011-12-20,2012-09-20,2012-06-20,2012-11-20,2012-10-20,2012-12-13,2012-12-06,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-11,2012-01-01,2012-04-01,2012-06-01,2012-06-09,0,-2,-5,-24,-169,0,-2,-6,-24,-24,41435,162,72,11,3,24,5919,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-15,11-Jun-2012,Jun 11th 2012,Tue 06-11-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-09,2012-06-10,2012-06-11,Tue ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,24,2012,2012-06-09,2012-06-15,N,Wk.24 - 13,2012-06-09 00:00:00,2012-06-15 00:00:00,2012W24 ,2012W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2012,N,2012-06-11,2011-06-11,2012-03-11,2012-12-11,2012-05-11,2012-04-11,2012-06-04,2012-05-28,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-01,2012-01-01,2012-07-01,2012-08-01,2012-07-28,0,-1,-3,-17,-118,0,-1,-4,-17,-17,41486,213,32,1,5,31,5926,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-03,01-Aug-2012,Aug 1st 2012,Thu 08-01-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-07-28,2012-07-29,2012-08-01,Thu ,2012M08,Aug-2012,Y,2012M08 ,Y,Year 2012 - Quarter 03,2012Q03 ,N,31,2012,2012-07-28,2012-08-03,N,Wk.31 - 13,2012-07-28 00:00:00,2012-08-03 00:00:00,2012W31 ,2012W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2012,N,2012-08-01,2011-08-01,2012-05-01,2012-02-01,2012-07-01,2012-06-01,2012-07-25,2012-07-18,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-26,2012-01-01,2012-07-01,2012-09-01,2012-09-22,0,-1,-2,-9,-62,0,-1,-3,-9,-9,41542,269,88,26,5,39,5934,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-28,26-Sep-2012,Sep 26th 2012,Thu 09-26-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-22,2012-09-23,2012-09-26,Thu ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,39,2012,2012-09-22,2012-09-28,N,Wk.39 - 13,2012-09-22 00:00:00,2012-09-28 00:00:00,2012W39 ,2012W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2012,N,2012-09-26,2011-09-26,2012-06-26,2012-03-26,2012-08-26,2012-07-26,2012-09-19,2012-09-12,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-16,2012-01-01,2012-01-01,2012-02-01,2012-02-10,0,-3,-9,-41,-284,0,-3,-10,-41,-41,41320,47,47,16,7,7,5902,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-16,16-Feb-2012,Feb 16th 2012,Sat 02-16-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-10,2012-02-11,2012-02-16,Sat ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,7,2012,2012-02-10,2012-02-16,N,Wk.07 - 13,2012-02-10 00:00:00,2012-02-16 00:00:00,2012W07 ,2012W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2012,N,2012-02-16,2011-02-16,2012-11-16,2012-08-16,2012-01-16,2012-12-16,2012-02-09,2012-02-02,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-13,2012-01-01,2012-01-01,2012-01-01,2012-01-13,0,-3,-10,-45,-318,0,-3,-11,-45,-46,41286,13,13,13,1,3,5898,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-19,13-Jan-2012,Jan 13th 2012,Sun 01-13-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-13,2012-01-07,2012-01-13,Sun ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,3,2012,2012-01-13,2012-01-19,Y,Wk.03 - 13,2012-01-13 00:00:00,2012-01-19 00:00:00,2012W03 ,2012W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2012,N,2012-01-13,2011-01-13,2012-10-13,2012-07-13,2012-12-13,2012-11-13,2012-01-06,2012-12-30,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-08,2012-01-01,2012-04-01,2012-06-01,2012-06-02,0,-2,-5,-25,-172,0,-2,-6,-25,-25,41432,159,69,8,7,23,5918,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-08,08-Jun-2012,Jun 8th 2012,Sat 06-08-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-02,2012-06-03,2012-06-08,Sat ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,23,2012,2012-06-02,2012-06-08,N,Wk.23 - 13,2012-06-02 00:00:00,2012-06-08 00:00:00,2012W23 ,2012W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2012,N,2012-06-08,2011-06-08,2012-03-08,2012-12-08,2012-05-08,2012-04-08,2012-06-01,2012-05-25,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-30,2012-01-01,2012-01-01,2012-01-01,2012-01-27,0,-3,-10,-43,-301,0,-3,-10,-43,-43,41303,30,30,30,4,5,5900,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-02-02,30-Jan-2012,Jan 30th 2012,Wed 01-30-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-01-27,2012-01-27,2012-01-28,2012-01-30,Wed ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,5,2012,2012-01-27,2012-02-02,N,Wk.05 - 13,2012-01-27 00:00:00,2012-02-02 00:00:00,2012W05 ,2012W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2012,N,2012-01-30,2011-01-30,2012-10-30,2012-07-30,2012-12-30,2012-11-30,2012-01-23,2012-01-16,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-13,2012-01-01,2012-04-01,2012-06-01,2012-06-09,0,-2,-5,-24,-167,0,-2,-6,-24,-24,41437,164,74,13,5,24,5919,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-15,13-Jun-2012,Jun 13th 2012,Thu 06-13-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-09,2012-06-10,2012-06-13,Thu ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,24,2012,2012-06-09,2012-06-15,N,Wk.24 - 13,2012-06-09 00:00:00,2012-06-15 00:00:00,2012W24 ,2012W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2012,N,2012-06-13,2011-06-13,2012-03-13,2012-12-13,2012-05-13,2012-04-13,2012-06-06,2012-05-30,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-06,2012-01-01,2012-01-01,2012-03-01,2012-03-03,0,-3,-8,-38,-266,0,-3,-9,-38,-38,41338,65,65,6,4,10,5905,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-09,06-Mar-2012,Mar 6th 2012,Wed 03-06-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-03,2012-03-04,2012-03-06,Wed ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,10,2012,2012-03-03,2012-03-09,N,Wk.10 - 13,2012-03-03 00:00:00,2012-03-09 00:00:00,2012W10 ,2012W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2012,N,2012-03-06,2011-03-06,2012-12-06,2012-09-06,2012-02-06,2012-01-06,2012-02-27,2012-02-20,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-15,2012-01-01,2012-01-01,2012-03-01,2012-03-10,0,-3,-8,-37,-257,0,-3,-9,-37,-37,41347,74,74,15,6,11,5906,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-16,15-Mar-2012,Mar 15th 2012,Fri 03-15-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-10,2012-03-11,2012-03-15,Fri ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,11,2012,2012-03-10,2012-03-16,N,Wk.11 - 13,2012-03-10 00:00:00,2012-03-16 00:00:00,2012W11 ,2012W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2012,N,2012-03-15,2011-03-15,2012-12-15,2012-09-15,2012-02-15,2012-01-15,2012-03-08,2012-03-01,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-15,2012-01-01,2012-10-01,2012-12-01,2012-12-15,0,0,1,3,18,0,0,0,3,2,41622,349,76,15,1,51,5946,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-21,15-Dec-2012,Dec 15th 2012,Sun 12-15-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-15,2012-12-09,2012-12-15,Sun ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,51,2012,2012-12-15,2012-12-21,Y,Wk.51 - 13,2012-12-15 00:00:00,2012-12-21 00:00:00,2012W51 ,2012W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2012,N,2012-12-15,2011-12-15,2012-09-15,2012-06-15,2012-11-15,2012-10-15,2012-12-08,2012-12-01,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-19,2012-01-01,2012-04-01,2012-04-01,2012-04-14,0,-2,-7,-32,-222,0,-2,-8,-32,-32,41382,109,19,19,6,16,5911,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-20,19-Apr-2012,Apr 19th 2012,Fri 04-19-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-14,2012-04-15,2012-04-19,Fri ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,16,2012,2012-04-14,2012-04-20,N,Wk.16 - 13,2012-04-14 00:00:00,2012-04-20 00:00:00,2012W16 ,2012W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2012,N,2012-04-19,2011-04-19,2012-01-19,2012-10-19,2012-03-19,2012-02-19,2012-04-12,2012-04-05,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-14,2012-01-01,2012-10-01,2012-12-01,2012-12-08,0,0,1,2,17,0,0,0,2,2,41621,348,75,14,7,50,5945,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-14,14-Dec-2012,Dec 14th 2012,Sat 12-14-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-08,2012-12-09,2012-12-14,Sat ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,50,2012,2012-12-08,2012-12-14,N,Wk.50 - 13,2012-12-08 00:00:00,2012-12-14 00:00:00,2012W50 ,2012W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2012,N,2012-12-14,2011-12-14,2012-09-14,2012-06-14,2012-11-14,2012-10-14,2012-12-07,2012-11-30,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-28,2012-01-01,2012-01-01,2012-02-01,2012-02-24,0,-3,-9,-39,-272,0,-3,-9,-39,-39,41332,59,59,28,5,9,5904,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-03-02,28-Feb-2012,Feb 28th 2012,Thu 02-28-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-02-24,2012-02-24,2012-02-25,2012-02-28,Thu ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,9,2012,2012-02-24,2012-03-02,N,Wk.09 - 13,2012-02-24 00:00:00,2012-03-02 00:00:00,2012W09 ,2012W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2012,N,2012-02-28,2011-02-28,2012-11-28,2012-08-28,2012-01-28,2012-12-28,2012-02-21,2012-02-14,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-26,2012-01-01,2012-01-01,2012-02-01,2012-02-24,0,-3,-9,-39,-274,0,-3,-9,-39,-39,41330,57,57,26,3,9,5904,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-03-02,26-Feb-2012,Feb 26th 2012,Tue 02-26-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-02-24,2012-02-24,2012-02-25,2012-02-26,Tue ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,9,2012,2012-02-24,2012-03-02,N,Wk.09 - 13,2012-02-24 00:00:00,2012-03-02 00:00:00,2012W09 ,2012W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2012,N,2012-02-26,2011-02-26,2012-11-26,2012-08-26,2012-01-26,2012-12-26,2012-02-19,2012-02-12,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-14,2012-01-01,2012-07-01,2012-08-01,2012-08-11,0,-1,-3,-15,-105,0,-1,-4,-15,-15,41499,226,45,14,4,33,5928,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-17,14-Aug-2012,Aug 14th 2012,Wed 08-14-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-11,2012-08-12,2012-08-14,Wed ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,33,2012,2012-08-11,2012-08-17,N,Wk.33 - 13,2012-08-11 00:00:00,2012-08-17 00:00:00,2012W33 ,2012W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2012,N,2012-08-14,2011-08-14,2012-05-14,2012-02-14,2012-07-14,2012-06-14,2012-08-07,2012-07-31,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-23,2012-01-01,2012-04-01,2012-06-01,2012-06-23,0,-2,-5,-22,-157,0,-2,-6,-22,-23,41447,174,84,23,1,26,5921,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-29,23-Jun-2012,Jun 23rd 2012,Sun 06-23-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-23,2012-06-17,2012-06-23,Sun ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,26,2012,2012-06-23,2012-06-29,Y,Wk.26 - 13,2012-06-23 00:00:00,2012-06-29 00:00:00,2012W26 ,2012W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2012,N,2012-06-23,2011-06-23,2012-03-23,2012-12-23,2012-05-23,2012-04-23,2012-06-16,2012-06-09,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-07,2012-01-01,2012-04-01,2012-06-01,2012-06-02,0,-2,-5,-25,-173,0,-2,-6,-25,-25,41431,158,68,7,6,23,5918,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-08,07-Jun-2012,Jun 7th 2012,Fri 06-07-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-02,2012-06-03,2012-06-07,Fri ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,23,2012,2012-06-02,2012-06-08,N,Wk.23 - 13,2012-06-02 00:00:00,2012-06-08 00:00:00,2012W23 ,2012W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2012,N,2012-06-07,2011-06-07,2012-03-07,2012-12-07,2012-05-07,2012-04-07,2012-05-31,2012-05-24,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-08,2012-01-01,2012-10-01,2012-10-01,2012-10-06,0,0,-1,-7,-50,0,0,-2,-7,-7,41554,281,8,8,3,41,5936,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-12,08-Oct-2012,Oct 8th 2012,Tue 10-08-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-06,2012-10-07,2012-10-08,Tue ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,41,2012,2012-10-06,2012-10-12,N,Wk.41 - 13,2012-10-06 00:00:00,2012-10-12 00:00:00,2012W41 ,2012W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2012,N,2012-10-08,2011-10-08,2012-07-08,2012-04-08,2012-09-08,2012-08-08,2012-10-01,2012-09-24,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-12,2012-01-01,2012-10-01,2012-11-01,2012-11-10,0,0,0,-2,-15,0,0,-1,-2,-2,41589,316,43,12,3,46,5941,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-16,12-Nov-2012,Nov 12th 2012,Tue 11-12-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-10,2012-11-11,2012-11-12,Tue ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,46,2012,2012-11-10,2012-11-16,N,Wk.46 - 13,2012-11-10 00:00:00,2012-11-16 00:00:00,2012W46 ,2012W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2012,N,2012-11-12,2011-11-12,2012-08-12,2012-05-12,2012-10-12,2012-09-12,2012-11-05,2012-10-29,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-22,2012-01-01,2012-04-01,2012-04-01,2012-04-21,0,-2,-7,-31,-219,0,-2,-8,-31,-31,41385,112,22,22,2,17,5912,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-27,22-Apr-2012,Apr 22nd 2012,Mon 04-22-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-21,2012-04-22,2012-04-22,Mon ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,17,2012,2012-04-21,2012-04-27,N,Wk.17 - 13,2012-04-21 00:00:00,2012-04-27 00:00:00,2012W17 ,2012W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2012,N,2012-04-22,2011-04-22,2012-01-22,2012-10-22,2012-03-22,2012-02-22,2012-04-15,2012-04-08,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-31,2012-01-01,2012-10-01,2012-10-01,2012-10-27,0,0,-1,-4,-27,0,0,-1,-4,-4,41577,304,31,31,5,44,5939,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-11-02,31-Oct-2012,Oct 31st 2012,Thu 10-31-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-10-27,2012-10-27,2012-10-28,2012-10-31,Thu ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,44,2012,2012-10-27,2012-11-02,N,Wk.44 - 13,2012-10-27 00:00:00,2012-11-02 00:00:00,2012W44 ,2012W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2012,N,2012-10-31,2011-10-31,2012-07-31,2012-04-30,2012-09-30,2012-08-31,2012-10-24,2012-10-17,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-07,2012-01-01,2012-01-01,2012-01-01,2012-01-06,0,-3,-10,-46,-324,0,-3,-11,-46,-46,41280,7,7,7,2,2,5897,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-12,07-Jan-2012,Jan 7th 2012,Mon 01-07-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-06,2012-01-07,2012-01-07,Mon ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,2,2012,2012-01-06,2012-01-12,N,Wk.02 - 13,2012-01-06 00:00:00,2012-01-12 00:00:00,2012W02 ,2012W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2012,N,2012-01-07,2011-01-07,2012-10-07,2012-07-07,2012-12-07,2012-11-07,2012-12-31,2012-12-24,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-25,2012-01-01,2012-10-01,2012-12-01,2012-12-22,0,0,1,4,28,0,0,0,4,4,41632,359,86,25,4,52,5947,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-28,25-Dec-2012,Dec 25th 2012,Wed 12-25-13,0,0,0,0,2012-12-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-22,2012-12-23,2012-12-25,Wed ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,52,2012,2012-12-22,2012-12-28,N,Wk.52 - 13,2012-12-22 00:00:00,2012-12-28 00:00:00,2012W52 ,2012W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2012,N,2012-12-25,2011-12-25,2012-09-25,2012-06-25,2012-11-25,2012-10-25,2012-12-18,2012-12-11,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-10,2012-01-01,2012-10-01,2012-12-01,2012-12-08,0,0,1,2,13,0,0,0,2,2,41617,344,71,10,3,50,5945,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-14,10-Dec-2012,Dec 10th 2012,Tue 12-10-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-08,2012-12-09,2012-12-10,Tue ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,50,2012,2012-12-08,2012-12-14,N,Wk.50 - 13,2012-12-08 00:00:00,2012-12-14 00:00:00,2012W50 ,2012W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2012,N,2012-12-10,2011-12-10,2012-09-10,2012-06-10,2012-11-10,2012-10-10,2012-12-03,2012-11-26,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-29,2012-01-01,2012-04-01,2012-06-01,2012-06-23,0,-2,-5,-22,-151,0,-2,-6,-22,-22,41453,180,90,29,7,26,5921,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-29,29-Jun-2012,Jun 29th 2012,Sat 06-29-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-23,2012-06-24,2012-06-29,Sat ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,26,2012,2012-06-23,2012-06-29,N,Wk.26 - 13,2012-06-23 00:00:00,2012-06-29 00:00:00,2012W26 ,2012W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2012,N,2012-06-29,2011-06-29,2012-03-29,2012-12-29,2012-05-29,2012-04-29,2012-06-22,2012-06-15,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-01,2012-01-01,2012-01-01,2012-02-01,2012-01-27,0,-3,-9,-43,-299,0,-3,-10,-43,-43,41305,32,32,1,6,5,5900,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-02,01-Feb-2012,Feb 1st 2012,Fri 02-01-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-01-27,2012-01-28,2012-02-01,Fri ,2012M02,Feb-2012,Y,2012M02 ,Y,Year 2012 - Quarter 01,2012Q01 ,N,5,2012,2012-01-27,2012-02-02,N,Wk.05 - 13,2012-01-27 00:00:00,2012-02-02 00:00:00,2012W05 ,2012W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2012,N,2012-02-01,2011-02-01,2012-11-01,2012-08-01,2012-01-01,2012-12-01,2012-01-25,2012-01-18,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-30,2012-01-01,2012-10-01,2012-12-01,2012-12-29,0,0,1,5,33,1,1,1,5,5,41637,364,91,30,2,53,5948,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-31,30-Dec-2012,Dec 30th 2012,Mon 12-30-13,0,0,0,0,2012-12-21,365,92,31,3,2012-12-29,2012-12-29,2012-12-29,2012-12-29,2012-12-30,2012-12-30,Mon ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,1,2014,2012-12-29,2014-01-04,N,Wk.53 - 13,2012-12-29 00:00:00,2012-12-31 00:00:00,2012W53 ,2012W53 ,12/29/13 - 12/31/13,12/29 - 12/31,2012,N,2012-12-30,2011-12-30,2012-09-30,2012-06-30,2012-11-30,2012-10-30,2012-12-23,2012-12-16,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-13,2012-01-01,2012-01-01,2012-02-01,2012-02-10,0,-3,-9,-41,-287,0,-3,-10,-41,-41,41317,44,44,13,4,7,5902,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-16,13-Feb-2012,Feb 13th 2012,Wed 02-13-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-10,2012-02-11,2012-02-13,Wed ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,7,2012,2012-02-10,2012-02-16,N,Wk.07 - 13,2012-02-10 00:00:00,2012-02-16 00:00:00,2012W07 ,2012W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2012,N,2012-02-13,2011-02-13,2012-11-13,2012-08-13,2012-01-13,2012-12-13,2012-02-06,2012-01-30,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-29,2012-01-01,2012-10-01,2012-11-01,2012-11-24,0,0,0,0,2,0,0,0,0,0,41606,333,60,29,6,48,5943,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-30,29-Nov-2012,Nov 29th 2012,Fri 11-29-13,0,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-11-24,2012-11-24,2012-11-25,2012-11-29,Fri ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,48,2012,2012-11-24,2012-11-30,N,Wk.48 - 13,2012-11-24 00:00:00,2012-11-30 00:00:00,2012W48 ,2012W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2012,N,2012-11-29,2011-11-29,2012-08-29,2012-05-29,2012-10-29,2012-09-29,2012-11-22,2012-11-15,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-09,2012-01-01,2012-10-01,2012-10-01,2012-10-06,0,0,-1,-7,-49,0,0,-2,-7,-7,41555,282,9,9,4,41,5936,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-12,09-Oct-2012,Oct 9th 2012,Wed 10-09-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-06,2012-10-07,2012-10-09,Wed ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,41,2012,2012-10-06,2012-10-12,N,Wk.41 - 13,2012-10-06 00:00:00,2012-10-12 00:00:00,2012W41 ,2012W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2012,N,2012-10-09,2011-10-09,2012-07-09,2012-04-09,2012-09-09,2012-08-09,2012-10-02,2012-09-25,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-09,2012-01-01,2012-04-01,2012-06-01,2012-06-09,0,-2,-5,-24,-171,0,-2,-6,-24,-25,41433,160,70,9,1,24,5919,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-15,09-Jun-2012,Jun 9th 2012,Sun 06-09-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-09,2012-06-03,2012-06-09,Sun ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,24,2012,2012-06-09,2012-06-15,Y,Wk.24 - 13,2012-06-09 00:00:00,2012-06-15 00:00:00,2012W24 ,2012W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2012,N,2012-06-09,2011-06-09,2012-03-09,2012-12-09,2012-05-09,2012-04-09,2012-06-02,2012-05-26,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-10,2012-01-01,2012-10-01,2012-10-01,2012-10-06,0,0,-1,-7,-48,0,0,-2,-7,-7,41556,283,10,10,5,41,5936,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-12,10-Oct-2012,Oct 10th 2012,Thu 10-10-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-06,2012-10-07,2012-10-10,Thu ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,41,2012,2012-10-06,2012-10-12,N,Wk.41 - 13,2012-10-06 00:00:00,2012-10-12 00:00:00,2012W41 ,2012W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2012,N,2012-10-10,2011-10-10,2012-07-10,2012-04-10,2012-09-10,2012-08-10,2012-10-03,2012-09-26,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-28,2012-01-01,2012-10-01,2012-11-01,2012-11-24,0,0,0,0,1,0,0,0,0,0,41605,332,59,28,5,48,5943,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-30,28-Nov-2012,Nov 28th 2012,Thu 11-28-13,0,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-11-24,2012-11-24,2012-11-25,2012-11-28,Thu ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,48,2012,2012-11-24,2012-11-30,N,Wk.48 - 13,2012-11-24 00:00:00,2012-11-30 00:00:00,2012W48 ,2012W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2012,N,2012-11-28,2011-11-28,2012-08-28,2012-05-28,2012-10-28,2012-09-28,2012-11-21,2012-11-14,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-31,2012-01-01,2012-04-01,2012-05-01,2012-05-26,0,-2,-6,-26,-180,0,-2,-6,-26,-26,41424,151,61,31,6,22,5917,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-06-01,31-May-2012,May 31st 2012,Fri 05-31-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-05-26,2012-05-26,2012-05-27,2012-05-31,Fri ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,22,2012,2012-05-26,2012-06-01,N,Wk.22 - 13,2012-05-26 00:00:00,2012-06-01 00:00:00,2012W22 ,2012W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2012,N,2012-05-31,2011-05-31,2012-02-28,2012-11-30,2012-04-30,2012-03-31,2012-05-24,2012-05-17,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-09-15,2012-01-01,2012-07-01,2012-09-01,2012-09-15,0,-1,-2,-10,-73,0,-1,-3,-10,-11,41531,258,77,15,1,38,5933,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-21,15-Sep-2012,Sep 15th 2012,Sun 09-15-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-15,2012-09-09,2012-09-15,Sun ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,38,2012,2012-09-15,2012-09-21,Y,Wk.38 - 13,2012-09-15 00:00:00,2012-09-21 00:00:00,2012W38 ,2012W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2012,N,2012-09-15,2011-09-15,2012-06-15,2012-03-15,2012-08-15,2012-07-15,2012-09-08,2012-09-01,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-31,2012-01-01,2012-07-01,2012-07-01,2012-07-28,0,-1,-4,-17,-119,0,-1,-4,-17,-17,41485,212,31,31,4,31,5926,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-08-03,31-Jul-2012,Jul 31st 2012,Wed 07-31-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-07-28,2012-07-29,2012-07-31,Wed ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,31,2012,2012-07-28,2012-08-03,N,Wk.31 - 13,2012-07-28 00:00:00,2012-08-03 00:00:00,2012W31 ,2012W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2012,N,2012-07-31,2011-07-31,2012-04-30,2012-01-31,2012-06-30,2012-05-31,2012-07-24,2012-07-17,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-17,2012-01-01,2012-10-01,2012-11-01,2012-11-17,0,0,0,-1,-10,0,0,-1,-1,-2,41594,321,48,17,1,47,5942,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-23,17-Nov-2012,Nov 17th 2012,Sun 11-17-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-17,2012-11-11,2012-11-17,Sun ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,47,2012,2012-11-17,2012-11-23,Y,Wk.47 - 13,2012-11-17 00:00:00,2012-11-23 00:00:00,2012W47 ,2012W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2012,N,2012-11-17,2011-11-17,2012-08-17,2012-05-17,2012-10-17,2012-09-17,2012-11-10,2012-11-03,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-18,2012-01-01,2012-01-01,2012-01-01,2012-01-13,0,-3,-10,-45,-313,0,-3,-11,-45,-45,41291,18,18,18,6,3,5898,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-19,18-Jan-2012,Jan 18th 2012,Fri 01-18-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-13,2012-01-14,2012-01-18,Fri ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,3,2012,2012-01-13,2012-01-19,N,Wk.03 - 13,2012-01-13 00:00:00,2012-01-19 00:00:00,2012W03 ,2012W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2012,N,2012-01-18,2011-01-18,2012-10-18,2012-07-18,2012-12-18,2012-11-18,2012-01-11,2012-01-04,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-26,2012-01-01,2012-04-01,2012-05-01,2012-05-26,0,-2,-6,-26,-185,0,-2,-6,-26,-27,41419,146,56,26,1,22,5917,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-06-01,26-May-2012,May 26th 2012,Sun 05-26-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-05-26,2012-05-26,2012-05-20,2012-05-26,Sun ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,22,2012,2012-05-26,2012-06-01,Y,Wk.22 - 13,2012-05-26 00:00:00,2012-06-01 00:00:00,2012W22 ,2012W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2012,N,2012-05-26,2011-05-26,2012-02-26,2012-11-26,2012-04-26,2012-03-26,2012-05-19,2012-05-12,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-06,2012-01-01,2012-04-01,2012-04-01,2012-03-31,0,-2,-7,-34,-235,0,-2,-8,-34,-34,41369,96,6,6,7,14,5909,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-06,06-Apr-2012,Apr 6th 2012,Sat 04-06-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-03-31,2012-04-01,2012-04-06,Sat ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,14,2012,2012-03-31,2012-04-06,N,Wk.14 - 13,2012-03-31 00:00:00,2012-04-06 00:00:00,2012W14 ,2012W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2012,N,2012-04-06,2011-04-06,2012-01-06,2012-10-06,2012-03-06,2012-02-06,2012-03-30,2012-03-23,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-27,2012-01-01,2012-10-01,2012-11-01,2012-11-24,0,0,0,0,0,0,0,0,0,0,41604,331,58,27,4,48,5943,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-30,27-Nov-2012,Nov 27th 2012,Wed 11-27-13,1,1,1,1,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-11-24,2012-11-24,2012-11-25,2012-11-27,Wed ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,48,2012,2012-11-24,2012-11-30,N,Wk.48 - 13,2012-11-24 00:00:00,2012-11-30 00:00:00,2012W48 ,2012W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2012,N,2012-11-27,2011-11-27,2012-08-27,2012-05-27,2012-10-27,2012-09-27,2012-11-20,2012-11-13,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-10,2012-01-01,2012-07-01,2012-08-01,2012-08-04,0,-1,-3,-16,-109,0,-1,-4,-16,-16,41495,222,41,10,7,32,5927,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-10,10-Aug-2012,Aug 10th 2012,Sat 08-10-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-04,2012-08-05,2012-08-10,Sat ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,32,2012,2012-08-04,2012-08-10,N,Wk.32 - 13,2012-08-04 00:00:00,2012-08-10 00:00:00,2012W32 ,2012W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2012,N,2012-08-10,2011-08-10,2012-05-10,2012-02-10,2012-07-10,2012-06-10,2012-08-03,2012-07-27,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-24,2012-01-01,2012-04-01,2012-04-01,2012-04-21,0,-2,-7,-31,-217,0,-2,-8,-31,-31,41387,114,24,24,4,17,5912,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-27,24-Apr-2012,Apr 24th 2012,Wed 04-24-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-21,2012-04-22,2012-04-24,Wed ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,17,2012,2012-04-21,2012-04-27,N,Wk.17 - 13,2012-04-21 00:00:00,2012-04-27 00:00:00,2012W17 ,2012W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2012,N,2012-04-24,2011-04-24,2012-01-24,2012-10-24,2012-03-24,2012-02-24,2012-04-17,2012-04-10,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-29,2012-01-01,2012-07-01,2012-07-01,2012-07-28,0,-1,-4,-17,-121,0,-1,-4,-17,-17,41483,210,29,29,2,31,5926,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-08-03,29-Jul-2012,Jul 29th 2012,Mon 07-29-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-07-28,2012-07-29,2012-07-29,Mon ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,31,2012,2012-07-28,2012-08-03,N,Wk.31 - 13,2012-07-28 00:00:00,2012-08-03 00:00:00,2012W31 ,2012W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2012,N,2012-07-29,2011-07-29,2012-04-29,2012-01-29,2012-06-29,2012-05-29,2012-07-22,2012-07-15,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-29,2012-01-01,2012-10-01,2012-10-01,2012-10-27,0,0,-1,-4,-29,0,0,-1,-4,-4,41575,302,29,29,3,44,5939,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-11-02,29-Oct-2012,Oct 29th 2012,Tue 10-29-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-10-27,2012-10-27,2012-10-28,2012-10-29,Tue ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,44,2012,2012-10-27,2012-11-02,N,Wk.44 - 13,2012-10-27 00:00:00,2012-11-02 00:00:00,2012W44 ,2012W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2012,N,2012-10-29,2011-10-29,2012-07-29,2012-04-29,2012-09-29,2012-08-29,2012-10-22,2012-10-15,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-17,2012-01-01,2012-07-01,2012-07-01,2012-07-14,0,-1,-4,-19,-133,0,-1,-5,-19,-19,41471,198,17,17,4,29,5924,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-20,17-Jul-2012,Jul 17th 2012,Wed 07-17-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-14,2012-07-15,2012-07-17,Wed ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,29,2012,2012-07-14,2012-07-20,N,Wk.29 - 13,2012-07-14 00:00:00,2012-07-20 00:00:00,2012W29 ,2012W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2012,N,2012-07-17,2011-07-17,2012-04-17,2012-01-17,2012-06-17,2012-05-17,2012-07-10,2012-07-03,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-22,2012-01-01,2012-10-01,2012-12-01,2012-12-22,0,0,1,4,25,0,0,0,4,3,41629,356,83,22,1,52,5947,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-28,22-Dec-2012,Dec 22nd 2012,Sun 12-22-13,0,0,0,0,2012-12-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-22,2012-12-16,2012-12-22,Sun ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,52,2012,2012-12-22,2012-12-28,Y,Wk.52 - 13,2012-12-22 00:00:00,2012-12-28 00:00:00,2012W52 ,2012W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2012,N,2012-12-22,2011-12-22,2012-09-22,2012-06-22,2012-11-22,2012-10-22,2012-12-15,2012-12-08,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-23,2012-01-01,2012-01-01,2012-03-01,2012-03-17,0,-3,-8,-36,-249,0,-3,-9,-36,-36,41355,82,82,23,7,12,5907,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-23,23-Mar-2012,Mar 23rd 2012,Sat 03-23-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-17,2012-03-18,2012-03-23,Sat ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,12,2012,2012-03-17,2012-03-23,N,Wk.12 - 13,2012-03-17 00:00:00,2012-03-23 00:00:00,2012W12 ,2012W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2012,N,2012-03-23,2011-03-23,2012-12-23,2012-09-23,2012-02-23,2012-01-23,2012-03-16,2012-03-09,0,0,0,0,0,0,0,0,3,1,12,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-11,2012-01-01,2012-10-01,2012-11-01,2012-11-10,0,0,0,-2,-16,0,0,-1,-2,-2,41588,315,42,11,2,46,5941,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-16,11-Nov-2012,Nov 11th 2012,Mon 11-11-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-10,2012-11-11,2012-11-11,Mon ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,46,2012,2012-11-10,2012-11-16,N,Wk.46 - 13,2012-11-10 00:00:00,2012-11-16 00:00:00,2012W46 ,2012W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2012,N,2012-11-11,2011-11-11,2012-08-11,2012-05-11,2012-10-11,2012-09-11,2012-11-04,2012-10-28,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-06,2012-01-01,2012-07-01,2012-08-01,2012-08-04,0,-1,-3,-16,-113,0,-1,-4,-16,-16,41491,218,37,6,3,32,5927,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-10,06-Aug-2012,Aug 6th 2012,Tue 08-06-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-04,2012-08-05,2012-08-06,Tue ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,32,2012,2012-08-04,2012-08-10,N,Wk.32 - 13,2012-08-04 00:00:00,2012-08-10 00:00:00,2012W32 ,2012W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2012,N,2012-08-06,2011-08-06,2012-05-06,2012-02-06,2012-07-06,2012-06-06,2012-07-30,2012-07-23,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-02,2012-01-01,2012-01-01,2012-02-01,2012-01-27,0,-3,-9,-43,-298,0,-3,-10,-43,-43,41306,33,33,2,7,5,5900,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-02,02-Feb-2012,Feb 2nd 2012,Sat 02-02-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-01-27,2012-01-28,2012-02-02,Sat ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,5,2012,2012-01-27,2012-02-02,N,Wk.05 - 13,2012-01-27 00:00:00,2012-02-02 00:00:00,2012W05 ,2012W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2012,N,2012-02-02,2011-02-02,2012-11-02,2012-08-02,2012-01-02,2012-12-02,2012-01-26,2012-01-19,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-22,2012-01-01,2012-01-01,2012-03-01,2012-03-17,0,-3,-8,-36,-250,0,-3,-9,-36,-36,41354,81,81,22,6,12,5907,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-23,22-Mar-2012,Mar 22nd 2012,Fri 03-22-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-17,2012-03-18,2012-03-22,Fri ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,12,2012,2012-03-17,2012-03-23,N,Wk.12 - 13,2012-03-17 00:00:00,2012-03-23 00:00:00,2012W12 ,2012W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2012,N,2012-03-22,2011-03-22,2012-12-22,2012-09-22,2012-02-22,2012-01-22,2012-03-15,2012-03-08,0,0,0,0,0,0,0,0,3,1,12,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-04-28,2012-01-01,2012-04-01,2012-04-01,2012-04-28,0,-2,-7,-30,-213,0,-2,-7,-30,-31,41391,118,28,28,1,18,5913,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-05-04,28-Apr-2012,Apr 28th 2012,Sun 04-28-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-04-28,2012-04-28,2012-04-22,2012-04-28,Sun ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,18,2012,2012-04-28,2012-05-04,Y,Wk.18 - 13,2012-04-28 00:00:00,2012-05-04 00:00:00,2012W18 ,2012W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2012,N,2012-04-28,2011-04-28,2012-01-28,2012-10-28,2012-03-28,2012-02-28,2012-04-21,2012-04-14,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-04,2012-01-01,2012-01-01,2012-03-01,2012-03-03,0,-3,-8,-38,-268,0,-3,-9,-38,-38,41336,63,63,4,2,10,5905,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-09,04-Mar-2012,Mar 4th 2012,Mon 03-04-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-03,2012-03-04,2012-03-04,Mon ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,10,2012,2012-03-03,2012-03-09,N,Wk.10 - 13,2012-03-03 00:00:00,2012-03-09 00:00:00,2012W10 ,2012W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2012,N,2012-03-04,2011-03-04,2012-12-04,2012-09-04,2012-02-04,2012-01-04,2012-02-25,2012-02-18,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-12,2012-01-01,2012-07-01,2012-07-01,2012-07-07,0,-1,-4,-20,-138,0,-1,-5,-20,-20,41466,193,12,12,6,28,5923,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-13,12-Jul-2012,Jul 12th 2012,Fri 07-12-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-07,2012-07-08,2012-07-12,Fri ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,28,2012,2012-07-07,2012-07-13,N,Wk.28 - 13,2012-07-07 00:00:00,2012-07-13 00:00:00,2012W28 ,2012W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2012,N,2012-07-12,2011-07-12,2012-04-12,2012-01-12,2012-06-12,2012-05-12,2012-07-05,2012-06-28,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-05,2012-01-01,2012-01-01,2012-01-01,2012-01-01,0,-3,-10,-47,-326,0,-3,-11,-47,-47,41278,5,5,5,7,1,5896,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-05,05-Jan-2012,Jan 5th 2012,Sat 01-05-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2012-01-05,Sat ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,1,2012,2012-12-30,2012-01-05,N,Wk.01 - 13,2012-01-01 00:00:00,2012-01-05 00:00:00,2012W01 ,2012W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2012,N,2012-01-05,2011-01-05,2012-10-05,2012-07-05,2012-12-05,2012-11-05,2012-12-29,2012-12-22,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-12,2012-01-01,2012-07-01,2012-08-01,2012-08-11,0,-1,-3,-15,-107,0,-1,-4,-15,-15,41497,224,43,12,2,33,5928,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-17,12-Aug-2012,Aug 12th 2012,Mon 08-12-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-11,2012-08-12,2012-08-12,Mon ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,33,2012,2012-08-11,2012-08-17,N,Wk.33 - 13,2012-08-11 00:00:00,2012-08-17 00:00:00,2012W33 ,2012W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2012,N,2012-08-12,2011-08-12,2012-05-12,2012-02-12,2012-07-12,2012-06-12,2012-08-05,2012-07-29,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-04,2012-01-01,2012-07-01,2012-08-01,2012-08-04,0,-1,-3,-16,-115,0,-1,-4,-16,-17,41489,216,35,4,1,32,5927,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-10,04-Aug-2012,Aug 4th 2012,Sun 08-04-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-04,2012-07-29,2012-08-04,Sun ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,32,2012,2012-08-04,2012-08-10,Y,Wk.32 - 13,2012-08-04 00:00:00,2012-08-10 00:00:00,2012W32 ,2012W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2012,N,2012-08-04,2011-08-04,2012-05-04,2012-02-04,2012-07-04,2012-06-04,2012-07-28,2012-07-21,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-17,2012-01-01,2012-01-01,2012-03-01,2012-03-17,0,-3,-8,-36,-255,0,-3,-9,-36,-37,41349,76,76,17,1,12,5907,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-23,17-Mar-2012,Mar 17th 2012,Sun 03-17-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-17,2012-03-11,2012-03-17,Sun ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,12,2012,2012-03-17,2012-03-23,Y,Wk.12 - 13,2012-03-17 00:00:00,2012-03-23 00:00:00,2012W12 ,2012W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2012,N,2012-03-17,2011-03-17,2012-12-17,2012-09-17,2012-02-17,2012-01-17,2012-03-10,2012-03-03,0,0,0,0,0,0,0,0,3,1,12,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-18,2012-01-01,2012-07-01,2012-07-01,2012-07-14,0,-1,-4,-19,-132,0,-1,-5,-19,-19,41472,199,18,18,5,29,5924,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-20,18-Jul-2012,Jul 18th 2012,Thu 07-18-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-14,2012-07-15,2012-07-18,Thu ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,29,2012,2012-07-14,2012-07-20,N,Wk.29 - 13,2012-07-14 00:00:00,2012-07-20 00:00:00,2012W29 ,2012W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2012,N,2012-07-18,2011-07-18,2012-04-18,2012-01-18,2012-06-18,2012-05-18,2012-07-11,2012-07-04,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-01,2012-01-01,2012-10-01,2012-12-01,2012-12-01,0,0,1,1,4,0,0,0,1,0,41608,335,62,1,1,49,5944,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-07,01-Dec-2012,Dec 1st 2012,Sun 12-01-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-01,2012-11-25,2012-12-01,Sun ,2012M12,Dec-2012,Y,2012M12 ,Y,Year 2012 - Quarter 04,2012Q04 ,N,49,2012,2012-12-01,2012-12-07,Y,Wk.49 - 13,2012-12-01 00:00:00,2012-12-07 00:00:00,2012W49 ,2012W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2012,N,2012-12-01,2011-12-01,2012-09-01,2012-06-01,2012-11-01,2012-10-01,2012-11-24,2012-11-17,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-16,2012-01-01,2012-10-01,2012-12-01,2012-12-15,0,0,1,3,19,0,0,0,3,3,41623,350,77,16,2,51,5946,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-21,16-Dec-2012,Dec 16th 2012,Mon 12-16-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-15,2012-12-16,2012-12-16,Mon ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,51,2012,2012-12-15,2012-12-21,N,Wk.51 - 13,2012-12-15 00:00:00,2012-12-21 00:00:00,2012W51 ,2012W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2012,N,2012-12-16,2011-12-16,2012-09-16,2012-06-16,2012-11-16,2012-10-16,2012-12-09,2012-12-02,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-21,2012-01-01,2012-07-01,2012-07-01,2012-07-21,0,-1,-4,-18,-129,0,-1,-5,-18,-19,41475,202,21,21,1,30,5925,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-27,21-Jul-2012,Jul 21st 2012,Sun 07-21-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-21,2012-07-15,2012-07-21,Sun ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,30,2012,2012-07-21,2012-07-27,Y,Wk.30 - 13,2012-07-21 00:00:00,2012-07-27 00:00:00,2012W30 ,2012W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2012,N,2012-07-21,2011-07-21,2012-04-21,2012-01-21,2012-06-21,2012-05-21,2012-07-14,2012-07-07,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-30,2012-01-01,2012-07-01,2012-07-01,2012-07-28,0,-1,-4,-17,-120,0,-1,-4,-17,-17,41484,211,30,30,3,31,5926,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-08-03,30-Jul-2012,Jul 30th 2012,Tue 07-30-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-07-28,2012-07-29,2012-07-30,Tue ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,31,2012,2012-07-28,2012-08-03,N,Wk.31 - 13,2012-07-28 00:00:00,2012-08-03 00:00:00,2012W31 ,2012W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2012,N,2012-07-30,2011-07-30,2012-04-30,2012-01-30,2012-06-30,2012-05-30,2012-07-23,2012-07-16,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-18,2012-01-01,2012-10-01,2012-10-01,2012-10-13,0,0,-1,-6,-40,0,0,-2,-6,-6,41564,291,18,18,6,42,5937,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-19,18-Oct-2012,Oct 18th 2012,Fri 10-18-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-13,2012-10-14,2012-10-18,Fri ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,42,2012,2012-10-13,2012-10-19,N,Wk.42 - 13,2012-10-13 00:00:00,2012-10-19 00:00:00,2012W42 ,2012W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2012,N,2012-10-18,2011-10-18,2012-07-18,2012-04-18,2012-09-18,2012-08-18,2012-10-11,2012-10-04,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-10,2012-01-01,2012-04-01,2012-06-01,2012-06-09,0,-2,-5,-24,-170,0,-2,-6,-24,-24,41434,161,71,10,2,24,5919,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-15,10-Jun-2012,Jun 10th 2012,Mon 06-10-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-09,2012-06-10,2012-06-10,Mon ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,24,2012,2012-06-09,2012-06-15,N,Wk.24 - 13,2012-06-09 00:00:00,2012-06-15 00:00:00,2012W24 ,2012W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2012,N,2012-06-10,2011-06-10,2012-03-10,2012-12-10,2012-05-10,2012-04-10,2012-06-03,2012-05-27,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-09,2012-01-01,2012-04-01,2012-05-01,2012-05-05,0,-2,-6,-29,-202,0,-2,-7,-29,-29,41402,129,39,9,5,19,5914,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-11,09-May-2012,May 9th 2012,Thu 05-09-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-05,2012-05-06,2012-05-09,Thu ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,19,2012,2012-05-05,2012-05-11,N,Wk.19 - 13,2012-05-05 00:00:00,2012-05-11 00:00:00,2012W19 ,2012W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2012,N,2012-05-09,2011-05-09,2012-02-09,2012-11-09,2012-04-09,2012-03-09,2012-05-02,2012-04-25,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-06,2012-01-01,2012-01-01,2012-02-01,2012-02-03,0,-3,-9,-42,-294,0,-3,-10,-42,-42,41310,37,37,6,4,6,5901,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-09,06-Feb-2012,Feb 6th 2012,Wed 02-06-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-03,2012-02-04,2012-02-06,Wed ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,6,2012,2012-02-03,2012-02-09,N,Wk.06 - 13,2012-02-03 00:00:00,2012-02-09 00:00:00,2012W06 ,2012W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2012,N,2012-02-06,2011-02-06,2012-11-06,2012-08-06,2012-01-06,2012-12-06,2012-01-30,2012-01-23,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-23,2012-01-01,2012-01-01,2012-02-01,2012-02-17,0,-3,-9,-40,-277,0,-3,-10,-40,-40,41327,54,54,23,7,8,5903,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-23,23-Feb-2012,Feb 23rd 2012,Sat 02-23-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-17,2012-02-18,2012-02-23,Sat ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,8,2012,2012-02-17,2012-02-23,N,Wk.08 - 13,2012-02-17 00:00:00,2012-02-23 00:00:00,2012W08 ,2012W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2012,N,2012-02-23,2011-02-23,2012-11-23,2012-08-23,2012-01-23,2012-12-23,2012-02-16,2012-02-09,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-18,2012-01-01,2012-07-01,2012-08-01,2012-08-18,0,-1,-3,-14,-101,0,-1,-4,-14,-15,41503,230,49,18,1,34,5929,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-24,18-Aug-2012,Aug 18th 2012,Sun 08-18-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-18,2012-08-12,2012-08-18,Sun ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,34,2012,2012-08-18,2012-08-24,Y,Wk.34 - 13,2012-08-18 00:00:00,2012-08-24 00:00:00,2012W34 ,2012W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2012,N,2012-08-18,2011-08-18,2012-05-18,2012-02-18,2012-07-18,2012-06-18,2012-08-11,2012-08-04,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-09,2012-01-01,2012-01-01,2012-01-01,2012-01-06,0,-3,-10,-46,-322,0,-3,-11,-46,-46,41282,9,9,9,4,2,5897,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-12,09-Jan-2012,Jan 9th 2012,Wed 01-09-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-06,2012-01-07,2012-01-09,Wed ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,2,2012,2012-01-06,2012-01-12,N,Wk.02 - 13,2012-01-06 00:00:00,2012-01-12 00:00:00,2012W02 ,2012W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2012,N,2012-01-09,2011-01-09,2012-10-09,2012-07-09,2012-12-09,2012-11-09,2012-01-02,2012-12-26,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-11,2012-01-01,2012-01-01,2012-03-01,2012-03-10,0,-3,-8,-37,-261,0,-3,-9,-37,-37,41343,70,70,11,2,11,5906,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-16,11-Mar-2012,Mar 11th 2012,Mon 03-11-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-10,2012-03-11,2012-03-11,Mon ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,11,2012,2012-03-10,2012-03-16,N,Wk.11 - 13,2012-03-10 00:00:00,2012-03-16 00:00:00,2012W11 ,2012W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2012,N,2012-03-11,2011-03-11,2012-12-11,2012-09-11,2012-02-11,2012-01-11,2012-03-04,2012-02-25,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-10-06,2012-01-01,2012-10-01,2012-10-01,2012-10-06,0,0,-1,-7,-52,0,0,-2,-7,-8,41552,279,6,6,1,41,5936,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-12,06-Oct-2012,Oct 6th 2012,Sun 10-06-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-06,2012-09-30,2012-10-06,Sun ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,41,2012,2012-10-06,2012-10-12,Y,Wk.41 - 13,2012-10-06 00:00:00,2012-10-12 00:00:00,2012W41 ,2012W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2012,N,2012-10-06,2011-10-06,2012-07-06,2012-04-06,2012-09-06,2012-08-06,2012-09-29,2012-09-22,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-08-02,2012-01-01,2012-07-01,2012-08-01,2012-07-28,0,-1,-3,-17,-117,0,-1,-4,-17,-17,41487,214,33,2,6,31,5926,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-03,02-Aug-2012,Aug 2nd 2012,Fri 08-02-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-07-28,2012-07-29,2012-08-02,Fri ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,31,2012,2012-07-28,2012-08-03,N,Wk.31 - 13,2012-07-28 00:00:00,2012-08-03 00:00:00,2012W31 ,2012W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2012,N,2012-08-02,2011-08-02,2012-05-02,2012-02-02,2012-07-02,2012-06-02,2012-07-26,2012-07-19,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-08,2012-01-01,2012-10-01,2012-12-01,2012-12-08,0,0,1,2,11,0,0,0,2,1,41615,342,69,8,1,50,5945,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-14,08-Dec-2012,Dec 8th 2012,Sun 12-08-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-08,2012-12-02,2012-12-08,Sun ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,50,2012,2012-12-08,2012-12-14,Y,Wk.50 - 13,2012-12-08 00:00:00,2012-12-14 00:00:00,2012W50 ,2012W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2012,N,2012-12-08,2011-12-08,2012-09-08,2012-06-08,2012-11-08,2012-10-08,2012-12-01,2012-11-24,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-12-29,2012-01-01,2012-10-01,2012-12-01,2012-12-29,0,0,1,5,32,1,1,1,5,4,41636,363,90,29,1,53,5948,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-31,29-Dec-2012,Dec 29th 2012,Sun 12-29-13,0,0,0,0,2012-12-21,365,92,31,3,2012-12-29,2012-12-29,2012-12-29,2012-12-29,2012-12-23,2012-12-29,Sun ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,1,2014,2012-12-29,2014-01-04,Y,Wk.53 - 13,2012-12-29 00:00:00,2012-12-31 00:00:00,2012W53 ,2012W53 ,12/29/13 - 12/31/13,12/29 - 12/31,2012,N,2012-12-29,2011-12-29,2012-09-29,2012-06-29,2012-11-29,2012-10-29,2012-12-22,2012-12-15,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-15,2012-01-01,2012-04-01,2012-06-01,2012-06-09,0,-2,-5,-24,-165,0,-2,-6,-24,-24,41439,166,76,15,7,24,5919,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-15,15-Jun-2012,Jun 15th 2012,Sat 06-15-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-09,2012-06-10,2012-06-15,Sat ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,24,2012,2012-06-09,2012-06-15,N,Wk.24 - 13,2012-06-09 00:00:00,2012-06-15 00:00:00,2012W24 ,2012W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2012,N,2012-06-15,2011-06-15,2012-03-15,2012-12-15,2012-05-15,2012-04-15,2012-06-08,2012-06-01,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-07,2012-01-01,2012-01-01,2012-02-01,2012-02-03,0,-3,-9,-42,-293,0,-3,-10,-42,-42,41311,38,38,7,5,6,5901,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-09,07-Feb-2012,Feb 7th 2012,Thu 02-07-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-03,2012-02-04,2012-02-07,Thu ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,6,2012,2012-02-03,2012-02-09,N,Wk.06 - 13,2012-02-03 00:00:00,2012-02-09 00:00:00,2012W06 ,2012W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2012,N,2012-02-07,2011-02-07,2012-11-07,2012-08-07,2012-01-07,2012-12-07,2012-01-31,2012-01-24,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-11-15,2012-01-01,2012-10-01,2012-11-01,2012-11-10,0,0,0,-2,-12,0,0,-1,-2,-2,41592,319,46,15,6,46,5941,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-16,15-Nov-2012,Nov 15th 2012,Fri 11-15-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-10,2012-11-11,2012-11-15,Fri ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,46,2012,2012-11-10,2012-11-16,N,Wk.46 - 13,2012-11-10 00:00:00,2012-11-16 00:00:00,2012W46 ,2012W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2012,N,2012-11-15,2011-11-15,2012-08-15,2012-05-15,2012-10-15,2012-09-15,2012-11-08,2012-11-01,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-02-11,2012-01-01,2012-01-01,2012-02-01,2012-02-10,0,-3,-9,-41,-289,0,-3,-10,-41,-41,41315,42,42,11,2,7,5902,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-16,11-Feb-2012,Feb 11th 2012,Mon 02-11-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-10,2012-02-11,2012-02-11,Mon ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,7,2012,2012-02-10,2012-02-16,N,Wk.07 - 13,2012-02-10 00:00:00,2012-02-16 00:00:00,2012W07 ,2012W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2012,N,2012-02-11,2011-02-11,2012-11-11,2012-08-11,2012-01-11,2012-12-11,2012-02-04,2012-01-28,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-19,2012-01-01,2012-04-01,2012-06-01,2012-06-16,0,-2,-5,-23,-161,0,-2,-6,-23,-23,41443,170,80,19,4,25,5920,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-22,19-Jun-2012,Jun 19th 2012,Wed 06-19-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-16,2012-06-17,2012-06-19,Wed ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,25,2012,2012-06-16,2012-06-22,N,Wk.25 - 13,2012-06-16 00:00:00,2012-06-22 00:00:00,2012W25 ,2012W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2012,N,2012-06-19,2011-06-19,2012-03-19,2012-12-19,2012-05-19,2012-04-19,2012-06-12,2012-06-05,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-17,2012-01-01,2012-04-01,2012-06-01,2012-06-16,0,-2,-5,-23,-163,0,-2,-6,-23,-23,41441,168,78,17,2,25,5920,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-22,17-Jun-2012,Jun 17th 2012,Mon 06-17-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-16,2012-06-17,2012-06-17,Mon ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,25,2012,2012-06-16,2012-06-22,N,Wk.25 - 13,2012-06-16 00:00:00,2012-06-22 00:00:00,2012W25 ,2012W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2012,N,2012-06-17,2011-06-17,2012-03-17,2012-12-17,2012-05-17,2012-04-17,2012-06-10,2012-06-03,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-05-10,2012-01-01,2012-04-01,2012-05-01,2012-05-05,0,-2,-6,-29,-201,0,-2,-7,-29,-29,41403,130,40,10,6,19,5914,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-11,10-May-2012,May 10th 2012,Fri 05-10-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-05,2012-05-06,2012-05-10,Fri ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,19,2012,2012-05-05,2012-05-11,N,Wk.19 - 13,2012-05-05 00:00:00,2012-05-11 00:00:00,2012W19 ,2012W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2012,N,2012-05-10,2011-05-10,2012-02-10,2012-11-10,2012-04-10,2012-03-10,2012-05-03,2012-04-26,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-06-16,2012-01-01,2012-04-01,2012-06-01,2012-06-16,0,-2,-5,-23,-164,0,-2,-6,-23,-24,41440,167,77,16,1,25,5920,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-22,16-Jun-2012,Jun 16th 2012,Sun 06-16-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-16,2012-06-10,2012-06-16,Sun ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,25,2012,2012-06-16,2012-06-22,Y,Wk.25 - 13,2012-06-16 00:00:00,2012-06-22 00:00:00,2012W25 ,2012W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2012,N,2012-06-16,2011-06-16,2012-03-16,2012-12-16,2012-05-16,2012-04-16,2012-06-09,2012-06-02,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-07-28,2012-01-01,2012-07-01,2012-07-01,2012-07-28,0,-1,-4,-17,-122,0,-1,-4,-17,-18,41482,209,28,28,1,31,5926,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-08-03,28-Jul-2012,Jul 28th 2012,Sun 07-28-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-07-28,2012-07-22,2012-07-28,Sun ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,31,2012,2012-07-28,2012-08-03,Y,Wk.31 - 13,2012-07-28 00:00:00,2012-08-03 00:00:00,2012W31 ,2012W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2012,N,2012-07-28,2011-07-28,2012-04-28,2012-01-28,2012-06-28,2012-05-28,2012-07-21,2012-07-14,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-03-03,2012-01-01,2012-01-01,2012-03-01,2012-03-03,0,-3,-8,-38,-269,0,-3,-9,-38,-39,41335,62,62,3,1,10,5905,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-09,03-Mar-2012,Mar 3rd 2012,Sun 03-03-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-03,2012-02-25,2012-03-03,Sun ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,10,2012,2012-03-03,2012-03-09,Y,Wk.10 - 13,2012-03-03 00:00:00,2012-03-09 00:00:00,2012W10 ,2012W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2012,N,2012-03-03,2011-03-03,2012-12-03,2012-09-03,2012-02-03,2012-01-03,2012-02-24,2012-02-17,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2012-01-19,2012-01-01,2012-01-01,2012-01-01,2012-01-13,0,-3,-10,-45,-312,0,-3,-11,-45,-45,41292,19,19,19,7,3,5898,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-19,19-Jan-2012,Jan 19th 2012,Sat 01-19-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-13,2012-01-14,2012-01-19,Sat ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,3,2012,2012-01-13,2012-01-19,N,Wk.03 - 13,2012-01-13 00:00:00,2012-01-19 00:00:00,2012W03 ,2012W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2012,N,2012-01-19,2011-01-19,2012-10-19,2012-07-19,2012-12-19,2012-11-19,2012-01-12,2012-01-05,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X +2013-08-16,2013-01-01,2013-07-01,2013-08-01,2013-08-11,0,-1,-3,-15,-103,0,-1,-4,-15,-15,41501,228,47,16,6,33,5928,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-17,16-Aug-2013,Aug 16th 2013,Fri 08-16-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-11,2013-08-12,2013-08-16,Fri ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,33,2013,2013-08-11,2013-08-17,N,Wk.33 - 13,2013-08-11 00:00:00,2013-08-17 00:00:00,2013W33 ,2013W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2013,N,2012-08-16,2011-08-16,2013-05-16,2013-02-16,2013-07-16,2013-06-16,2013-08-09,2013-08-02,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-03,2013-01-01,2013-01-01,2013-01-01,2013-01-01,0,-3,-10,-47,-328,0,-3,-11,-47,-47,41276,3,3,3,5,1,5896,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-05,03-Jan-2013,Jan 3rd 2013,Thu 01-03-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2013-01-03,Thu ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,1,2013,2012-12-30,2013-01-05,N,Wk.01 - 13,2013-01-01 00:00:00,2013-01-05 00:00:00,2013W01 ,2013W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2013,N,2012-01-03,2011-01-03,2012-10-03,2012-07-03,2012-12-03,2012-11-03,2012-12-27,2012-12-20,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-10,2013-01-01,2013-04-01,2013-04-01,2013-04-07,0,-2,-7,-33,-231,0,-2,-8,-33,-33,41373,100,10,10,4,15,5910,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-13,10-Apr-2013,Apr 10th 2013,Wed 04-10-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-07,2013-04-08,2013-04-10,Wed ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,15,2013,2013-04-07,2013-04-13,N,Wk.15 - 13,2013-04-07 00:00:00,2013-04-13 00:00:00,2013W15 ,2013W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2013,N,2012-04-10,2011-04-10,2013-01-10,2012-10-10,2013-03-10,2013-02-10,2013-04-03,2013-03-27,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-12,2013-01-01,2013-04-01,2013-06-01,2013-06-09,0,-2,-5,-24,-168,0,-2,-6,-24,-24,41436,163,73,12,4,24,5919,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-15,12-Jun-2013,Jun 12th 2013,Wed 06-12-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-09,2013-06-10,2013-06-12,Wed ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,24,2013,2013-06-09,2013-06-15,N,Wk.24 - 13,2013-06-09 00:00:00,2013-06-15 00:00:00,2013W24 ,2013W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2013,N,2012-06-12,2011-06-12,2013-03-12,2012-12-12,2013-05-12,2013-04-12,2013-06-05,2013-05-29,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-27,2013-01-01,2013-04-01,2013-04-01,2013-04-21,0,-2,-7,-31,-214,0,-2,-8,-31,-31,41390,117,27,27,7,17,5912,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-27,27-Apr-2013,Apr 27th 2013,Sat 04-27-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-21,2013-04-22,2013-04-27,Sat ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,17,2013,2013-04-21,2013-04-27,N,Wk.17 - 13,2013-04-21 00:00:00,2013-04-27 00:00:00,2013W17 ,2013W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2013,N,2012-04-27,2011-04-27,2013-01-27,2012-10-27,2013-03-27,2013-02-27,2013-04-20,2013-04-13,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-19,2013-01-01,2013-07-01,2013-09-01,2013-09-15,0,-1,-2,-10,-69,0,-1,-3,-10,-10,41535,262,81,19,5,38,5933,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-21,19-Sep-2013,Sep 19th 2013,Thu 09-19-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-15,2013-09-16,2013-09-19,Thu ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,38,2013,2013-09-15,2013-09-21,N,Wk.38 - 13,2013-09-15 00:00:00,2013-09-21 00:00:00,2013W38 ,2013W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2013,N,2012-09-19,2011-09-19,2013-06-19,2013-03-19,2013-08-19,2013-07-19,2013-09-12,2013-09-05,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-07,2013-01-01,2013-01-01,2013-03-01,2013-03-03,0,-3,-8,-38,-265,0,-3,-9,-38,-38,41339,66,66,7,5,10,5905,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-09,07-Mar-2013,Mar 7th 2013,Thu 03-07-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-03,2013-03-04,2013-03-07,Thu ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,10,2013,2013-03-03,2013-03-09,N,Wk.10 - 13,2013-03-03 00:00:00,2013-03-09 00:00:00,2013W10 ,2013W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2013,N,2012-03-07,2011-03-07,2012-12-07,2012-09-07,2013-02-07,2013-01-07,2013-02-28,2013-02-21,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-28,2013-01-01,2013-01-01,2013-03-01,2013-03-24,0,-3,-8,-35,-244,0,-3,-9,-35,-35,41360,87,87,28,5,13,5908,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-30,28-Mar-2013,Mar 28th 2013,Thu 03-28-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-24,2013-03-25,2013-03-28,Thu ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,13,2013,2013-03-24,2013-03-30,N,Wk.13 - 13,2013-03-24 00:00:00,2013-03-30 00:00:00,2013W13 ,2013W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2013,N,2012-03-28,2011-03-28,2012-12-28,2012-09-28,2013-02-28,2013-01-28,2013-03-21,2013-03-14,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-23,2013-01-01,2013-10-01,2013-11-01,2013-11-17,0,0,0,-1,-4,0,0,-1,-1,-1,41600,327,54,23,7,47,5942,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-23,23-Nov-2013,Nov 23rd 2013,Sat 11-23-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-17,2013-11-18,2013-11-23,Sat ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,47,2013,2013-11-17,2013-11-23,N,Wk.47 - 13,2013-11-17 00:00:00,2013-11-23 00:00:00,2013W47 ,2013W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2013,N,2012-11-23,2011-11-23,2013-08-23,2013-05-23,2013-10-23,2013-09-23,2013-11-16,2013-11-09,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-09,2013-01-01,2013-01-01,2013-03-01,2013-03-03,0,-3,-8,-38,-263,0,-3,-9,-38,-38,41341,68,68,9,7,10,5905,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-09,09-Mar-2013,Mar 9th 2013,Sat 03-09-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-03,2013-03-04,2013-03-09,Sat ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,10,2013,2013-03-03,2013-03-09,N,Wk.10 - 13,2013-03-03 00:00:00,2013-03-09 00:00:00,2013W10 ,2013W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2013,N,2012-03-09,2011-03-09,2012-12-09,2012-09-09,2013-02-09,2013-01-09,2013-03-02,2013-02-23,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-21,2013-01-01,2013-10-01,2013-11-01,2013-11-17,0,0,0,-1,-6,0,0,-1,-1,-1,41598,325,52,21,5,47,5942,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-23,21-Nov-2013,Nov 21st 2013,Thu 11-21-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-17,2013-11-18,2013-11-21,Thu ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,47,2013,2013-11-17,2013-11-23,N,Wk.47 - 13,2013-11-17 00:00:00,2013-11-23 00:00:00,2013W47 ,2013W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2013,N,2012-11-21,2011-11-21,2013-08-21,2013-05-21,2013-10-21,2013-09-21,2013-11-14,2013-11-07,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-26,2013-01-01,2013-01-01,2013-03-01,2013-03-24,0,-3,-8,-35,-246,0,-3,-9,-35,-35,41358,85,85,26,3,13,5908,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-30,26-Mar-2013,Mar 26th 2013,Tue 03-26-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-24,2013-03-25,2013-03-26,Tue ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,13,2013,2013-03-24,2013-03-30,N,Wk.13 - 13,2013-03-24 00:00:00,2013-03-30 00:00:00,2013W13 ,2013W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2013,N,2012-03-26,2011-03-26,2012-12-26,2012-09-26,2013-02-26,2013-01-26,2013-03-19,2013-03-12,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-24,2013-01-01,2013-01-01,2013-01-01,2013-01-20,0,-3,-10,-44,-307,0,-3,-11,-44,-44,41297,24,24,24,5,4,5899,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-26,24-Jan-2013,Jan 24th 2013,Thu 01-24-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-20,2013-01-21,2013-01-24,Thu ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,4,2013,2013-01-20,2013-01-26,N,Wk.04 - 13,2013-01-20 00:00:00,2013-01-26 00:00:00,2013W04 ,2013W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2013,N,2012-01-24,2011-01-24,2012-10-24,2012-07-24,2012-12-24,2012-11-24,2013-01-17,2013-01-10,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-01,2013-01-01,2013-01-01,2013-01-01,2013-01-01,0,-3,-10,-47,-330,0,-3,-11,-47,-47,41274,1,1,1,3,1,5896,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-05,01-Jan-2013,Jan 1st 2013,Tue 01-01-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2013-01-01,Tue ,2013M01,Jan-2013,Y,2013M01 ,Y,Year 2013 - Quarter 01,2013Q01 ,Y,1,2013,2012-12-30,2013-01-05,Y,Wk.01 - 13,2013-01-01 00:00:00,2013-01-05 00:00:00,2013W01 ,2013W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2013,Y,2012-01-01,2011-01-01,2012-10-01,2012-07-01,2012-12-01,2012-11-01,2012-12-25,2012-12-18,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-29,2013-01-01,2013-04-01,2013-04-01,2013-04-28,0,-2,-7,-30,-212,0,-2,-7,-30,-30,41392,119,29,29,2,18,5913,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-05-04,29-Apr-2013,Apr 29th 2013,Mon 04-29-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-04-28,2013-04-28,2013-04-29,2013-04-29,Mon ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,18,2013,2013-04-28,2013-05-04,N,Wk.18 - 13,2013-04-28 00:00:00,2013-05-04 00:00:00,2013W18 ,2013W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2013,N,2012-04-29,2011-04-29,2013-01-29,2012-10-29,2013-03-29,2013-02-28,2013-04-22,2013-04-15,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-11,2013-01-01,2013-04-01,2013-05-01,2013-05-05,0,-2,-6,-29,-200,0,-2,-7,-29,-29,41404,131,41,11,7,19,5914,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-11,11-May-2013,May 11th 2013,Sat 05-11-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-05,2013-05-06,2013-05-11,Sat ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,19,2013,2013-05-05,2013-05-11,N,Wk.19 - 13,2013-05-05 00:00:00,2013-05-11 00:00:00,2013W19 ,2013W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2013,N,2012-05-11,2011-05-11,2013-02-11,2012-11-11,2013-04-11,2013-03-11,2013-05-04,2013-04-27,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-01,2013-01-01,2013-10-01,2013-10-01,2013-09-29,0,0,-1,-8,-57,0,0,-2,-8,-8,41547,274,1,1,3,40,5935,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-05,01-Oct-2013,Oct 1st 2013,Tue 10-01-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-09-29,2013-09-30,2013-10-01,Tue ,2013M10,Oct-2013,Y,2013M10 ,Y,Year 2013 - Quarter 04,2013Q04 ,Y,40,2013,2013-09-29,2013-10-05,N,Wk.40 - 13,2013-09-29 00:00:00,2013-10-05 00:00:00,2013W40 ,2013W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2013,N,2012-10-01,2011-10-01,2013-07-01,2013-04-01,2013-09-01,2013-08-01,2013-09-24,2013-09-17,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-05,2013-01-01,2013-10-01,2013-12-01,2013-12-01,0,0,1,1,8,0,0,0,1,1,41612,339,66,5,5,49,5944,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-07,05-Dec-2013,Dec 5th 2013,Thu 12-05-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-01,2013-12-02,2013-12-05,Thu ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,49,2013,2013-12-01,2013-12-07,N,Wk.49 - 13,2013-12-01 00:00:00,2013-12-07 00:00:00,2013W49 ,2013W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2013,N,2012-12-05,2011-12-05,2013-09-05,2013-06-05,2013-11-05,2013-10-05,2013-11-28,2013-11-21,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-05,2013-01-01,2013-01-01,2013-03-01,2013-03-03,0,-3,-8,-38,-267,0,-3,-9,-38,-38,41337,64,64,5,3,10,5905,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-09,05-Mar-2013,Mar 5th 2013,Tue 03-05-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-03,2013-03-04,2013-03-05,Tue ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,10,2013,2013-03-03,2013-03-09,N,Wk.10 - 13,2013-03-03 00:00:00,2013-03-09 00:00:00,2013W10 ,2013W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2013,N,2012-03-05,2011-03-05,2012-12-05,2012-09-05,2013-02-05,2013-01-05,2013-02-26,2013-02-19,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-03,2013-01-01,2013-10-01,2013-10-01,2013-09-29,0,0,-1,-8,-55,0,0,-2,-8,-8,41549,276,3,3,5,40,5935,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-05,03-Oct-2013,Oct 3rd 2013,Thu 10-03-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-09-29,2013-09-30,2013-10-03,Thu ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,40,2013,2013-09-29,2013-10-05,N,Wk.40 - 13,2013-09-29 00:00:00,2013-10-05 00:00:00,2013W40 ,2013W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2013,N,2012-10-03,2011-10-03,2013-07-03,2013-04-03,2013-09-03,2013-08-03,2013-09-26,2013-09-19,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-22,2013-01-01,2013-01-01,2013-01-01,2013-01-20,0,-3,-10,-44,-309,0,-3,-11,-44,-44,41295,22,22,22,3,4,5899,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-26,22-Jan-2013,Jan 22nd 2013,Tue 01-22-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-20,2013-01-21,2013-01-22,Tue ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,4,2013,2013-01-20,2013-01-26,N,Wk.04 - 13,2013-01-20 00:00:00,2013-01-26 00:00:00,2013W04 ,2013W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2013,N,2012-01-22,2011-01-22,2012-10-22,2012-07-22,2012-12-22,2012-11-22,2013-01-15,2013-01-08,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-26,2013-01-01,2013-10-01,2013-12-01,2013-12-22,0,0,1,4,29,0,0,0,4,4,41633,360,87,26,5,52,5947,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-28,26-Dec-2013,Dec 26th 2013,Thu 12-26-13,0,0,0,0,2013-12-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-22,2013-12-23,2013-12-26,Thu ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,52,2013,2013-12-22,2013-12-28,N,Wk.52 - 13,2013-12-22 00:00:00,2013-12-28 00:00:00,2013W52 ,2013W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2013,N,2012-12-26,2011-12-26,2013-09-26,2013-06-26,2013-11-26,2013-10-26,2013-12-19,2013-12-12,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-17,2013-01-01,2013-07-01,2013-09-01,2013-09-15,0,-1,-2,-10,-71,0,-1,-3,-10,-10,41533,260,79,17,3,38,5933,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-21,17-Sep-2013,Sep 17th 2013,Tue 09-17-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-15,2013-09-16,2013-09-17,Tue ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,38,2013,2013-09-15,2013-09-21,N,Wk.38 - 13,2013-09-15 00:00:00,2013-09-21 00:00:00,2013W38 ,2013W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2013,N,2012-09-17,2011-09-17,2013-06-17,2013-03-17,2013-08-17,2013-07-17,2013-09-10,2013-09-03,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-20,2013-01-01,2013-10-01,2013-10-01,2013-10-20,0,0,-1,-5,-38,0,0,-2,-5,-6,41566,293,20,20,1,43,5938,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-26,20-Oct-2013,Oct 20th 2013,Sun 10-20-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-20,2013-10-14,2013-10-20,Sun ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,43,2013,2013-10-20,2013-10-26,Y,Wk.43 - 13,2013-10-20 00:00:00,2013-10-26 00:00:00,2013W43 ,2013W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2013,N,2012-10-20,2011-10-20,2013-07-20,2013-04-20,2013-09-20,2013-08-20,2013-10-13,2013-10-06,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-25,2013-01-01,2013-10-01,2013-11-01,2013-11-24,0,0,0,0,-2,0,0,0,0,0,41602,329,56,25,2,48,5943,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-30,25-Nov-2013,Nov 25th 2013,Mon 11-25-13,1,1,1,1,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-11-24,2013-11-24,2013-11-25,2013-11-25,Mon ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,48,2013,2013-11-24,2013-11-30,N,Wk.48 - 13,2013-11-24 00:00:00,2013-11-30 00:00:00,2013W48 ,2013W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2013,N,2012-11-25,2011-11-25,2013-08-25,2013-05-25,2013-10-25,2013-09-25,2013-11-18,2013-11-11,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-26,2013-01-01,2013-01-01,2013-01-01,2013-01-20,0,-3,-10,-44,-305,0,-3,-11,-44,-44,41299,26,26,26,7,4,5899,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-26,26-Jan-2013,Jan 26th 2013,Sat 01-26-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-20,2013-01-21,2013-01-26,Sat ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,4,2013,2013-01-20,2013-01-26,N,Wk.04 - 13,2013-01-20 00:00:00,2013-01-26 00:00:00,2013W04 ,2013W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2013,N,2012-01-26,2011-01-26,2012-10-26,2012-07-26,2012-12-26,2012-11-26,2013-01-19,2013-01-12,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-24,2013-01-01,2013-10-01,2013-12-01,2013-12-22,0,0,1,4,27,0,0,0,4,4,41631,358,85,24,3,52,5947,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-28,24-Dec-2013,Dec 24th 2013,Tue 12-24-13,0,0,0,0,2013-12-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-22,2013-12-23,2013-12-24,Tue ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,52,2013,2013-12-22,2013-12-28,N,Wk.52 - 13,2013-12-22 00:00:00,2013-12-28 00:00:00,2013W52 ,2013W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2013,N,2012-12-24,2011-12-24,2013-09-24,2013-06-24,2013-11-24,2013-10-24,2013-12-17,2013-12-10,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-04,2013-01-01,2013-01-01,2013-02-01,2013-02-03,0,-3,-9,-42,-296,0,-3,-10,-42,-42,41308,35,35,4,2,6,5901,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-09,04-Feb-2013,Feb 4th 2013,Mon 02-04-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-03,2013-02-04,2013-02-04,Mon ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,6,2013,2013-02-03,2013-02-09,N,Wk.06 - 13,2013-02-03 00:00:00,2013-02-09 00:00:00,2013W06 ,2013W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2013,N,2012-02-04,2011-02-04,2012-11-04,2012-08-04,2013-01-04,2012-12-04,2013-01-28,2013-01-21,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-30,2013-01-01,2013-04-01,2013-05-01,2013-05-26,0,-2,-6,-26,-181,0,-2,-6,-26,-26,41423,150,60,30,5,22,5917,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-06-01,30-May-2013,May 30th 2013,Thu 05-30-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-05-26,2013-05-26,2013-05-27,2013-05-30,Thu ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,22,2013,2013-05-26,2013-06-01,N,Wk.22 - 13,2013-05-26 00:00:00,2013-06-01 00:00:00,2013W22 ,2013W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2013,N,2012-05-30,2011-05-30,2013-02-28,2012-11-30,2013-04-30,2013-03-30,2013-05-23,2013-05-16,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-12,2013-01-01,2013-04-01,2013-04-01,2013-04-07,0,-2,-7,-33,-229,0,-2,-8,-33,-33,41375,102,12,12,6,15,5910,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-13,12-Apr-2013,Apr 12th 2013,Fri 04-12-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-07,2013-04-08,2013-04-12,Fri ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,15,2013,2013-04-07,2013-04-13,N,Wk.15 - 13,2013-04-07 00:00:00,2013-04-13 00:00:00,2013W15 ,2013W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2013,N,2012-04-12,2011-04-12,2013-01-12,2012-10-12,2013-03-12,2013-02-12,2013-04-05,2013-03-29,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-08,2013-01-01,2013-04-01,2013-04-01,2013-04-07,0,-2,-7,-33,-233,0,-2,-8,-33,-33,41371,98,8,8,2,15,5910,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-13,08-Apr-2013,Apr 8th 2013,Mon 04-08-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-07,2013-04-08,2013-04-08,Mon ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,15,2013,2013-04-07,2013-04-13,N,Wk.15 - 13,2013-04-07 00:00:00,2013-04-13 00:00:00,2013W15 ,2013W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2013,N,2012-04-08,2011-04-08,2013-01-08,2012-10-08,2013-03-08,2013-02-08,2013-04-01,2013-03-25,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-28,2013-01-01,2013-10-01,2013-12-01,2013-12-22,0,0,1,4,31,0,0,0,4,4,41635,362,89,28,7,52,5947,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-28,28-Dec-2013,Dec 28th 2013,Sat 12-28-13,0,0,0,0,2013-12-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-22,2013-12-23,2013-12-28,Sat ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,52,2013,2013-12-22,2013-12-28,N,Wk.52 - 13,2013-12-22 00:00:00,2013-12-28 00:00:00,2013W52 ,2013W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2013,N,2012-12-28,2011-12-28,2013-09-28,2013-06-28,2013-11-28,2013-10-28,2013-12-21,2013-12-14,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-03,2013-01-01,2013-10-01,2013-12-01,2013-12-01,0,0,1,1,6,0,0,0,1,1,41610,337,64,3,3,49,5944,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-07,03-Dec-2013,Dec 3rd 2013,Tue 12-03-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-01,2013-12-02,2013-12-03,Tue ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,49,2013,2013-12-01,2013-12-07,N,Wk.49 - 13,2013-12-01 00:00:00,2013-12-07 00:00:00,2013W49 ,2013W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2013,N,2012-12-03,2011-12-03,2013-09-03,2013-06-03,2013-11-03,2013-10-03,2013-11-26,2013-11-19,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-15,2013-01-01,2013-07-01,2013-07-01,2013-07-14,0,-1,-4,-19,-135,0,-1,-5,-19,-19,41469,196,15,15,2,29,5924,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-20,15-Jul-2013,Jul 15th 2013,Mon 07-15-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-14,2013-07-15,2013-07-15,Mon ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,29,2013,2013-07-14,2013-07-20,N,Wk.29 - 13,2013-07-14 00:00:00,2013-07-20 00:00:00,2013W29 ,2013W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2013,N,2012-07-15,2011-07-15,2013-04-15,2013-01-15,2013-06-15,2013-05-15,2013-07-08,2013-07-01,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-13,2013-01-01,2013-04-01,2013-05-01,2013-05-12,0,-2,-6,-28,-198,0,-2,-7,-28,-28,41406,133,43,13,2,20,5915,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-18,13-May-2013,May 13th 2013,Mon 05-13-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-12,2013-05-13,2013-05-13,Mon ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,20,2013,2013-05-12,2013-05-18,N,Wk.20 - 13,2013-05-12 00:00:00,2013-05-18 00:00:00,2013W20 ,2013W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2013,N,2012-05-13,2011-05-13,2013-02-13,2012-11-13,2013-04-13,2013-03-13,2013-05-06,2013-04-29,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-30,2013-01-01,2013-01-01,2013-03-01,2013-03-24,0,-3,-8,-35,-242,0,-3,-9,-35,-35,41362,89,89,30,7,13,5908,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-30,30-Mar-2013,Mar 30th 2013,Sat 03-30-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-24,2013-03-25,2013-03-30,Sat ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,13,2013,2013-03-24,2013-03-30,N,Wk.13 - 13,2013-03-24 00:00:00,2013-03-30 00:00:00,2013W13 ,2013W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2013,N,2012-03-30,2011-03-30,2012-12-30,2012-09-30,2013-02-28,2013-01-30,2013-03-23,2013-03-16,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-09,2013-01-01,2013-10-01,2013-12-01,2013-12-08,0,0,1,2,12,0,0,0,2,2,41616,343,70,9,2,50,5945,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-14,09-Dec-2013,Dec 9th 2013,Mon 12-09-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-08,2013-12-09,2013-12-09,Mon ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,50,2013,2013-12-08,2013-12-14,N,Wk.50 - 13,2013-12-08 00:00:00,2013-12-14 00:00:00,2013W50 ,2013W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2013,N,2012-12-09,2011-12-09,2013-09-09,2013-06-09,2013-11-09,2013-10-09,2013-12-02,2013-11-25,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-25,2013-01-01,2013-01-01,2013-02-01,2013-02-24,0,-3,-9,-39,-275,0,-3,-9,-39,-39,41329,56,56,25,2,9,5904,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-03-02,25-Feb-2013,Feb 25th 2013,Mon 02-25-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-02-24,2013-02-24,2013-02-25,2013-02-25,Mon ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,9,2013,2013-02-24,2013-03-02,N,Wk.09 - 13,2013-02-24 00:00:00,2013-03-02 00:00:00,2013W09 ,2013W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2013,N,2012-02-25,2011-02-25,2012-11-25,2012-08-25,2013-01-25,2012-12-25,2013-02-18,2013-02-11,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-04,2013-01-01,2013-10-01,2013-11-01,2013-11-03,0,0,0,-3,-23,0,0,-1,-3,-3,41581,308,35,4,2,45,5940,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-09,04-Nov-2013,Nov 4th 2013,Mon 11-04-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-03,2013-11-04,2013-11-04,Mon ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,45,2013,2013-11-03,2013-11-09,N,Wk.45 - 13,2013-11-03 00:00:00,2013-11-09 00:00:00,2013W45 ,2013W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2013,N,2012-11-04,2011-11-04,2013-08-04,2013-05-04,2013-10-04,2013-09-04,2013-10-28,2013-10-21,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-08,2013-01-01,2013-10-01,2013-11-01,2013-11-03,0,0,0,-3,-19,0,0,-1,-3,-3,41585,312,39,8,6,45,5940,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-09,08-Nov-2013,Nov 8th 2013,Fri 11-08-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-03,2013-11-04,2013-11-08,Fri ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,45,2013,2013-11-03,2013-11-09,N,Wk.45 - 13,2013-11-03 00:00:00,2013-11-09 00:00:00,2013W45 ,2013W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2013,N,2012-11-08,2011-11-08,2013-08-08,2013-05-08,2013-10-08,2013-09-08,2013-11-01,2013-10-25,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-22,2013-01-01,2013-07-01,2013-08-01,2013-08-18,0,-1,-3,-14,-97,0,-1,-4,-14,-14,41507,234,53,22,5,34,5929,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-24,22-Aug-2013,Aug 22nd 2013,Thu 08-22-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-18,2013-08-19,2013-08-22,Thu ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,34,2013,2013-08-18,2013-08-24,N,Wk.34 - 13,2013-08-18 00:00:00,2013-08-24 00:00:00,2013W34 ,2013W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2013,N,2012-08-22,2011-08-22,2013-05-22,2013-02-22,2013-07-22,2013-06-22,2013-08-15,2013-08-08,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-18,2013-01-01,2013-04-01,2013-06-01,2013-06-16,0,-2,-5,-23,-162,0,-2,-6,-23,-23,41442,169,79,18,3,25,5920,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-22,18-Jun-2013,Jun 18th 2013,Tue 06-18-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-16,2013-06-17,2013-06-18,Tue ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,25,2013,2013-06-16,2013-06-22,N,Wk.25 - 13,2013-06-16 00:00:00,2013-06-22 00:00:00,2013W25 ,2013W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2013,N,2012-06-18,2011-06-18,2013-03-18,2012-12-18,2013-05-18,2013-04-18,2013-06-11,2013-06-04,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-19,2013-01-01,2013-07-01,2013-07-01,2013-07-14,0,-1,-4,-19,-131,0,-1,-5,-19,-19,41473,200,19,19,6,29,5924,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-20,19-Jul-2013,Jul 19th 2013,Fri 07-19-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-14,2013-07-15,2013-07-19,Fri ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,29,2013,2013-07-14,2013-07-20,N,Wk.29 - 13,2013-07-14 00:00:00,2013-07-20 00:00:00,2013W29 ,2013W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2013,N,2012-07-19,2011-07-19,2013-04-19,2013-01-19,2013-06-19,2013-05-19,2013-07-12,2013-07-05,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-20,2013-01-01,2013-07-01,2013-08-01,2013-08-18,0,-1,-3,-14,-99,0,-1,-4,-14,-14,41505,232,51,20,3,34,5929,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-24,20-Aug-2013,Aug 20th 2013,Tue 08-20-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-18,2013-08-19,2013-08-20,Tue ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,34,2013,2013-08-18,2013-08-24,N,Wk.34 - 13,2013-08-18 00:00:00,2013-08-24 00:00:00,2013W34 ,2013W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2013,N,2012-08-20,2011-08-20,2013-05-20,2013-02-20,2013-07-20,2013-06-20,2013-08-13,2013-08-06,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-24,2013-01-01,2013-07-01,2013-08-01,2013-08-18,0,-1,-3,-14,-95,0,-1,-4,-14,-14,41509,236,55,24,7,34,5929,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-24,24-Aug-2013,Aug 24th 2013,Sat 08-24-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-18,2013-08-19,2013-08-24,Sat ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,34,2013,2013-08-18,2013-08-24,N,Wk.34 - 13,2013-08-18 00:00:00,2013-08-24 00:00:00,2013W34 ,2013W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2013,N,2012-08-24,2011-08-24,2013-05-24,2013-02-24,2013-07-24,2013-06-24,2013-08-17,2013-08-10,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-13,2013-01-01,2013-07-01,2013-07-01,2013-07-07,0,-1,-4,-20,-137,0,-1,-5,-20,-20,41467,194,13,13,7,28,5923,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-13,13-Jul-2013,Jul 13th 2013,Sat 07-13-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-07,2013-07-08,2013-07-13,Sat ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,28,2013,2013-07-07,2013-07-13,N,Wk.28 - 13,2013-07-07 00:00:00,2013-07-13 00:00:00,2013W28 ,2013W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2013,N,2012-07-13,2011-07-13,2013-04-13,2013-01-13,2013-06-13,2013-05-13,2013-07-06,2013-06-29,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-06,2013-01-01,2013-10-01,2013-11-01,2013-11-03,0,0,0,-3,-21,0,0,-1,-3,-3,41583,310,37,6,4,45,5940,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-09,06-Nov-2013,Nov 6th 2013,Wed 11-06-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-03,2013-11-04,2013-11-06,Wed ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,45,2013,2013-11-03,2013-11-09,N,Wk.45 - 13,2013-11-03 00:00:00,2013-11-09 00:00:00,2013W45 ,2013W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2013,N,2012-11-06,2011-11-06,2013-08-06,2013-05-06,2013-10-06,2013-09-06,2013-10-30,2013-10-23,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-07,2013-01-01,2013-10-01,2013-12-01,2013-12-01,0,0,1,1,10,0,0,0,1,1,41614,341,68,7,7,49,5944,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-07,07-Dec-2013,Dec 7th 2013,Sat 12-07-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-01,2013-12-02,2013-12-07,Sat ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,49,2013,2013-12-01,2013-12-07,N,Wk.49 - 13,2013-12-01 00:00:00,2013-12-07 00:00:00,2013W49 ,2013W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2013,N,2012-12-07,2011-12-07,2013-09-07,2013-06-07,2013-11-07,2013-10-07,2013-11-30,2013-11-23,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-04,2013-01-01,2013-07-01,2013-07-01,2013-06-30,0,-1,-4,-21,-146,0,-1,-5,-21,-21,41458,185,4,4,5,27,5922,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-06,04-Jul-2013,Jul 4th 2013,Thu 07-04-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-06-30,2013-07-01,2013-07-04,Thu ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,27,2013,2013-06-30,2013-07-06,N,Wk.27 - 13,2013-06-30 00:00:00,2013-07-06 00:00:00,2013W27 ,2013W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2013,N,2012-07-04,2011-07-04,2013-04-04,2013-01-04,2013-06-04,2013-05-04,2013-06-27,2013-06-20,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-07,2013-01-01,2013-10-01,2013-10-01,2013-10-06,0,0,-1,-7,-51,0,0,-2,-7,-7,41553,280,7,7,2,41,5936,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-12,07-Oct-2013,Oct 7th 2013,Mon 10-07-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-06,2013-10-07,2013-10-07,Mon ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,41,2013,2013-10-06,2013-10-12,N,Wk.41 - 13,2013-10-06 00:00:00,2013-10-12 00:00:00,2013W41 ,2013W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2013,N,2012-10-07,2011-10-07,2013-07-07,2013-04-07,2013-09-07,2013-08-07,2013-09-30,2013-09-23,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-10,2013-01-01,2013-10-01,2013-11-01,2013-11-10,0,0,0,-2,-17,0,0,-1,-2,-3,41587,314,41,10,1,46,5941,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-16,10-Nov-2013,Nov 10th 2013,Sun 11-10-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-10,2013-11-04,2013-11-10,Sun ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,46,2013,2013-11-10,2013-11-16,Y,Wk.46 - 13,2013-11-10 00:00:00,2013-11-16 00:00:00,2013W46 ,2013W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2013,N,2012-11-10,2011-11-10,2013-08-10,2013-05-10,2013-10-10,2013-09-10,2013-11-03,2013-10-27,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-07,2013-01-01,2013-07-01,2013-08-01,2013-08-04,0,-1,-3,-16,-112,0,-1,-4,-16,-16,41492,219,38,7,4,32,5927,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-10,07-Aug-2013,Aug 7th 2013,Wed 08-07-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-04,2013-08-05,2013-08-07,Wed ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,32,2013,2013-08-04,2013-08-10,N,Wk.32 - 13,2013-08-04 00:00:00,2013-08-10 00:00:00,2013W32 ,2013W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2013,N,2012-08-07,2011-08-07,2013-05-07,2013-02-07,2013-07-07,2013-06-07,2013-07-31,2013-07-24,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-25,2013-01-01,2013-07-01,2013-09-01,2013-09-22,0,-1,-2,-9,-63,0,-1,-3,-9,-9,41541,268,87,25,4,39,5934,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-28,25-Sep-2013,Sep 25th 2013,Wed 09-25-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-22,2013-09-23,2013-09-25,Wed ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,39,2013,2013-09-22,2013-09-28,N,Wk.39 - 13,2013-09-22 00:00:00,2013-09-28 00:00:00,2013W39 ,2013W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2013,N,2012-09-25,2011-09-25,2013-06-25,2013-03-25,2013-08-25,2013-07-25,2013-09-18,2013-09-11,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-05,2013-01-01,2013-10-01,2013-10-01,2013-09-29,0,0,-1,-8,-53,0,0,-2,-8,-8,41551,278,5,5,7,40,5935,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-05,05-Oct-2013,Oct 5th 2013,Sat 10-05-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-09-29,2013-09-30,2013-10-05,Sat ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,40,2013,2013-09-29,2013-10-05,N,Wk.40 - 13,2013-09-29 00:00:00,2013-10-05 00:00:00,2013W40 ,2013W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2013,N,2012-10-05,2011-10-05,2013-07-05,2013-04-05,2013-09-05,2013-08-05,2013-09-28,2013-09-21,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-02,2013-01-01,2013-07-01,2013-09-01,2013-09-01,0,-1,-2,-12,-86,0,-1,-3,-12,-12,41518,245,64,2,2,36,5931,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-07,02-Sep-2013,Sep 2nd 2013,Mon 09-02-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-01,2013-09-02,2013-09-02,Mon ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,36,2013,2013-09-01,2013-09-07,N,Wk.36 - 13,2013-09-01 00:00:00,2013-09-07 00:00:00,2013W36 ,2013W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2013,N,2012-09-02,2011-09-02,2013-06-02,2013-03-02,2013-08-02,2013-07-02,2013-08-26,2013-08-19,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-15,2013-01-01,2013-04-01,2013-05-01,2013-05-12,0,-2,-6,-28,-196,0,-2,-7,-28,-28,41408,135,45,15,4,20,5915,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-18,15-May-2013,May 15th 2013,Wed 05-15-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-12,2013-05-13,2013-05-15,Wed ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,20,2013,2013-05-12,2013-05-18,N,Wk.20 - 13,2013-05-12 00:00:00,2013-05-18 00:00:00,2013W20 ,2013W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2013,N,2012-05-15,2011-05-15,2013-02-15,2012-11-15,2013-04-15,2013-03-15,2013-05-08,2013-05-01,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-10,2013-01-01,2013-01-01,2013-02-01,2013-02-10,0,-3,-9,-41,-290,0,-3,-10,-41,-42,41314,41,41,10,1,7,5902,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-16,10-Feb-2013,Feb 10th 2013,Sun 02-10-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-10,2013-02-04,2013-02-10,Sun ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,7,2013,2013-02-10,2013-02-16,Y,Wk.07 - 13,2013-02-10 00:00:00,2013-02-16 00:00:00,2013W07 ,2013W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2013,N,2012-02-10,2011-02-10,2012-11-10,2012-08-10,2013-01-10,2012-12-10,2013-02-03,2013-01-27,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-21,2013-01-01,2013-10-01,2013-12-01,2013-12-15,0,0,1,3,24,0,0,0,3,3,41628,355,82,21,7,51,5946,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-21,21-Dec-2013,Dec 21st 2013,Sat 12-21-13,0,0,0,0,2013-12-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-15,2013-12-16,2013-12-21,Sat ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,51,2013,2013-12-15,2013-12-21,N,Wk.51 - 13,2013-12-15 00:00:00,2013-12-21 00:00:00,2013W51 ,2013W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2013,N,2012-12-21,2011-12-21,2013-09-21,2013-06-21,2013-11-21,2013-10-21,2013-12-14,2013-12-07,0,0,0,0,0,0,0,0,12,4,51,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-22,2013-01-01,2013-10-01,2013-10-01,2013-10-20,0,0,-1,-5,-36,0,0,-2,-5,-5,41568,295,22,22,3,43,5938,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-26,22-Oct-2013,Oct 22nd 2013,Tue 10-22-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-20,2013-10-21,2013-10-22,Tue ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,43,2013,2013-10-20,2013-10-26,N,Wk.43 - 13,2013-10-20 00:00:00,2013-10-26 00:00:00,2013W43 ,2013W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2013,N,2012-10-22,2011-10-22,2013-07-22,2013-04-22,2013-09-22,2013-08-22,2013-10-15,2013-10-08,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-24,2013-01-01,2013-10-01,2013-10-01,2013-10-20,0,0,-1,-5,-34,0,0,-2,-5,-5,41570,297,24,24,5,43,5938,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-26,24-Oct-2013,Oct 24th 2013,Thu 10-24-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-20,2013-10-21,2013-10-24,Thu ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,43,2013,2013-10-20,2013-10-26,N,Wk.43 - 13,2013-10-20 00:00:00,2013-10-26 00:00:00,2013W43 ,2013W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2013,N,2012-10-24,2011-10-24,2013-07-24,2013-04-24,2013-09-24,2013-08-24,2013-10-17,2013-10-10,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-10,2013-01-01,2013-07-01,2013-07-01,2013-07-07,0,-1,-4,-20,-140,0,-1,-5,-20,-20,41464,191,10,10,4,28,5923,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-13,10-Jul-2013,Jul 10th 2013,Wed 07-10-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-07,2013-07-08,2013-07-10,Wed ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,28,2013,2013-07-07,2013-07-13,N,Wk.28 - 13,2013-07-07 00:00:00,2013-07-13 00:00:00,2013W28 ,2013W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2013,N,2012-07-10,2011-07-10,2013-04-10,2013-01-10,2013-06-10,2013-05-10,2013-07-03,2013-06-26,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-27,2013-01-01,2013-01-01,2013-02-01,2013-02-24,0,-3,-9,-39,-273,0,-3,-9,-39,-39,41331,58,58,27,4,9,5904,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-03-02,27-Feb-2013,Feb 27th 2013,Wed 02-27-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-02-24,2013-02-24,2013-02-25,2013-02-27,Wed ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,9,2013,2013-02-24,2013-03-02,N,Wk.09 - 13,2013-02-24 00:00:00,2013-03-02 00:00:00,2013W09 ,2013W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2013,N,2012-02-27,2011-02-27,2012-11-27,2012-08-27,2013-01-27,2012-12-27,2013-02-20,2013-02-13,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-02,2013-01-01,2013-01-01,2013-03-01,2013-02-24,0,-3,-8,-39,-270,0,-3,-9,-39,-39,41334,61,61,2,7,9,5904,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-02,02-Mar-2013,Mar 2nd 2013,Sat 03-02-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-02-24,2013-02-25,2013-03-02,Sat ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,9,2013,2013-02-24,2013-03-02,N,Wk.09 - 13,2013-02-24 00:00:00,2013-03-02 00:00:00,2013W09 ,2013W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2013,N,2012-03-02,2011-03-02,2012-12-02,2012-09-02,2013-02-02,2013-01-02,2013-02-23,2013-02-16,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-02,2013-01-01,2013-10-01,2013-11-01,2013-10-27,0,0,0,-4,-25,0,0,-1,-4,-4,41579,306,33,2,7,44,5939,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-02,02-Nov-2013,Nov 2nd 2013,Sat 11-02-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-10-27,2013-10-28,2013-11-02,Sat ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,44,2013,2013-10-27,2013-11-02,N,Wk.44 - 13,2013-10-27 00:00:00,2013-11-02 00:00:00,2013W44 ,2013W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2013,N,2012-11-02,2011-11-02,2013-08-02,2013-05-02,2013-10-02,2013-09-02,2013-10-26,2013-10-19,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-21,2013-01-01,2013-01-01,2013-03-01,2013-03-17,0,-3,-8,-36,-251,0,-3,-9,-36,-36,41353,80,80,21,5,12,5907,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-23,21-Mar-2013,Mar 21st 2013,Thu 03-21-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-17,2013-03-18,2013-03-21,Thu ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,12,2013,2013-03-17,2013-03-23,N,Wk.12 - 13,2013-03-17 00:00:00,2013-03-23 00:00:00,2013W12 ,2013W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2013,N,2012-03-21,2011-03-21,2012-12-21,2012-09-21,2013-02-21,2013-01-21,2013-03-14,2013-03-07,0,0,0,0,0,0,0,0,3,1,12,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-03,2013-01-01,2013-04-01,2013-04-01,2013-03-31,0,-2,-7,-34,-238,0,-2,-8,-34,-34,41366,93,3,3,4,14,5909,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-06,03-Apr-2013,Apr 3rd 2013,Wed 04-03-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-03-31,2013-04-01,2013-04-03,Wed ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,14,2013,2013-03-31,2013-04-06,N,Wk.14 - 13,2013-03-31 00:00:00,2013-04-06 00:00:00,2013W14 ,2013W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2013,N,2012-04-03,2011-04-03,2013-01-03,2012-10-03,2013-03-03,2013-02-03,2013-03-27,2013-03-20,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-06,2013-01-01,2013-07-01,2013-07-01,2013-06-30,0,-1,-4,-21,-144,0,-1,-5,-21,-21,41460,187,6,6,7,27,5922,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-06,06-Jul-2013,Jul 6th 2013,Sat 07-06-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-06-30,2013-07-01,2013-07-06,Sat ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,27,2013,2013-06-30,2013-07-06,N,Wk.27 - 13,2013-06-30 00:00:00,2013-07-06 00:00:00,2013W27 ,2013W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2013,N,2012-07-06,2011-07-06,2013-04-06,2013-01-06,2013-06-06,2013-05-06,2013-06-29,2013-06-22,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-26,2013-01-01,2013-04-01,2013-06-01,2013-06-23,0,-2,-5,-22,-154,0,-2,-6,-22,-22,41450,177,87,26,4,26,5921,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-29,26-Jun-2013,Jun 26th 2013,Wed 06-26-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-23,2013-06-24,2013-06-26,Wed ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,26,2013,2013-06-23,2013-06-29,N,Wk.26 - 13,2013-06-23 00:00:00,2013-06-29 00:00:00,2013W26 ,2013W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2013,N,2012-06-26,2011-06-26,2013-03-26,2012-12-26,2013-05-26,2013-04-26,2013-06-19,2013-06-12,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-26,2013-01-01,2013-07-01,2013-08-01,2013-08-25,0,-1,-3,-13,-93,0,-1,-3,-13,-13,41511,238,57,26,2,35,5930,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-31,26-Aug-2013,Aug 26th 2013,Mon 08-26-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-08-25,2013-08-25,2013-08-26,2013-08-26,Mon ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,35,2013,2013-08-25,2013-08-31,N,Wk.35 - 13,2013-08-25 00:00:00,2013-08-31 00:00:00,2013W35 ,2013W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2013,N,2012-08-26,2011-08-26,2013-05-26,2013-02-26,2013-07-26,2013-06-26,2013-08-19,2013-08-12,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-13,2013-01-01,2013-10-01,2013-12-01,2013-12-08,0,0,1,2,16,0,0,0,2,2,41620,347,74,13,6,50,5945,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-14,13-Dec-2013,Dec 13th 2013,Fri 12-13-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-08,2013-12-09,2013-12-13,Fri ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,50,2013,2013-12-08,2013-12-14,N,Wk.50 - 13,2013-12-08 00:00:00,2013-12-14 00:00:00,2013W50 ,2013W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2013,N,2012-12-13,2011-12-13,2013-09-13,2013-06-13,2013-11-13,2013-10-13,2013-12-06,2013-11-29,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-02,2013-01-01,2013-07-01,2013-07-01,2013-06-30,0,-1,-4,-21,-148,0,-1,-5,-21,-21,41456,183,2,2,3,27,5922,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-06,02-Jul-2013,Jul 2nd 2013,Tue 07-02-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-06-30,2013-07-01,2013-07-02,Tue ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,27,2013,2013-06-30,2013-07-06,N,Wk.27 - 13,2013-06-30 00:00:00,2013-07-06 00:00:00,2013W27 ,2013W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2013,N,2012-07-02,2011-07-02,2013-04-02,2013-01-02,2013-06-02,2013-05-02,2013-06-25,2013-06-18,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-05,2013-01-01,2013-07-01,2013-08-01,2013-08-04,0,-1,-3,-16,-114,0,-1,-4,-16,-16,41490,217,36,5,2,32,5927,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-10,05-Aug-2013,Aug 5th 2013,Mon 08-05-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-04,2013-08-05,2013-08-05,Mon ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,32,2013,2013-08-04,2013-08-10,N,Wk.32 - 13,2013-08-04 00:00:00,2013-08-10 00:00:00,2013W32 ,2013W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2013,N,2012-08-05,2011-08-05,2013-05-05,2013-02-05,2013-07-05,2013-06-05,2013-07-29,2013-07-22,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-08,2013-01-01,2013-01-01,2013-02-01,2013-02-03,0,-3,-9,-42,-292,0,-3,-10,-42,-42,41312,39,39,8,6,6,5901,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-09,08-Feb-2013,Feb 8th 2013,Fri 02-08-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-03,2013-02-04,2013-02-08,Fri ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,6,2013,2013-02-03,2013-02-09,N,Wk.06 - 13,2013-02-03 00:00:00,2013-02-09 00:00:00,2013W06 ,2013W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2013,N,2012-02-08,2011-02-08,2012-11-08,2012-08-08,2013-01-08,2012-12-08,2013-02-01,2013-01-25,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-14,2013-01-01,2013-01-01,2013-02-01,2013-02-10,0,-3,-9,-41,-286,0,-3,-10,-41,-41,41318,45,45,14,5,7,5902,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-16,14-Feb-2013,Feb 14th 2013,Thu 02-14-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-10,2013-02-11,2013-02-14,Thu ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,7,2013,2013-02-10,2013-02-16,N,Wk.07 - 13,2013-02-10 00:00:00,2013-02-16 00:00:00,2013W07 ,2013W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2013,N,2012-02-14,2011-02-14,2012-11-14,2012-08-14,2013-01-14,2012-12-14,2013-02-07,2013-01-31,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-21,2013-01-01,2013-07-01,2013-09-01,2013-09-15,0,-1,-2,-10,-67,0,-1,-3,-10,-10,41537,264,83,21,7,38,5933,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-21,21-Sep-2013,Sep 21st 2013,Sat 09-21-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-15,2013-09-16,2013-09-21,Sat ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,38,2013,2013-09-15,2013-09-21,N,Wk.38 - 13,2013-09-15 00:00:00,2013-09-21 00:00:00,2013W38 ,2013W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2013,N,2012-09-21,2011-09-21,2013-06-21,2013-03-21,2013-08-21,2013-07-21,2013-09-14,2013-09-07,0,0,0,0,0,0,0,0,9,3,38,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-19,2013-01-01,2013-01-01,2013-03-01,2013-03-17,0,-3,-8,-36,-253,0,-3,-9,-36,-36,41351,78,78,19,3,12,5907,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-23,19-Mar-2013,Mar 19th 2013,Tue 03-19-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-17,2013-03-18,2013-03-19,Tue ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,12,2013,2013-03-17,2013-03-23,N,Wk.12 - 13,2013-03-17 00:00:00,2013-03-23 00:00:00,2013W12 ,2013W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2013,N,2012-03-19,2011-03-19,2012-12-19,2012-09-19,2013-02-19,2013-01-19,2013-03-12,2013-03-05,0,0,0,0,0,0,0,0,3,1,12,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-28,2013-01-01,2013-01-01,2013-01-01,2013-01-27,0,-3,-10,-43,-303,0,-3,-10,-43,-43,41301,28,28,28,2,5,5900,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-02-02,28-Jan-2013,Jan 28th 2013,Mon 01-28-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-01-27,2013-01-27,2013-01-28,2013-01-28,Mon ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,5,2013,2013-01-27,2013-02-02,N,Wk.05 - 13,2013-01-27 00:00:00,2013-02-02 00:00:00,2013W05 ,2013W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2013,N,2012-01-28,2011-01-28,2012-10-28,2012-07-28,2012-12-28,2012-11-28,2013-01-21,2013-01-14,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-03,2013-01-01,2013-07-01,2013-08-01,2013-07-28,0,-1,-3,-17,-116,0,-1,-4,-17,-17,41488,215,34,3,7,31,5926,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-03,03-Aug-2013,Aug 3rd 2013,Sat 08-03-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-07-28,2013-07-29,2013-08-03,Sat ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,31,2013,2013-07-28,2013-08-03,N,Wk.31 - 13,2013-07-28 00:00:00,2013-08-03 00:00:00,2013W31 ,2013W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2013,N,2012-08-03,2011-08-03,2013-05-03,2013-02-03,2013-07-03,2013-06-03,2013-07-27,2013-07-20,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-14,2013-01-01,2013-04-01,2013-06-01,2013-06-09,0,-2,-5,-24,-166,0,-2,-6,-24,-24,41438,165,75,14,6,24,5919,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-15,14-Jun-2013,Jun 14th 2013,Fri 06-14-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-09,2013-06-10,2013-06-14,Fri ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,24,2013,2013-06-09,2013-06-15,N,Wk.24 - 13,2013-06-09 00:00:00,2013-06-15 00:00:00,2013W24 ,2013W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2013,N,2012-06-14,2011-06-14,2013-03-14,2012-12-14,2013-05-14,2013-04-14,2013-06-07,2013-05-31,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-08,2013-01-01,2013-07-01,2013-07-01,2013-07-07,0,-1,-4,-20,-142,0,-1,-5,-20,-20,41462,189,8,8,2,28,5923,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-13,08-Jul-2013,Jul 8th 2013,Mon 07-08-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-07,2013-07-08,2013-07-08,Mon ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,28,2013,2013-07-07,2013-07-13,N,Wk.28 - 13,2013-07-07 00:00:00,2013-07-13 00:00:00,2013W28 ,2013W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2013,N,2012-07-08,2011-07-08,2013-04-08,2013-01-08,2013-06-08,2013-05-08,2013-07-01,2013-06-24,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-30,2013-01-01,2013-10-01,2013-11-01,2013-11-24,0,0,0,0,3,0,0,0,0,0,41607,334,61,30,7,48,5943,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-30,30-Nov-2013,Nov 30th 2013,Sat 11-30-13,0,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-11-24,2013-11-24,2013-11-25,2013-11-30,Sat ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,48,2013,2013-11-24,2013-11-30,N,Wk.48 - 13,2013-11-24 00:00:00,2013-11-30 00:00:00,2013W48 ,2013W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2013,N,2012-11-30,2011-11-30,2013-08-30,2013-05-30,2013-10-30,2013-09-30,2013-11-23,2013-11-16,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-10,2013-01-01,2013-01-01,2013-01-01,2013-01-06,0,-3,-10,-46,-321,0,-3,-11,-46,-46,41283,10,10,10,5,2,5897,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-12,10-Jan-2013,Jan 10th 2013,Thu 01-10-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-06,2013-01-07,2013-01-10,Thu ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,2,2013,2013-01-06,2013-01-12,N,Wk.02 - 13,2013-01-06 00:00:00,2013-01-12 00:00:00,2013W02 ,2013W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2013,N,2012-01-10,2011-01-10,2012-10-10,2012-07-10,2012-12-10,2012-11-10,2013-01-03,2012-12-27,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-18,2013-01-01,2013-04-01,2013-05-01,2013-05-12,0,-2,-6,-28,-193,0,-2,-7,-28,-28,41411,138,48,18,7,20,5915,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-18,18-May-2013,May 18th 2013,Sat 05-18-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-12,2013-05-13,2013-05-18,Sat ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,20,2013,2013-05-12,2013-05-18,N,Wk.20 - 13,2013-05-12 00:00:00,2013-05-18 00:00:00,2013W20 ,2013W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2013,N,2012-05-18,2011-05-18,2013-02-18,2012-11-18,2013-04-18,2013-03-18,2013-05-11,2013-05-04,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-15,2013-01-01,2013-04-01,2013-04-01,2013-04-14,0,-2,-7,-32,-226,0,-2,-8,-32,-32,41378,105,15,15,2,16,5911,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-20,15-Apr-2013,Apr 15th 2013,Mon 04-15-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-14,2013-04-15,2013-04-15,Mon ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,16,2013,2013-04-14,2013-04-20,N,Wk.16 - 13,2013-04-14 00:00:00,2013-04-20 00:00:00,2013W16 ,2013W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2013,N,2012-04-15,2011-04-15,2013-01-15,2012-10-15,2013-03-15,2013-02-15,2013-04-08,2013-04-01,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-12,2013-01-01,2013-01-01,2013-03-01,2013-03-10,0,-3,-8,-37,-260,0,-3,-9,-37,-37,41344,71,71,12,3,11,5906,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-16,12-Mar-2013,Mar 12th 2013,Tue 03-12-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-10,2013-03-11,2013-03-12,Tue ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,11,2013,2013-03-10,2013-03-16,N,Wk.11 - 13,2013-03-10 00:00:00,2013-03-16 00:00:00,2013W11 ,2013W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2013,N,2012-03-12,2011-03-12,2012-12-12,2012-09-12,2013-02-12,2013-01-12,2013-03-05,2013-02-26,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-09,2013-01-01,2013-10-01,2013-11-01,2013-11-03,0,0,0,-3,-18,0,0,-1,-3,-3,41586,313,40,9,7,45,5940,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-09,09-Nov-2013,Nov 9th 2013,Sat 11-09-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-03,2013-11-04,2013-11-09,Sat ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,45,2013,2013-11-03,2013-11-09,N,Wk.45 - 13,2013-11-03 00:00:00,2013-11-09 00:00:00,2013W45 ,2013W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2013,N,2012-11-09,2011-11-09,2013-08-09,2013-05-09,2013-10-09,2013-09-09,2013-11-02,2013-10-26,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-14,2013-01-01,2013-01-01,2013-03-01,2013-03-10,0,-3,-8,-37,-258,0,-3,-9,-37,-37,41346,73,73,14,5,11,5906,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-16,14-Mar-2013,Mar 14th 2013,Thu 03-14-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-10,2013-03-11,2013-03-14,Thu ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,11,2013,2013-03-10,2013-03-16,N,Wk.11 - 13,2013-03-10 00:00:00,2013-03-16 00:00:00,2013W11 ,2013W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2013,N,2012-03-14,2011-03-14,2012-12-14,2012-09-14,2013-02-14,2013-01-14,2013-03-07,2013-02-28,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-03,2013-01-01,2013-07-01,2013-09-01,2013-09-01,0,-1,-2,-12,-85,0,-1,-3,-12,-12,41519,246,65,3,3,36,5931,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-07,03-Sep-2013,Sep 3rd 2013,Tue 09-03-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-01,2013-09-02,2013-09-03,Tue ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,36,2013,2013-09-01,2013-09-07,N,Wk.36 - 13,2013-09-01 00:00:00,2013-09-07 00:00:00,2013W36 ,2013W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2013,N,2012-09-03,2011-09-03,2013-06-03,2013-03-03,2013-08-03,2013-07-03,2013-08-27,2013-08-20,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-16,2013-01-01,2013-04-01,2013-05-01,2013-05-12,0,-2,-6,-28,-195,0,-2,-7,-28,-28,41409,136,46,16,5,20,5915,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-18,16-May-2013,May 16th 2013,Thu 05-16-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-12,2013-05-13,2013-05-16,Thu ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,20,2013,2013-05-12,2013-05-18,N,Wk.20 - 13,2013-05-12 00:00:00,2013-05-18 00:00:00,2013W20 ,2013W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2013,N,2012-05-16,2011-05-16,2013-02-16,2012-11-16,2013-04-16,2013-03-16,2013-05-09,2013-05-02,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-27,2013-01-01,2013-10-01,2013-10-01,2013-10-27,0,0,-1,-4,-31,0,0,-1,-4,-5,41573,300,27,27,1,44,5939,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-11-02,27-Oct-2013,Oct 27th 2013,Sun 10-27-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-10-27,2013-10-27,2013-10-21,2013-10-27,Sun ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,44,2013,2013-10-27,2013-11-02,Y,Wk.44 - 13,2013-10-27 00:00:00,2013-11-02 00:00:00,2013W44 ,2013W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2013,N,2012-10-27,2011-10-27,2013-07-27,2013-04-27,2013-09-27,2013-08-27,2013-10-20,2013-10-13,0,0,0,0,1,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-21,2013-01-01,2013-07-01,2013-08-01,2013-08-18,0,-1,-3,-14,-98,0,-1,-4,-14,-14,41506,233,52,21,4,34,5929,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-24,21-Aug-2013,Aug 21st 2013,Wed 08-21-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-18,2013-08-19,2013-08-21,Wed ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,34,2013,2013-08-18,2013-08-24,N,Wk.34 - 13,2013-08-18 00:00:00,2013-08-24 00:00:00,2013W34 ,2013W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2013,N,2012-08-21,2011-08-21,2013-05-21,2013-02-21,2013-07-21,2013-06-21,2013-08-14,2013-08-07,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-25,2013-01-01,2013-10-01,2013-10-01,2013-10-20,0,0,-1,-5,-33,0,0,-2,-5,-5,41571,298,25,25,6,43,5938,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-26,25-Oct-2013,Oct 25th 2013,Fri 10-25-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-20,2013-10-21,2013-10-25,Fri ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,43,2013,2013-10-20,2013-10-26,N,Wk.43 - 13,2013-10-20 00:00:00,2013-10-26 00:00:00,2013W43 ,2013W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2013,N,2012-10-25,2011-10-25,2013-07-25,2013-04-25,2013-09-25,2013-08-25,2013-10-18,2013-10-11,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-24,2013-01-01,2013-07-01,2013-09-01,2013-09-22,0,-1,-2,-9,-64,0,-1,-3,-9,-9,41540,267,86,24,3,39,5934,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-28,24-Sep-2013,Sep 24th 2013,Tue 09-24-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-22,2013-09-23,2013-09-24,Tue ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,39,2013,2013-09-22,2013-09-28,N,Wk.39 - 13,2013-09-22 00:00:00,2013-09-28 00:00:00,2013W39 ,2013W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2013,N,2012-09-24,2011-09-24,2013-06-24,2013-03-24,2013-08-24,2013-07-24,2013-09-17,2013-09-10,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-27,2013-01-01,2013-01-01,2013-01-01,2013-01-27,0,-3,-10,-43,-304,0,-3,-10,-43,-44,41300,27,27,27,1,5,5900,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-02-02,27-Jan-2013,Jan 27th 2013,Sun 01-27-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-01-27,2013-01-27,2013-01-21,2013-01-27,Sun ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,5,2013,2013-01-27,2013-02-02,Y,Wk.05 - 13,2013-01-27 00:00:00,2013-02-02 00:00:00,2013W05 ,2013W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2013,N,2012-01-27,2011-01-27,2012-10-27,2012-07-27,2012-12-27,2012-11-27,2013-01-20,2013-01-13,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-10,2013-01-01,2013-01-01,2013-03-01,2013-03-10,0,-3,-8,-37,-262,0,-3,-9,-37,-38,41342,69,69,10,1,11,5906,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-16,10-Mar-2013,Mar 10th 2013,Sun 03-10-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-10,2013-03-04,2013-03-10,Sun ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,11,2013,2013-03-10,2013-03-16,Y,Wk.11 - 13,2013-03-10 00:00:00,2013-03-16 00:00:00,2013W11 ,2013W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2013,N,2012-03-10,2011-03-10,2012-12-10,2012-09-10,2013-02-10,2013-01-10,2013-03-03,2013-02-24,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-14,2013-01-01,2013-04-01,2013-05-01,2013-05-12,0,-2,-6,-28,-197,0,-2,-7,-28,-28,41407,134,44,14,3,20,5915,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-18,14-May-2013,May 14th 2013,Tue 05-14-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-12,2013-05-13,2013-05-14,Tue ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,20,2013,2013-05-12,2013-05-18,N,Wk.20 - 13,2013-05-12 00:00:00,2013-05-18 00:00:00,2013W20 ,2013W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2013,N,2012-05-14,2011-05-14,2013-02-14,2012-11-14,2013-04-14,2013-03-14,2013-05-07,2013-04-30,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-31,2013-01-01,2013-10-01,2013-12-01,2013-12-29,0,0,1,5,34,1,1,1,5,5,41638,365,92,31,3,53,5948,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-31,31-Dec-2013,Dec 31st 2013,Tue 12-31-13,0,0,0,0,2013-12-21,365,92,31,3,2013-12-29,2013-12-29,2013-12-29,2013-12-29,2013-12-30,2013-12-31,Tue ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,1,2014,2013-12-29,2014-01-04,N,Wk.53 - 13,2013-12-29 00:00:00,2013-12-31 00:00:00,2013W53 ,2013W53 ,12/29/13 - 12/31/13,12/29 - 12/31,2013,N,2012-12-31,2011-12-31,2013-09-30,2013-06-30,2013-11-30,2013-10-31,2013-12-24,2013-12-17,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-01,2013-01-01,2013-07-01,2013-09-01,2013-09-01,0,-1,-2,-12,-87,0,-1,-3,-12,-13,41517,244,63,1,1,36,5931,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-07,01-Sep-2013,Sep 1st 2013,Sun 09-01-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-01,2013-08-26,2013-09-01,Sun ,2013M09,Sep-2013,Y,2013M09 ,Y,Year 2013 - Quarter 03,2013Q03 ,N,36,2013,2013-09-01,2013-09-07,Y,Wk.36 - 13,2013-09-01 00:00:00,2013-09-07 00:00:00,2013W36 ,2013W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2013,N,2012-09-01,2011-09-01,2013-06-01,2013-03-01,2013-08-01,2013-07-01,2013-08-25,2013-08-18,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-13,2013-01-01,2013-04-01,2013-04-01,2013-04-07,0,-2,-7,-33,-228,0,-2,-8,-33,-33,41376,103,13,13,7,15,5910,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-13,13-Apr-2013,Apr 13th 2013,Sat 04-13-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-07,2013-04-08,2013-04-13,Sat ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,15,2013,2013-04-07,2013-04-13,N,Wk.15 - 13,2013-04-07 00:00:00,2013-04-13 00:00:00,2013W15 ,2013W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2013,N,2012-04-13,2011-04-13,2013-01-13,2012-10-13,2013-03-13,2013-02-13,2013-04-06,2013-03-30,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-09,2013-01-01,2013-01-01,2013-02-01,2013-02-03,0,-3,-9,-42,-291,0,-3,-10,-42,-42,41313,40,40,9,7,6,5901,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-09,09-Feb-2013,Feb 9th 2013,Sat 02-09-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-03,2013-02-04,2013-02-09,Sat ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,6,2013,2013-02-03,2013-02-09,N,Wk.06 - 13,2013-02-03 00:00:00,2013-02-09 00:00:00,2013W06 ,2013W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2013,N,2012-02-09,2011-02-09,2012-11-09,2012-08-09,2013-01-09,2012-12-09,2013-02-02,2013-01-26,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-27,2013-01-01,2013-10-01,2013-12-01,2013-12-22,0,0,1,4,30,0,0,0,4,4,41634,361,88,27,6,52,5947,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-28,27-Dec-2013,Dec 27th 2013,Fri 12-27-13,0,0,0,0,2013-12-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-22,2013-12-23,2013-12-27,Fri ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,52,2013,2013-12-22,2013-12-28,N,Wk.52 - 13,2013-12-22 00:00:00,2013-12-28 00:00:00,2013W52 ,2013W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2013,N,2012-12-27,2011-12-27,2013-09-27,2013-06-27,2013-11-27,2013-10-27,2013-12-20,2013-12-13,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-19,2013-01-01,2013-07-01,2013-08-01,2013-08-18,0,-1,-3,-14,-100,0,-1,-4,-14,-14,41504,231,50,19,2,34,5929,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-24,19-Aug-2013,Aug 19th 2013,Mon 08-19-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-18,2013-08-19,2013-08-19,Mon ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,34,2013,2013-08-18,2013-08-24,N,Wk.34 - 13,2013-08-18 00:00:00,2013-08-24 00:00:00,2013W34 ,2013W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2013,N,2012-08-19,2011-08-19,2013-05-19,2013-02-19,2013-07-19,2013-06-19,2013-08-12,2013-08-05,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-11,2013-01-01,2013-04-01,2013-04-01,2013-04-07,0,-2,-7,-33,-230,0,-2,-8,-33,-33,41374,101,11,11,5,15,5910,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-13,11-Apr-2013,Apr 11th 2013,Thu 04-11-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-07,2013-04-08,2013-04-11,Thu ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,15,2013,2013-04-07,2013-04-13,N,Wk.15 - 13,2013-04-07 00:00:00,2013-04-13 00:00:00,2013W15 ,2013W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2013,N,2012-04-11,2011-04-11,2013-01-11,2012-10-11,2013-03-11,2013-02-11,2013-04-04,2013-03-28,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-06,2013-01-01,2013-10-01,2013-12-01,2013-12-01,0,0,1,1,9,0,0,0,1,1,41613,340,67,6,6,49,5944,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-07,06-Dec-2013,Dec 6th 2013,Fri 12-06-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-01,2013-12-02,2013-12-06,Fri ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,49,2013,2013-12-01,2013-12-07,N,Wk.49 - 13,2013-12-01 00:00:00,2013-12-07 00:00:00,2013W49 ,2013W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2013,N,2012-12-06,2011-12-06,2013-09-06,2013-06-06,2013-11-06,2013-10-06,2013-11-29,2013-11-22,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-31,2013-01-01,2013-01-01,2013-03-01,2013-03-31,0,-3,-8,-34,-241,0,-2,-8,-34,-35,41363,90,90,31,1,14,5909,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-04-06,31-Mar-2013,Mar 31st 2013,Sun 03-31-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2013-03-31,2013-03-31,2013-03-31,2013-03-25,2013-03-31,Sun ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,14,2013,2013-03-31,2013-04-06,Y,Wk.14 - 13,2013-03-31 00:00:00,2013-04-06 00:00:00,2013W14 ,2013W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2013,N,2012-03-31,2011-03-31,2012-12-31,2012-09-30,2013-02-28,2013-01-31,2013-03-24,2013-03-17,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-22,2013-01-01,2013-07-01,2013-09-01,2013-09-22,0,-1,-2,-9,-66,0,-1,-3,-9,-10,41538,265,84,22,1,39,5934,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-28,22-Sep-2013,Sep 22nd 2013,Sun 09-22-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-22,2013-09-16,2013-09-22,Sun ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,39,2013,2013-09-22,2013-09-28,Y,Wk.39 - 13,2013-09-22 00:00:00,2013-09-28 00:00:00,2013W39 ,2013W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2013,N,2012-09-22,2011-09-22,2013-06-22,2013-03-22,2013-08-22,2013-07-22,2013-09-15,2013-09-08,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-06,2013-01-01,2013-01-01,2013-01-01,2013-01-06,0,-3,-10,-46,-325,0,-3,-11,-46,-47,41279,6,6,6,1,2,5897,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-12,06-Jan-2013,Jan 6th 2013,Sun 01-06-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-06,2012-12-31,2013-01-06,Sun ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,2,2013,2013-01-06,2013-01-12,Y,Wk.02 - 13,2013-01-06 00:00:00,2013-01-12 00:00:00,2013W02 ,2013W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2013,N,2012-01-06,2011-01-06,2012-10-06,2012-07-06,2012-12-06,2012-11-06,2012-12-30,2012-12-23,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-04,2013-01-01,2013-01-01,2013-01-01,2013-01-01,0,-3,-10,-47,-327,0,-3,-11,-47,-47,41277,4,4,4,6,1,5896,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-05,04-Jan-2013,Jan 4th 2013,Fri 01-04-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2013-01-04,Fri ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,1,2013,2012-12-30,2013-01-05,N,Wk.01 - 13,2013-01-01 00:00:00,2013-01-05 00:00:00,2013W01 ,2013W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2013,N,2012-01-04,2011-01-04,2012-10-04,2012-07-04,2012-12-04,2012-11-04,2012-12-28,2012-12-21,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-16,2013-01-01,2013-07-01,2013-07-01,2013-07-14,0,-1,-4,-19,-134,0,-1,-5,-19,-19,41470,197,16,16,3,29,5924,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-20,16-Jul-2013,Jul 16th 2013,Tue 07-16-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-14,2013-07-15,2013-07-16,Tue ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,29,2013,2013-07-14,2013-07-20,N,Wk.29 - 13,2013-07-14 00:00:00,2013-07-20 00:00:00,2013W29 ,2013W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2013,N,2012-07-16,2011-07-16,2013-04-16,2013-01-16,2013-06-16,2013-05-16,2013-07-09,2013-07-02,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-03,2013-01-01,2013-10-01,2013-11-01,2013-11-03,0,0,0,-3,-24,0,0,-1,-3,-4,41580,307,34,3,1,45,5940,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-09,03-Nov-2013,Nov 3rd 2013,Sun 11-03-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-03,2013-10-28,2013-11-03,Sun ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,45,2013,2013-11-03,2013-11-09,Y,Wk.45 - 13,2013-11-03 00:00:00,2013-11-09 00:00:00,2013W45 ,2013W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2013,N,2012-11-03,2011-11-03,2013-08-03,2013-05-03,2013-10-03,2013-09-03,2013-10-27,2013-10-20,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-25,2013-01-01,2013-07-01,2013-08-01,2013-08-25,0,-1,-3,-13,-94,0,-1,-3,-13,-14,41510,237,56,25,1,35,5930,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-31,25-Aug-2013,Aug 25th 2013,Sun 08-25-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-08-25,2013-08-25,2013-08-19,2013-08-25,Sun ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,35,2013,2013-08-25,2013-08-31,Y,Wk.35 - 13,2013-08-25 00:00:00,2013-08-31 00:00:00,2013W35 ,2013W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2013,N,2012-08-25,2011-08-25,2013-05-25,2013-02-25,2013-07-25,2013-06-25,2013-08-18,2013-08-11,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-24,2013-01-01,2013-10-01,2013-11-01,2013-11-24,0,0,0,0,-3,0,0,0,0,-1,41601,328,55,24,1,48,5943,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-30,24-Nov-2013,Nov 24th 2013,Sun 11-24-13,1,1,1,1,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-11-24,2013-11-24,2013-11-18,2013-11-24,Sun ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,48,2013,2013-11-24,2013-11-30,Y,Wk.48 - 13,2013-11-24 00:00:00,2013-11-30 00:00:00,2013W48 ,2013W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2013,N,2012-11-24,2011-11-24,2013-08-24,2013-05-24,2013-10-24,2013-09-24,2013-11-17,2013-11-10,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-12,2013-01-01,2013-04-01,2013-05-01,2013-05-12,0,-2,-6,-28,-199,0,-2,-7,-28,-29,41405,132,42,12,1,20,5915,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-18,12-May-2013,May 12th 2013,Sun 05-12-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-12,2013-05-06,2013-05-12,Sun ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,20,2013,2013-05-12,2013-05-18,Y,Wk.20 - 13,2013-05-12 00:00:00,2013-05-18 00:00:00,2013W20 ,2013W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2013,N,2012-05-12,2011-05-12,2013-02-12,2012-11-12,2013-04-12,2013-03-12,2013-05-05,2013-04-28,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-17,2013-01-01,2013-07-01,2013-08-01,2013-08-11,0,-1,-3,-15,-102,0,-1,-4,-15,-15,41502,229,48,17,7,33,5928,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-17,17-Aug-2013,Aug 17th 2013,Sat 08-17-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-11,2013-08-12,2013-08-17,Sat ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,33,2013,2013-08-11,2013-08-17,N,Wk.33 - 13,2013-08-11 00:00:00,2013-08-17 00:00:00,2013W33 ,2013W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2013,N,2012-08-17,2011-08-17,2013-05-17,2013-02-17,2013-07-17,2013-06-17,2013-08-10,2013-08-03,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-21,2013-01-01,2013-10-01,2013-10-01,2013-10-20,0,0,-1,-5,-37,0,0,-2,-5,-5,41567,294,21,21,2,43,5938,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-26,21-Oct-2013,Oct 21st 2013,Mon 10-21-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-20,2013-10-21,2013-10-21,Mon ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,43,2013,2013-10-20,2013-10-26,N,Wk.43 - 13,2013-10-20 00:00:00,2013-10-26 00:00:00,2013W43 ,2013W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2013,N,2012-10-21,2011-10-21,2013-07-21,2013-04-21,2013-09-21,2013-08-21,2013-10-14,2013-10-07,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-27,2013-01-01,2013-01-01,2013-03-01,2013-03-24,0,-3,-8,-35,-245,0,-3,-9,-35,-35,41359,86,86,27,4,13,5908,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-30,27-Mar-2013,Mar 27th 2013,Wed 03-27-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-24,2013-03-25,2013-03-27,Wed ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,13,2013,2013-03-24,2013-03-30,N,Wk.13 - 13,2013-03-24 00:00:00,2013-03-30 00:00:00,2013W13 ,2013W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2013,N,2012-03-27,2011-03-27,2012-12-27,2012-09-27,2013-02-27,2013-01-27,2013-03-20,2013-03-13,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-22,2013-01-01,2013-10-01,2013-11-01,2013-11-17,0,0,0,-1,-5,0,0,-1,-1,-1,41599,326,53,22,6,47,5942,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-23,22-Nov-2013,Nov 22nd 2013,Fri 11-22-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-17,2013-11-18,2013-11-22,Fri ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,47,2013,2013-11-17,2013-11-23,N,Wk.47 - 13,2013-11-17 00:00:00,2013-11-23 00:00:00,2013W47 ,2013W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2013,N,2012-11-22,2011-11-22,2013-08-22,2013-05-22,2013-10-22,2013-09-22,2013-11-15,2013-11-08,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-07,2013-01-01,2013-07-01,2013-07-01,2013-07-07,0,-1,-4,-20,-143,0,-1,-5,-20,-21,41461,188,7,7,1,28,5923,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-13,07-Jul-2013,Jul 7th 2013,Sun 07-07-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-07,2013-07-01,2013-07-07,Sun ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,28,2013,2013-07-07,2013-07-13,Y,Wk.28 - 13,2013-07-07 00:00:00,2013-07-13 00:00:00,2013W28 ,2013W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2013,N,2012-07-07,2011-07-07,2013-04-07,2013-01-07,2013-06-07,2013-05-07,2013-06-30,2013-06-23,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-11,2013-01-01,2013-07-01,2013-09-01,2013-09-08,0,-1,-2,-11,-77,0,-1,-3,-11,-11,41527,254,73,11,4,37,5932,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-14,11-Sep-2013,Sep 11th 2013,Wed 09-11-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-08,2013-09-09,2013-09-11,Wed ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,37,2013,2013-09-08,2013-09-14,N,Wk.37 - 13,2013-09-08 00:00:00,2013-09-14 00:00:00,2013W37 ,2013W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2013,N,2012-09-11,2011-09-11,2013-06-11,2013-03-11,2013-08-11,2013-07-11,2013-09-04,2013-08-28,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-19,2013-01-01,2013-10-01,2013-10-01,2013-10-13,0,0,-1,-6,-39,0,0,-2,-6,-6,41565,292,19,19,7,42,5937,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-19,19-Oct-2013,Oct 19th 2013,Sat 10-19-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-13,2013-10-14,2013-10-19,Sat ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,42,2013,2013-10-13,2013-10-19,N,Wk.42 - 13,2013-10-13 00:00:00,2013-10-19 00:00:00,2013W42 ,2013W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2013,N,2012-10-19,2011-10-19,2013-07-19,2013-04-19,2013-09-19,2013-08-19,2013-10-12,2013-10-05,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-23,2013-01-01,2013-10-01,2013-12-01,2013-12-22,0,0,1,4,26,0,0,0,4,4,41630,357,84,23,2,52,5947,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-28,23-Dec-2013,Dec 23rd 2013,Mon 12-23-13,0,0,0,0,2013-12-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-22,2013-12-23,2013-12-23,Mon ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,52,2013,2013-12-22,2013-12-28,N,Wk.52 - 13,2013-12-22 00:00:00,2013-12-28 00:00:00,2013W52 ,2013W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2013,N,2012-12-23,2011-12-23,2013-09-23,2013-06-23,2013-11-23,2013-10-23,2013-12-16,2013-12-09,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-24,2013-01-01,2013-04-01,2013-05-01,2013-05-19,0,-2,-6,-27,-187,0,-2,-7,-27,-27,41417,144,54,24,6,21,5916,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-25,24-May-2013,May 24th 2013,Fri 05-24-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-19,2013-05-20,2013-05-24,Fri ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,21,2013,2013-05-19,2013-05-25,N,Wk.21 - 13,2013-05-19 00:00:00,2013-05-25 00:00:00,2013W21 ,2013W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2013,N,2012-05-24,2011-05-24,2013-02-24,2012-11-24,2013-04-24,2013-03-24,2013-05-17,2013-05-10,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-05,2013-01-01,2013-10-01,2013-11-01,2013-11-03,0,0,0,-3,-22,0,0,-1,-3,-3,41582,309,36,5,3,45,5940,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-09,05-Nov-2013,Nov 5th 2013,Tue 11-05-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-03,2013-11-04,2013-11-05,Tue ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,45,2013,2013-11-03,2013-11-09,N,Wk.45 - 13,2013-11-03 00:00:00,2013-11-09 00:00:00,2013W45 ,2013W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2013,N,2012-11-05,2011-11-05,2013-08-05,2013-05-05,2013-10-05,2013-09-05,2013-10-29,2013-10-22,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-29,2013-01-01,2013-04-01,2013-05-01,2013-05-26,0,-2,-6,-26,-182,0,-2,-6,-26,-26,41422,149,59,29,4,22,5917,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-06-01,29-May-2013,May 29th 2013,Wed 05-29-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-05-26,2013-05-26,2013-05-27,2013-05-29,Wed ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,22,2013,2013-05-26,2013-06-01,N,Wk.22 - 13,2013-05-26 00:00:00,2013-06-01 00:00:00,2013W22 ,2013W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2013,N,2012-05-29,2011-05-29,2013-02-28,2012-11-29,2013-04-29,2013-03-29,2013-05-22,2013-05-15,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-02,2013-01-01,2013-01-01,2013-01-01,2013-01-01,0,-3,-10,-47,-329,0,-3,-11,-47,-47,41275,2,2,2,4,1,5896,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-05,02-Jan-2013,Jan 2nd 2013,Wed 01-02-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2013-01-02,Wed ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,1,2013,2012-12-30,2013-01-05,N,Wk.01 - 13,2013-01-01 00:00:00,2013-01-05 00:00:00,2013W01 ,2013W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2013,N,2012-01-02,2011-01-02,2012-10-02,2012-07-02,2012-12-02,2012-11-02,2012-12-26,2012-12-19,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-02,2013-01-01,2013-10-01,2013-12-01,2013-12-01,0,0,1,1,5,0,0,0,1,1,41609,336,63,2,2,49,5944,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-07,02-Dec-2013,Dec 2nd 2013,Mon 12-02-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-01,2013-12-02,2013-12-02,Mon ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,49,2013,2013-12-01,2013-12-07,N,Wk.49 - 13,2013-12-01 00:00:00,2013-12-07 00:00:00,2013W49 ,2013W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2013,N,2012-12-02,2011-12-02,2013-09-02,2013-06-02,2013-11-02,2013-10-02,2013-11-25,2013-11-18,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-24,2013-01-01,2013-01-01,2013-02-01,2013-02-24,0,-3,-9,-39,-276,0,-3,-9,-39,-40,41328,55,55,24,1,9,5904,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-03-02,24-Feb-2013,Feb 24th 2013,Sun 02-24-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-02-24,2013-02-24,2013-02-18,2013-02-24,Sun ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,9,2013,2013-02-24,2013-03-02,Y,Wk.09 - 13,2013-02-24 00:00:00,2013-03-02 00:00:00,2013W09 ,2013W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2013,N,2012-02-24,2011-02-24,2012-11-24,2012-08-24,2013-01-24,2012-12-24,2013-02-17,2013-02-10,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-23,2013-01-01,2013-01-01,2013-01-01,2013-01-20,0,-3,-10,-44,-308,0,-3,-11,-44,-44,41296,23,23,23,4,4,5899,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-26,23-Jan-2013,Jan 23rd 2013,Wed 01-23-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-20,2013-01-21,2013-01-23,Wed ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,4,2013,2013-01-20,2013-01-26,N,Wk.04 - 13,2013-01-20 00:00:00,2013-01-26 00:00:00,2013W04 ,2013W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2013,N,2012-01-23,2011-01-23,2012-10-23,2012-07-23,2012-12-23,2012-11-23,2013-01-16,2013-01-09,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-16,2013-01-01,2013-01-01,2013-01-01,2013-01-13,0,-3,-10,-45,-315,0,-3,-11,-45,-45,41289,16,16,16,4,3,5898,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-19,16-Jan-2013,Jan 16th 2013,Wed 01-16-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-13,2013-01-14,2013-01-16,Wed ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,3,2013,2013-01-13,2013-01-19,N,Wk.03 - 13,2013-01-13 00:00:00,2013-01-19 00:00:00,2013W03 ,2013W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2013,N,2012-01-16,2011-01-16,2012-10-16,2012-07-16,2012-12-16,2012-11-16,2013-01-09,2013-01-02,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-05,2013-01-01,2013-04-01,2013-04-01,2013-03-31,0,-2,-7,-34,-236,0,-2,-8,-34,-34,41368,95,5,5,6,14,5909,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-06,05-Apr-2013,Apr 5th 2013,Fri 04-05-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-03-31,2013-04-01,2013-04-05,Fri ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,14,2013,2013-03-31,2013-04-06,N,Wk.14 - 13,2013-03-31 00:00:00,2013-04-06 00:00:00,2013W14 ,2013W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2013,N,2012-04-05,2011-04-05,2013-01-05,2012-10-05,2013-03-05,2013-02-05,2013-03-29,2013-03-22,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-27,2013-01-01,2013-04-01,2013-05-01,2013-05-26,0,-2,-6,-26,-184,0,-2,-6,-26,-26,41420,147,57,27,2,22,5917,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-06-01,27-May-2013,May 27th 2013,Mon 05-27-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-05-26,2013-05-26,2013-05-27,2013-05-27,Mon ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,22,2013,2013-05-26,2013-06-01,N,Wk.22 - 13,2013-05-26 00:00:00,2013-06-01 00:00:00,2013W22 ,2013W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2013,N,2012-05-27,2011-05-27,2013-02-27,2012-11-27,2013-04-27,2013-03-27,2013-05-20,2013-05-13,0,0,0,1,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-12,2013-01-01,2013-10-01,2013-10-01,2013-10-06,0,0,-1,-7,-46,0,0,-2,-7,-7,41558,285,12,12,7,41,5936,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-12,12-Oct-2013,Oct 12th 2013,Sat 10-12-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-06,2013-10-07,2013-10-12,Sat ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,41,2013,2013-10-06,2013-10-12,N,Wk.41 - 13,2013-10-06 00:00:00,2013-10-12 00:00:00,2013W41 ,2013W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2013,N,2012-10-12,2011-10-12,2013-07-12,2013-04-12,2013-09-12,2013-08-12,2013-10-05,2013-09-28,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-01,2013-01-01,2013-01-01,2013-03-01,2013-02-24,0,-3,-8,-39,-271,0,-3,-9,-39,-39,41333,60,60,1,6,9,5904,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-02,01-Mar-2013,Mar 1st 2013,Fri 03-01-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-02-24,2013-02-25,2013-03-01,Fri ,2013M03,Mar-2013,Y,2013M03 ,Y,Year 2013 - Quarter 01,2013Q01 ,N,9,2013,2013-02-24,2013-03-02,N,Wk.09 - 13,2013-02-24 00:00:00,2013-03-02 00:00:00,2013W09 ,2013W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2013,N,2012-03-01,2011-03-01,2012-12-01,2012-09-01,2013-02-01,2013-01-01,2013-02-22,2013-02-15,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-26,2013-01-01,2013-04-01,2013-04-01,2013-04-21,0,-2,-7,-31,-215,0,-2,-8,-31,-31,41389,116,26,26,6,17,5912,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-27,26-Apr-2013,Apr 26th 2013,Fri 04-26-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-21,2013-04-22,2013-04-26,Fri ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,17,2013,2013-04-21,2013-04-27,N,Wk.17 - 13,2013-04-21 00:00:00,2013-04-27 00:00:00,2013W17 ,2013W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2013,N,2012-04-26,2011-04-26,2013-01-26,2012-10-26,2013-03-26,2013-02-26,2013-04-19,2013-04-12,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-20,2013-01-01,2013-10-01,2013-11-01,2013-11-17,0,0,0,-1,-7,0,0,-1,-1,-1,41597,324,51,20,4,47,5942,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-23,20-Nov-2013,Nov 20th 2013,Wed 11-20-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-17,2013-11-18,2013-11-20,Wed ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,47,2013,2013-11-17,2013-11-23,N,Wk.47 - 13,2013-11-17 00:00:00,2013-11-23 00:00:00,2013W47 ,2013W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2013,N,2012-11-20,2011-11-20,2013-08-20,2013-05-20,2013-10-20,2013-09-20,2013-11-13,2013-11-06,0,0,0,0,0,0,1,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-04,2013-01-01,2013-04-01,2013-06-01,2013-06-02,0,-2,-5,-25,-176,0,-2,-6,-25,-25,41428,155,65,4,3,23,5918,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-08,04-Jun-2013,Jun 4th 2013,Tue 06-04-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-02,2013-06-03,2013-06-04,Tue ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,23,2013,2013-06-02,2013-06-08,N,Wk.23 - 13,2013-06-02 00:00:00,2013-06-08 00:00:00,2013W23 ,2013W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2013,N,2012-06-04,2011-06-04,2013-03-04,2012-12-04,2013-05-04,2013-04-04,2013-05-28,2013-05-21,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-14,2013-01-01,2013-07-01,2013-09-01,2013-09-08,0,-1,-2,-11,-74,0,-1,-3,-11,-11,41530,257,76,14,7,37,5932,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-14,14-Sep-2013,Sep 14th 2013,Sat 09-14-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-08,2013-09-09,2013-09-14,Sat ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,37,2013,2013-09-08,2013-09-14,N,Wk.37 - 13,2013-09-08 00:00:00,2013-09-14 00:00:00,2013W37 ,2013W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2013,N,2012-09-14,2011-09-14,2013-06-14,2013-03-14,2013-08-14,2013-07-14,2013-09-07,2013-08-31,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-06,2013-01-01,2013-04-01,2013-05-01,2013-05-05,0,-2,-6,-29,-205,0,-2,-7,-29,-29,41399,126,36,6,2,19,5914,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-11,06-May-2013,May 6th 2013,Mon 05-06-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-05,2013-05-06,2013-05-06,Mon ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,19,2013,2013-05-05,2013-05-11,N,Wk.19 - 13,2013-05-05 00:00:00,2013-05-11 00:00:00,2013W19 ,2013W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2013,N,2012-05-06,2011-05-06,2013-02-06,2012-11-06,2013-04-06,2013-03-06,2013-04-29,2013-04-22,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-25,2013-01-01,2013-04-01,2013-06-01,2013-06-23,0,-2,-5,-22,-155,0,-2,-6,-22,-22,41449,176,86,25,3,26,5921,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-29,25-Jun-2013,Jun 25th 2013,Tue 06-25-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-23,2013-06-24,2013-06-25,Tue ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,26,2013,2013-06-23,2013-06-29,N,Wk.26 - 13,2013-06-23 00:00:00,2013-06-29 00:00:00,2013W26 ,2013W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2013,N,2012-06-25,2011-06-25,2013-03-25,2012-12-25,2013-05-25,2013-04-25,2013-06-18,2013-06-11,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-22,2013-01-01,2013-01-01,2013-02-01,2013-02-17,0,-3,-9,-40,-278,0,-3,-10,-40,-40,41326,53,53,22,6,8,5903,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-23,22-Feb-2013,Feb 22nd 2013,Fri 02-22-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-17,2013-02-18,2013-02-22,Fri ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,8,2013,2013-02-17,2013-02-23,N,Wk.08 - 13,2013-02-17 00:00:00,2013-02-23 00:00:00,2013W08 ,2013W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2013,N,2012-02-22,2011-02-22,2012-11-22,2012-08-22,2013-01-22,2012-12-22,2013-02-15,2013-02-08,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-19,2013-01-01,2013-10-01,2013-12-01,2013-12-15,0,0,1,3,22,0,0,0,3,3,41626,353,80,19,5,51,5946,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-21,19-Dec-2013,Dec 19th 2013,Thu 12-19-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-15,2013-12-16,2013-12-19,Thu ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,51,2013,2013-12-15,2013-12-21,N,Wk.51 - 13,2013-12-15 00:00:00,2013-12-21 00:00:00,2013W51 ,2013W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2013,N,2012-12-19,2011-12-19,2013-09-19,2013-06-19,2013-11-19,2013-10-19,2013-12-12,2013-12-05,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-30,2013-01-01,2013-07-01,2013-09-01,2013-09-29,0,-1,-2,-8,-58,0,0,-2,-8,-8,41546,273,92,30,2,40,5935,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-10-05,30-Sep-2013,Sep 30th 2013,Mon 09-30-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-09-29,2013-09-29,2013-09-30,2013-09-30,Mon ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,40,2013,2013-09-29,2013-10-05,N,Wk.40 - 13,2013-09-29 00:00:00,2013-10-05 00:00:00,2013W40 ,2013W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2013,N,2012-09-30,2011-09-30,2013-06-30,2013-03-30,2013-08-30,2013-07-30,2013-09-23,2013-09-16,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-26,2013-01-01,2013-10-01,2013-11-01,2013-11-24,0,0,0,0,-1,0,0,0,0,0,41603,330,57,26,3,48,5943,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-30,26-Nov-2013,Nov 26th 2013,Tue 11-26-13,1,1,1,1,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-11-24,2013-11-24,2013-11-25,2013-11-26,Tue ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,48,2013,2013-11-24,2013-11-30,N,Wk.48 - 13,2013-11-24 00:00:00,2013-11-30 00:00:00,2013W48 ,2013W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2013,N,2012-11-26,2011-11-26,2013-08-26,2013-05-26,2013-10-26,2013-09-26,2013-11-19,2013-11-12,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-25,2013-01-01,2013-04-01,2013-05-01,2013-05-19,0,-2,-6,-27,-186,0,-2,-7,-27,-27,41418,145,55,25,7,21,5916,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-25,25-May-2013,May 25th 2013,Sat 05-25-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-19,2013-05-20,2013-05-25,Sat ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,21,2013,2013-05-19,2013-05-25,N,Wk.21 - 13,2013-05-19 00:00:00,2013-05-25 00:00:00,2013W21 ,2013W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2013,N,2012-05-25,2011-05-25,2013-02-25,2012-11-25,2013-04-25,2013-03-25,2013-05-18,2013-05-11,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-14,2013-01-01,2013-10-01,2013-10-01,2013-10-13,0,0,-1,-6,-44,0,0,-2,-6,-6,41560,287,14,14,2,42,5937,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-19,14-Oct-2013,Oct 14th 2013,Mon 10-14-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-13,2013-10-14,2013-10-14,Mon ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,42,2013,2013-10-13,2013-10-19,N,Wk.42 - 13,2013-10-13 00:00:00,2013-10-19 00:00:00,2013W42 ,2013W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2013,N,2012-10-14,2011-10-14,2013-07-14,2013-04-14,2013-09-14,2013-08-14,2013-10-07,2013-09-30,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-30,2013-01-01,2013-04-01,2013-06-01,2013-06-30,0,-2,-5,-21,-150,0,-1,-5,-21,-22,41454,181,91,30,1,27,5922,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-07-06,30-Jun-2013,Jun 30th 2013,Sun 06-30-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-06-30,2013-06-30,2013-06-30,2013-06-24,2013-06-30,Sun ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,27,2013,2013-06-30,2013-07-06,Y,Wk.27 - 13,2013-06-30 00:00:00,2013-07-06 00:00:00,2013W27 ,2013W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2013,N,2012-06-30,2011-06-30,2013-03-30,2012-12-30,2013-05-30,2013-04-30,2013-06-23,2013-06-16,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-21,2013-01-01,2013-04-01,2013-04-01,2013-04-21,0,-2,-7,-31,-220,0,-2,-8,-31,-32,41384,111,21,21,1,17,5912,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-27,21-Apr-2013,Apr 21st 2013,Sun 04-21-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-21,2013-04-15,2013-04-21,Sun ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,17,2013,2013-04-21,2013-04-27,Y,Wk.17 - 13,2013-04-21 00:00:00,2013-04-27 00:00:00,2013W17 ,2013W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2013,N,2012-04-21,2011-04-21,2013-01-21,2012-10-21,2013-03-21,2013-02-21,2013-04-14,2013-04-07,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-16,2013-01-01,2013-10-01,2013-11-01,2013-11-10,0,0,0,-2,-11,0,0,-1,-2,-2,41593,320,47,16,7,46,5941,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-16,16-Nov-2013,Nov 16th 2013,Sat 11-16-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-10,2013-11-11,2013-11-16,Sat ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,46,2013,2013-11-10,2013-11-16,N,Wk.46 - 13,2013-11-10 00:00:00,2013-11-16 00:00:00,2013W46 ,2013W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2013,N,2012-11-16,2011-11-16,2013-08-16,2013-05-16,2013-10-16,2013-09-16,2013-11-09,2013-11-02,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-26,2013-01-01,2013-07-01,2013-07-01,2013-07-21,0,-1,-4,-18,-124,0,-1,-5,-18,-18,41480,207,26,26,6,30,5925,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-27,26-Jul-2013,Jul 26th 2013,Fri 07-26-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-21,2013-07-22,2013-07-26,Fri ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,30,2013,2013-07-21,2013-07-27,N,Wk.30 - 13,2013-07-21 00:00:00,2013-07-27 00:00:00,2013W30 ,2013W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2013,N,2012-07-26,2011-07-26,2013-04-26,2013-01-26,2013-06-26,2013-05-26,2013-07-19,2013-07-12,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-04,2013-01-01,2013-04-01,2013-05-01,2013-04-28,0,-2,-6,-30,-207,0,-2,-7,-30,-30,41397,124,34,4,7,18,5913,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-04,04-May-2013,May 4th 2013,Sat 05-04-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-04-28,2013-04-29,2013-05-04,Sat ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,18,2013,2013-04-28,2013-05-04,N,Wk.18 - 13,2013-04-28 00:00:00,2013-05-04 00:00:00,2013W18 ,2013W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2013,N,2012-05-04,2011-05-04,2013-02-04,2012-11-04,2013-04-04,2013-03-04,2013-04-27,2013-04-20,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-21,2013-01-01,2013-01-01,2013-01-01,2013-01-20,0,-3,-10,-44,-310,0,-3,-11,-44,-44,41294,21,21,21,2,4,5899,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-26,21-Jan-2013,Jan 21st 2013,Mon 01-21-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-20,2013-01-21,2013-01-21,Mon ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,4,2013,2013-01-20,2013-01-26,N,Wk.04 - 13,2013-01-20 00:00:00,2013-01-26 00:00:00,2013W04 ,2013W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2013,N,2012-01-21,2011-01-21,2012-10-21,2012-07-21,2012-12-21,2012-11-21,2013-01-14,2013-01-07,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-17,2013-01-01,2013-10-01,2013-12-01,2013-12-15,0,0,1,3,20,0,0,0,3,3,41624,351,78,17,3,51,5946,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-21,17-Dec-2013,Dec 17th 2013,Tue 12-17-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-15,2013-12-16,2013-12-17,Tue ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,51,2013,2013-12-15,2013-12-21,N,Wk.51 - 13,2013-12-15 00:00:00,2013-12-21 00:00:00,2013W51 ,2013W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2013,N,2012-12-17,2011-12-17,2013-09-17,2013-06-17,2013-11-17,2013-10-17,2013-12-10,2013-12-03,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-12,2013-01-01,2013-07-01,2013-09-01,2013-09-08,0,-1,-2,-11,-76,0,-1,-3,-11,-11,41528,255,74,12,5,37,5932,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-14,12-Sep-2013,Sep 12th 2013,Thu 09-12-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-08,2013-09-09,2013-09-12,Thu ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,37,2013,2013-09-08,2013-09-14,N,Wk.37 - 13,2013-09-08 00:00:00,2013-09-14 00:00:00,2013W37 ,2013W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2013,N,2012-09-12,2011-09-12,2013-06-12,2013-03-12,2013-08-12,2013-07-12,2013-09-05,2013-08-29,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-22,2013-01-01,2013-07-01,2013-07-01,2013-07-21,0,-1,-4,-18,-128,0,-1,-5,-18,-18,41476,203,22,22,2,30,5925,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-27,22-Jul-2013,Jul 22nd 2013,Mon 07-22-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-21,2013-07-22,2013-07-22,Mon ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,30,2013,2013-07-21,2013-07-27,N,Wk.30 - 13,2013-07-21 00:00:00,2013-07-27 00:00:00,2013W30 ,2013W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2013,N,2012-07-22,2011-07-22,2013-04-22,2013-01-22,2013-06-22,2013-05-22,2013-07-15,2013-07-08,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-13,2013-01-01,2013-10-01,2013-10-01,2013-10-13,0,0,-1,-6,-45,0,0,-2,-6,-7,41559,286,13,13,1,42,5937,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-19,13-Oct-2013,Oct 13th 2013,Sun 10-13-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-13,2013-10-07,2013-10-13,Sun ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,42,2013,2013-10-13,2013-10-19,Y,Wk.42 - 13,2013-10-13 00:00:00,2013-10-19 00:00:00,2013W42 ,2013W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2013,N,2012-10-13,2011-10-13,2013-07-13,2013-04-13,2013-09-13,2013-08-13,2013-10-06,2013-09-29,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-11,2013-01-01,2013-07-01,2013-08-01,2013-08-11,0,-1,-3,-15,-108,0,-1,-4,-15,-16,41496,223,42,11,1,33,5928,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-17,11-Aug-2013,Aug 11th 2013,Sun 08-11-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-11,2013-08-05,2013-08-11,Sun ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,33,2013,2013-08-11,2013-08-17,Y,Wk.33 - 13,2013-08-11 00:00:00,2013-08-17 00:00:00,2013W33 ,2013W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2013,N,2012-08-11,2011-08-11,2013-05-11,2013-02-11,2013-07-11,2013-06-11,2013-08-04,2013-07-28,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-08,2013-01-01,2013-07-01,2013-08-01,2013-08-04,0,-1,-3,-16,-111,0,-1,-4,-16,-16,41493,220,39,8,5,32,5927,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-10,08-Aug-2013,Aug 8th 2013,Thu 08-08-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-04,2013-08-05,2013-08-08,Thu ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,32,2013,2013-08-04,2013-08-10,N,Wk.32 - 13,2013-08-04 00:00:00,2013-08-10 00:00:00,2013W32 ,2013W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2013,N,2012-08-08,2011-08-08,2013-05-08,2013-02-08,2013-07-08,2013-06-08,2013-08-01,2013-07-25,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-28,2013-01-01,2013-04-01,2013-06-01,2013-06-23,0,-2,-5,-22,-152,0,-2,-6,-22,-22,41452,179,89,28,6,26,5921,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-29,28-Jun-2013,Jun 28th 2013,Fri 06-28-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-23,2013-06-24,2013-06-28,Fri ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,26,2013,2013-06-23,2013-06-29,N,Wk.26 - 13,2013-06-23 00:00:00,2013-06-29 00:00:00,2013W26 ,2013W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2013,N,2012-06-28,2011-06-28,2013-03-28,2012-12-28,2013-05-28,2013-04-28,2013-06-21,2013-06-14,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-17,2013-01-01,2013-01-01,2013-02-01,2013-02-17,0,-3,-9,-40,-283,0,-3,-10,-40,-41,41321,48,48,17,1,8,5903,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-23,17-Feb-2013,Feb 17th 2013,Sun 02-17-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-17,2013-02-11,2013-02-17,Sun ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,8,2013,2013-02-17,2013-02-23,Y,Wk.08 - 13,2013-02-17 00:00:00,2013-02-23 00:00:00,2013W08 ,2013W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2013,N,2012-02-17,2011-02-17,2012-11-17,2012-08-17,2013-01-17,2012-12-17,2013-02-10,2013-02-03,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-03,2013-01-01,2013-07-01,2013-07-01,2013-06-30,0,-1,-4,-21,-147,0,-1,-5,-21,-21,41457,184,3,3,4,27,5922,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-06,03-Jul-2013,Jul 3rd 2013,Wed 07-03-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-06-30,2013-07-01,2013-07-03,Wed ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,27,2013,2013-06-30,2013-07-06,N,Wk.27 - 13,2013-06-30 00:00:00,2013-07-06 00:00:00,2013W27 ,2013W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2013,N,2012-07-03,2011-07-03,2013-04-03,2013-01-03,2013-06-03,2013-05-03,2013-06-26,2013-06-19,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-05,2013-01-01,2013-04-01,2013-06-01,2013-06-02,0,-2,-5,-25,-175,0,-2,-6,-25,-25,41429,156,66,5,4,23,5918,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-08,05-Jun-2013,Jun 5th 2013,Wed 06-05-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-02,2013-06-03,2013-06-05,Wed ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,23,2013,2013-06-02,2013-06-08,N,Wk.23 - 13,2013-06-02 00:00:00,2013-06-08 00:00:00,2013W23 ,2013W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2013,N,2012-06-05,2011-06-05,2013-03-05,2012-12-05,2013-05-05,2013-04-05,2013-05-29,2013-05-22,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-23,2013-01-01,2013-04-01,2013-05-01,2013-05-19,0,-2,-6,-27,-188,0,-2,-7,-27,-27,41416,143,53,23,5,21,5916,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-25,23-May-2013,May 23rd 2013,Thu 05-23-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-19,2013-05-20,2013-05-23,Thu ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,21,2013,2013-05-19,2013-05-25,N,Wk.21 - 13,2013-05-19 00:00:00,2013-05-25 00:00:00,2013W21 ,2013W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2013,N,2012-05-23,2011-05-23,2013-02-23,2012-11-23,2013-04-23,2013-03-23,2013-05-16,2013-05-09,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-06,2013-01-01,2013-04-01,2013-06-01,2013-06-02,0,-2,-5,-25,-174,0,-2,-6,-25,-25,41430,157,67,6,5,23,5918,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-08,06-Jun-2013,Jun 6th 2013,Thu 06-06-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-02,2013-06-03,2013-06-06,Thu ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,23,2013,2013-06-02,2013-06-08,N,Wk.23 - 13,2013-06-02 00:00:00,2013-06-08 00:00:00,2013W23 ,2013W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2013,N,2012-06-06,2011-06-06,2013-03-06,2012-12-06,2013-05-06,2013-04-06,2013-05-30,2013-05-23,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-23,2013-01-01,2013-04-01,2013-04-01,2013-04-21,0,-2,-7,-31,-218,0,-2,-8,-31,-31,41386,113,23,23,3,17,5912,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-27,23-Apr-2013,Apr 23rd 2013,Tue 04-23-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-21,2013-04-22,2013-04-23,Tue ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,17,2013,2013-04-21,2013-04-27,N,Wk.17 - 13,2013-04-21 00:00:00,2013-04-27 00:00:00,2013W17 ,2013W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2013,N,2012-04-23,2011-04-23,2013-01-23,2012-10-23,2013-03-23,2013-02-23,2013-04-16,2013-04-09,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-13,2013-01-01,2013-07-01,2013-08-01,2013-08-11,0,-1,-3,-15,-106,0,-1,-4,-15,-15,41498,225,44,13,3,33,5928,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-17,13-Aug-2013,Aug 13th 2013,Tue 08-13-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-11,2013-08-12,2013-08-13,Tue ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,33,2013,2013-08-11,2013-08-17,N,Wk.33 - 13,2013-08-11 00:00:00,2013-08-17 00:00:00,2013W33 ,2013W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2013,N,2012-08-13,2011-08-13,2013-05-13,2013-02-13,2013-07-13,2013-06-13,2013-08-06,2013-07-30,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-14,2013-01-01,2013-10-01,2013-11-01,2013-11-10,0,0,0,-2,-13,0,0,-1,-2,-2,41591,318,45,14,5,46,5941,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-16,14-Nov-2013,Nov 14th 2013,Thu 11-14-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-10,2013-11-11,2013-11-14,Thu ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,46,2013,2013-11-10,2013-11-16,N,Wk.46 - 13,2013-11-10 00:00:00,2013-11-16 00:00:00,2013W46 ,2013W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2013,N,2012-11-14,2011-11-14,2013-08-14,2013-05-14,2013-10-14,2013-09-14,2013-11-07,2013-10-31,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-09,2013-01-01,2013-07-01,2013-08-01,2013-08-04,0,-1,-3,-16,-110,0,-1,-4,-16,-16,41494,221,40,9,6,32,5927,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-10,09-Aug-2013,Aug 9th 2013,Fri 08-09-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-04,2013-08-05,2013-08-09,Fri ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,32,2013,2013-08-04,2013-08-10,N,Wk.32 - 13,2013-08-04 00:00:00,2013-08-10 00:00:00,2013W32 ,2013W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2013,N,2012-08-09,2011-08-09,2013-05-09,2013-02-09,2013-07-09,2013-06-09,2013-08-02,2013-07-26,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-10,2013-01-01,2013-07-01,2013-09-01,2013-09-08,0,-1,-2,-11,-78,0,-1,-3,-11,-11,41526,253,72,10,3,37,5932,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-14,10-Sep-2013,Sep 10th 2013,Tue 09-10-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-08,2013-09-09,2013-09-10,Tue ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,37,2013,2013-09-08,2013-09-14,N,Wk.37 - 13,2013-09-08 00:00:00,2013-09-14 00:00:00,2013W37 ,2013W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2013,N,2012-09-10,2011-09-10,2013-06-10,2013-03-10,2013-08-10,2013-07-10,2013-09-03,2013-08-27,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-08,2013-01-01,2013-01-01,2013-03-01,2013-03-03,0,-3,-8,-38,-264,0,-3,-9,-38,-38,41340,67,67,8,6,10,5905,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-09,08-Mar-2013,Mar 8th 2013,Fri 03-08-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-03,2013-03-04,2013-03-08,Fri ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,10,2013,2013-03-03,2013-03-09,N,Wk.10 - 13,2013-03-03 00:00:00,2013-03-09 00:00:00,2013W10 ,2013W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2013,N,2012-03-08,2011-03-08,2012-12-08,2012-09-08,2013-02-08,2013-01-08,2013-03-01,2013-02-22,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-01,2013-01-01,2013-04-01,2013-04-01,2013-03-31,0,-2,-7,-34,-240,0,-2,-8,-34,-34,41364,91,1,1,2,14,5909,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-06,01-Apr-2013,Apr 1st 2013,Mon 04-01-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-03-31,2013-04-01,2013-04-01,Mon ,2013M04,Apr-2013,Y,2013M04 ,Y,Year 2013 - Quarter 02,2013Q02 ,Y,14,2013,2013-03-31,2013-04-06,N,Wk.14 - 13,2013-03-31 00:00:00,2013-04-06 00:00:00,2013W14 ,2013W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2013,N,2012-04-01,2011-04-01,2013-01-01,2012-10-01,2013-03-01,2013-02-01,2013-03-25,2013-03-18,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-25,2013-01-01,2013-01-01,2013-01-01,2013-01-20,0,-3,-10,-44,-306,0,-3,-11,-44,-44,41298,25,25,25,6,4,5899,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-26,25-Jan-2013,Jan 25th 2013,Fri 01-25-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-20,2013-01-21,2013-01-25,Fri ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,4,2013,2013-01-20,2013-01-26,N,Wk.04 - 13,2013-01-20 00:00:00,2013-01-26 00:00:00,2013W04 ,2013W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2013,N,2012-01-25,2011-01-25,2012-10-25,2012-07-25,2012-12-25,2012-11-25,2013-01-18,2013-01-11,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-24,2013-01-01,2013-04-01,2013-06-01,2013-06-23,0,-2,-5,-22,-156,0,-2,-6,-22,-22,41448,175,85,24,2,26,5921,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-29,24-Jun-2013,Jun 24th 2013,Mon 06-24-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-23,2013-06-24,2013-06-24,Mon ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,26,2013,2013-06-23,2013-06-29,N,Wk.26 - 13,2013-06-23 00:00:00,2013-06-29 00:00:00,2013W26 ,2013W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2013,N,2012-06-24,2011-06-24,2013-03-24,2012-12-24,2013-05-24,2013-04-24,2013-06-17,2013-06-10,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-15,2013-01-01,2013-07-01,2013-08-01,2013-08-11,0,-1,-3,-15,-104,0,-1,-4,-15,-15,41500,227,46,15,5,33,5928,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-17,15-Aug-2013,Aug 15th 2013,Thu 08-15-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-11,2013-08-12,2013-08-15,Thu ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,33,2013,2013-08-11,2013-08-17,N,Wk.33 - 13,2013-08-11 00:00:00,2013-08-17 00:00:00,2013W33 ,2013W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2013,N,2012-08-15,2011-08-15,2013-05-15,2013-02-15,2013-07-15,2013-06-15,2013-08-08,2013-08-01,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-17,2013-01-01,2013-01-01,2013-01-01,2013-01-13,0,-3,-10,-45,-314,0,-3,-11,-45,-45,41290,17,17,17,5,3,5898,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-19,17-Jan-2013,Jan 17th 2013,Thu 01-17-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-13,2013-01-14,2013-01-17,Thu ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,3,2013,2013-01-13,2013-01-19,N,Wk.03 - 13,2013-01-13 00:00:00,2013-01-19 00:00:00,2013W03 ,2013W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2013,N,2012-01-17,2011-01-17,2012-10-17,2012-07-17,2012-12-17,2012-11-17,2013-01-10,2013-01-03,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-11,2013-01-01,2013-10-01,2013-10-01,2013-10-06,0,0,-1,-7,-47,0,0,-2,-7,-7,41557,284,11,11,6,41,5936,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-12,11-Oct-2013,Oct 11th 2013,Fri 10-11-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-06,2013-10-07,2013-10-11,Fri ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,41,2013,2013-10-06,2013-10-12,N,Wk.41 - 13,2013-10-06 00:00:00,2013-10-12 00:00:00,2013W41 ,2013W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2013,N,2012-10-11,2011-10-11,2013-07-11,2013-04-11,2013-09-11,2013-08-11,2013-10-04,2013-09-27,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-22,2013-01-01,2013-04-01,2013-05-01,2013-05-19,0,-2,-6,-27,-189,0,-2,-7,-27,-27,41415,142,52,22,4,21,5916,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-25,22-May-2013,May 22nd 2013,Wed 05-22-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-19,2013-05-20,2013-05-22,Wed ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,21,2013,2013-05-19,2013-05-25,N,Wk.21 - 13,2013-05-19 00:00:00,2013-05-25 00:00:00,2013W21 ,2013W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2013,N,2012-05-22,2011-05-22,2013-02-22,2012-11-22,2013-04-22,2013-03-22,2013-05-15,2013-05-08,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-18,2013-01-01,2013-10-01,2013-12-01,2013-12-15,0,0,1,3,21,0,0,0,3,3,41625,352,79,18,4,51,5946,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-21,18-Dec-2013,Dec 18th 2013,Wed 12-18-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-15,2013-12-16,2013-12-18,Wed ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,51,2013,2013-12-15,2013-12-21,N,Wk.51 - 13,2013-12-15 00:00:00,2013-12-21 00:00:00,2013W51 ,2013W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2013,N,2012-12-18,2011-12-18,2013-09-18,2013-06-18,2013-11-18,2013-10-18,2013-12-11,2013-12-04,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-27,2013-01-01,2013-07-01,2013-08-01,2013-08-25,0,-1,-3,-13,-92,0,-1,-3,-13,-13,41512,239,58,27,3,35,5930,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-31,27-Aug-2013,Aug 27th 2013,Tue 08-27-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-08-25,2013-08-25,2013-08-26,2013-08-27,Tue ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,35,2013,2013-08-25,2013-08-31,N,Wk.35 - 13,2013-08-25 00:00:00,2013-08-31 00:00:00,2013W35 ,2013W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2013,N,2012-08-27,2011-08-27,2013-05-27,2013-02-27,2013-07-27,2013-06-27,2013-08-20,2013-08-13,0,0,1,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-28,2013-01-01,2013-07-01,2013-08-01,2013-08-25,0,-1,-3,-13,-91,0,-1,-3,-13,-13,41513,240,59,28,4,35,5930,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-31,28-Aug-2013,Aug 28th 2013,Wed 08-28-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-08-25,2013-08-25,2013-08-26,2013-08-28,Wed ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,35,2013,2013-08-25,2013-08-31,N,Wk.35 - 13,2013-08-25 00:00:00,2013-08-31 00:00:00,2013W35 ,2013W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2013,N,2012-08-28,2011-08-28,2013-05-28,2013-02-28,2013-07-28,2013-06-28,2013-08-21,2013-08-14,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-29,2013-01-01,2013-01-01,2013-01-01,2013-01-27,0,-3,-10,-43,-302,0,-3,-10,-43,-43,41302,29,29,29,3,5,5900,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-02-02,29-Jan-2013,Jan 29th 2013,Tue 01-29-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-01-27,2013-01-27,2013-01-28,2013-01-29,Tue ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,5,2013,2013-01-27,2013-02-02,N,Wk.05 - 13,2013-01-27 00:00:00,2013-02-02 00:00:00,2013W05 ,2013W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2013,N,2012-01-29,2011-01-29,2012-10-29,2012-07-29,2012-12-29,2012-11-29,2013-01-22,2013-01-15,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-20,2013-01-01,2013-01-01,2013-03-01,2013-03-17,0,-3,-8,-36,-252,0,-3,-9,-36,-36,41352,79,79,20,4,12,5907,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-23,20-Mar-2013,Mar 20th 2013,Wed 03-20-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-17,2013-03-18,2013-03-20,Wed ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,12,2013,2013-03-17,2013-03-23,N,Wk.12 - 13,2013-03-17 00:00:00,2013-03-23 00:00:00,2013W12 ,2013W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2013,N,2012-03-20,2011-03-20,2012-12-20,2012-09-20,2013-02-20,2013-01-20,2013-03-13,2013-03-06,0,0,0,0,0,0,0,0,3,1,12,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-28,2013-01-01,2013-07-01,2013-09-01,2013-09-22,0,-1,-2,-9,-60,0,-1,-3,-9,-9,41544,271,90,28,7,39,5934,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-28,28-Sep-2013,Sep 28th 2013,Sat 09-28-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-22,2013-09-23,2013-09-28,Sat ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,39,2013,2013-09-22,2013-09-28,N,Wk.39 - 13,2013-09-22 00:00:00,2013-09-28 00:00:00,2013W39 ,2013W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2013,N,2012-09-28,2011-09-28,2013-06-28,2013-03-28,2013-08-28,2013-07-28,2013-09-21,2013-09-14,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-02,2013-01-01,2013-04-01,2013-04-01,2013-03-31,0,-2,-7,-34,-239,0,-2,-8,-34,-34,41365,92,2,2,3,14,5909,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-06,02-Apr-2013,Apr 2nd 2013,Tue 04-02-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-03-31,2013-04-01,2013-04-02,Tue ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,14,2013,2013-03-31,2013-04-06,N,Wk.14 - 13,2013-03-31 00:00:00,2013-04-06 00:00:00,2013W14 ,2013W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2013,N,2012-04-02,2011-04-02,2013-01-02,2012-10-02,2013-03-02,2013-02-02,2013-03-26,2013-03-19,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-12,2013-01-01,2013-10-01,2013-12-01,2013-12-08,0,0,1,2,15,0,0,0,2,2,41619,346,73,12,5,50,5945,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-14,12-Dec-2013,Dec 12th 2013,Thu 12-12-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-08,2013-12-09,2013-12-12,Thu ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,50,2013,2013-12-08,2013-12-14,N,Wk.50 - 13,2013-12-08 00:00:00,2013-12-14 00:00:00,2013W50 ,2013W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2013,N,2012-12-12,2011-12-12,2013-09-12,2013-06-12,2013-11-12,2013-10-12,2013-12-05,2013-11-28,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-31,2013-01-01,2013-01-01,2013-01-01,2013-01-27,0,-3,-10,-43,-300,0,-3,-10,-43,-43,41304,31,31,31,5,5,5900,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-02-02,31-Jan-2013,Jan 31st 2013,Thu 01-31-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-01-27,2013-01-27,2013-01-28,2013-01-31,Thu ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,5,2013,2013-01-27,2013-02-02,N,Wk.05 - 13,2013-01-27 00:00:00,2013-02-02 00:00:00,2013W05 ,2013W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2013,N,2012-01-31,2011-01-31,2012-10-31,2012-07-31,2012-12-31,2012-11-30,2013-01-24,2013-01-17,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-22,2013-01-01,2013-04-01,2013-06-01,2013-06-16,0,-2,-5,-23,-158,0,-2,-6,-23,-23,41446,173,83,22,7,25,5920,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-22,22-Jun-2013,Jun 22nd 2013,Sat 06-22-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-16,2013-06-17,2013-06-22,Sat ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,25,2013,2013-06-16,2013-06-22,N,Wk.25 - 13,2013-06-16 00:00:00,2013-06-22 00:00:00,2013W25 ,2013W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2013,N,2012-06-22,2011-06-22,2013-03-22,2012-12-22,2013-05-22,2013-04-22,2013-06-15,2013-06-08,0,0,0,0,0,0,0,0,6,2,25,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-08,2013-01-01,2013-07-01,2013-09-01,2013-09-08,0,-1,-2,-11,-80,0,-1,-3,-11,-12,41524,251,70,8,1,37,5932,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-14,08-Sep-2013,Sep 8th 2013,Sun 09-08-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-08,2013-09-02,2013-09-08,Sun ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,37,2013,2013-09-08,2013-09-14,Y,Wk.37 - 13,2013-09-08 00:00:00,2013-09-14 00:00:00,2013W37 ,2013W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2013,N,2012-09-08,2011-09-08,2013-06-08,2013-03-08,2013-08-08,2013-07-08,2013-09-01,2013-08-25,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-15,2013-01-01,2013-01-01,2013-02-01,2013-02-10,0,-3,-9,-41,-285,0,-3,-10,-41,-41,41319,46,46,15,6,7,5902,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-16,15-Feb-2013,Feb 15th 2013,Fri 02-15-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-10,2013-02-11,2013-02-15,Fri ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,7,2013,2013-02-10,2013-02-16,N,Wk.07 - 13,2013-02-10 00:00:00,2013-02-16 00:00:00,2013W07 ,2013W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2013,N,2012-02-15,2011-02-15,2012-11-15,2012-08-15,2013-01-15,2012-12-15,2013-02-08,2013-02-01,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-20,2013-01-01,2013-01-01,2013-02-01,2013-02-17,0,-3,-9,-40,-280,0,-3,-10,-40,-40,41324,51,51,20,4,8,5903,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-23,20-Feb-2013,Feb 20th 2013,Wed 02-20-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-17,2013-02-18,2013-02-20,Wed ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,8,2013,2013-02-17,2013-02-23,N,Wk.08 - 13,2013-02-17 00:00:00,2013-02-23 00:00:00,2013W08 ,2013W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2013,N,2012-02-20,2011-02-20,2012-11-20,2012-08-20,2013-01-20,2012-12-20,2013-02-13,2013-02-06,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-18,2013-01-01,2013-04-01,2013-04-01,2013-04-14,0,-2,-7,-32,-223,0,-2,-8,-32,-32,41381,108,18,18,5,16,5911,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-20,18-Apr-2013,Apr 18th 2013,Thu 04-18-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-14,2013-04-15,2013-04-18,Thu ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,16,2013,2013-04-14,2013-04-20,N,Wk.16 - 13,2013-04-14 00:00:00,2013-04-20 00:00:00,2013W16 ,2013W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2013,N,2012-04-18,2011-04-18,2013-01-18,2012-10-18,2013-03-18,2013-02-18,2013-04-11,2013-04-04,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-03,2013-01-01,2013-04-01,2013-06-01,2013-06-02,0,-2,-5,-25,-177,0,-2,-6,-25,-25,41427,154,64,3,2,23,5918,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-08,03-Jun-2013,Jun 3rd 2013,Mon 06-03-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-02,2013-06-03,2013-06-03,Mon ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,23,2013,2013-06-02,2013-06-08,N,Wk.23 - 13,2013-06-02 00:00:00,2013-06-08 00:00:00,2013W23 ,2013W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2013,N,2012-06-03,2011-06-03,2013-03-03,2012-12-03,2013-05-03,2013-04-03,2013-05-27,2013-05-20,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-18,2013-01-01,2013-07-01,2013-09-01,2013-09-15,0,-1,-2,-10,-70,0,-1,-3,-10,-10,41534,261,80,18,4,38,5933,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-21,18-Sep-2013,Sep 18th 2013,Wed 09-18-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-15,2013-09-16,2013-09-18,Wed ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,38,2013,2013-09-15,2013-09-21,N,Wk.38 - 13,2013-09-15 00:00:00,2013-09-21 00:00:00,2013W38 ,2013W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2013,N,2012-09-18,2011-09-18,2013-06-18,2013-03-18,2013-08-18,2013-07-18,2013-09-11,2013-09-04,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-29,2013-01-01,2013-01-01,2013-03-01,2013-03-24,0,-3,-8,-35,-243,0,-3,-9,-35,-35,41361,88,88,29,6,13,5908,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-30,29-Mar-2013,Mar 29th 2013,Fri 03-29-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-24,2013-03-25,2013-03-29,Fri ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,13,2013,2013-03-24,2013-03-30,N,Wk.13 - 13,2013-03-24 00:00:00,2013-03-30 00:00:00,2013W13 ,2013W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2013,N,2012-03-29,2011-03-29,2012-12-29,2012-09-29,2013-02-28,2013-01-29,2013-03-22,2013-03-15,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-30,2013-01-01,2013-07-01,2013-08-01,2013-08-25,0,-1,-3,-13,-89,0,-1,-3,-13,-13,41515,242,61,30,6,35,5930,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-31,30-Aug-2013,Aug 30th 2013,Fri 08-30-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-08-25,2013-08-25,2013-08-26,2013-08-30,Fri ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,35,2013,2013-08-25,2013-08-31,N,Wk.35 - 13,2013-08-25 00:00:00,2013-08-31 00:00:00,2013W35 ,2013W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2013,N,2012-08-30,2011-08-30,2013-05-30,2013-02-28,2013-07-30,2013-06-30,2013-08-23,2013-08-16,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-29,2013-01-01,2013-07-01,2013-08-01,2013-08-25,0,-1,-3,-13,-90,0,-1,-3,-13,-13,41514,241,60,29,5,35,5930,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-31,29-Aug-2013,Aug 29th 2013,Thu 08-29-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-08-25,2013-08-25,2013-08-26,2013-08-29,Thu ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,35,2013,2013-08-25,2013-08-31,N,Wk.35 - 13,2013-08-25 00:00:00,2013-08-31 00:00:00,2013W35 ,2013W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2013,N,2012-08-29,2011-08-29,2013-05-29,2013-02-28,2013-07-29,2013-06-29,2013-08-22,2013-08-15,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-20,2013-01-01,2013-07-01,2013-07-01,2013-07-14,0,-1,-4,-19,-130,0,-1,-5,-19,-19,41474,201,20,20,7,29,5924,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-20,20-Jul-2013,Jul 20th 2013,Sat 07-20-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-14,2013-07-15,2013-07-20,Sat ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,29,2013,2013-07-14,2013-07-20,N,Wk.29 - 13,2013-07-14 00:00:00,2013-07-20 00:00:00,2013W29 ,2013W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2013,N,2012-07-20,2011-07-20,2013-04-20,2013-01-20,2013-06-20,2013-05-20,2013-07-13,2013-07-06,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-20,2013-01-01,2013-07-01,2013-09-01,2013-09-15,0,-1,-2,-10,-68,0,-1,-3,-10,-10,41536,263,82,20,6,38,5933,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-21,20-Sep-2013,Sep 20th 2013,Fri 09-20-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-15,2013-09-16,2013-09-20,Fri ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,38,2013,2013-09-15,2013-09-21,N,Wk.38 - 13,2013-09-15 00:00:00,2013-09-21 00:00:00,2013W38 ,2013W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2013,N,2012-09-20,2011-09-20,2013-06-20,2013-03-20,2013-08-20,2013-07-20,2013-09-13,2013-09-06,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-23,2013-01-01,2013-07-01,2013-07-01,2013-07-21,0,-1,-4,-18,-127,0,-1,-5,-18,-18,41477,204,23,23,3,30,5925,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-27,23-Jul-2013,Jul 23rd 2013,Tue 07-23-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-21,2013-07-22,2013-07-23,Tue ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,30,2013,2013-07-21,2013-07-27,N,Wk.30 - 13,2013-07-21 00:00:00,2013-07-27 00:00:00,2013W30 ,2013W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2013,N,2012-07-23,2011-07-23,2013-04-23,2013-01-23,2013-06-23,2013-05-23,2013-07-16,2013-07-09,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-19,2013-01-01,2013-04-01,2013-05-01,2013-05-19,0,-2,-6,-27,-192,0,-2,-7,-27,-28,41412,139,49,19,1,21,5916,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-25,19-May-2013,May 19th 2013,Sun 05-19-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-19,2013-05-13,2013-05-19,Sun ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,21,2013,2013-05-19,2013-05-25,Y,Wk.21 - 13,2013-05-19 00:00:00,2013-05-25 00:00:00,2013W21 ,2013W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2013,N,2012-05-19,2011-05-19,2013-02-19,2012-11-19,2013-04-19,2013-03-19,2013-05-12,2013-05-05,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-05,2013-01-01,2013-04-01,2013-05-01,2013-05-05,0,-2,-6,-29,-206,0,-2,-7,-29,-30,41398,125,35,5,1,19,5914,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-11,05-May-2013,May 5th 2013,Sun 05-05-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-05,2013-04-29,2013-05-05,Sun ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,19,2013,2013-05-05,2013-05-11,Y,Wk.19 - 13,2013-05-05 00:00:00,2013-05-11 00:00:00,2013W19 ,2013W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2013,N,2012-05-05,2011-05-05,2013-02-05,2012-11-05,2013-04-05,2013-03-05,2013-04-28,2013-04-21,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-16,2013-01-01,2013-10-01,2013-10-01,2013-10-13,0,0,-1,-6,-42,0,0,-2,-6,-6,41562,289,16,16,4,42,5937,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-19,16-Oct-2013,Oct 16th 2013,Wed 10-16-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-13,2013-10-14,2013-10-16,Wed ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,42,2013,2013-10-13,2013-10-19,N,Wk.42 - 13,2013-10-13 00:00:00,2013-10-19 00:00:00,2013W42 ,2013W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2013,N,2012-10-16,2011-10-16,2013-07-16,2013-04-16,2013-09-16,2013-08-16,2013-10-09,2013-10-02,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-01,2013-01-01,2013-10-01,2013-11-01,2013-10-27,0,0,0,-4,-26,0,0,-1,-4,-4,41578,305,32,1,6,44,5939,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-02,01-Nov-2013,Nov 1st 2013,Fri 11-01-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-10-27,2013-10-28,2013-11-01,Fri ,2013M11,Nov-2013,Y,2013M11 ,Y,Year 2013 - Quarter 04,2013Q04 ,N,44,2013,2013-10-27,2013-11-02,N,Wk.44 - 13,2013-10-27 00:00:00,2013-11-02 00:00:00,2013W44 ,2013W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2013,N,2012-11-01,2011-11-01,2013-08-01,2013-05-01,2013-10-01,2013-09-01,2013-10-25,2013-10-18,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-08,2013-01-01,2013-04-01,2013-05-01,2013-05-05,0,-2,-6,-29,-203,0,-2,-7,-29,-29,41401,128,38,8,4,19,5914,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-11,08-May-2013,May 8th 2013,Wed 05-08-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-05,2013-05-06,2013-05-08,Wed ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,19,2013,2013-05-05,2013-05-11,N,Wk.19 - 13,2013-05-05 00:00:00,2013-05-11 00:00:00,2013W19 ,2013W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2013,N,2012-05-08,2011-05-08,2013-02-08,2012-11-08,2013-04-08,2013-03-08,2013-05-01,2013-04-24,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-21,2013-01-01,2013-01-01,2013-02-01,2013-02-17,0,-3,-9,-40,-279,0,-3,-10,-40,-40,41325,52,52,21,5,8,5903,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-23,21-Feb-2013,Feb 21st 2013,Thu 02-21-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-17,2013-02-18,2013-02-21,Thu ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,8,2013,2013-02-17,2013-02-23,N,Wk.08 - 13,2013-02-17 00:00:00,2013-02-23 00:00:00,2013W08 ,2013W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2013,N,2012-02-21,2011-02-21,2012-11-21,2012-08-21,2013-01-21,2012-12-21,2013-02-14,2013-02-07,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-27,2013-01-01,2013-07-01,2013-09-01,2013-09-22,0,-1,-2,-9,-61,0,-1,-3,-9,-9,41543,270,89,27,6,39,5934,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-28,27-Sep-2013,Sep 27th 2013,Fri 09-27-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-22,2013-09-23,2013-09-27,Fri ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,39,2013,2013-09-22,2013-09-28,N,Wk.39 - 13,2013-09-22 00:00:00,2013-09-28 00:00:00,2013W39 ,2013W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2013,N,2012-09-27,2011-09-27,2013-06-27,2013-03-27,2013-08-27,2013-07-27,2013-09-20,2013-09-13,0,0,0,0,0,1,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-09,2013-01-01,2013-07-01,2013-07-01,2013-07-07,0,-1,-4,-20,-141,0,-1,-5,-20,-20,41463,190,9,9,3,28,5923,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-13,09-Jul-2013,Jul 9th 2013,Tue 07-09-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-07,2013-07-08,2013-07-09,Tue ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,28,2013,2013-07-07,2013-07-13,N,Wk.28 - 13,2013-07-07 00:00:00,2013-07-13 00:00:00,2013W28 ,2013W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2013,N,2012-07-09,2011-07-09,2013-04-09,2013-01-09,2013-06-09,2013-05-09,2013-07-02,2013-06-25,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-04,2013-01-01,2013-10-01,2013-10-01,2013-09-29,0,0,-1,-8,-54,0,0,-2,-8,-8,41550,277,4,4,6,40,5935,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-05,04-Oct-2013,Oct 4th 2013,Fri 10-04-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-09-29,2013-09-30,2013-10-04,Fri ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,40,2013,2013-09-29,2013-10-05,N,Wk.40 - 13,2013-09-29 00:00:00,2013-10-05 00:00:00,2013W40 ,2013W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2013,N,2012-10-04,2011-10-04,2013-07-04,2013-04-04,2013-09-04,2013-08-04,2013-09-27,2013-09-20,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-09,2013-01-01,2013-07-01,2013-09-01,2013-09-08,0,-1,-2,-11,-79,0,-1,-3,-11,-11,41525,252,71,9,2,37,5932,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-14,09-Sep-2013,Sep 9th 2013,Mon 09-09-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-08,2013-09-09,2013-09-09,Mon ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,37,2013,2013-09-08,2013-09-14,N,Wk.37 - 13,2013-09-08 00:00:00,2013-09-14 00:00:00,2013W37 ,2013W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2013,N,2012-09-09,2011-09-09,2013-06-09,2013-03-09,2013-08-09,2013-07-09,2013-09-02,2013-08-26,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-01,2013-01-01,2013-04-01,2013-05-01,2013-04-28,0,-2,-6,-30,-210,0,-2,-7,-30,-30,41394,121,31,1,4,18,5913,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-04,01-May-2013,May 1st 2013,Wed 05-01-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-04-28,2013-04-29,2013-05-01,Wed ,2013M05,May-2013,Y,2013M05 ,Y,Year 2013 - Quarter 02,2013Q02 ,N,18,2013,2013-04-28,2013-05-04,N,Wk.18 - 13,2013-04-28 00:00:00,2013-05-04 00:00:00,2013W18 ,2013W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2013,N,2012-05-01,2011-05-01,2013-02-01,2012-11-01,2013-04-01,2013-03-01,2013-04-24,2013-04-17,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-29,2013-01-01,2013-07-01,2013-09-01,2013-09-29,0,-1,-2,-8,-59,0,0,-2,-8,-9,41545,272,91,29,1,40,5935,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-10-05,29-Sep-2013,Sep 29th 2013,Sun 09-29-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-09-29,2013-09-29,2013-09-23,2013-09-29,Sun ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,40,2013,2013-09-29,2013-10-05,Y,Wk.40 - 13,2013-09-29 00:00:00,2013-10-05 00:00:00,2013W40 ,2013W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2013,N,2012-09-29,2011-09-29,2013-06-29,2013-03-29,2013-08-29,2013-07-29,2013-09-22,2013-09-15,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-02,2013-01-01,2013-04-01,2013-05-01,2013-04-28,0,-2,-6,-30,-209,0,-2,-7,-30,-30,41395,122,32,2,5,18,5913,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-04,02-May-2013,May 2nd 2013,Thu 05-02-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-04-28,2013-04-29,2013-05-02,Thu ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,18,2013,2013-04-28,2013-05-04,N,Wk.18 - 13,2013-04-28 00:00:00,2013-05-04 00:00:00,2013W18 ,2013W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2013,N,2012-05-02,2011-05-02,2013-02-02,2012-11-02,2013-04-02,2013-03-02,2013-04-25,2013-04-18,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-17,2013-01-01,2013-10-01,2013-10-01,2013-10-13,0,0,-1,-6,-41,0,0,-2,-6,-6,41563,290,17,17,5,42,5937,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-19,17-Oct-2013,Oct 17th 2013,Thu 10-17-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-13,2013-10-14,2013-10-17,Thu ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,42,2013,2013-10-13,2013-10-19,N,Wk.42 - 13,2013-10-13 00:00:00,2013-10-19 00:00:00,2013W42 ,2013W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2013,N,2012-10-17,2011-10-17,2013-07-17,2013-04-17,2013-09-17,2013-08-17,2013-10-10,2013-10-03,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-01,2013-01-01,2013-04-01,2013-06-01,2013-05-26,0,-2,-5,-26,-179,0,-2,-6,-26,-26,41425,152,62,1,7,22,5917,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-01,01-Jun-2013,Jun 1st 2013,Sat 06-01-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-05-26,2013-05-27,2013-06-01,Sat ,2013M06,Jun-2013,Y,2013M06 ,Y,Year 2013 - Quarter 02,2013Q02 ,N,22,2013,2013-05-26,2013-06-01,N,Wk.22 - 13,2013-05-26 00:00:00,2013-06-01 00:00:00,2013W22 ,2013W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2013,N,2012-06-01,2011-06-01,2013-03-01,2012-12-01,2013-05-01,2013-04-01,2013-05-25,2013-05-18,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-21,2013-01-01,2013-04-01,2013-05-01,2013-05-19,0,-2,-6,-27,-190,0,-2,-7,-27,-27,41414,141,51,21,3,21,5916,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-25,21-May-2013,May 21st 2013,Tue 05-21-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-19,2013-05-20,2013-05-21,Tue ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,21,2013,2013-05-19,2013-05-25,N,Wk.21 - 13,2013-05-19 00:00:00,2013-05-25 00:00:00,2013W21 ,2013W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2013,N,2012-05-21,2011-05-21,2013-02-21,2012-11-21,2013-04-21,2013-03-21,2013-05-14,2013-05-07,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-30,2013-01-01,2013-10-01,2013-10-01,2013-10-27,0,0,-1,-4,-28,0,0,-1,-4,-4,41576,303,30,30,4,44,5939,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-11-02,30-Oct-2013,Oct 30th 2013,Wed 10-30-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-10-27,2013-10-27,2013-10-28,2013-10-30,Wed ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,44,2013,2013-10-27,2013-11-02,N,Wk.44 - 13,2013-10-27 00:00:00,2013-11-02 00:00:00,2013W44 ,2013W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2013,N,2012-10-30,2011-10-30,2013-07-30,2013-04-30,2013-09-30,2013-08-30,2013-10-23,2013-10-16,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-11,2013-01-01,2013-01-01,2013-01-01,2013-01-06,0,-3,-10,-46,-320,0,-3,-11,-46,-46,41284,11,11,11,6,2,5897,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-12,11-Jan-2013,Jan 11th 2013,Fri 01-11-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-06,2013-01-07,2013-01-11,Fri ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,2,2013,2013-01-06,2013-01-12,N,Wk.02 - 13,2013-01-06 00:00:00,2013-01-12 00:00:00,2013W02 ,2013W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2013,N,2012-01-11,2011-01-11,2012-10-11,2012-07-11,2012-12-11,2012-11-11,2013-01-04,2012-12-28,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-25,2013-01-01,2013-01-01,2013-03-01,2013-03-24,0,-3,-8,-35,-247,0,-3,-9,-35,-35,41357,84,84,25,2,13,5908,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-30,25-Mar-2013,Mar 25th 2013,Mon 03-25-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-24,2013-03-25,2013-03-25,Mon ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,13,2013,2013-03-24,2013-03-30,N,Wk.13 - 13,2013-03-24 00:00:00,2013-03-30 00:00:00,2013W13 ,2013W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2013,N,2012-03-25,2011-03-25,2012-12-25,2012-09-25,2013-02-25,2013-01-25,2013-03-18,2013-03-11,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-16,2013-01-01,2013-04-01,2013-04-01,2013-04-14,0,-2,-7,-32,-225,0,-2,-8,-32,-32,41379,106,16,16,3,16,5911,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-20,16-Apr-2013,Apr 16th 2013,Tue 04-16-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-14,2013-04-15,2013-04-16,Tue ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,16,2013,2013-04-14,2013-04-20,N,Wk.16 - 13,2013-04-14 00:00:00,2013-04-20 00:00:00,2013W16 ,2013W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2013,N,2012-04-16,2011-04-16,2013-01-16,2012-10-16,2013-03-16,2013-02-16,2013-04-09,2013-04-02,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-20,2013-01-01,2013-04-01,2013-06-01,2013-06-16,0,-2,-5,-23,-160,0,-2,-6,-23,-23,41444,171,81,20,5,25,5920,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-22,20-Jun-2013,Jun 20th 2013,Thu 06-20-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-16,2013-06-17,2013-06-20,Thu ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,25,2013,2013-06-16,2013-06-22,N,Wk.25 - 13,2013-06-16 00:00:00,2013-06-22 00:00:00,2013W25 ,2013W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2013,N,2012-06-20,2011-06-20,2013-03-20,2012-12-20,2013-05-20,2013-04-20,2013-06-13,2013-06-06,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-19,2013-01-01,2013-01-01,2013-02-01,2013-02-17,0,-3,-9,-40,-281,0,-3,-10,-40,-40,41323,50,50,19,3,8,5903,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-23,19-Feb-2013,Feb 19th 2013,Tue 02-19-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-17,2013-02-18,2013-02-19,Tue ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,8,2013,2013-02-17,2013-02-23,N,Wk.08 - 13,2013-02-17 00:00:00,2013-02-23 00:00:00,2013W08 ,2013W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2013,N,2012-02-19,2011-02-19,2012-11-19,2012-08-19,2013-01-19,2012-12-19,2013-02-12,2013-02-05,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-09,2013-01-01,2013-04-01,2013-04-01,2013-04-07,0,-2,-7,-33,-232,0,-2,-8,-33,-33,41372,99,9,9,3,15,5910,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-13,09-Apr-2013,Apr 9th 2013,Tue 04-09-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-07,2013-04-08,2013-04-09,Tue ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,15,2013,2013-04-07,2013-04-13,N,Wk.15 - 13,2013-04-07 00:00:00,2013-04-13 00:00:00,2013W15 ,2013W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2013,N,2012-04-09,2011-04-09,2013-01-09,2012-10-09,2013-03-09,2013-02-09,2013-04-02,2013-03-26,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-03,2013-01-01,2013-01-01,2013-02-01,2013-02-03,0,-3,-9,-42,-297,0,-3,-10,-42,-43,41307,34,34,3,1,6,5901,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-09,03-Feb-2013,Feb 3rd 2013,Sun 02-03-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-03,2013-01-28,2013-02-03,Sun ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,6,2013,2013-02-03,2013-02-09,Y,Wk.06 - 13,2013-02-03 00:00:00,2013-02-09 00:00:00,2013W06 ,2013W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2013,N,2012-02-03,2011-02-03,2012-11-03,2012-08-03,2013-01-03,2012-12-03,2013-01-27,2013-01-20,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-27,2013-01-01,2013-07-01,2013-07-01,2013-07-21,0,-1,-4,-18,-123,0,-1,-5,-18,-18,41481,208,27,27,7,30,5925,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-27,27-Jul-2013,Jul 27th 2013,Sat 07-27-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-21,2013-07-22,2013-07-27,Sat ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,30,2013,2013-07-21,2013-07-27,N,Wk.30 - 13,2013-07-21 00:00:00,2013-07-27 00:00:00,2013W30 ,2013W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2013,N,2012-07-27,2011-07-27,2013-04-27,2013-01-27,2013-06-27,2013-05-27,2013-07-20,2013-07-13,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-20,2013-01-01,2013-04-01,2013-05-01,2013-05-19,0,-2,-6,-27,-191,0,-2,-7,-27,-27,41413,140,50,20,2,21,5916,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-25,20-May-2013,May 20th 2013,Mon 05-20-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-19,2013-05-20,2013-05-20,Mon ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,21,2013,2013-05-19,2013-05-25,N,Wk.21 - 13,2013-05-19 00:00:00,2013-05-25 00:00:00,2013W21 ,2013W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2013,N,2012-05-20,2011-05-20,2013-02-20,2012-11-20,2013-04-20,2013-03-20,2013-05-13,2013-05-06,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-25,2013-01-01,2013-04-01,2013-04-01,2013-04-21,0,-2,-7,-31,-216,0,-2,-8,-31,-31,41388,115,25,25,5,17,5912,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-27,25-Apr-2013,Apr 25th 2013,Thu 04-25-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-21,2013-04-22,2013-04-25,Thu ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,17,2013,2013-04-21,2013-04-27,N,Wk.17 - 13,2013-04-21 00:00:00,2013-04-27 00:00:00,2013W17 ,2013W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2013,N,2012-04-25,2011-04-25,2013-01-25,2012-10-25,2013-03-25,2013-02-25,2013-04-18,2013-04-11,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-07,2013-01-01,2013-04-01,2013-05-01,2013-05-05,0,-2,-6,-29,-204,0,-2,-7,-29,-29,41400,127,37,7,3,19,5914,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-11,07-May-2013,May 7th 2013,Tue 05-07-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-05,2013-05-06,2013-05-07,Tue ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,19,2013,2013-05-05,2013-05-11,N,Wk.19 - 13,2013-05-05 00:00:00,2013-05-11 00:00:00,2013W19 ,2013W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2013,N,2012-05-07,2011-05-07,2013-02-07,2012-11-07,2013-04-07,2013-03-07,2013-04-30,2013-04-23,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-05,2013-01-01,2013-07-01,2013-09-01,2013-09-01,0,-1,-2,-12,-83,0,-1,-3,-12,-12,41521,248,67,5,5,36,5931,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-07,05-Sep-2013,Sep 5th 2013,Thu 09-05-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-01,2013-09-02,2013-09-05,Thu ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,36,2013,2013-09-01,2013-09-07,N,Wk.36 - 13,2013-09-01 00:00:00,2013-09-07 00:00:00,2013W36 ,2013W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2013,N,2012-09-05,2011-09-05,2013-06-05,2013-03-05,2013-08-05,2013-07-05,2013-08-29,2013-08-22,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-16,2013-01-01,2013-01-01,2013-03-01,2013-03-10,0,-3,-8,-37,-256,0,-3,-9,-37,-37,41348,75,75,16,7,11,5906,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-16,16-Mar-2013,Mar 16th 2013,Sat 03-16-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-10,2013-03-11,2013-03-16,Sat ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,11,2013,2013-03-10,2013-03-16,N,Wk.11 - 13,2013-03-10 00:00:00,2013-03-16 00:00:00,2013W11 ,2013W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2013,N,2012-03-16,2011-03-16,2012-12-16,2012-09-16,2013-02-16,2013-01-16,2013-03-09,2013-03-02,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-17,2013-01-01,2013-04-01,2013-05-01,2013-05-12,0,-2,-6,-28,-194,0,-2,-7,-28,-28,41410,137,47,17,6,20,5915,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-18,17-May-2013,May 17th 2013,Fri 05-17-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-12,2013-05-13,2013-05-17,Fri ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,20,2013,2013-05-12,2013-05-18,N,Wk.20 - 13,2013-05-12 00:00:00,2013-05-18 00:00:00,2013W20 ,2013W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2013,N,2012-05-17,2011-05-17,2013-02-17,2012-11-17,2013-04-17,2013-03-17,2013-05-10,2013-05-03,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-23,2013-01-01,2013-07-01,2013-08-01,2013-08-18,0,-1,-3,-14,-96,0,-1,-4,-14,-14,41508,235,54,23,6,34,5929,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-24,23-Aug-2013,Aug 23rd 2013,Fri 08-23-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-18,2013-08-19,2013-08-23,Fri ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,34,2013,2013-08-18,2013-08-24,N,Wk.34 - 13,2013-08-18 00:00:00,2013-08-24 00:00:00,2013W34 ,2013W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2013,N,2012-08-23,2011-08-23,2013-05-23,2013-02-23,2013-07-23,2013-06-23,2013-08-16,2013-08-09,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-07,2013-01-01,2013-07-01,2013-09-01,2013-09-01,0,-1,-2,-12,-81,0,-1,-3,-12,-12,41523,250,69,7,7,36,5931,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-07,07-Sep-2013,Sep 7th 2013,Sat 09-07-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-01,2013-09-02,2013-09-07,Sat ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,36,2013,2013-09-01,2013-09-07,N,Wk.36 - 13,2013-09-01 00:00:00,2013-09-07 00:00:00,2013W36 ,2013W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2013,N,2012-09-07,2011-09-07,2013-06-07,2013-03-07,2013-08-07,2013-07-07,2013-08-31,2013-08-24,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-06,2013-01-01,2013-07-01,2013-09-01,2013-09-01,0,-1,-2,-12,-82,0,-1,-3,-12,-12,41522,249,68,6,6,36,5931,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-07,06-Sep-2013,Sep 6th 2013,Fri 09-06-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-01,2013-09-02,2013-09-06,Fri ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,36,2013,2013-09-01,2013-09-07,N,Wk.36 - 13,2013-09-01 00:00:00,2013-09-07 00:00:00,2013W36 ,2013W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2013,N,2012-09-06,2011-09-06,2013-06-06,2013-03-06,2013-08-06,2013-07-06,2013-08-30,2013-08-23,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-03,2013-01-01,2013-04-01,2013-05-01,2013-04-28,0,-2,-6,-30,-208,0,-2,-7,-30,-30,41396,123,33,3,6,18,5913,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-04,03-May-2013,May 3rd 2013,Fri 05-03-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-04-28,2013-04-29,2013-05-03,Fri ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,18,2013,2013-04-28,2013-05-04,N,Wk.18 - 13,2013-04-28 00:00:00,2013-05-04 00:00:00,2013W18 ,2013W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2013,N,2012-05-03,2011-05-03,2013-02-03,2012-11-03,2013-04-03,2013-03-03,2013-04-26,2013-04-19,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-04,2013-01-01,2013-10-01,2013-12-01,2013-12-01,0,0,1,1,7,0,0,0,1,1,41611,338,65,4,4,49,5944,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-07,04-Dec-2013,Dec 4th 2013,Wed 12-04-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-01,2013-12-02,2013-12-04,Wed ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,49,2013,2013-12-01,2013-12-07,N,Wk.49 - 13,2013-12-01 00:00:00,2013-12-07 00:00:00,2013W49 ,2013W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2013,N,2012-12-04,2011-12-04,2013-09-04,2013-06-04,2013-11-04,2013-10-04,2013-11-27,2013-11-20,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2014-01-01,2014-01-01,2014-01-01,2014-01-01,2014-01-01,1,1,2,6,35,1,1,1,5,5,41639,1,1,1,4,1,5948,1,1,1369,1,457,115,2014-12-31,2014-03-31,2014-01-31,2014-01-04,01-Jan-2014,Jan 1st 2014,Wed 01-01-14,0,0,0,0,2013-12-21,365,90,31,4,2013-12-29,2013-12-29,2013-12-29,2013-12-29,2013-12-30,2014-01-01,Wed ,2014M01,Jan-2014,Y,2014M01 ,Y,Year 2014 - Quarter 01,2014Q01 ,Y,1,2014,2013-12-29,2014-01-04,Y,Wk.01 - 14,2014-01-01 00:00:00,2014-01-04 00:00:00,2014W01 ,2014W01 ,01/01/14 - 01/04/14,01/01 - 01/04,2014,Y,2013-01-01,2012-01-01,2013-10-01,2013-07-01,2013-12-01,2013-11-01,2013-12-25,2013-12-18,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-19,2013-01-01,2013-10-01,2013-11-01,2013-11-17,0,0,0,-1,-8,0,0,-1,-1,-1,41596,323,50,19,3,47,5942,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-23,19-Nov-2013,Nov 19th 2013,Tue 11-19-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-17,2013-11-18,2013-11-19,Tue ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,47,2013,2013-11-17,2013-11-23,N,Wk.47 - 13,2013-11-17 00:00:00,2013-11-23 00:00:00,2013W47 ,2013W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2013,N,2012-11-19,2011-11-19,2013-08-19,2013-05-19,2013-10-19,2013-09-19,2013-11-12,2013-11-05,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-18,2013-01-01,2013-01-01,2013-03-01,2013-03-17,0,-3,-8,-36,-254,0,-3,-9,-36,-36,41350,77,77,18,2,12,5907,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-23,18-Mar-2013,Mar 18th 2013,Mon 03-18-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-17,2013-03-18,2013-03-18,Mon ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,12,2013,2013-03-17,2013-03-23,N,Wk.12 - 13,2013-03-17 00:00:00,2013-03-23 00:00:00,2013W12 ,2013W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2013,N,2012-03-18,2011-03-18,2012-12-18,2012-09-18,2013-02-18,2013-01-18,2013-03-11,2013-03-04,0,0,0,0,0,0,0,0,3,1,12,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-11,2013-01-01,2013-07-01,2013-07-01,2013-07-07,0,-1,-4,-20,-139,0,-1,-5,-20,-20,41465,192,11,11,5,28,5923,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-13,11-Jul-2013,Jul 11th 2013,Thu 07-11-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-07,2013-07-08,2013-07-11,Thu ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,28,2013,2013-07-07,2013-07-13,N,Wk.28 - 13,2013-07-07 00:00:00,2013-07-13 00:00:00,2013W28 ,2013W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2013,N,2012-07-11,2011-07-11,2013-04-11,2013-01-11,2013-06-11,2013-05-11,2013-07-04,2013-06-27,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-07,2013-01-01,2013-04-01,2013-04-01,2013-04-07,0,-2,-7,-33,-234,0,-2,-8,-33,-34,41370,97,7,7,1,15,5910,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-13,07-Apr-2013,Apr 7th 2013,Sun 04-07-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-07,2013-04-01,2013-04-07,Sun ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,15,2013,2013-04-07,2013-04-13,Y,Wk.15 - 13,2013-04-07 00:00:00,2013-04-13 00:00:00,2013W15 ,2013W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2013,N,2012-04-07,2011-04-07,2013-01-07,2012-10-07,2013-03-07,2013-02-07,2013-03-31,2013-03-24,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-11,2013-01-01,2013-10-01,2013-12-01,2013-12-08,0,0,1,2,14,0,0,0,2,2,41618,345,72,11,4,50,5945,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-14,11-Dec-2013,Dec 11th 2013,Wed 12-11-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-08,2013-12-09,2013-12-11,Wed ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,50,2013,2013-12-08,2013-12-14,N,Wk.50 - 13,2013-12-08 00:00:00,2013-12-14 00:00:00,2013W50 ,2013W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2013,N,2012-12-11,2011-12-11,2013-09-11,2013-06-11,2013-11-11,2013-10-11,2013-12-04,2013-11-27,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-26,2013-01-01,2013-10-01,2013-10-01,2013-10-20,0,0,-1,-5,-32,0,0,-2,-5,-5,41572,299,26,26,7,43,5938,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-26,26-Oct-2013,Oct 26th 2013,Sat 10-26-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-20,2013-10-21,2013-10-26,Sat ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,43,2013,2013-10-20,2013-10-26,N,Wk.43 - 13,2013-10-20 00:00:00,2013-10-26 00:00:00,2013W43 ,2013W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2013,N,2012-10-26,2011-10-26,2013-07-26,2013-04-26,2013-09-26,2013-08-26,2013-10-19,2013-10-12,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-20,2013-01-01,2013-01-01,2013-01-01,2013-01-20,0,-3,-10,-44,-311,0,-3,-11,-44,-45,41293,20,20,20,1,4,5899,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-26,20-Jan-2013,Jan 20th 2013,Sun 01-20-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-20,2013-01-14,2013-01-20,Sun ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,4,2013,2013-01-20,2013-01-26,Y,Wk.04 - 13,2013-01-20 00:00:00,2013-01-26 00:00:00,2013W04 ,2013W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2013,N,2012-01-20,2011-01-20,2012-10-20,2012-07-20,2012-12-20,2012-11-20,2013-01-13,2013-01-06,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-27,2013-01-01,2013-04-01,2013-06-01,2013-06-23,0,-2,-5,-22,-153,0,-2,-6,-22,-22,41451,178,88,27,5,26,5921,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-29,27-Jun-2013,Jun 27th 2013,Thu 06-27-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-23,2013-06-24,2013-06-27,Thu ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,26,2013,2013-06-23,2013-06-29,N,Wk.26 - 13,2013-06-23 00:00:00,2013-06-29 00:00:00,2013W26 ,2013W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2013,N,2012-06-27,2011-06-27,2013-03-27,2012-12-27,2013-05-27,2013-04-27,2013-06-20,2013-06-13,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-16,2013-01-01,2013-07-01,2013-09-01,2013-09-15,0,-1,-2,-10,-72,0,-1,-3,-10,-10,41532,259,78,16,2,38,5933,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-21,16-Sep-2013,Sep 16th 2013,Mon 09-16-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-15,2013-09-16,2013-09-16,Mon ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,38,2013,2013-09-15,2013-09-21,N,Wk.38 - 13,2013-09-15 00:00:00,2013-09-21 00:00:00,2013W38 ,2013W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2013,N,2012-09-16,2011-09-16,2013-06-16,2013-03-16,2013-08-16,2013-07-16,2013-09-09,2013-09-02,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-20,2013-01-01,2013-04-01,2013-04-01,2013-04-14,0,-2,-7,-32,-221,0,-2,-8,-32,-32,41383,110,20,20,7,16,5911,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-20,20-Apr-2013,Apr 20th 2013,Sat 04-20-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-14,2013-04-15,2013-04-20,Sat ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,16,2013,2013-04-14,2013-04-20,N,Wk.16 - 13,2013-04-14 00:00:00,2013-04-20 00:00:00,2013W16 ,2013W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2013,N,2012-04-20,2011-04-20,2013-01-20,2012-10-20,2013-03-20,2013-02-20,2013-04-13,2013-04-06,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-14,2013-01-01,2013-04-01,2013-04-01,2013-04-14,0,-2,-7,-32,-227,0,-2,-8,-32,-33,41377,104,14,14,1,16,5911,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-20,14-Apr-2013,Apr 14th 2013,Sun 04-14-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-14,2013-04-08,2013-04-14,Sun ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,16,2013,2013-04-14,2013-04-20,Y,Wk.16 - 13,2013-04-14 00:00:00,2013-04-20 00:00:00,2013W16 ,2013W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2013,N,2012-04-14,2011-04-14,2013-01-14,2012-10-14,2013-03-14,2013-02-14,2013-04-07,2013-03-31,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-28,2013-01-01,2013-10-01,2013-10-01,2013-10-27,0,0,-1,-4,-30,0,0,-1,-4,-4,41574,301,28,28,2,44,5939,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-11-02,28-Oct-2013,Oct 28th 2013,Mon 10-28-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-10-27,2013-10-27,2013-10-28,2013-10-28,Mon ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,44,2013,2013-10-27,2013-11-02,N,Wk.44 - 13,2013-10-27 00:00:00,2013-11-02 00:00:00,2013W44 ,2013W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2013,N,2012-10-28,2011-10-28,2013-07-28,2013-04-28,2013-09-28,2013-08-28,2013-10-21,2013-10-14,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-08,2013-01-01,2013-01-01,2013-01-01,2013-01-06,0,-3,-10,-46,-323,0,-3,-11,-46,-46,41281,8,8,8,3,2,5897,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-12,08-Jan-2013,Jan 8th 2013,Tue 01-08-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-06,2013-01-07,2013-01-08,Tue ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,2,2013,2013-01-06,2013-01-12,N,Wk.02 - 13,2013-01-06 00:00:00,2013-01-12 00:00:00,2013W02 ,2013W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2013,N,2012-01-08,2011-01-08,2012-10-08,2012-07-08,2012-12-08,2012-11-08,2013-01-01,2012-12-25,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-13,2013-01-01,2013-01-01,2013-03-01,2013-03-10,0,-3,-8,-37,-259,0,-3,-9,-37,-37,41345,72,72,13,4,11,5906,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-16,13-Mar-2013,Mar 13th 2013,Wed 03-13-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-10,2013-03-11,2013-03-13,Wed ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,11,2013,2013-03-10,2013-03-16,N,Wk.11 - 13,2013-03-10 00:00:00,2013-03-16 00:00:00,2013W11 ,2013W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2013,N,2012-03-13,2011-03-13,2012-12-13,2012-09-13,2013-02-13,2013-01-13,2013-03-06,2013-02-27,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-28,2013-01-01,2013-04-01,2013-05-01,2013-05-26,0,-2,-6,-26,-183,0,-2,-6,-26,-26,41421,148,58,28,3,22,5917,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-06-01,28-May-2013,May 28th 2013,Tue 05-28-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-05-26,2013-05-26,2013-05-27,2013-05-28,Tue ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,22,2013,2013-05-26,2013-06-01,N,Wk.22 - 13,2013-05-26 00:00:00,2013-06-01 00:00:00,2013W22 ,2013W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2013,N,2012-05-28,2011-05-28,2013-02-28,2012-11-28,2013-04-28,2013-03-28,2013-05-21,2013-05-14,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-14,2013-01-01,2013-01-01,2013-01-01,2013-01-13,0,-3,-10,-45,-317,0,-3,-11,-45,-45,41287,14,14,14,2,3,5898,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-19,14-Jan-2013,Jan 14th 2013,Mon 01-14-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-13,2013-01-14,2013-01-14,Mon ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,3,2013,2013-01-13,2013-01-19,N,Wk.03 - 13,2013-01-13 00:00:00,2013-01-19 00:00:00,2013W03 ,2013W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2013,N,2012-01-14,2011-01-14,2012-10-14,2012-07-14,2012-12-14,2012-11-14,2013-01-07,2012-12-31,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-30,2013-01-01,2013-04-01,2013-04-01,2013-04-28,0,-2,-7,-30,-211,0,-2,-7,-30,-30,41393,120,30,30,3,18,5913,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-05-04,30-Apr-2013,Apr 30th 2013,Tue 04-30-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-04-28,2013-04-28,2013-04-29,2013-04-30,Tue ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,18,2013,2013-04-28,2013-05-04,N,Wk.18 - 13,2013-04-28 00:00:00,2013-05-04 00:00:00,2013W18 ,2013W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2013,N,2012-04-30,2011-04-30,2013-01-30,2012-10-30,2013-03-30,2013-02-28,2013-04-23,2013-04-16,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-14,2013-01-01,2013-07-01,2013-07-01,2013-07-14,0,-1,-4,-19,-136,0,-1,-5,-19,-20,41468,195,14,14,1,29,5924,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-20,14-Jul-2013,Jul 14th 2013,Sun 07-14-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-14,2013-07-08,2013-07-14,Sun ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,29,2013,2013-07-14,2013-07-20,Y,Wk.29 - 13,2013-07-14 00:00:00,2013-07-20 00:00:00,2013W29 ,2013W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2013,N,2012-07-14,2011-07-14,2013-04-14,2013-01-14,2013-06-14,2013-05-14,2013-07-07,2013-06-30,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-24,2013-01-01,2013-07-01,2013-07-01,2013-07-21,0,-1,-4,-18,-126,0,-1,-5,-18,-18,41478,205,24,24,4,30,5925,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-27,24-Jul-2013,Jul 24th 2013,Wed 07-24-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-21,2013-07-22,2013-07-24,Wed ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,30,2013,2013-07-21,2013-07-27,N,Wk.30 - 13,2013-07-21 00:00:00,2013-07-27 00:00:00,2013W30 ,2013W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2013,N,2012-07-24,2011-07-24,2013-04-24,2013-01-24,2013-06-24,2013-05-24,2013-07-17,2013-07-10,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-04,2013-01-01,2013-07-01,2013-09-01,2013-09-01,0,-1,-2,-12,-84,0,-1,-3,-12,-12,41520,247,66,4,4,36,5931,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-07,04-Sep-2013,Sep 4th 2013,Wed 09-04-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-01,2013-09-02,2013-09-04,Wed ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,36,2013,2013-09-01,2013-09-07,N,Wk.36 - 13,2013-09-01 00:00:00,2013-09-07 00:00:00,2013W36 ,2013W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2013,N,2012-09-04,2011-09-04,2013-06-04,2013-03-04,2013-08-04,2013-07-04,2013-08-28,2013-08-21,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-18,2013-01-01,2013-10-01,2013-11-01,2013-11-17,0,0,0,-1,-9,0,0,-1,-1,-1,41595,322,49,18,2,47,5942,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-23,18-Nov-2013,Nov 18th 2013,Mon 11-18-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-17,2013-11-18,2013-11-18,Mon ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,47,2013,2013-11-17,2013-11-23,N,Wk.47 - 13,2013-11-17 00:00:00,2013-11-23 00:00:00,2013W47 ,2013W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2013,N,2012-11-18,2011-11-18,2013-08-18,2013-05-18,2013-10-18,2013-09-18,2013-11-11,2013-11-04,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-18,2013-01-01,2013-01-01,2013-02-01,2013-02-17,0,-3,-9,-40,-282,0,-3,-10,-40,-40,41322,49,49,18,2,8,5903,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-23,18-Feb-2013,Feb 18th 2013,Mon 02-18-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-17,2013-02-18,2013-02-18,Mon ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,8,2013,2013-02-17,2013-02-23,N,Wk.08 - 13,2013-02-17 00:00:00,2013-02-23 00:00:00,2013W08 ,2013W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2013,N,2012-02-18,2011-02-18,2012-11-18,2012-08-18,2013-01-18,2012-12-18,2013-02-11,2013-02-04,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-13,2013-01-01,2013-10-01,2013-11-01,2013-11-10,0,0,0,-2,-14,0,0,-1,-2,-2,41590,317,44,13,4,46,5941,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-16,13-Nov-2013,Nov 13th 2013,Wed 11-13-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-10,2013-11-11,2013-11-13,Wed ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,46,2013,2013-11-10,2013-11-16,N,Wk.46 - 13,2013-11-10 00:00:00,2013-11-16 00:00:00,2013W46 ,2013W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2013,N,2012-11-13,2011-11-13,2013-08-13,2013-05-13,2013-10-13,2013-09-13,2013-11-06,2013-10-30,0,0,0,0,0,0,0,1,11,4,46,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-02,2013-01-01,2013-10-01,2013-10-01,2013-09-29,0,0,-1,-8,-56,0,0,-2,-8,-8,41548,275,2,2,4,40,5935,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-05,02-Oct-2013,Oct 2nd 2013,Wed 10-02-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-09-29,2013-09-30,2013-10-02,Wed ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,40,2013,2013-09-29,2013-10-05,N,Wk.40 - 13,2013-09-29 00:00:00,2013-10-05 00:00:00,2013W40 ,2013W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2013,N,2012-10-02,2011-10-02,2013-07-02,2013-04-02,2013-09-02,2013-08-02,2013-09-25,2013-09-18,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-05,2013-01-01,2013-01-01,2013-02-01,2013-02-03,0,-3,-9,-42,-295,0,-3,-10,-42,-42,41309,36,36,5,3,6,5901,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-09,05-Feb-2013,Feb 5th 2013,Tue 02-05-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-03,2013-02-04,2013-02-05,Tue ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,6,2013,2013-02-03,2013-02-09,N,Wk.06 - 13,2013-02-03 00:00:00,2013-02-09 00:00:00,2013W06 ,2013W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2013,N,2012-02-05,2011-02-05,2012-11-05,2012-08-05,2013-01-05,2012-12-05,2013-01-29,2013-01-22,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-02,2013-01-01,2013-04-01,2013-06-01,2013-06-02,0,-2,-5,-25,-178,0,-2,-6,-25,-26,41426,153,63,2,1,23,5918,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-08,02-Jun-2013,Jun 2nd 2013,Sun 06-02-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-02,2013-05-27,2013-06-02,Sun ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,23,2013,2013-06-02,2013-06-08,Y,Wk.23 - 13,2013-06-02 00:00:00,2013-06-08 00:00:00,2013W23 ,2013W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2013,N,2012-06-02,2011-06-02,2013-03-02,2012-12-02,2013-05-02,2013-04-02,2013-05-26,2013-05-19,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-12,2013-01-01,2013-01-01,2013-02-01,2013-02-10,0,-3,-9,-41,-288,0,-3,-10,-41,-41,41316,43,43,12,3,7,5902,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-16,12-Feb-2013,Feb 12th 2013,Tue 02-12-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-10,2013-02-11,2013-02-12,Tue ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,7,2013,2013-02-10,2013-02-16,N,Wk.07 - 13,2013-02-10 00:00:00,2013-02-16 00:00:00,2013W07 ,2013W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2013,N,2012-02-12,2011-02-12,2012-11-12,2012-08-12,2013-01-12,2012-12-12,2013-02-05,2013-01-29,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-23,2013-01-01,2013-10-01,2013-10-01,2013-10-20,0,0,-1,-5,-35,0,0,-2,-5,-5,41569,296,23,23,4,43,5938,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-26,23-Oct-2013,Oct 23rd 2013,Wed 10-23-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-20,2013-10-21,2013-10-23,Wed ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,43,2013,2013-10-20,2013-10-26,N,Wk.43 - 13,2013-10-20 00:00:00,2013-10-26 00:00:00,2013W43 ,2013W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2013,N,2012-10-23,2011-10-23,2013-07-23,2013-04-23,2013-09-23,2013-08-23,2013-10-16,2013-10-09,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-12,2013-01-01,2013-01-01,2013-01-01,2013-01-06,0,-3,-10,-46,-319,0,-3,-11,-46,-46,41285,12,12,12,7,2,5897,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-12,12-Jan-2013,Jan 12th 2013,Sat 01-12-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-06,2013-01-07,2013-01-12,Sat ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,2,2013,2013-01-06,2013-01-12,N,Wk.02 - 13,2013-01-06 00:00:00,2013-01-12 00:00:00,2013W02 ,2013W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2013,N,2012-01-12,2011-01-12,2012-10-12,2012-07-12,2012-12-12,2012-11-12,2013-01-05,2012-12-29,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-04,2013-01-01,2013-04-01,2013-04-01,2013-03-31,0,-2,-7,-34,-237,0,-2,-8,-34,-34,41367,94,4,4,5,14,5909,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-06,04-Apr-2013,Apr 4th 2013,Thu 04-04-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-03-31,2013-04-01,2013-04-04,Thu ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,14,2013,2013-03-31,2013-04-06,N,Wk.14 - 13,2013-03-31 00:00:00,2013-04-06 00:00:00,2013W14 ,2013W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2013,N,2012-04-04,2011-04-04,2013-01-04,2012-10-04,2013-03-04,2013-02-04,2013-03-28,2013-03-21,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-17,2013-01-01,2013-04-01,2013-04-01,2013-04-14,0,-2,-7,-32,-224,0,-2,-8,-32,-32,41380,107,17,17,4,16,5911,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-20,17-Apr-2013,Apr 17th 2013,Wed 04-17-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-14,2013-04-15,2013-04-17,Wed ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,16,2013,2013-04-14,2013-04-20,N,Wk.16 - 13,2013-04-14 00:00:00,2013-04-20 00:00:00,2013W16 ,2013W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2013,N,2012-04-17,2011-04-17,2013-01-17,2012-10-17,2013-03-17,2013-02-17,2013-04-10,2013-04-03,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-21,2013-01-01,2013-04-01,2013-06-01,2013-06-16,0,-2,-5,-23,-159,0,-2,-6,-23,-23,41445,172,82,21,6,25,5920,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-22,21-Jun-2013,Jun 21st 2013,Fri 06-21-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-16,2013-06-17,2013-06-21,Fri ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,25,2013,2013-06-16,2013-06-22,N,Wk.25 - 13,2013-06-16 00:00:00,2013-06-22 00:00:00,2013W25 ,2013W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2013,N,2012-06-21,2011-06-21,2013-03-21,2012-12-21,2013-05-21,2013-04-21,2013-06-14,2013-06-07,0,0,0,0,0,0,0,0,6,2,25,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-15,2013-01-01,2013-10-01,2013-10-01,2013-10-13,0,0,-1,-6,-43,0,0,-2,-6,-6,41561,288,15,15,3,42,5937,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-19,15-Oct-2013,Oct 15th 2013,Tue 10-15-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-13,2013-10-14,2013-10-15,Tue ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,42,2013,2013-10-13,2013-10-19,N,Wk.42 - 13,2013-10-13 00:00:00,2013-10-19 00:00:00,2013W42 ,2013W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2013,N,2012-10-15,2011-10-15,2013-07-15,2013-04-15,2013-09-15,2013-08-15,2013-10-08,2013-10-01,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-01,2013-01-01,2013-07-01,2013-07-01,2013-06-30,0,-1,-4,-21,-149,0,-1,-5,-21,-21,41455,182,1,1,2,27,5922,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-06,01-Jul-2013,Jul 1st 2013,Mon 07-01-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-06-30,2013-07-01,2013-07-01,Mon ,2013M07,Jul-2013,Y,2013M07 ,Y,Year 2013 - Quarter 03,2013Q03 ,Y,27,2013,2013-06-30,2013-07-06,N,Wk.27 - 13,2013-06-30 00:00:00,2013-07-06 00:00:00,2013W27 ,2013W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2013,N,2012-07-01,2011-07-01,2013-04-01,2013-01-01,2013-06-01,2013-05-01,2013-06-24,2013-06-17,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-05,2013-01-01,2013-07-01,2013-07-01,2013-06-30,0,-1,-4,-21,-145,0,-1,-5,-21,-21,41459,186,5,5,6,27,5922,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-06,05-Jul-2013,Jul 5th 2013,Fri 07-05-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-06-30,2013-07-01,2013-07-05,Fri ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,27,2013,2013-06-30,2013-07-06,N,Wk.27 - 13,2013-06-30 00:00:00,2013-07-06 00:00:00,2013W27 ,2013W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2013,N,2012-07-05,2011-07-05,2013-04-05,2013-01-05,2013-06-05,2013-05-05,2013-06-28,2013-06-21,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-25,2013-01-01,2013-07-01,2013-07-01,2013-07-21,0,-1,-4,-18,-125,0,-1,-5,-18,-18,41479,206,25,25,5,30,5925,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-27,25-Jul-2013,Jul 25th 2013,Thu 07-25-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-21,2013-07-22,2013-07-25,Thu ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,30,2013,2013-07-21,2013-07-27,N,Wk.30 - 13,2013-07-21 00:00:00,2013-07-27 00:00:00,2013W30 ,2013W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2013,N,2012-07-25,2011-07-25,2013-04-25,2013-01-25,2013-06-25,2013-05-25,2013-07-18,2013-07-11,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-13,2013-01-01,2013-07-01,2013-09-01,2013-09-08,0,-1,-2,-11,-75,0,-1,-3,-11,-11,41529,256,75,13,6,37,5932,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-14,13-Sep-2013,Sep 13th 2013,Fri 09-13-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-08,2013-09-09,2013-09-13,Fri ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,37,2013,2013-09-08,2013-09-14,N,Wk.37 - 13,2013-09-08 00:00:00,2013-09-14 00:00:00,2013W37 ,2013W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2013,N,2012-09-13,2011-09-13,2013-06-13,2013-03-13,2013-08-13,2013-07-13,2013-09-06,2013-08-30,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-23,2013-01-01,2013-07-01,2013-09-01,2013-09-22,0,-1,-2,-9,-65,0,-1,-3,-9,-9,41539,266,85,23,2,39,5934,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-28,23-Sep-2013,Sep 23rd 2013,Mon 09-23-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-22,2013-09-23,2013-09-23,Mon ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,39,2013,2013-09-22,2013-09-28,N,Wk.39 - 13,2013-09-22 00:00:00,2013-09-28 00:00:00,2013W39 ,2013W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2013,N,2012-09-23,2011-09-23,2013-06-23,2013-03-23,2013-08-23,2013-07-23,2013-09-16,2013-09-09,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-24,2013-01-01,2013-01-01,2013-03-01,2013-03-24,0,-3,-8,-35,-248,0,-3,-9,-35,-36,41356,83,83,24,1,13,5908,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-30,24-Mar-2013,Mar 24th 2013,Sun 03-24-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-24,2013-03-18,2013-03-24,Sun ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,13,2013,2013-03-24,2013-03-30,Y,Wk.13 - 13,2013-03-24 00:00:00,2013-03-30 00:00:00,2013W13 ,2013W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2013,N,2012-03-24,2011-03-24,2012-12-24,2012-09-24,2013-02-24,2013-01-24,2013-03-17,2013-03-10,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-15,2013-01-01,2013-01-01,2013-01-01,2013-01-13,0,-3,-10,-45,-316,0,-3,-11,-45,-45,41288,15,15,15,3,3,5898,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-19,15-Jan-2013,Jan 15th 2013,Tue 01-15-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-13,2013-01-14,2013-01-15,Tue ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,3,2013,2013-01-13,2013-01-19,N,Wk.03 - 13,2013-01-13 00:00:00,2013-01-19 00:00:00,2013W03 ,2013W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2013,N,2012-01-15,2011-01-15,2012-10-15,2012-07-15,2012-12-15,2012-11-15,2013-01-08,2013-01-01,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-07,2013-01-01,2013-10-01,2013-11-01,2013-11-03,0,0,0,-3,-20,0,0,-1,-3,-3,41584,311,38,7,5,45,5940,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-09,07-Nov-2013,Nov 7th 2013,Thu 11-07-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-03,2013-11-04,2013-11-07,Thu ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,45,2013,2013-11-03,2013-11-09,N,Wk.45 - 13,2013-11-03 00:00:00,2013-11-09 00:00:00,2013W45 ,2013W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2013,N,2012-11-07,2011-11-07,2013-08-07,2013-05-07,2013-10-07,2013-09-07,2013-10-31,2013-10-24,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-31,2013-01-01,2013-07-01,2013-08-01,2013-08-25,0,-1,-3,-13,-88,0,-1,-3,-13,-13,41516,243,62,31,7,35,5930,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-31,31-Aug-2013,Aug 31st 2013,Sat 08-31-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-08-25,2013-08-25,2013-08-26,2013-08-31,Sat ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,35,2013,2013-08-25,2013-08-31,N,Wk.35 - 13,2013-08-25 00:00:00,2013-08-31 00:00:00,2013W35 ,2013W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2013,N,2012-08-31,2011-08-31,2013-05-31,2013-02-28,2013-07-31,2013-06-30,2013-08-24,2013-08-17,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-20,2013-01-01,2013-10-01,2013-12-01,2013-12-15,0,0,1,3,23,0,0,0,3,3,41627,354,81,20,6,51,5946,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-21,20-Dec-2013,Dec 20th 2013,Fri 12-20-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-15,2013-12-16,2013-12-20,Fri ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,51,2013,2013-12-15,2013-12-21,N,Wk.51 - 13,2013-12-15 00:00:00,2013-12-21 00:00:00,2013W51 ,2013W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2013,N,2012-12-20,2011-12-20,2013-09-20,2013-06-20,2013-11-20,2013-10-20,2013-12-13,2013-12-06,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-11,2013-01-01,2013-04-01,2013-06-01,2013-06-09,0,-2,-5,-24,-169,0,-2,-6,-24,-24,41435,162,72,11,3,24,5919,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-15,11-Jun-2013,Jun 11th 2013,Tue 06-11-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-09,2013-06-10,2013-06-11,Tue ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,24,2013,2013-06-09,2013-06-15,N,Wk.24 - 13,2013-06-09 00:00:00,2013-06-15 00:00:00,2013W24 ,2013W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2013,N,2012-06-11,2011-06-11,2013-03-11,2012-12-11,2013-05-11,2013-04-11,2013-06-04,2013-05-28,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-01,2013-01-01,2013-07-01,2013-08-01,2013-07-28,0,-1,-3,-17,-118,0,-1,-4,-17,-17,41486,213,32,1,5,31,5926,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-03,01-Aug-2013,Aug 1st 2013,Thu 08-01-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-07-28,2013-07-29,2013-08-01,Thu ,2013M08,Aug-2013,Y,2013M08 ,Y,Year 2013 - Quarter 03,2013Q03 ,N,31,2013,2013-07-28,2013-08-03,N,Wk.31 - 13,2013-07-28 00:00:00,2013-08-03 00:00:00,2013W31 ,2013W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2013,N,2012-08-01,2011-08-01,2013-05-01,2013-02-01,2013-07-01,2013-06-01,2013-07-25,2013-07-18,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-26,2013-01-01,2013-07-01,2013-09-01,2013-09-22,0,-1,-2,-9,-62,0,-1,-3,-9,-9,41542,269,88,26,5,39,5934,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-28,26-Sep-2013,Sep 26th 2013,Thu 09-26-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-22,2013-09-23,2013-09-26,Thu ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,39,2013,2013-09-22,2013-09-28,N,Wk.39 - 13,2013-09-22 00:00:00,2013-09-28 00:00:00,2013W39 ,2013W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2013,N,2012-09-26,2011-09-26,2013-06-26,2013-03-26,2013-08-26,2013-07-26,2013-09-19,2013-09-12,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-16,2013-01-01,2013-01-01,2013-02-01,2013-02-10,0,-3,-9,-41,-284,0,-3,-10,-41,-41,41320,47,47,16,7,7,5902,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-16,16-Feb-2013,Feb 16th 2013,Sat 02-16-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-10,2013-02-11,2013-02-16,Sat ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,7,2013,2013-02-10,2013-02-16,N,Wk.07 - 13,2013-02-10 00:00:00,2013-02-16 00:00:00,2013W07 ,2013W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2013,N,2012-02-16,2011-02-16,2012-11-16,2012-08-16,2013-01-16,2012-12-16,2013-02-09,2013-02-02,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-13,2013-01-01,2013-01-01,2013-01-01,2013-01-13,0,-3,-10,-45,-318,0,-3,-11,-45,-46,41286,13,13,13,1,3,5898,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-19,13-Jan-2013,Jan 13th 2013,Sun 01-13-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-13,2013-01-07,2013-01-13,Sun ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,3,2013,2013-01-13,2013-01-19,Y,Wk.03 - 13,2013-01-13 00:00:00,2013-01-19 00:00:00,2013W03 ,2013W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2013,N,2012-01-13,2011-01-13,2012-10-13,2012-07-13,2012-12-13,2012-11-13,2013-01-06,2012-12-30,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-08,2013-01-01,2013-04-01,2013-06-01,2013-06-02,0,-2,-5,-25,-172,0,-2,-6,-25,-25,41432,159,69,8,7,23,5918,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-08,08-Jun-2013,Jun 8th 2013,Sat 06-08-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-02,2013-06-03,2013-06-08,Sat ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,23,2013,2013-06-02,2013-06-08,N,Wk.23 - 13,2013-06-02 00:00:00,2013-06-08 00:00:00,2013W23 ,2013W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2013,N,2012-06-08,2011-06-08,2013-03-08,2012-12-08,2013-05-08,2013-04-08,2013-06-01,2013-05-25,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-30,2013-01-01,2013-01-01,2013-01-01,2013-01-27,0,-3,-10,-43,-301,0,-3,-10,-43,-43,41303,30,30,30,4,5,5900,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-02-02,30-Jan-2013,Jan 30th 2013,Wed 01-30-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-01-27,2013-01-27,2013-01-28,2013-01-30,Wed ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,5,2013,2013-01-27,2013-02-02,N,Wk.05 - 13,2013-01-27 00:00:00,2013-02-02 00:00:00,2013W05 ,2013W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2013,N,2012-01-30,2011-01-30,2012-10-30,2012-07-30,2012-12-30,2012-11-30,2013-01-23,2013-01-16,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-13,2013-01-01,2013-04-01,2013-06-01,2013-06-09,0,-2,-5,-24,-167,0,-2,-6,-24,-24,41437,164,74,13,5,24,5919,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-15,13-Jun-2013,Jun 13th 2013,Thu 06-13-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-09,2013-06-10,2013-06-13,Thu ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,24,2013,2013-06-09,2013-06-15,N,Wk.24 - 13,2013-06-09 00:00:00,2013-06-15 00:00:00,2013W24 ,2013W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2013,N,2012-06-13,2011-06-13,2013-03-13,2012-12-13,2013-05-13,2013-04-13,2013-06-06,2013-05-30,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-06,2013-01-01,2013-01-01,2013-03-01,2013-03-03,0,-3,-8,-38,-266,0,-3,-9,-38,-38,41338,65,65,6,4,10,5905,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-09,06-Mar-2013,Mar 6th 2013,Wed 03-06-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-03,2013-03-04,2013-03-06,Wed ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,10,2013,2013-03-03,2013-03-09,N,Wk.10 - 13,2013-03-03 00:00:00,2013-03-09 00:00:00,2013W10 ,2013W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2013,N,2012-03-06,2011-03-06,2012-12-06,2012-09-06,2013-02-06,2013-01-06,2013-02-27,2013-02-20,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-15,2013-01-01,2013-01-01,2013-03-01,2013-03-10,0,-3,-8,-37,-257,0,-3,-9,-37,-37,41347,74,74,15,6,11,5906,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-16,15-Mar-2013,Mar 15th 2013,Fri 03-15-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-10,2013-03-11,2013-03-15,Fri ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,11,2013,2013-03-10,2013-03-16,N,Wk.11 - 13,2013-03-10 00:00:00,2013-03-16 00:00:00,2013W11 ,2013W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2013,N,2012-03-15,2011-03-15,2012-12-15,2012-09-15,2013-02-15,2013-01-15,2013-03-08,2013-03-01,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-15,2013-01-01,2013-10-01,2013-12-01,2013-12-15,0,0,1,3,18,0,0,0,3,2,41622,349,76,15,1,51,5946,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-21,15-Dec-2013,Dec 15th 2013,Sun 12-15-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-15,2013-12-09,2013-12-15,Sun ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,51,2013,2013-12-15,2013-12-21,Y,Wk.51 - 13,2013-12-15 00:00:00,2013-12-21 00:00:00,2013W51 ,2013W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2013,N,2012-12-15,2011-12-15,2013-09-15,2013-06-15,2013-11-15,2013-10-15,2013-12-08,2013-12-01,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-19,2013-01-01,2013-04-01,2013-04-01,2013-04-14,0,-2,-7,-32,-222,0,-2,-8,-32,-32,41382,109,19,19,6,16,5911,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-20,19-Apr-2013,Apr 19th 2013,Fri 04-19-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-14,2013-04-15,2013-04-19,Fri ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,16,2013,2013-04-14,2013-04-20,N,Wk.16 - 13,2013-04-14 00:00:00,2013-04-20 00:00:00,2013W16 ,2013W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2013,N,2012-04-19,2011-04-19,2013-01-19,2012-10-19,2013-03-19,2013-02-19,2013-04-12,2013-04-05,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-14,2013-01-01,2013-10-01,2013-12-01,2013-12-08,0,0,1,2,17,0,0,0,2,2,41621,348,75,14,7,50,5945,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-14,14-Dec-2013,Dec 14th 2013,Sat 12-14-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-08,2013-12-09,2013-12-14,Sat ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,50,2013,2013-12-08,2013-12-14,N,Wk.50 - 13,2013-12-08 00:00:00,2013-12-14 00:00:00,2013W50 ,2013W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2013,N,2012-12-14,2011-12-14,2013-09-14,2013-06-14,2013-11-14,2013-10-14,2013-12-07,2013-11-30,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-28,2013-01-01,2013-01-01,2013-02-01,2013-02-24,0,-3,-9,-39,-272,0,-3,-9,-39,-39,41332,59,59,28,5,9,5904,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-03-02,28-Feb-2013,Feb 28th 2013,Thu 02-28-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-02-24,2013-02-24,2013-02-25,2013-02-28,Thu ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,9,2013,2013-02-24,2013-03-02,N,Wk.09 - 13,2013-02-24 00:00:00,2013-03-02 00:00:00,2013W09 ,2013W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2013,N,2012-02-28,2011-02-28,2012-11-28,2012-08-28,2013-01-28,2012-12-28,2013-02-21,2013-02-14,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-26,2013-01-01,2013-01-01,2013-02-01,2013-02-24,0,-3,-9,-39,-274,0,-3,-9,-39,-39,41330,57,57,26,3,9,5904,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-03-02,26-Feb-2013,Feb 26th 2013,Tue 02-26-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-02-24,2013-02-24,2013-02-25,2013-02-26,Tue ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,9,2013,2013-02-24,2013-03-02,N,Wk.09 - 13,2013-02-24 00:00:00,2013-03-02 00:00:00,2013W09 ,2013W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2013,N,2012-02-26,2011-02-26,2012-11-26,2012-08-26,2013-01-26,2012-12-26,2013-02-19,2013-02-12,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-14,2013-01-01,2013-07-01,2013-08-01,2013-08-11,0,-1,-3,-15,-105,0,-1,-4,-15,-15,41499,226,45,14,4,33,5928,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-17,14-Aug-2013,Aug 14th 2013,Wed 08-14-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-11,2013-08-12,2013-08-14,Wed ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,33,2013,2013-08-11,2013-08-17,N,Wk.33 - 13,2013-08-11 00:00:00,2013-08-17 00:00:00,2013W33 ,2013W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2013,N,2012-08-14,2011-08-14,2013-05-14,2013-02-14,2013-07-14,2013-06-14,2013-08-07,2013-07-31,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-23,2013-01-01,2013-04-01,2013-06-01,2013-06-23,0,-2,-5,-22,-157,0,-2,-6,-22,-23,41447,174,84,23,1,26,5921,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-29,23-Jun-2013,Jun 23rd 2013,Sun 06-23-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-23,2013-06-17,2013-06-23,Sun ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,26,2013,2013-06-23,2013-06-29,Y,Wk.26 - 13,2013-06-23 00:00:00,2013-06-29 00:00:00,2013W26 ,2013W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2013,N,2012-06-23,2011-06-23,2013-03-23,2012-12-23,2013-05-23,2013-04-23,2013-06-16,2013-06-09,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-07,2013-01-01,2013-04-01,2013-06-01,2013-06-02,0,-2,-5,-25,-173,0,-2,-6,-25,-25,41431,158,68,7,6,23,5918,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-08,07-Jun-2013,Jun 7th 2013,Fri 06-07-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-02,2013-06-03,2013-06-07,Fri ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,23,2013,2013-06-02,2013-06-08,N,Wk.23 - 13,2013-06-02 00:00:00,2013-06-08 00:00:00,2013W23 ,2013W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2013,N,2012-06-07,2011-06-07,2013-03-07,2012-12-07,2013-05-07,2013-04-07,2013-05-31,2013-05-24,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-08,2013-01-01,2013-10-01,2013-10-01,2013-10-06,0,0,-1,-7,-50,0,0,-2,-7,-7,41554,281,8,8,3,41,5936,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-12,08-Oct-2013,Oct 8th 2013,Tue 10-08-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-06,2013-10-07,2013-10-08,Tue ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,41,2013,2013-10-06,2013-10-12,N,Wk.41 - 13,2013-10-06 00:00:00,2013-10-12 00:00:00,2013W41 ,2013W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2013,N,2012-10-08,2011-10-08,2013-07-08,2013-04-08,2013-09-08,2013-08-08,2013-10-01,2013-09-24,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-12,2013-01-01,2013-10-01,2013-11-01,2013-11-10,0,0,0,-2,-15,0,0,-1,-2,-2,41589,316,43,12,3,46,5941,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-16,12-Nov-2013,Nov 12th 2013,Tue 11-12-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-10,2013-11-11,2013-11-12,Tue ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,46,2013,2013-11-10,2013-11-16,N,Wk.46 - 13,2013-11-10 00:00:00,2013-11-16 00:00:00,2013W46 ,2013W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2013,N,2012-11-12,2011-11-12,2013-08-12,2013-05-12,2013-10-12,2013-09-12,2013-11-05,2013-10-29,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-22,2013-01-01,2013-04-01,2013-04-01,2013-04-21,0,-2,-7,-31,-219,0,-2,-8,-31,-31,41385,112,22,22,2,17,5912,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-27,22-Apr-2013,Apr 22nd 2013,Mon 04-22-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-21,2013-04-22,2013-04-22,Mon ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,17,2013,2013-04-21,2013-04-27,N,Wk.17 - 13,2013-04-21 00:00:00,2013-04-27 00:00:00,2013W17 ,2013W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2013,N,2012-04-22,2011-04-22,2013-01-22,2012-10-22,2013-03-22,2013-02-22,2013-04-15,2013-04-08,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-31,2013-01-01,2013-10-01,2013-10-01,2013-10-27,0,0,-1,-4,-27,0,0,-1,-4,-4,41577,304,31,31,5,44,5939,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-11-02,31-Oct-2013,Oct 31st 2013,Thu 10-31-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-10-27,2013-10-27,2013-10-28,2013-10-31,Thu ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,44,2013,2013-10-27,2013-11-02,N,Wk.44 - 13,2013-10-27 00:00:00,2013-11-02 00:00:00,2013W44 ,2013W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2013,N,2012-10-31,2011-10-31,2013-07-31,2013-04-30,2013-09-30,2013-08-31,2013-10-24,2013-10-17,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-07,2013-01-01,2013-01-01,2013-01-01,2013-01-06,0,-3,-10,-46,-324,0,-3,-11,-46,-46,41280,7,7,7,2,2,5897,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-12,07-Jan-2013,Jan 7th 2013,Mon 01-07-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-06,2013-01-07,2013-01-07,Mon ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,2,2013,2013-01-06,2013-01-12,N,Wk.02 - 13,2013-01-06 00:00:00,2013-01-12 00:00:00,2013W02 ,2013W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2013,N,2012-01-07,2011-01-07,2012-10-07,2012-07-07,2012-12-07,2012-11-07,2012-12-31,2012-12-24,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-25,2013-01-01,2013-10-01,2013-12-01,2013-12-22,0,0,1,4,28,0,0,0,4,4,41632,359,86,25,4,52,5947,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-28,25-Dec-2013,Dec 25th 2013,Wed 12-25-13,0,0,0,0,2013-12-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-22,2013-12-23,2013-12-25,Wed ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,52,2013,2013-12-22,2013-12-28,N,Wk.52 - 13,2013-12-22 00:00:00,2013-12-28 00:00:00,2013W52 ,2013W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2013,N,2012-12-25,2011-12-25,2013-09-25,2013-06-25,2013-11-25,2013-10-25,2013-12-18,2013-12-11,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-10,2013-01-01,2013-10-01,2013-12-01,2013-12-08,0,0,1,2,13,0,0,0,2,2,41617,344,71,10,3,50,5945,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-14,10-Dec-2013,Dec 10th 2013,Tue 12-10-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-08,2013-12-09,2013-12-10,Tue ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,50,2013,2013-12-08,2013-12-14,N,Wk.50 - 13,2013-12-08 00:00:00,2013-12-14 00:00:00,2013W50 ,2013W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2013,N,2012-12-10,2011-12-10,2013-09-10,2013-06-10,2013-11-10,2013-10-10,2013-12-03,2013-11-26,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-29,2013-01-01,2013-04-01,2013-06-01,2013-06-23,0,-2,-5,-22,-151,0,-2,-6,-22,-22,41453,180,90,29,7,26,5921,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-29,29-Jun-2013,Jun 29th 2013,Sat 06-29-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-23,2013-06-24,2013-06-29,Sat ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,26,2013,2013-06-23,2013-06-29,N,Wk.26 - 13,2013-06-23 00:00:00,2013-06-29 00:00:00,2013W26 ,2013W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2013,N,2012-06-29,2011-06-29,2013-03-29,2012-12-29,2013-05-29,2013-04-29,2013-06-22,2013-06-15,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-01,2013-01-01,2013-01-01,2013-02-01,2013-01-27,0,-3,-9,-43,-299,0,-3,-10,-43,-43,41305,32,32,1,6,5,5900,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-02,01-Feb-2013,Feb 1st 2013,Fri 02-01-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-01-27,2013-01-28,2013-02-01,Fri ,2013M02,Feb-2013,Y,2013M02 ,Y,Year 2013 - Quarter 01,2013Q01 ,N,5,2013,2013-01-27,2013-02-02,N,Wk.05 - 13,2013-01-27 00:00:00,2013-02-02 00:00:00,2013W05 ,2013W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2013,N,2012-02-01,2011-02-01,2012-11-01,2012-08-01,2013-01-01,2012-12-01,2013-01-25,2013-01-18,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-30,2013-01-01,2013-10-01,2013-12-01,2013-12-29,0,0,1,5,33,1,1,1,5,5,41637,364,91,30,2,53,5948,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-31,30-Dec-2013,Dec 30th 2013,Mon 12-30-13,0,0,0,0,2013-12-21,365,92,31,3,2013-12-29,2013-12-29,2013-12-29,2013-12-29,2013-12-30,2013-12-30,Mon ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,1,2014,2013-12-29,2014-01-04,N,Wk.53 - 13,2013-12-29 00:00:00,2013-12-31 00:00:00,2013W53 ,2013W53 ,12/29/13 - 12/31/13,12/29 - 12/31,2013,N,2012-12-30,2011-12-30,2013-09-30,2013-06-30,2013-11-30,2013-10-30,2013-12-23,2013-12-16,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-13,2013-01-01,2013-01-01,2013-02-01,2013-02-10,0,-3,-9,-41,-287,0,-3,-10,-41,-41,41317,44,44,13,4,7,5902,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-16,13-Feb-2013,Feb 13th 2013,Wed 02-13-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-10,2013-02-11,2013-02-13,Wed ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,7,2013,2013-02-10,2013-02-16,N,Wk.07 - 13,2013-02-10 00:00:00,2013-02-16 00:00:00,2013W07 ,2013W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2013,N,2012-02-13,2011-02-13,2012-11-13,2012-08-13,2013-01-13,2012-12-13,2013-02-06,2013-01-30,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-29,2013-01-01,2013-10-01,2013-11-01,2013-11-24,0,0,0,0,2,0,0,0,0,0,41606,333,60,29,6,48,5943,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-30,29-Nov-2013,Nov 29th 2013,Fri 11-29-13,0,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-11-24,2013-11-24,2013-11-25,2013-11-29,Fri ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,48,2013,2013-11-24,2013-11-30,N,Wk.48 - 13,2013-11-24 00:00:00,2013-11-30 00:00:00,2013W48 ,2013W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2013,N,2012-11-29,2011-11-29,2013-08-29,2013-05-29,2013-10-29,2013-09-29,2013-11-22,2013-11-15,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-09,2013-01-01,2013-10-01,2013-10-01,2013-10-06,0,0,-1,-7,-49,0,0,-2,-7,-7,41555,282,9,9,4,41,5936,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-12,09-Oct-2013,Oct 9th 2013,Wed 10-09-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-06,2013-10-07,2013-10-09,Wed ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,41,2013,2013-10-06,2013-10-12,N,Wk.41 - 13,2013-10-06 00:00:00,2013-10-12 00:00:00,2013W41 ,2013W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2013,N,2012-10-09,2011-10-09,2013-07-09,2013-04-09,2013-09-09,2013-08-09,2013-10-02,2013-09-25,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-09,2013-01-01,2013-04-01,2013-06-01,2013-06-09,0,-2,-5,-24,-171,0,-2,-6,-24,-25,41433,160,70,9,1,24,5919,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-15,09-Jun-2013,Jun 9th 2013,Sun 06-09-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-09,2013-06-03,2013-06-09,Sun ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,24,2013,2013-06-09,2013-06-15,Y,Wk.24 - 13,2013-06-09 00:00:00,2013-06-15 00:00:00,2013W24 ,2013W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2013,N,2012-06-09,2011-06-09,2013-03-09,2012-12-09,2013-05-09,2013-04-09,2013-06-02,2013-05-26,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-10,2013-01-01,2013-10-01,2013-10-01,2013-10-06,0,0,-1,-7,-48,0,0,-2,-7,-7,41556,283,10,10,5,41,5936,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-12,10-Oct-2013,Oct 10th 2013,Thu 10-10-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-06,2013-10-07,2013-10-10,Thu ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,41,2013,2013-10-06,2013-10-12,N,Wk.41 - 13,2013-10-06 00:00:00,2013-10-12 00:00:00,2013W41 ,2013W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2013,N,2012-10-10,2011-10-10,2013-07-10,2013-04-10,2013-09-10,2013-08-10,2013-10-03,2013-09-26,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-28,2013-01-01,2013-10-01,2013-11-01,2013-11-24,0,0,0,0,1,0,0,0,0,0,41605,332,59,28,5,48,5943,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-30,28-Nov-2013,Nov 28th 2013,Thu 11-28-13,0,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-11-24,2013-11-24,2013-11-25,2013-11-28,Thu ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,48,2013,2013-11-24,2013-11-30,N,Wk.48 - 13,2013-11-24 00:00:00,2013-11-30 00:00:00,2013W48 ,2013W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2013,N,2012-11-28,2011-11-28,2013-08-28,2013-05-28,2013-10-28,2013-09-28,2013-11-21,2013-11-14,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-31,2013-01-01,2013-04-01,2013-05-01,2013-05-26,0,-2,-6,-26,-180,0,-2,-6,-26,-26,41424,151,61,31,6,22,5917,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-06-01,31-May-2013,May 31st 2013,Fri 05-31-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-05-26,2013-05-26,2013-05-27,2013-05-31,Fri ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,22,2013,2013-05-26,2013-06-01,N,Wk.22 - 13,2013-05-26 00:00:00,2013-06-01 00:00:00,2013W22 ,2013W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2013,N,2012-05-31,2011-05-31,2013-02-28,2012-11-30,2013-04-30,2013-03-31,2013-05-24,2013-05-17,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-09-15,2013-01-01,2013-07-01,2013-09-01,2013-09-15,0,-1,-2,-10,-73,0,-1,-3,-10,-11,41531,258,77,15,1,38,5933,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-21,15-Sep-2013,Sep 15th 2013,Sun 09-15-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-15,2013-09-09,2013-09-15,Sun ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,38,2013,2013-09-15,2013-09-21,Y,Wk.38 - 13,2013-09-15 00:00:00,2013-09-21 00:00:00,2013W38 ,2013W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2013,N,2012-09-15,2011-09-15,2013-06-15,2013-03-15,2013-08-15,2013-07-15,2013-09-08,2013-09-01,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-31,2013-01-01,2013-07-01,2013-07-01,2013-07-28,0,-1,-4,-17,-119,0,-1,-4,-17,-17,41485,212,31,31,4,31,5926,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-08-03,31-Jul-2013,Jul 31st 2013,Wed 07-31-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-07-28,2013-07-29,2013-07-31,Wed ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,31,2013,2013-07-28,2013-08-03,N,Wk.31 - 13,2013-07-28 00:00:00,2013-08-03 00:00:00,2013W31 ,2013W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2013,N,2012-07-31,2011-07-31,2013-04-30,2013-01-31,2013-06-30,2013-05-31,2013-07-24,2013-07-17,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-17,2013-01-01,2013-10-01,2013-11-01,2013-11-17,0,0,0,-1,-10,0,0,-1,-1,-2,41594,321,48,17,1,47,5942,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-23,17-Nov-2013,Nov 17th 2013,Sun 11-17-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-17,2013-11-11,2013-11-17,Sun ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,47,2013,2013-11-17,2013-11-23,Y,Wk.47 - 13,2013-11-17 00:00:00,2013-11-23 00:00:00,2013W47 ,2013W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2013,N,2012-11-17,2011-11-17,2013-08-17,2013-05-17,2013-10-17,2013-09-17,2013-11-10,2013-11-03,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-18,2013-01-01,2013-01-01,2013-01-01,2013-01-13,0,-3,-10,-45,-313,0,-3,-11,-45,-45,41291,18,18,18,6,3,5898,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-19,18-Jan-2013,Jan 18th 2013,Fri 01-18-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-13,2013-01-14,2013-01-18,Fri ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,3,2013,2013-01-13,2013-01-19,N,Wk.03 - 13,2013-01-13 00:00:00,2013-01-19 00:00:00,2013W03 ,2013W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2013,N,2012-01-18,2011-01-18,2012-10-18,2012-07-18,2012-12-18,2012-11-18,2013-01-11,2013-01-04,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-26,2013-01-01,2013-04-01,2013-05-01,2013-05-26,0,-2,-6,-26,-185,0,-2,-6,-26,-27,41419,146,56,26,1,22,5917,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-06-01,26-May-2013,May 26th 2013,Sun 05-26-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-05-26,2013-05-26,2013-05-20,2013-05-26,Sun ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,22,2013,2013-05-26,2013-06-01,Y,Wk.22 - 13,2013-05-26 00:00:00,2013-06-01 00:00:00,2013W22 ,2013W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2013,N,2012-05-26,2011-05-26,2013-02-26,2012-11-26,2013-04-26,2013-03-26,2013-05-19,2013-05-12,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-06,2013-01-01,2013-04-01,2013-04-01,2013-03-31,0,-2,-7,-34,-235,0,-2,-8,-34,-34,41369,96,6,6,7,14,5909,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-06,06-Apr-2013,Apr 6th 2013,Sat 04-06-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-03-31,2013-04-01,2013-04-06,Sat ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,14,2013,2013-03-31,2013-04-06,N,Wk.14 - 13,2013-03-31 00:00:00,2013-04-06 00:00:00,2013W14 ,2013W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2013,N,2012-04-06,2011-04-06,2013-01-06,2012-10-06,2013-03-06,2013-02-06,2013-03-30,2013-03-23,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-27,2013-01-01,2013-10-01,2013-11-01,2013-11-24,0,0,0,0,0,0,0,0,0,0,41604,331,58,27,4,48,5943,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-30,27-Nov-2013,Nov 27th 2013,Wed 11-27-13,1,1,1,1,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-11-24,2013-11-24,2013-11-25,2013-11-27,Wed ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,48,2013,2013-11-24,2013-11-30,N,Wk.48 - 13,2013-11-24 00:00:00,2013-11-30 00:00:00,2013W48 ,2013W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2013,N,2012-11-27,2011-11-27,2013-08-27,2013-05-27,2013-10-27,2013-09-27,2013-11-20,2013-11-13,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-10,2013-01-01,2013-07-01,2013-08-01,2013-08-04,0,-1,-3,-16,-109,0,-1,-4,-16,-16,41495,222,41,10,7,32,5927,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-10,10-Aug-2013,Aug 10th 2013,Sat 08-10-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-04,2013-08-05,2013-08-10,Sat ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,32,2013,2013-08-04,2013-08-10,N,Wk.32 - 13,2013-08-04 00:00:00,2013-08-10 00:00:00,2013W32 ,2013W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2013,N,2012-08-10,2011-08-10,2013-05-10,2013-02-10,2013-07-10,2013-06-10,2013-08-03,2013-07-27,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-24,2013-01-01,2013-04-01,2013-04-01,2013-04-21,0,-2,-7,-31,-217,0,-2,-8,-31,-31,41387,114,24,24,4,17,5912,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-27,24-Apr-2013,Apr 24th 2013,Wed 04-24-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-21,2013-04-22,2013-04-24,Wed ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,17,2013,2013-04-21,2013-04-27,N,Wk.17 - 13,2013-04-21 00:00:00,2013-04-27 00:00:00,2013W17 ,2013W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2013,N,2012-04-24,2011-04-24,2013-01-24,2012-10-24,2013-03-24,2013-02-24,2013-04-17,2013-04-10,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-29,2013-01-01,2013-07-01,2013-07-01,2013-07-28,0,-1,-4,-17,-121,0,-1,-4,-17,-17,41483,210,29,29,2,31,5926,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-08-03,29-Jul-2013,Jul 29th 2013,Mon 07-29-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-07-28,2013-07-29,2013-07-29,Mon ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,31,2013,2013-07-28,2013-08-03,N,Wk.31 - 13,2013-07-28 00:00:00,2013-08-03 00:00:00,2013W31 ,2013W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2013,N,2012-07-29,2011-07-29,2013-04-29,2013-01-29,2013-06-29,2013-05-29,2013-07-22,2013-07-15,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-29,2013-01-01,2013-10-01,2013-10-01,2013-10-27,0,0,-1,-4,-29,0,0,-1,-4,-4,41575,302,29,29,3,44,5939,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-11-02,29-Oct-2013,Oct 29th 2013,Tue 10-29-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-10-27,2013-10-27,2013-10-28,2013-10-29,Tue ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,44,2013,2013-10-27,2013-11-02,N,Wk.44 - 13,2013-10-27 00:00:00,2013-11-02 00:00:00,2013W44 ,2013W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2013,N,2012-10-29,2011-10-29,2013-07-29,2013-04-29,2013-09-29,2013-08-29,2013-10-22,2013-10-15,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-17,2013-01-01,2013-07-01,2013-07-01,2013-07-14,0,-1,-4,-19,-133,0,-1,-5,-19,-19,41471,198,17,17,4,29,5924,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-20,17-Jul-2013,Jul 17th 2013,Wed 07-17-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-14,2013-07-15,2013-07-17,Wed ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,29,2013,2013-07-14,2013-07-20,N,Wk.29 - 13,2013-07-14 00:00:00,2013-07-20 00:00:00,2013W29 ,2013W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2013,N,2012-07-17,2011-07-17,2013-04-17,2013-01-17,2013-06-17,2013-05-17,2013-07-10,2013-07-03,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-22,2013-01-01,2013-10-01,2013-12-01,2013-12-22,0,0,1,4,25,0,0,0,4,3,41629,356,83,22,1,52,5947,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-28,22-Dec-2013,Dec 22nd 2013,Sun 12-22-13,0,0,0,0,2013-12-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-22,2013-12-16,2013-12-22,Sun ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,52,2013,2013-12-22,2013-12-28,Y,Wk.52 - 13,2013-12-22 00:00:00,2013-12-28 00:00:00,2013W52 ,2013W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2013,N,2012-12-22,2011-12-22,2013-09-22,2013-06-22,2013-11-22,2013-10-22,2013-12-15,2013-12-08,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-23,2013-01-01,2013-01-01,2013-03-01,2013-03-17,0,-3,-8,-36,-249,0,-3,-9,-36,-36,41355,82,82,23,7,12,5907,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-23,23-Mar-2013,Mar 23rd 2013,Sat 03-23-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-17,2013-03-18,2013-03-23,Sat ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,12,2013,2013-03-17,2013-03-23,N,Wk.12 - 13,2013-03-17 00:00:00,2013-03-23 00:00:00,2013W12 ,2013W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2013,N,2012-03-23,2011-03-23,2012-12-23,2012-09-23,2013-02-23,2013-01-23,2013-03-16,2013-03-09,0,0,0,0,0,0,0,0,3,1,12,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-11,2013-01-01,2013-10-01,2013-11-01,2013-11-10,0,0,0,-2,-16,0,0,-1,-2,-2,41588,315,42,11,2,46,5941,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-16,11-Nov-2013,Nov 11th 2013,Mon 11-11-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-10,2013-11-11,2013-11-11,Mon ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,46,2013,2013-11-10,2013-11-16,N,Wk.46 - 13,2013-11-10 00:00:00,2013-11-16 00:00:00,2013W46 ,2013W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2013,N,2012-11-11,2011-11-11,2013-08-11,2013-05-11,2013-10-11,2013-09-11,2013-11-04,2013-10-28,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-06,2013-01-01,2013-07-01,2013-08-01,2013-08-04,0,-1,-3,-16,-113,0,-1,-4,-16,-16,41491,218,37,6,3,32,5927,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-10,06-Aug-2013,Aug 6th 2013,Tue 08-06-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-04,2013-08-05,2013-08-06,Tue ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,32,2013,2013-08-04,2013-08-10,N,Wk.32 - 13,2013-08-04 00:00:00,2013-08-10 00:00:00,2013W32 ,2013W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2013,N,2012-08-06,2011-08-06,2013-05-06,2013-02-06,2013-07-06,2013-06-06,2013-07-30,2013-07-23,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-02,2013-01-01,2013-01-01,2013-02-01,2013-01-27,0,-3,-9,-43,-298,0,-3,-10,-43,-43,41306,33,33,2,7,5,5900,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-02,02-Feb-2013,Feb 2nd 2013,Sat 02-02-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-01-27,2013-01-28,2013-02-02,Sat ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,5,2013,2013-01-27,2013-02-02,N,Wk.05 - 13,2013-01-27 00:00:00,2013-02-02 00:00:00,2013W05 ,2013W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2013,N,2012-02-02,2011-02-02,2012-11-02,2012-08-02,2013-01-02,2012-12-02,2013-01-26,2013-01-19,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-22,2013-01-01,2013-01-01,2013-03-01,2013-03-17,0,-3,-8,-36,-250,0,-3,-9,-36,-36,41354,81,81,22,6,12,5907,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-23,22-Mar-2013,Mar 22nd 2013,Fri 03-22-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-17,2013-03-18,2013-03-22,Fri ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,12,2013,2013-03-17,2013-03-23,N,Wk.12 - 13,2013-03-17 00:00:00,2013-03-23 00:00:00,2013W12 ,2013W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2013,N,2012-03-22,2011-03-22,2012-12-22,2012-09-22,2013-02-22,2013-01-22,2013-03-15,2013-03-08,0,0,0,0,0,0,0,0,3,1,12,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-04-28,2013-01-01,2013-04-01,2013-04-01,2013-04-28,0,-2,-7,-30,-213,0,-2,-7,-30,-31,41391,118,28,28,1,18,5913,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-05-04,28-Apr-2013,Apr 28th 2013,Sun 04-28-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-04-28,2013-04-28,2013-04-22,2013-04-28,Sun ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,18,2013,2013-04-28,2013-05-04,Y,Wk.18 - 13,2013-04-28 00:00:00,2013-05-04 00:00:00,2013W18 ,2013W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2013,N,2012-04-28,2011-04-28,2013-01-28,2012-10-28,2013-03-28,2013-02-28,2013-04-21,2013-04-14,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-04,2013-01-01,2013-01-01,2013-03-01,2013-03-03,0,-3,-8,-38,-268,0,-3,-9,-38,-38,41336,63,63,4,2,10,5905,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-09,04-Mar-2013,Mar 4th 2013,Mon 03-04-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-03,2013-03-04,2013-03-04,Mon ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,10,2013,2013-03-03,2013-03-09,N,Wk.10 - 13,2013-03-03 00:00:00,2013-03-09 00:00:00,2013W10 ,2013W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2013,N,2012-03-04,2011-03-04,2012-12-04,2012-09-04,2013-02-04,2013-01-04,2013-02-25,2013-02-18,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-12,2013-01-01,2013-07-01,2013-07-01,2013-07-07,0,-1,-4,-20,-138,0,-1,-5,-20,-20,41466,193,12,12,6,28,5923,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-13,12-Jul-2013,Jul 12th 2013,Fri 07-12-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-07,2013-07-08,2013-07-12,Fri ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,28,2013,2013-07-07,2013-07-13,N,Wk.28 - 13,2013-07-07 00:00:00,2013-07-13 00:00:00,2013W28 ,2013W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2013,N,2012-07-12,2011-07-12,2013-04-12,2013-01-12,2013-06-12,2013-05-12,2013-07-05,2013-06-28,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-05,2013-01-01,2013-01-01,2013-01-01,2013-01-01,0,-3,-10,-47,-326,0,-3,-11,-47,-47,41278,5,5,5,7,1,5896,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-05,05-Jan-2013,Jan 5th 2013,Sat 01-05-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2013-01-05,Sat ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,1,2013,2012-12-30,2013-01-05,N,Wk.01 - 13,2013-01-01 00:00:00,2013-01-05 00:00:00,2013W01 ,2013W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2013,N,2012-01-05,2011-01-05,2012-10-05,2012-07-05,2012-12-05,2012-11-05,2012-12-29,2012-12-22,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-12,2013-01-01,2013-07-01,2013-08-01,2013-08-11,0,-1,-3,-15,-107,0,-1,-4,-15,-15,41497,224,43,12,2,33,5928,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-17,12-Aug-2013,Aug 12th 2013,Mon 08-12-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-11,2013-08-12,2013-08-12,Mon ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,33,2013,2013-08-11,2013-08-17,N,Wk.33 - 13,2013-08-11 00:00:00,2013-08-17 00:00:00,2013W33 ,2013W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2013,N,2012-08-12,2011-08-12,2013-05-12,2013-02-12,2013-07-12,2013-06-12,2013-08-05,2013-07-29,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-04,2013-01-01,2013-07-01,2013-08-01,2013-08-04,0,-1,-3,-16,-115,0,-1,-4,-16,-17,41489,216,35,4,1,32,5927,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-10,04-Aug-2013,Aug 4th 2013,Sun 08-04-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-04,2013-07-29,2013-08-04,Sun ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,32,2013,2013-08-04,2013-08-10,Y,Wk.32 - 13,2013-08-04 00:00:00,2013-08-10 00:00:00,2013W32 ,2013W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2013,N,2012-08-04,2011-08-04,2013-05-04,2013-02-04,2013-07-04,2013-06-04,2013-07-28,2013-07-21,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-17,2013-01-01,2013-01-01,2013-03-01,2013-03-17,0,-3,-8,-36,-255,0,-3,-9,-36,-37,41349,76,76,17,1,12,5907,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-23,17-Mar-2013,Mar 17th 2013,Sun 03-17-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-17,2013-03-11,2013-03-17,Sun ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,12,2013,2013-03-17,2013-03-23,Y,Wk.12 - 13,2013-03-17 00:00:00,2013-03-23 00:00:00,2013W12 ,2013W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2013,N,2012-03-17,2011-03-17,2012-12-17,2012-09-17,2013-02-17,2013-01-17,2013-03-10,2013-03-03,0,0,0,0,0,0,0,0,3,1,12,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-18,2013-01-01,2013-07-01,2013-07-01,2013-07-14,0,-1,-4,-19,-132,0,-1,-5,-19,-19,41472,199,18,18,5,29,5924,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-20,18-Jul-2013,Jul 18th 2013,Thu 07-18-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-14,2013-07-15,2013-07-18,Thu ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,29,2013,2013-07-14,2013-07-20,N,Wk.29 - 13,2013-07-14 00:00:00,2013-07-20 00:00:00,2013W29 ,2013W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2013,N,2012-07-18,2011-07-18,2013-04-18,2013-01-18,2013-06-18,2013-05-18,2013-07-11,2013-07-04,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-01,2013-01-01,2013-10-01,2013-12-01,2013-12-01,0,0,1,1,4,0,0,0,1,0,41608,335,62,1,1,49,5944,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-07,01-Dec-2013,Dec 1st 2013,Sun 12-01-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-01,2013-11-25,2013-12-01,Sun ,2013M12,Dec-2013,Y,2013M12 ,Y,Year 2013 - Quarter 04,2013Q04 ,N,49,2013,2013-12-01,2013-12-07,Y,Wk.49 - 13,2013-12-01 00:00:00,2013-12-07 00:00:00,2013W49 ,2013W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2013,N,2012-12-01,2011-12-01,2013-09-01,2013-06-01,2013-11-01,2013-10-01,2013-11-24,2013-11-17,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-16,2013-01-01,2013-10-01,2013-12-01,2013-12-15,0,0,1,3,19,0,0,0,3,3,41623,350,77,16,2,51,5946,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-21,16-Dec-2013,Dec 16th 2013,Mon 12-16-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-15,2013-12-16,2013-12-16,Mon ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,51,2013,2013-12-15,2013-12-21,N,Wk.51 - 13,2013-12-15 00:00:00,2013-12-21 00:00:00,2013W51 ,2013W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2013,N,2012-12-16,2011-12-16,2013-09-16,2013-06-16,2013-11-16,2013-10-16,2013-12-09,2013-12-02,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-21,2013-01-01,2013-07-01,2013-07-01,2013-07-21,0,-1,-4,-18,-129,0,-1,-5,-18,-19,41475,202,21,21,1,30,5925,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-27,21-Jul-2013,Jul 21st 2013,Sun 07-21-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-21,2013-07-15,2013-07-21,Sun ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,30,2013,2013-07-21,2013-07-27,Y,Wk.30 - 13,2013-07-21 00:00:00,2013-07-27 00:00:00,2013W30 ,2013W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2013,N,2012-07-21,2011-07-21,2013-04-21,2013-01-21,2013-06-21,2013-05-21,2013-07-14,2013-07-07,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-30,2013-01-01,2013-07-01,2013-07-01,2013-07-28,0,-1,-4,-17,-120,0,-1,-4,-17,-17,41484,211,30,30,3,31,5926,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-08-03,30-Jul-2013,Jul 30th 2013,Tue 07-30-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-07-28,2013-07-29,2013-07-30,Tue ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,31,2013,2013-07-28,2013-08-03,N,Wk.31 - 13,2013-07-28 00:00:00,2013-08-03 00:00:00,2013W31 ,2013W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2013,N,2012-07-30,2011-07-30,2013-04-30,2013-01-30,2013-06-30,2013-05-30,2013-07-23,2013-07-16,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-18,2013-01-01,2013-10-01,2013-10-01,2013-10-13,0,0,-1,-6,-40,0,0,-2,-6,-6,41564,291,18,18,6,42,5937,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-19,18-Oct-2013,Oct 18th 2013,Fri 10-18-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-13,2013-10-14,2013-10-18,Fri ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,42,2013,2013-10-13,2013-10-19,N,Wk.42 - 13,2013-10-13 00:00:00,2013-10-19 00:00:00,2013W42 ,2013W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2013,N,2012-10-18,2011-10-18,2013-07-18,2013-04-18,2013-09-18,2013-08-18,2013-10-11,2013-10-04,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-10,2013-01-01,2013-04-01,2013-06-01,2013-06-09,0,-2,-5,-24,-170,0,-2,-6,-24,-24,41434,161,71,10,2,24,5919,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-15,10-Jun-2013,Jun 10th 2013,Mon 06-10-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-09,2013-06-10,2013-06-10,Mon ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,24,2013,2013-06-09,2013-06-15,N,Wk.24 - 13,2013-06-09 00:00:00,2013-06-15 00:00:00,2013W24 ,2013W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2013,N,2012-06-10,2011-06-10,2013-03-10,2012-12-10,2013-05-10,2013-04-10,2013-06-03,2013-05-27,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-09,2013-01-01,2013-04-01,2013-05-01,2013-05-05,0,-2,-6,-29,-202,0,-2,-7,-29,-29,41402,129,39,9,5,19,5914,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-11,09-May-2013,May 9th 2013,Thu 05-09-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-05,2013-05-06,2013-05-09,Thu ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,19,2013,2013-05-05,2013-05-11,N,Wk.19 - 13,2013-05-05 00:00:00,2013-05-11 00:00:00,2013W19 ,2013W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2013,N,2012-05-09,2011-05-09,2013-02-09,2012-11-09,2013-04-09,2013-03-09,2013-05-02,2013-04-25,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-06,2013-01-01,2013-01-01,2013-02-01,2013-02-03,0,-3,-9,-42,-294,0,-3,-10,-42,-42,41310,37,37,6,4,6,5901,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-09,06-Feb-2013,Feb 6th 2013,Wed 02-06-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-03,2013-02-04,2013-02-06,Wed ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,6,2013,2013-02-03,2013-02-09,N,Wk.06 - 13,2013-02-03 00:00:00,2013-02-09 00:00:00,2013W06 ,2013W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2013,N,2012-02-06,2011-02-06,2012-11-06,2012-08-06,2013-01-06,2012-12-06,2013-01-30,2013-01-23,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-23,2013-01-01,2013-01-01,2013-02-01,2013-02-17,0,-3,-9,-40,-277,0,-3,-10,-40,-40,41327,54,54,23,7,8,5903,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-23,23-Feb-2013,Feb 23rd 2013,Sat 02-23-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-17,2013-02-18,2013-02-23,Sat ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,8,2013,2013-02-17,2013-02-23,N,Wk.08 - 13,2013-02-17 00:00:00,2013-02-23 00:00:00,2013W08 ,2013W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2013,N,2012-02-23,2011-02-23,2012-11-23,2012-08-23,2013-01-23,2012-12-23,2013-02-16,2013-02-09,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-18,2013-01-01,2013-07-01,2013-08-01,2013-08-18,0,-1,-3,-14,-101,0,-1,-4,-14,-15,41503,230,49,18,1,34,5929,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-24,18-Aug-2013,Aug 18th 2013,Sun 08-18-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-18,2013-08-12,2013-08-18,Sun ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,34,2013,2013-08-18,2013-08-24,Y,Wk.34 - 13,2013-08-18 00:00:00,2013-08-24 00:00:00,2013W34 ,2013W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2013,N,2012-08-18,2011-08-18,2013-05-18,2013-02-18,2013-07-18,2013-06-18,2013-08-11,2013-08-04,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-09,2013-01-01,2013-01-01,2013-01-01,2013-01-06,0,-3,-10,-46,-322,0,-3,-11,-46,-46,41282,9,9,9,4,2,5897,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-12,09-Jan-2013,Jan 9th 2013,Wed 01-09-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-06,2013-01-07,2013-01-09,Wed ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,2,2013,2013-01-06,2013-01-12,N,Wk.02 - 13,2013-01-06 00:00:00,2013-01-12 00:00:00,2013W02 ,2013W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2013,N,2012-01-09,2011-01-09,2012-10-09,2012-07-09,2012-12-09,2012-11-09,2013-01-02,2012-12-26,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-11,2013-01-01,2013-01-01,2013-03-01,2013-03-10,0,-3,-8,-37,-261,0,-3,-9,-37,-37,41343,70,70,11,2,11,5906,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-16,11-Mar-2013,Mar 11th 2013,Mon 03-11-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-10,2013-03-11,2013-03-11,Mon ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,11,2013,2013-03-10,2013-03-16,N,Wk.11 - 13,2013-03-10 00:00:00,2013-03-16 00:00:00,2013W11 ,2013W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2013,N,2012-03-11,2011-03-11,2012-12-11,2012-09-11,2013-02-11,2013-01-11,2013-03-04,2013-02-25,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-10-06,2013-01-01,2013-10-01,2013-10-01,2013-10-06,0,0,-1,-7,-52,0,0,-2,-7,-8,41552,279,6,6,1,41,5936,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-12,06-Oct-2013,Oct 6th 2013,Sun 10-06-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-06,2013-09-30,2013-10-06,Sun ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,41,2013,2013-10-06,2013-10-12,Y,Wk.41 - 13,2013-10-06 00:00:00,2013-10-12 00:00:00,2013W41 ,2013W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2013,N,2012-10-06,2011-10-06,2013-07-06,2013-04-06,2013-09-06,2013-08-06,2013-09-29,2013-09-22,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-08-02,2013-01-01,2013-07-01,2013-08-01,2013-07-28,0,-1,-3,-17,-117,0,-1,-4,-17,-17,41487,214,33,2,6,31,5926,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-03,02-Aug-2013,Aug 2nd 2013,Fri 08-02-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-07-28,2013-07-29,2013-08-02,Fri ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,31,2013,2013-07-28,2013-08-03,N,Wk.31 - 13,2013-07-28 00:00:00,2013-08-03 00:00:00,2013W31 ,2013W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2013,N,2012-08-02,2011-08-02,2013-05-02,2013-02-02,2013-07-02,2013-06-02,2013-07-26,2013-07-19,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-08,2013-01-01,2013-10-01,2013-12-01,2013-12-08,0,0,1,2,11,0,0,0,2,1,41615,342,69,8,1,50,5945,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-14,08-Dec-2013,Dec 8th 2013,Sun 12-08-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-08,2013-12-02,2013-12-08,Sun ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,50,2013,2013-12-08,2013-12-14,Y,Wk.50 - 13,2013-12-08 00:00:00,2013-12-14 00:00:00,2013W50 ,2013W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2013,N,2012-12-08,2011-12-08,2013-09-08,2013-06-08,2013-11-08,2013-10-08,2013-12-01,2013-11-24,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-12-29,2013-01-01,2013-10-01,2013-12-01,2013-12-29,0,0,1,5,32,1,1,1,5,4,41636,363,90,29,1,53,5948,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-31,29-Dec-2013,Dec 29th 2013,Sun 12-29-13,0,0,0,0,2013-12-21,365,92,31,3,2013-12-29,2013-12-29,2013-12-29,2013-12-29,2013-12-23,2013-12-29,Sun ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,1,2014,2013-12-29,2014-01-04,Y,Wk.53 - 13,2013-12-29 00:00:00,2013-12-31 00:00:00,2013W53 ,2013W53 ,12/29/13 - 12/31/13,12/29 - 12/31,2013,N,2012-12-29,2011-12-29,2013-09-29,2013-06-29,2013-11-29,2013-10-29,2013-12-22,2013-12-15,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-15,2013-01-01,2013-04-01,2013-06-01,2013-06-09,0,-2,-5,-24,-165,0,-2,-6,-24,-24,41439,166,76,15,7,24,5919,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-15,15-Jun-2013,Jun 15th 2013,Sat 06-15-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-09,2013-06-10,2013-06-15,Sat ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,24,2013,2013-06-09,2013-06-15,N,Wk.24 - 13,2013-06-09 00:00:00,2013-06-15 00:00:00,2013W24 ,2013W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2013,N,2012-06-15,2011-06-15,2013-03-15,2012-12-15,2013-05-15,2013-04-15,2013-06-08,2013-06-01,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-07,2013-01-01,2013-01-01,2013-02-01,2013-02-03,0,-3,-9,-42,-293,0,-3,-10,-42,-42,41311,38,38,7,5,6,5901,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-09,07-Feb-2013,Feb 7th 2013,Thu 02-07-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-03,2013-02-04,2013-02-07,Thu ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,6,2013,2013-02-03,2013-02-09,N,Wk.06 - 13,2013-02-03 00:00:00,2013-02-09 00:00:00,2013W06 ,2013W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2013,N,2012-02-07,2011-02-07,2012-11-07,2012-08-07,2013-01-07,2012-12-07,2013-01-31,2013-01-24,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-11-15,2013-01-01,2013-10-01,2013-11-01,2013-11-10,0,0,0,-2,-12,0,0,-1,-2,-2,41592,319,46,15,6,46,5941,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-16,15-Nov-2013,Nov 15th 2013,Fri 11-15-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-10,2013-11-11,2013-11-15,Fri ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,46,2013,2013-11-10,2013-11-16,N,Wk.46 - 13,2013-11-10 00:00:00,2013-11-16 00:00:00,2013W46 ,2013W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2013,N,2012-11-15,2011-11-15,2013-08-15,2013-05-15,2013-10-15,2013-09-15,2013-11-08,2013-11-01,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-02-11,2013-01-01,2013-01-01,2013-02-01,2013-02-10,0,-3,-9,-41,-289,0,-3,-10,-41,-41,41315,42,42,11,2,7,5902,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-16,11-Feb-2013,Feb 11th 2013,Mon 02-11-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-10,2013-02-11,2013-02-11,Mon ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,7,2013,2013-02-10,2013-02-16,N,Wk.07 - 13,2013-02-10 00:00:00,2013-02-16 00:00:00,2013W07 ,2013W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2013,N,2012-02-11,2011-02-11,2012-11-11,2012-08-11,2013-01-11,2012-12-11,2013-02-04,2013-01-28,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-19,2013-01-01,2013-04-01,2013-06-01,2013-06-16,0,-2,-5,-23,-161,0,-2,-6,-23,-23,41443,170,80,19,4,25,5920,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-22,19-Jun-2013,Jun 19th 2013,Wed 06-19-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-16,2013-06-17,2013-06-19,Wed ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,25,2013,2013-06-16,2013-06-22,N,Wk.25 - 13,2013-06-16 00:00:00,2013-06-22 00:00:00,2013W25 ,2013W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2013,N,2012-06-19,2011-06-19,2013-03-19,2012-12-19,2013-05-19,2013-04-19,2013-06-12,2013-06-05,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-17,2013-01-01,2013-04-01,2013-06-01,2013-06-16,0,-2,-5,-23,-163,0,-2,-6,-23,-23,41441,168,78,17,2,25,5920,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-22,17-Jun-2013,Jun 17th 2013,Mon 06-17-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-16,2013-06-17,2013-06-17,Mon ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,25,2013,2013-06-16,2013-06-22,N,Wk.25 - 13,2013-06-16 00:00:00,2013-06-22 00:00:00,2013W25 ,2013W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2013,N,2012-06-17,2011-06-17,2013-03-17,2012-12-17,2013-05-17,2013-04-17,2013-06-10,2013-06-03,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-05-10,2013-01-01,2013-04-01,2013-05-01,2013-05-05,0,-2,-6,-29,-201,0,-2,-7,-29,-29,41403,130,40,10,6,19,5914,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-11,10-May-2013,May 10th 2013,Fri 05-10-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-05,2013-05-06,2013-05-10,Fri ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,19,2013,2013-05-05,2013-05-11,N,Wk.19 - 13,2013-05-05 00:00:00,2013-05-11 00:00:00,2013W19 ,2013W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2013,N,2012-05-10,2011-05-10,2013-02-10,2012-11-10,2013-04-10,2013-03-10,2013-05-03,2013-04-26,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-06-16,2013-01-01,2013-04-01,2013-06-01,2013-06-16,0,-2,-5,-23,-164,0,-2,-6,-23,-24,41440,167,77,16,1,25,5920,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-22,16-Jun-2013,Jun 16th 2013,Sun 06-16-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-16,2013-06-10,2013-06-16,Sun ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,25,2013,2013-06-16,2013-06-22,Y,Wk.25 - 13,2013-06-16 00:00:00,2013-06-22 00:00:00,2013W25 ,2013W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2013,N,2012-06-16,2011-06-16,2013-03-16,2012-12-16,2013-05-16,2013-04-16,2013-06-09,2013-06-02,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-07-28,2013-01-01,2013-07-01,2013-07-01,2013-07-28,0,-1,-4,-17,-122,0,-1,-4,-17,-18,41482,209,28,28,1,31,5926,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-08-03,28-Jul-2013,Jul 28th 2013,Sun 07-28-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-07-28,2013-07-22,2013-07-28,Sun ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,31,2013,2013-07-28,2013-08-03,Y,Wk.31 - 13,2013-07-28 00:00:00,2013-08-03 00:00:00,2013W31 ,2013W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2013,N,2012-07-28,2011-07-28,2013-04-28,2013-01-28,2013-06-28,2013-05-28,2013-07-21,2013-07-14,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-03-03,2013-01-01,2013-01-01,2013-03-01,2013-03-03,0,-3,-8,-38,-269,0,-3,-9,-38,-39,41335,62,62,3,1,10,5905,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-09,03-Mar-2013,Mar 3rd 2013,Sun 03-03-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-03,2013-02-25,2013-03-03,Sun ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,10,2013,2013-03-03,2013-03-09,Y,Wk.10 - 13,2013-03-03 00:00:00,2013-03-09 00:00:00,2013W10 ,2013W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2013,N,2012-03-03,2011-03-03,2012-12-03,2012-09-03,2013-02-03,2013-01-03,2013-02-24,2013-02-17,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X +2013-01-19,2013-01-01,2013-01-01,2013-01-01,2013-01-13,0,-3,-10,-45,-312,0,-3,-11,-45,-45,41292,19,19,19,7,3,5898,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-19,19-Jan-2013,Jan 19th 2013,Sat 01-19-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-13,2013-01-14,2013-01-19,Sat ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,3,2013,2013-01-13,2013-01-19,N,Wk.03 - 13,2013-01-13 00:00:00,2013-01-19 00:00:00,2013W03 ,2013W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2013,N,2012-01-19,2011-01-19,2012-10-19,2012-07-19,2012-12-19,2012-11-19,2013-01-12,2013-01-05,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X diff --git a/examples/test_case_data/localmeta/data/EDW.TEST_SELLER_TYPE_DIM.csv b/examples/test_case_data/localmeta/data/EDW.TEST_SELLER_TYPE_DIM.csv new file mode 100644 index 0000000..73abe26 --- /dev/null +++ b/examples/test_case_data/localmeta/data/EDW.TEST_SELLER_TYPE_DIM.csv @@ -0,0 +1,8 @@ +16,Consumer-Other,16,102,Consumer,2012-08-09,USER_P,,USER_A +5,Occasional,5,102,Consumer,2010-05-11,USER_H,2011-03-01 11:30:52,USER_A +15,Professional-Other,15,101,Professional,2012-08-09,USER_P,,USER_A +-99,Not Applicable,-99,-99,Not Applicable,2010-05-11,USER_H,,USER_A +14,Regular,14,102,Consumer,2011-03-01,USER_H,,USER_A +12,Merchant,12,101,Professional,2011-03-01,USER_H,,USER_A +11,Large Merchant,11,101,Professional,2011-03-01,USER_H,,USER_A +13,Entrepreneur,13,101,Professional,2011-03-01,USER_H,,USER_A diff --git a/examples/test_case_data/localmeta/data/EDW.TEST_SITES.csv b/examples/test_case_data/localmeta/data/EDW.TEST_SITES.csv new file mode 100644 index 0000000..a9d79c6 --- /dev/null +++ b/examples/test_case_data/localmeta/data/EDW.TEST_SITES.csv @@ -0,0 +1,262 @@ +248,Uruguay,S,1,0,211,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +166,Qatar,S,1,0,166,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +84,Guam,S,1,0,84,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +225,Peru,S,45,0,161,2005-04-27,2013-11-27 00:14:36,USER_X,USER_X +103,Jan Mayen,S,1,0,103,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +63,El Salvador,S,1,0,63,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +124,Macedonia,S,1,0,124,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +147,Netherlands Antilles,S,1,0,147,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +21,Barbados,S,1,0,21,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +82,Grenada,S,1,0,82,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +980,CoBrand,D,1,0,-999,2000-06-29,,USER_G,USER_X +2,Canada,S,2,1,2,2000-06-09,2013-11-27 00:14:36,USER_S,USER_X +204,Indonesia,S,24,0,96,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +246,Tuvalu,S,1,0,207,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +25,Benin,S,1,0,25,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +-6,StubHub US,S,1,1,1,2012-11-04,,USER_C4,USER_X +86,Guernsey,S,1,0,86,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +187,Sri Lanka,S,1,0,187,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +6,Algeria,S,1,0,6,2000-07-26,2013-11-27 00:14:36,USER_G,USER_X +984,Digit City Cobrand,D,1,0,-999,2000-06-29,,USER_G,USER_X +145,Nepal,S,1,0,145,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +4,Afghanistan,S,1,0,4,2000-07-26,2013-11-27 00:14:36,USER_G,USER_X +227,Iceland,S,1,0,94,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +229,Serbia,S,1,0,229,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +65,Eritrea,S,1,0,65,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +44,Chile,S,1,0,44,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X +170,Saint Helena,S,1,0,170,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +88,Guinea-Bissau,S,1,0,88,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +46,Colombia,S,1,0,46,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X +-4,Gmarket,S,48,0,111,2010-05-23,,USER_X,USER_X +69,Fiji,S,1,0,69,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +48,"Congo Democratic Republic Of The",S,1,0,48,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +231,Turkey,S,1,0,204,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X +126,Malawi,S,1,0,126,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +-888,Invalid,S,-999,0,-999,2004-12-03,,USER_X,USER_X +107,Kazakhstan,S,1,0,107,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +982,Netscape Cobrand,D,1,0,-999,2000-06-29,,USER_G,USER_X +900,Gbh,S,1,0,1,2012-10-25,2013-11-27 00:14:36,USER_X,USER_X +208,New Zealand,S,33,0,149,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +71,France,S,7,1,71,2000-09-06,2013-11-27 00:14:36,USER_S,USER_X +10,Anguilla,S,1,0,10,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +172,Saint Lucia,S,1,0,172,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +153,Niue,S,1,0,153,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +67,Ethiopia,S,1,0,67,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +128,Maldives,S,1,0,128,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +233,United Arab Emirates,S,1,0,210,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X +143,Namibia,S,1,0,143,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +115,Latvia,S,1,0,115,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +206,Israel,S,26,0,100,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +216,Singapore,S,39,0,180,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +105,Jersey,S,1,0,105,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +159,Papua New Guinea,S,1,0,159,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +220,Vietnam,S,47,0,216,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +241,Tonga,S,1,0,201,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +201,Hong Kong,S,22,0,92,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +117,Lesotho,S,1,0,117,2013-02-22,2013-11-27 00:14:36,USER_X,USER_X +258,Zambia,S,1,0,223,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +237,Reunion,S,1,0,227,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +239,Tanzania,S,1,0,198,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +971,Butterfields,D,1,0,-999,2000-08-30,,USER_G,USER_X +136,Mexico,S,1,0,136,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X +50,Cook Islands,S,1,0,50,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +193,Switzerland,S,13,0,193,2002-08-30,2013-11-27 00:14:36,USER_S,USER_X +989,AutoTrader,D,1,0,-999,2000-06-29,,USER_G,USER_X +16,Austria,S,7,0,16,2002-06-11,2013-11-27 00:14:36,USER_S,USER_X +30,Botswana,S,1,0,30,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +178,Seychelles,S,1,0,178,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +152,Nigeria,S,1,0,152,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +9,Angola,S,1,0,9,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +23,Belgium (French),S,7,1,23,2001-12-27,2013-11-27 00:14:36,USER_S,USER_X +987,Card,D,1,0,-999,2000-06-29,,USER_G,USER_X +91,Honduras,S,1,0,91,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +232,Ukraine,S,1,0,209,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X +89,Guyana,S,1,0,89,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +129,Mali,S,1,0,129,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +234,Bangladesh,S,1,0,20,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +-5,Gitti gidiyor,S,49,0,204,2012-11-07,,USER_C4,USER_X +26,Bermuda,S,1,0,26,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +49,"Congo Republic Of The",S,1,0,49,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +148,New Caledonia,S,1,0,148,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +66,Estonia,S,1,0,66,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +5,Albania,S,1,0,5,2000-07-26,2013-11-27 00:14:36,USER_G,USER_X +108,Kenya,S,1,0,108,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +983,ICQ,D,1,0,-999,2000-07-07,,USER_PFI,USER_X +167,Romania,S,1,0,167,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X +169,Rwanda,S,1,0,169,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +228,Montenegro,S,1,0,228,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +106,Jordan,S,1,0,106,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +213,Purtugal,S,7,0,164,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +207,Malaysia,S,46,0,127,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +68,Falkland Islands (Islas Makvinas),S,1,0,68,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +247,Uganda,S,1,0,208,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +125,Madagascar,S,1,0,125,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +43,Chad,S,1,0,43,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +219,Thailand,S,40,0,199,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +123,Belgium (Dutch),S,7,1,23,2001-12-27,2013-11-27 00:14:36,USER_S,USER_X +15,Australia,S,5,1,15,2000-06-09,2013-11-27 00:14:36,USER_S,USER_X +144,Nauru,S,1,0,144,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +81,Greenland,S,1,0,81,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +142,Mozambique,S,1,0,142,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +104,Japan,S,6,0,104,2000-06-09,2013-11-27 00:14:36,USER_S,USER_X +102,Jamaica,S,1,0,102,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +186,Spain,S,7,0,186,2001-10-20,2013-11-27 00:14:36,USER_S,USER_X +100,Ebaymotors,S,1,0,1,2000-06-09,2013-11-27 00:14:36,USER_S,USER_X +116,"Lebanon South",S,1,0,116,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +76,Georgia,S,1,0,76,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +137,Moldova,S,1,0,137,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +79,Gibraltar,S,1,0,79,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +87,Guinea,S,1,0,87,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +996,Stamps,D,1,0,-999,2000-06-29,,USER_G,USER_X +160,Paraguay,S,1,0,160,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +240,Togo,S,1,0,200,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +203,India,S,44,0,95,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +3,英国,S,3,1,3,2000-06-09,2013-11-27 00:14:36,USER_S,USER_X +198,Denmark,S,17,0,57,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +37,Burundi,S,1,0,37,2001-09-07,2013-11-27 00:14:36,USER_DNEL,USER_X +20,Ebay Half Integration,S,1,0,1,2002-03-21,2013-11-27 00:14:36,USER_S,USER_X +55,Cyprus,S,1,0,55,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +259,Zimbabwe,S,1,0,224,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +120,Liechtenstein,S,1,0,120,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +156,Pakistan,S,1,0,156,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +205,Ireland,S,7,0,99,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +998,Computers,D,1,0,-999,2000-06-29,,USER_G,USER_X +157,Palau,S,1,0,157,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +182,Slovenia,S,1,0,182,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +35,Burkina Faso,S,1,0,35,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +199,Finland,S,7,0,70,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +197,Czech Republic,S,16,0,56,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +138,Monaco,S,1,0,138,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +985,AOL Cobrand,D,1,0,-999,2000-06-29,,USER_G,USER_X +75,Gambia,S,1,0,75,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +14,Aruba,S,1,0,14,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +218,Sweden,S,38,0,192,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +24,Belize,S,1,0,24,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +217,South Africa,S,43,0,185,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +970,Butterfields Kiss,D,1,0,-999,2000-08-30,,USER_G,USER_X +17,Azerbaijan Republic,S,1,0,17,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +993,Percelain,D,1,0,-999,2000-06-12,,USER_G,USER_X +211,Philippines,S,34,0,162,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +155,Oman,S,1,0,155,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +73,French Polynesia,S,1,0,73,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +53,"Croatia Democratic Republic Of The",S,1,0,53,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +134,Mauritius,S,1,0,134,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +113,Kyrgyzstan,S,1,0,113,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +131,Marshall Islands,S,1,0,131,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +992,Jewelry,D,1,0,-999,2000-06-29,,USER_G,USER_X +174,Saint Vincent And The Grenadines,S,1,0,174,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +22,Belarus,S,1,0,22,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +256,Western Samoa,S,1,0,220,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +52,Cote D Ivoire (Ivory Coast),S,1,0,52,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +175,San Marino,S,1,0,175,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +-3,Tradera,S,7,0,192,2009-02-11,,USER_OFF,USER_X +200,Greece,S,7,0,80,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +32,British Virgin Islands,S,1,0,32,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +171,Saint Kitts-Nevis,S,1,0,171,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +176,Saudi Arabia,S,1,0,176,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X +19,Bahrain,S,1,0,19,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +101,Italy,S,7,1,101,2000-11-03,2013-11-27 00:14:36,USER_S,USER_X +236,Micronesia,S,1,0,226,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +64,Equatorial Guinea,S,1,0,64,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +209,Norway,S,32,0,154,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +195,Tahiti,S,1,0,195,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +221,Us1,S,1,0,1,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +146,Netherlands,S,7,1,146,2001-07-12,2013-11-27 00:14:36,USER_S,USER_X +214,Puerto Rico,S,1,0,165,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +29,Bosnia And Herzegovina,S,1,0,29,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +215,Russia,S,84,0,168,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +90,Haiti,S,1,0,90,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +12,Argentina,S,1,0,12,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X +158,Panama,S,1,0,158,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +139,Mongolia,S,1,0,139,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +41,Cayman Islands,S,1,0,41,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +151,Niger,S,1,0,151,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +11,Antigua And Barbuda,S,1,0,11,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +-1,Korea Auction.co.kr,S,48,0,111,2009-02-11,,USER_OFF,USER_X +112,Kuwait,S,1,0,112,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +59,Dominica,S,1,0,59,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +179,Sierra Leone,S,1,0,179,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +132,Martinique,S,1,0,132,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +972,Hoianhoard,D,1,0,-999,2000-07-26,,USER_G,USER_X +257,Yemen,S,1,0,221,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +235,Macau,S,1,0,123,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +8,Andorra,S,1,0,8,2000-07-26,2013-11-27 00:14:36,USER_G,USER_X +191,Swaziland,S,1,0,191,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +141,Morocco,S,1,0,141,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +177,Senegal,S,1,0,177,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +184,Somalia,S,1,0,184,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +47,Comoros,S,1,0,47,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +212,Poland,S,35,0,163,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +994,Sports,D,1,0,-999,2000-07-07,,USER_PFI,USER_X +34,Bulgaria,S,1,0,34,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +-2,Bazee,S,44,0,95,2009-02-11,,USER_OFF,USER_X +224,Japan Row,S,6,0,104,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +-999,Unknown,S,-999,0,-999,2000-06-29,,USER_G,USER_X +986,GO Cobrand,D,1,0,-999,2000-06-29,,USER_G,USER_X +133,Mauritania,S,1,0,133,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +196,Taiwan,S,41,0,196,2002-03-08,2013-11-27 00:14:36,USER_S,USER_X +33,Brunei Darussalam,S,1,0,33,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +-7,StubHub UK,S,3,1,3,2012-11-08,,USER_C4,USER_X +140,Montserrat,S,1,0,140,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +990,Toys,D,1,0,-999,2000-06-29,,USER_G,USER_X +150,Nicaragua,S,1,0,150,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +244,Turkmenistan,S,1,0,205,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +78,Ghana,S,1,0,78,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +973,Developer.ebay.com,D,1,0,-999,2000-10-06,2000-10-06 00:00:00,USER_G,USER_G +202,Hungary,S,23,0,93,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +242,Trinidad And Tobago,S,1,0,202,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +981,Compuserve Cobrand,D,1,0,-999,2000-06-29,,USER_G,USER_X +60,Dominican Republic,S,1,0,60,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +13,Armenia,S,1,0,13,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +991,Dolls,D,1,0,-999,2000-06-29,,USER_G,USER_X +118,Liberia,S,1,0,118,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +77,Germany,S,7,1,77,2000-06-09,2013-11-27 00:14:36,USER_S,USER_X +51,Costa Rica,S,1,0,51,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +1,Usa,S,1,1,1,2000-06-09,2013-11-27 00:14:36,USER_S,USER_X +39,Cameroon,S,1,0,39,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +997,Great Collections,D,1,0,-999,2000-06-29,,USER_G,USER_X +181,Slovak Republic,S,1,0,181,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X +189,Suriname,S,1,0,189,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +74,Gabon Republic,S,1,0,74,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +31,Brazil,S,1,0,31,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X +38,Cambodia,S,1,0,38,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +245,Turks And Caicos Islands,S,1,0,206,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +28,Bolivia,S,1,0,28,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +210,Canada (French),S,2,0,2,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +238,Tajikistan,S,1,0,197,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +58,Djibouti,S,1,0,58,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +135,Mayotte,S,1,0,135,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +995,Coins,D,1,0,-999,2000-06-29,,USER_G,USER_X +114,Laos,S,1,0,114,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +173,Saint Pierre And Miquelon,S,1,0,173,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +83,Guadeloupe,S,1,0,83,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +62,Egypt,S,1,0,62,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +122,Luxembourg,S,1,0,122,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +72,French Guiana,S,1,0,72,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +223,China,S,14,0,45,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X +163,Unknown: Added by DW(0),S,-999,0,-999,2001-09-07,,USER_DNEL,USER_X +40,Cape Verde Islands,S,1,0,40,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +222,Yugoslavia,S,1,0,222,2013-03-12,2013-11-27 00:14:36,USER_X,USER_X +61,Ecuador,S,1,0,61,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +243,Tunisia,S,1,0,203,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +183,Solomon Islands,S,1,0,183,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +226,South Korea,S,1,0,111,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X +7,American Samoa,S,1,0,7,2000-07-26,2013-11-27 00:14:36,USER_G,USER_X +121,Lithuania,S,1,0,121,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +18,Bahamas,S,1,0,18,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +0,Ebay,S,1,0,1,2000-06-09,2013-11-27 00:14:36,USER_S,USER_X +-8,Wholesale Deals -- US,S,1,1,1,2013-02-19,,USER_YAJ,USER_X +250,Vanuatu,S,1,0,213,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +42,Central African Republic,S,1,0,42,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +252,Venezuela,S,1,0,215,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +109,Kiribati,S,1,0,109,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +130,Malta,S,1,0,130,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +251,Vatican City State,S,1,0,214,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +253,Virgin Islands (U.S.),S,1,0,217,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +500,Unknown: Added by DW(1),S,-999,0,-999,2000-07-26,,USER_G,USER_X +255,Western Sahara,S,1,0,219,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +190,Svalbard,S,1,0,190,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +85,Guatemala,S,1,0,85,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +254,Wallis And Futuna,S,1,0,218,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X +27,Bhutan,S,1,0,27,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X +249,Uzbekistan,S,1,0,212,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X diff --git a/examples/test_case_data/localmeta/data/TEST_CAL_DT.csv b/examples/test_case_data/localmeta/data/TEST_CAL_DT.csv deleted file mode 100644 index 67efe23..0000000 --- a/examples/test_case_data/localmeta/data/TEST_CAL_DT.csv +++ /dev/null @@ -1,731 +0,0 @@ -2012-08-16,2012-01-01,2012-07-01,2012-08-01,2012-08-11,0,-1,-3,-15,-103,0,-1,-4,-15,-15,41501,228,47,16,6,33,5928,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-17,16-Aug-2012,Aug 16th 2012,Fri 08-16-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-11,2012-08-12,2012-08-16,Fri ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,33,2012,2012-08-11,2012-08-17,N,Wk.33 - 13,2012-08-11 00:00:00,2012-08-17 00:00:00,2012W33 ,2012W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2012,N,2012-08-16,2011-08-16,2012-05-16,2012-02-16,2012-07-16,2012-06-16,2012-08-09,2012-08-02,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-03,2012-01-01,2012-01-01,2012-01-01,2012-01-01,0,-3,-10,-47,-328,0,-3,-11,-47,-47,41276,3,3,3,5,1,5896,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-05,03-Jan-2012,Jan 3rd 2012,Thu 01-03-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2012-01-03,Thu ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,1,2012,2012-12-30,2012-01-05,N,Wk.01 - 13,2012-01-01 00:00:00,2012-01-05 00:00:00,2012W01 ,2012W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2012,N,2012-01-03,2011-01-03,2012-10-03,2012-07-03,2012-12-03,2012-11-03,2012-12-27,2012-12-20,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-10,2012-01-01,2012-04-01,2012-04-01,2012-04-07,0,-2,-7,-33,-231,0,-2,-8,-33,-33,41373,100,10,10,4,15,5910,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-13,10-Apr-2012,Apr 10th 2012,Wed 04-10-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-07,2012-04-08,2012-04-10,Wed ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,15,2012,2012-04-07,2012-04-13,N,Wk.15 - 13,2012-04-07 00:00:00,2012-04-13 00:00:00,2012W15 ,2012W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2012,N,2012-04-10,2011-04-10,2012-01-10,2012-10-10,2012-03-10,2012-02-10,2012-04-03,2012-03-27,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-12,2012-01-01,2012-04-01,2012-06-01,2012-06-09,0,-2,-5,-24,-168,0,-2,-6,-24,-24,41436,163,73,12,4,24,5919,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-15,12-Jun-2012,Jun 12th 2012,Wed 06-12-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-09,2012-06-10,2012-06-12,Wed ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,24,2012,2012-06-09,2012-06-15,N,Wk.24 - 13,2012-06-09 00:00:00,2012-06-15 00:00:00,2012W24 ,2012W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2012,N,2012-06-12,2011-06-12,2012-03-12,2012-12-12,2012-05-12,2012-04-12,2012-06-05,2012-05-29,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-27,2012-01-01,2012-04-01,2012-04-01,2012-04-21,0,-2,-7,-31,-214,0,-2,-8,-31,-31,41390,117,27,27,7,17,5912,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-27,27-Apr-2012,Apr 27th 2012,Sat 04-27-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-21,2012-04-22,2012-04-27,Sat ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,17,2012,2012-04-21,2012-04-27,N,Wk.17 - 13,2012-04-21 00:00:00,2012-04-27 00:00:00,2012W17 ,2012W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2012,N,2012-04-27,2011-04-27,2012-01-27,2012-10-27,2012-03-27,2012-02-27,2012-04-20,2012-04-13,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-19,2012-01-01,2012-07-01,2012-09-01,2012-09-15,0,-1,-2,-10,-69,0,-1,-3,-10,-10,41535,262,81,19,5,38,5933,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-21,19-Sep-2012,Sep 19th 2012,Thu 09-19-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-15,2012-09-16,2012-09-19,Thu ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,38,2012,2012-09-15,2012-09-21,N,Wk.38 - 13,2012-09-15 00:00:00,2012-09-21 00:00:00,2012W38 ,2012W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2012,N,2012-09-19,2011-09-19,2012-06-19,2012-03-19,2012-08-19,2012-07-19,2012-09-12,2012-09-05,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-07,2012-01-01,2012-01-01,2012-03-01,2012-03-03,0,-3,-8,-38,-265,0,-3,-9,-38,-38,41339,66,66,7,5,10,5905,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-09,07-Mar-2012,Mar 7th 2012,Thu 03-07-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-03,2012-03-04,2012-03-07,Thu ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,10,2012,2012-03-03,2012-03-09,N,Wk.10 - 13,2012-03-03 00:00:00,2012-03-09 00:00:00,2012W10 ,2012W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2012,N,2012-03-07,2011-03-07,2012-12-07,2012-09-07,2012-02-07,2012-01-07,2012-02-28,2012-02-21,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-28,2012-01-01,2012-01-01,2012-03-01,2012-03-24,0,-3,-8,-35,-244,0,-3,-9,-35,-35,41360,87,87,28,5,13,5908,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-30,28-Mar-2012,Mar 28th 2012,Thu 03-28-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-24,2012-03-25,2012-03-28,Thu ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,13,2012,2012-03-24,2012-03-30,N,Wk.13 - 13,2012-03-24 00:00:00,2012-03-30 00:00:00,2012W13 ,2012W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2012,N,2012-03-28,2011-03-28,2012-12-28,2012-09-28,2012-02-28,2012-01-28,2012-03-21,2012-03-14,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-23,2012-01-01,2012-10-01,2012-11-01,2012-11-17,0,0,0,-1,-4,0,0,-1,-1,-1,41600,327,54,23,7,47,5942,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-23,23-Nov-2012,Nov 23rd 2012,Sat 11-23-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-17,2012-11-18,2012-11-23,Sat ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,47,2012,2012-11-17,2012-11-23,N,Wk.47 - 13,2012-11-17 00:00:00,2012-11-23 00:00:00,2012W47 ,2012W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2012,N,2012-11-23,2011-11-23,2012-08-23,2012-05-23,2012-10-23,2012-09-23,2012-11-16,2012-11-09,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-09,2012-01-01,2012-01-01,2012-03-01,2012-03-03,0,-3,-8,-38,-263,0,-3,-9,-38,-38,41341,68,68,9,7,10,5905,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-09,09-Mar-2012,Mar 9th 2012,Sat 03-09-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-03,2012-03-04,2012-03-09,Sat ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,10,2012,2012-03-03,2012-03-09,N,Wk.10 - 13,2012-03-03 00:00:00,2012-03-09 00:00:00,2012W10 ,2012W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2012,N,2012-03-09,2011-03-09,2012-12-09,2012-09-09,2012-02-09,2012-01-09,2012-03-02,2012-02-23,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-21,2012-01-01,2012-10-01,2012-11-01,2012-11-17,0,0,0,-1,-6,0,0,-1,-1,-1,41598,325,52,21,5,47,5942,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-23,21-Nov-2012,Nov 21st 2012,Thu 11-21-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-17,2012-11-18,2012-11-21,Thu ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,47,2012,2012-11-17,2012-11-23,N,Wk.47 - 13,2012-11-17 00:00:00,2012-11-23 00:00:00,2012W47 ,2012W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2012,N,2012-11-21,2011-11-21,2012-08-21,2012-05-21,2012-10-21,2012-09-21,2012-11-14,2012-11-07,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-26,2012-01-01,2012-01-01,2012-03-01,2012-03-24,0,-3,-8,-35,-246,0,-3,-9,-35,-35,41358,85,85,26,3,13,5908,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-30,26-Mar-2012,Mar 26th 2012,Tue 03-26-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-24,2012-03-25,2012-03-26,Tue ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,13,2012,2012-03-24,2012-03-30,N,Wk.13 - 13,2012-03-24 00:00:00,2012-03-30 00:00:00,2012W13 ,2012W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2012,N,2012-03-26,2011-03-26,2012-12-26,2012-09-26,2012-02-26,2012-01-26,2012-03-19,2012-03-12,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-24,2012-01-01,2012-01-01,2012-01-01,2012-01-20,0,-3,-10,-44,-307,0,-3,-11,-44,-44,41297,24,24,24,5,4,5899,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-26,24-Jan-2012,Jan 24th 2012,Thu 01-24-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-20,2012-01-21,2012-01-24,Thu ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,4,2012,2012-01-20,2012-01-26,N,Wk.04 - 13,2012-01-20 00:00:00,2012-01-26 00:00:00,2012W04 ,2012W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2012,N,2012-01-24,2011-01-24,2012-10-24,2012-07-24,2012-12-24,2012-11-24,2012-01-17,2012-01-10,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-01,2012-01-01,2012-01-01,2012-01-01,2012-01-01,0,-3,-10,-47,-330,0,-3,-11,-47,-47,41274,1,1,1,3,1,5896,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-05,01-Jan-2012,Jan 1st 2012,Tue 01-01-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2012-01-01,Tue ,2012M01,Jan-2012,Y,2012M01 ,Y,Year 2012 - Quarter 01,2012Q01 ,Y,1,2012,2012-12-30,2012-01-05,Y,Wk.01 - 13,2012-01-01 00:00:00,2012-01-05 00:00:00,2012W01 ,2012W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2012,Y,2012-01-01,2011-01-01,2012-10-01,2012-07-01,2012-12-01,2012-11-01,2012-12-25,2012-12-18,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-29,2012-01-01,2012-04-01,2012-04-01,2012-04-28,0,-2,-7,-30,-212,0,-2,-7,-30,-30,41392,119,29,29,2,18,5913,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-05-04,29-Apr-2012,Apr 29th 2012,Mon 04-29-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-04-28,2012-04-28,2012-04-29,2012-04-29,Mon ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,18,2012,2012-04-28,2012-05-04,N,Wk.18 - 13,2012-04-28 00:00:00,2012-05-04 00:00:00,2012W18 ,2012W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2012,N,2012-04-29,2011-04-29,2012-01-29,2012-10-29,2012-03-29,2012-02-28,2012-04-22,2012-04-15,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-11,2012-01-01,2012-04-01,2012-05-01,2012-05-05,0,-2,-6,-29,-200,0,-2,-7,-29,-29,41404,131,41,11,7,19,5914,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-11,11-May-2012,May 11th 2012,Sat 05-11-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-05,2012-05-06,2012-05-11,Sat ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,19,2012,2012-05-05,2012-05-11,N,Wk.19 - 13,2012-05-05 00:00:00,2012-05-11 00:00:00,2012W19 ,2012W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2012,N,2012-05-11,2011-05-11,2012-02-11,2012-11-11,2012-04-11,2012-03-11,2012-05-04,2012-04-27,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-01,2012-01-01,2012-10-01,2012-10-01,2012-09-29,0,0,-1,-8,-57,0,0,-2,-8,-8,41547,274,1,1,3,40,5935,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-05,01-Oct-2012,Oct 1st 2012,Tue 10-01-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-09-29,2012-09-30,2012-10-01,Tue ,2012M10,Oct-2012,Y,2012M10 ,Y,Year 2012 - Quarter 04,2012Q04 ,Y,40,2012,2012-09-29,2012-10-05,N,Wk.40 - 13,2012-09-29 00:00:00,2012-10-05 00:00:00,2012W40 ,2012W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2012,N,2012-10-01,2011-10-01,2012-07-01,2012-04-01,2012-09-01,2012-08-01,2012-09-24,2012-09-17,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-05,2012-01-01,2012-10-01,2012-12-01,2012-12-01,0,0,1,1,8,0,0,0,1,1,41612,339,66,5,5,49,5944,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-07,05-Dec-2012,Dec 5th 2012,Thu 12-05-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-01,2012-12-02,2012-12-05,Thu ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,49,2012,2012-12-01,2012-12-07,N,Wk.49 - 13,2012-12-01 00:00:00,2012-12-07 00:00:00,2012W49 ,2012W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2012,N,2012-12-05,2011-12-05,2012-09-05,2012-06-05,2012-11-05,2012-10-05,2012-11-28,2012-11-21,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-05,2012-01-01,2012-01-01,2012-03-01,2012-03-03,0,-3,-8,-38,-267,0,-3,-9,-38,-38,41337,64,64,5,3,10,5905,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-09,05-Mar-2012,Mar 5th 2012,Tue 03-05-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-03,2012-03-04,2012-03-05,Tue ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,10,2012,2012-03-03,2012-03-09,N,Wk.10 - 13,2012-03-03 00:00:00,2012-03-09 00:00:00,2012W10 ,2012W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2012,N,2012-03-05,2011-03-05,2012-12-05,2012-09-05,2012-02-05,2012-01-05,2012-02-26,2012-02-19,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-03,2012-01-01,2012-10-01,2012-10-01,2012-09-29,0,0,-1,-8,-55,0,0,-2,-8,-8,41549,276,3,3,5,40,5935,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-05,03-Oct-2012,Oct 3rd 2012,Thu 10-03-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-09-29,2012-09-30,2012-10-03,Thu ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,40,2012,2012-09-29,2012-10-05,N,Wk.40 - 13,2012-09-29 00:00:00,2012-10-05 00:00:00,2012W40 ,2012W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2012,N,2012-10-03,2011-10-03,2012-07-03,2012-04-03,2012-09-03,2012-08-03,2012-09-26,2012-09-19,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-22,2012-01-01,2012-01-01,2012-01-01,2012-01-20,0,-3,-10,-44,-309,0,-3,-11,-44,-44,41295,22,22,22,3,4,5899,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-26,22-Jan-2012,Jan 22nd 2012,Tue 01-22-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-20,2012-01-21,2012-01-22,Tue ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,4,2012,2012-01-20,2012-01-26,N,Wk.04 - 13,2012-01-20 00:00:00,2012-01-26 00:00:00,2012W04 ,2012W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2012,N,2012-01-22,2011-01-22,2012-10-22,2012-07-22,2012-12-22,2012-11-22,2012-01-15,2012-01-08,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-26,2012-01-01,2012-10-01,2012-12-01,2012-12-22,0,0,1,4,29,0,0,0,4,4,41633,360,87,26,5,52,5947,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-28,26-Dec-2012,Dec 26th 2012,Thu 12-26-13,0,0,0,0,2012-12-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-22,2012-12-23,2012-12-26,Thu ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,52,2012,2012-12-22,2012-12-28,N,Wk.52 - 13,2012-12-22 00:00:00,2012-12-28 00:00:00,2012W52 ,2012W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2012,N,2012-12-26,2011-12-26,2012-09-26,2012-06-26,2012-11-26,2012-10-26,2012-12-19,2012-12-12,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-17,2012-01-01,2012-07-01,2012-09-01,2012-09-15,0,-1,-2,-10,-71,0,-1,-3,-10,-10,41533,260,79,17,3,38,5933,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-21,17-Sep-2012,Sep 17th 2012,Tue 09-17-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-15,2012-09-16,2012-09-17,Tue ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,38,2012,2012-09-15,2012-09-21,N,Wk.38 - 13,2012-09-15 00:00:00,2012-09-21 00:00:00,2012W38 ,2012W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2012,N,2012-09-17,2011-09-17,2012-06-17,2012-03-17,2012-08-17,2012-07-17,2012-09-10,2012-09-03,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-20,2012-01-01,2012-10-01,2012-10-01,2012-10-20,0,0,-1,-5,-38,0,0,-2,-5,-6,41566,293,20,20,1,43,5938,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-26,20-Oct-2012,Oct 20th 2012,Sun 10-20-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-20,2012-10-14,2012-10-20,Sun ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,43,2012,2012-10-20,2012-10-26,Y,Wk.43 - 13,2012-10-20 00:00:00,2012-10-26 00:00:00,2012W43 ,2012W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2012,N,2012-10-20,2011-10-20,2012-07-20,2012-04-20,2012-09-20,2012-08-20,2012-10-13,2012-10-06,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-25,2012-01-01,2012-10-01,2012-11-01,2012-11-24,0,0,0,0,-2,0,0,0,0,0,41602,329,56,25,2,48,5943,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-30,25-Nov-2012,Nov 25th 2012,Mon 11-25-13,1,1,1,1,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-11-24,2012-11-24,2012-11-25,2012-11-25,Mon ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,48,2012,2012-11-24,2012-11-30,N,Wk.48 - 13,2012-11-24 00:00:00,2012-11-30 00:00:00,2012W48 ,2012W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2012,N,2012-11-25,2011-11-25,2012-08-25,2012-05-25,2012-10-25,2012-09-25,2012-11-18,2012-11-11,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-26,2012-01-01,2012-01-01,2012-01-01,2012-01-20,0,-3,-10,-44,-305,0,-3,-11,-44,-44,41299,26,26,26,7,4,5899,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-26,26-Jan-2012,Jan 26th 2012,Sat 01-26-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-20,2012-01-21,2012-01-26,Sat ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,4,2012,2012-01-20,2012-01-26,N,Wk.04 - 13,2012-01-20 00:00:00,2012-01-26 00:00:00,2012W04 ,2012W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2012,N,2012-01-26,2011-01-26,2012-10-26,2012-07-26,2012-12-26,2012-11-26,2012-01-19,2012-01-12,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-24,2012-01-01,2012-10-01,2012-12-01,2012-12-22,0,0,1,4,27,0,0,0,4,4,41631,358,85,24,3,52,5947,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-28,24-Dec-2012,Dec 24th 2012,Tue 12-24-13,0,0,0,0,2012-12-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-22,2012-12-23,2012-12-24,Tue ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,52,2012,2012-12-22,2012-12-28,N,Wk.52 - 13,2012-12-22 00:00:00,2012-12-28 00:00:00,2012W52 ,2012W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2012,N,2012-12-24,2011-12-24,2012-09-24,2012-06-24,2012-11-24,2012-10-24,2012-12-17,2012-12-10,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-04,2012-01-01,2012-01-01,2012-02-01,2012-02-03,0,-3,-9,-42,-296,0,-3,-10,-42,-42,41308,35,35,4,2,6,5901,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-09,04-Feb-2012,Feb 4th 2012,Mon 02-04-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-03,2012-02-04,2012-02-04,Mon ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,6,2012,2012-02-03,2012-02-09,N,Wk.06 - 13,2012-02-03 00:00:00,2012-02-09 00:00:00,2012W06 ,2012W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2012,N,2012-02-04,2011-02-04,2012-11-04,2012-08-04,2012-01-04,2012-12-04,2012-01-28,2012-01-21,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-30,2012-01-01,2012-04-01,2012-05-01,2012-05-26,0,-2,-6,-26,-181,0,-2,-6,-26,-26,41423,150,60,30,5,22,5917,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-06-01,30-May-2012,May 30th 2012,Thu 05-30-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-05-26,2012-05-26,2012-05-27,2012-05-30,Thu ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,22,2012,2012-05-26,2012-06-01,N,Wk.22 - 13,2012-05-26 00:00:00,2012-06-01 00:00:00,2012W22 ,2012W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2012,N,2012-05-30,2011-05-30,2012-02-28,2012-11-30,2012-04-30,2012-03-30,2012-05-23,2012-05-16,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-12,2012-01-01,2012-04-01,2012-04-01,2012-04-07,0,-2,-7,-33,-229,0,-2,-8,-33,-33,41375,102,12,12,6,15,5910,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-13,12-Apr-2012,Apr 12th 2012,Fri 04-12-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-07,2012-04-08,2012-04-12,Fri ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,15,2012,2012-04-07,2012-04-13,N,Wk.15 - 13,2012-04-07 00:00:00,2012-04-13 00:00:00,2012W15 ,2012W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2012,N,2012-04-12,2011-04-12,2012-01-12,2012-10-12,2012-03-12,2012-02-12,2012-04-05,2012-03-29,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-08,2012-01-01,2012-04-01,2012-04-01,2012-04-07,0,-2,-7,-33,-233,0,-2,-8,-33,-33,41371,98,8,8,2,15,5910,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-13,08-Apr-2012,Apr 8th 2012,Mon 04-08-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-07,2012-04-08,2012-04-08,Mon ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,15,2012,2012-04-07,2012-04-13,N,Wk.15 - 13,2012-04-07 00:00:00,2012-04-13 00:00:00,2012W15 ,2012W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2012,N,2012-04-08,2011-04-08,2012-01-08,2012-10-08,2012-03-08,2012-02-08,2012-04-01,2012-03-25,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-28,2012-01-01,2012-10-01,2012-12-01,2012-12-22,0,0,1,4,31,0,0,0,4,4,41635,362,89,28,7,52,5947,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-28,28-Dec-2012,Dec 28th 2012,Sat 12-28-13,0,0,0,0,2012-12-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-22,2012-12-23,2012-12-28,Sat ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,52,2012,2012-12-22,2012-12-28,N,Wk.52 - 13,2012-12-22 00:00:00,2012-12-28 00:00:00,2012W52 ,2012W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2012,N,2012-12-28,2011-12-28,2012-09-28,2012-06-28,2012-11-28,2012-10-28,2012-12-21,2012-12-14,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-03,2012-01-01,2012-10-01,2012-12-01,2012-12-01,0,0,1,1,6,0,0,0,1,1,41610,337,64,3,3,49,5944,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-07,03-Dec-2012,Dec 3rd 2012,Tue 12-03-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-01,2012-12-02,2012-12-03,Tue ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,49,2012,2012-12-01,2012-12-07,N,Wk.49 - 13,2012-12-01 00:00:00,2012-12-07 00:00:00,2012W49 ,2012W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2012,N,2012-12-03,2011-12-03,2012-09-03,2012-06-03,2012-11-03,2012-10-03,2012-11-26,2012-11-19,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-15,2012-01-01,2012-07-01,2012-07-01,2012-07-14,0,-1,-4,-19,-135,0,-1,-5,-19,-19,41469,196,15,15,2,29,5924,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-20,15-Jul-2012,Jul 15th 2012,Mon 07-15-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-14,2012-07-15,2012-07-15,Mon ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,29,2012,2012-07-14,2012-07-20,N,Wk.29 - 13,2012-07-14 00:00:00,2012-07-20 00:00:00,2012W29 ,2012W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2012,N,2012-07-15,2011-07-15,2012-04-15,2012-01-15,2012-06-15,2012-05-15,2012-07-08,2012-07-01,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-13,2012-01-01,2012-04-01,2012-05-01,2012-05-12,0,-2,-6,-28,-198,0,-2,-7,-28,-28,41406,133,43,13,2,20,5915,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-18,13-May-2012,May 13th 2012,Mon 05-13-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-12,2012-05-13,2012-05-13,Mon ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,20,2012,2012-05-12,2012-05-18,N,Wk.20 - 13,2012-05-12 00:00:00,2012-05-18 00:00:00,2012W20 ,2012W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2012,N,2012-05-13,2011-05-13,2012-02-13,2012-11-13,2012-04-13,2012-03-13,2012-05-06,2012-04-29,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-30,2012-01-01,2012-01-01,2012-03-01,2012-03-24,0,-3,-8,-35,-242,0,-3,-9,-35,-35,41362,89,89,30,7,13,5908,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-30,30-Mar-2012,Mar 30th 2012,Sat 03-30-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-24,2012-03-25,2012-03-30,Sat ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,13,2012,2012-03-24,2012-03-30,N,Wk.13 - 13,2012-03-24 00:00:00,2012-03-30 00:00:00,2012W13 ,2012W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2012,N,2012-03-30,2011-03-30,2012-12-30,2012-09-30,2012-02-28,2012-01-30,2012-03-23,2012-03-16,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-09,2012-01-01,2012-10-01,2012-12-01,2012-12-08,0,0,1,2,12,0,0,0,2,2,41616,343,70,9,2,50,5945,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-14,09-Dec-2012,Dec 9th 2012,Mon 12-09-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-08,2012-12-09,2012-12-09,Mon ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,50,2012,2012-12-08,2012-12-14,N,Wk.50 - 13,2012-12-08 00:00:00,2012-12-14 00:00:00,2012W50 ,2012W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2012,N,2012-12-09,2011-12-09,2012-09-09,2012-06-09,2012-11-09,2012-10-09,2012-12-02,2012-11-25,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-25,2012-01-01,2012-01-01,2012-02-01,2012-02-24,0,-3,-9,-39,-275,0,-3,-9,-39,-39,41329,56,56,25,2,9,5904,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-03-02,25-Feb-2012,Feb 25th 2012,Mon 02-25-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-02-24,2012-02-24,2012-02-25,2012-02-25,Mon ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,9,2012,2012-02-24,2012-03-02,N,Wk.09 - 13,2012-02-24 00:00:00,2012-03-02 00:00:00,2012W09 ,2012W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2012,N,2012-02-25,2011-02-25,2012-11-25,2012-08-25,2012-01-25,2012-12-25,2012-02-18,2012-02-11,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-04,2012-01-01,2012-10-01,2012-11-01,2012-11-03,0,0,0,-3,-23,0,0,-1,-3,-3,41581,308,35,4,2,45,5940,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-09,04-Nov-2012,Nov 4th 2012,Mon 11-04-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-03,2012-11-04,2012-11-04,Mon ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,45,2012,2012-11-03,2012-11-09,N,Wk.45 - 13,2012-11-03 00:00:00,2012-11-09 00:00:00,2012W45 ,2012W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2012,N,2012-11-04,2011-11-04,2012-08-04,2012-05-04,2012-10-04,2012-09-04,2012-10-28,2012-10-21,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-08,2012-01-01,2012-10-01,2012-11-01,2012-11-03,0,0,0,-3,-19,0,0,-1,-3,-3,41585,312,39,8,6,45,5940,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-09,08-Nov-2012,Nov 8th 2012,Fri 11-08-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-03,2012-11-04,2012-11-08,Fri ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,45,2012,2012-11-03,2012-11-09,N,Wk.45 - 13,2012-11-03 00:00:00,2012-11-09 00:00:00,2012W45 ,2012W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2012,N,2012-11-08,2011-11-08,2012-08-08,2012-05-08,2012-10-08,2012-09-08,2012-11-01,2012-10-25,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-22,2012-01-01,2012-07-01,2012-08-01,2012-08-18,0,-1,-3,-14,-97,0,-1,-4,-14,-14,41507,234,53,22,5,34,5929,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-24,22-Aug-2012,Aug 22nd 2012,Thu 08-22-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-18,2012-08-19,2012-08-22,Thu ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,34,2012,2012-08-18,2012-08-24,N,Wk.34 - 13,2012-08-18 00:00:00,2012-08-24 00:00:00,2012W34 ,2012W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2012,N,2012-08-22,2011-08-22,2012-05-22,2012-02-22,2012-07-22,2012-06-22,2012-08-15,2012-08-08,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-18,2012-01-01,2012-04-01,2012-06-01,2012-06-16,0,-2,-5,-23,-162,0,-2,-6,-23,-23,41442,169,79,18,3,25,5920,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-22,18-Jun-2012,Jun 18th 2012,Tue 06-18-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-16,2012-06-17,2012-06-18,Tue ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,25,2012,2012-06-16,2012-06-22,N,Wk.25 - 13,2012-06-16 00:00:00,2012-06-22 00:00:00,2012W25 ,2012W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2012,N,2012-06-18,2011-06-18,2012-03-18,2012-12-18,2012-05-18,2012-04-18,2012-06-11,2012-06-04,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-19,2012-01-01,2012-07-01,2012-07-01,2012-07-14,0,-1,-4,-19,-131,0,-1,-5,-19,-19,41473,200,19,19,6,29,5924,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-20,19-Jul-2012,Jul 19th 2012,Fri 07-19-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-14,2012-07-15,2012-07-19,Fri ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,29,2012,2012-07-14,2012-07-20,N,Wk.29 - 13,2012-07-14 00:00:00,2012-07-20 00:00:00,2012W29 ,2012W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2012,N,2012-07-19,2011-07-19,2012-04-19,2012-01-19,2012-06-19,2012-05-19,2012-07-12,2012-07-05,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-20,2012-01-01,2012-07-01,2012-08-01,2012-08-18,0,-1,-3,-14,-99,0,-1,-4,-14,-14,41505,232,51,20,3,34,5929,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-24,20-Aug-2012,Aug 20th 2012,Tue 08-20-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-18,2012-08-19,2012-08-20,Tue ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,34,2012,2012-08-18,2012-08-24,N,Wk.34 - 13,2012-08-18 00:00:00,2012-08-24 00:00:00,2012W34 ,2012W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2012,N,2012-08-20,2011-08-20,2012-05-20,2012-02-20,2012-07-20,2012-06-20,2012-08-13,2012-08-06,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-24,2012-01-01,2012-07-01,2012-08-01,2012-08-18,0,-1,-3,-14,-95,0,-1,-4,-14,-14,41509,236,55,24,7,34,5929,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-24,24-Aug-2012,Aug 24th 2012,Sat 08-24-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-18,2012-08-19,2012-08-24,Sat ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,34,2012,2012-08-18,2012-08-24,N,Wk.34 - 13,2012-08-18 00:00:00,2012-08-24 00:00:00,2012W34 ,2012W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2012,N,2012-08-24,2011-08-24,2012-05-24,2012-02-24,2012-07-24,2012-06-24,2012-08-17,2012-08-10,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-13,2012-01-01,2012-07-01,2012-07-01,2012-07-07,0,-1,-4,-20,-137,0,-1,-5,-20,-20,41467,194,13,13,7,28,5923,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-13,13-Jul-2012,Jul 13th 2012,Sat 07-13-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-07,2012-07-08,2012-07-13,Sat ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,28,2012,2012-07-07,2012-07-13,N,Wk.28 - 13,2012-07-07 00:00:00,2012-07-13 00:00:00,2012W28 ,2012W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2012,N,2012-07-13,2011-07-13,2012-04-13,2012-01-13,2012-06-13,2012-05-13,2012-07-06,2012-06-29,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-06,2012-01-01,2012-10-01,2012-11-01,2012-11-03,0,0,0,-3,-21,0,0,-1,-3,-3,41583,310,37,6,4,45,5940,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-09,06-Nov-2012,Nov 6th 2012,Wed 11-06-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-03,2012-11-04,2012-11-06,Wed ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,45,2012,2012-11-03,2012-11-09,N,Wk.45 - 13,2012-11-03 00:00:00,2012-11-09 00:00:00,2012W45 ,2012W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2012,N,2012-11-06,2011-11-06,2012-08-06,2012-05-06,2012-10-06,2012-09-06,2012-10-30,2012-10-23,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-07,2012-01-01,2012-10-01,2012-12-01,2012-12-01,0,0,1,1,10,0,0,0,1,1,41614,341,68,7,7,49,5944,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-07,07-Dec-2012,Dec 7th 2012,Sat 12-07-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-01,2012-12-02,2012-12-07,Sat ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,49,2012,2012-12-01,2012-12-07,N,Wk.49 - 13,2012-12-01 00:00:00,2012-12-07 00:00:00,2012W49 ,2012W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2012,N,2012-12-07,2011-12-07,2012-09-07,2012-06-07,2012-11-07,2012-10-07,2012-11-30,2012-11-23,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-04,2012-01-01,2012-07-01,2012-07-01,2012-06-30,0,-1,-4,-21,-146,0,-1,-5,-21,-21,41458,185,4,4,5,27,5922,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-06,04-Jul-2012,Jul 4th 2012,Thu 07-04-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-06-30,2012-07-01,2012-07-04,Thu ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,27,2012,2012-06-30,2012-07-06,N,Wk.27 - 13,2012-06-30 00:00:00,2012-07-06 00:00:00,2012W27 ,2012W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2012,N,2012-07-04,2011-07-04,2012-04-04,2012-01-04,2012-06-04,2012-05-04,2012-06-27,2012-06-20,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-07,2012-01-01,2012-10-01,2012-10-01,2012-10-06,0,0,-1,-7,-51,0,0,-2,-7,-7,41553,280,7,7,2,41,5936,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-12,07-Oct-2012,Oct 7th 2012,Mon 10-07-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-06,2012-10-07,2012-10-07,Mon ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,41,2012,2012-10-06,2012-10-12,N,Wk.41 - 13,2012-10-06 00:00:00,2012-10-12 00:00:00,2012W41 ,2012W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2012,N,2012-10-07,2011-10-07,2012-07-07,2012-04-07,2012-09-07,2012-08-07,2012-09-30,2012-09-23,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-10,2012-01-01,2012-10-01,2012-11-01,2012-11-10,0,0,0,-2,-17,0,0,-1,-2,-3,41587,314,41,10,1,46,5941,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-16,10-Nov-2012,Nov 10th 2012,Sun 11-10-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-10,2012-11-04,2012-11-10,Sun ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,46,2012,2012-11-10,2012-11-16,Y,Wk.46 - 13,2012-11-10 00:00:00,2012-11-16 00:00:00,2012W46 ,2012W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2012,N,2012-11-10,2011-11-10,2012-08-10,2012-05-10,2012-10-10,2012-09-10,2012-11-03,2012-10-27,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-07,2012-01-01,2012-07-01,2012-08-01,2012-08-04,0,-1,-3,-16,-112,0,-1,-4,-16,-16,41492,219,38,7,4,32,5927,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-10,07-Aug-2012,Aug 7th 2012,Wed 08-07-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-04,2012-08-05,2012-08-07,Wed ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,32,2012,2012-08-04,2012-08-10,N,Wk.32 - 13,2012-08-04 00:00:00,2012-08-10 00:00:00,2012W32 ,2012W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2012,N,2012-08-07,2011-08-07,2012-05-07,2012-02-07,2012-07-07,2012-06-07,2012-07-31,2012-07-24,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-25,2012-01-01,2012-07-01,2012-09-01,2012-09-22,0,-1,-2,-9,-63,0,-1,-3,-9,-9,41541,268,87,25,4,39,5934,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-28,25-Sep-2012,Sep 25th 2012,Wed 09-25-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-22,2012-09-23,2012-09-25,Wed ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,39,2012,2012-09-22,2012-09-28,N,Wk.39 - 13,2012-09-22 00:00:00,2012-09-28 00:00:00,2012W39 ,2012W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2012,N,2012-09-25,2011-09-25,2012-06-25,2012-03-25,2012-08-25,2012-07-25,2012-09-18,2012-09-11,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-05,2012-01-01,2012-10-01,2012-10-01,2012-09-29,0,0,-1,-8,-53,0,0,-2,-8,-8,41551,278,5,5,7,40,5935,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-05,05-Oct-2012,Oct 5th 2012,Sat 10-05-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-09-29,2012-09-30,2012-10-05,Sat ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,40,2012,2012-09-29,2012-10-05,N,Wk.40 - 13,2012-09-29 00:00:00,2012-10-05 00:00:00,2012W40 ,2012W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2012,N,2012-10-05,2011-10-05,2012-07-05,2012-04-05,2012-09-05,2012-08-05,2012-09-28,2012-09-21,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-02,2012-01-01,2012-07-01,2012-09-01,2012-09-01,0,-1,-2,-12,-86,0,-1,-3,-12,-12,41518,245,64,2,2,36,5931,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-07,02-Sep-2012,Sep 2nd 2012,Mon 09-02-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-01,2012-09-02,2012-09-02,Mon ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,36,2012,2012-09-01,2012-09-07,N,Wk.36 - 13,2012-09-01 00:00:00,2012-09-07 00:00:00,2012W36 ,2012W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2012,N,2012-09-02,2011-09-02,2012-06-02,2012-03-02,2012-08-02,2012-07-02,2012-08-26,2012-08-19,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-15,2012-01-01,2012-04-01,2012-05-01,2012-05-12,0,-2,-6,-28,-196,0,-2,-7,-28,-28,41408,135,45,15,4,20,5915,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-18,15-May-2012,May 15th 2012,Wed 05-15-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-12,2012-05-13,2012-05-15,Wed ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,20,2012,2012-05-12,2012-05-18,N,Wk.20 - 13,2012-05-12 00:00:00,2012-05-18 00:00:00,2012W20 ,2012W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2012,N,2012-05-15,2011-05-15,2012-02-15,2012-11-15,2012-04-15,2012-03-15,2012-05-08,2012-05-01,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-10,2012-01-01,2012-01-01,2012-02-01,2012-02-10,0,-3,-9,-41,-290,0,-3,-10,-41,-42,41314,41,41,10,1,7,5902,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-16,10-Feb-2012,Feb 10th 2012,Sun 02-10-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-10,2012-02-04,2012-02-10,Sun ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,7,2012,2012-02-10,2012-02-16,Y,Wk.07 - 13,2012-02-10 00:00:00,2012-02-16 00:00:00,2012W07 ,2012W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2012,N,2012-02-10,2011-02-10,2012-11-10,2012-08-10,2012-01-10,2012-12-10,2012-02-03,2012-01-27,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-21,2012-01-01,2012-10-01,2012-12-01,2012-12-15,0,0,1,3,24,0,0,0,3,3,41628,355,82,21,7,51,5946,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-21,21-Dec-2012,Dec 21st 2012,Sat 12-21-13,0,0,0,0,2012-12-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-15,2012-12-16,2012-12-21,Sat ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,51,2012,2012-12-15,2012-12-21,N,Wk.51 - 13,2012-12-15 00:00:00,2012-12-21 00:00:00,2012W51 ,2012W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2012,N,2012-12-21,2011-12-21,2012-09-21,2012-06-21,2012-11-21,2012-10-21,2012-12-14,2012-12-07,0,0,0,0,0,0,0,0,12,4,51,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-22,2012-01-01,2012-10-01,2012-10-01,2012-10-20,0,0,-1,-5,-36,0,0,-2,-5,-5,41568,295,22,22,3,43,5938,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-26,22-Oct-2012,Oct 22nd 2012,Tue 10-22-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-20,2012-10-21,2012-10-22,Tue ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,43,2012,2012-10-20,2012-10-26,N,Wk.43 - 13,2012-10-20 00:00:00,2012-10-26 00:00:00,2012W43 ,2012W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2012,N,2012-10-22,2011-10-22,2012-07-22,2012-04-22,2012-09-22,2012-08-22,2012-10-15,2012-10-08,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-24,2012-01-01,2012-10-01,2012-10-01,2012-10-20,0,0,-1,-5,-34,0,0,-2,-5,-5,41570,297,24,24,5,43,5938,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-26,24-Oct-2012,Oct 24th 2012,Thu 10-24-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-20,2012-10-21,2012-10-24,Thu ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,43,2012,2012-10-20,2012-10-26,N,Wk.43 - 13,2012-10-20 00:00:00,2012-10-26 00:00:00,2012W43 ,2012W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2012,N,2012-10-24,2011-10-24,2012-07-24,2012-04-24,2012-09-24,2012-08-24,2012-10-17,2012-10-10,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-10,2012-01-01,2012-07-01,2012-07-01,2012-07-07,0,-1,-4,-20,-140,0,-1,-5,-20,-20,41464,191,10,10,4,28,5923,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-13,10-Jul-2012,Jul 10th 2012,Wed 07-10-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-07,2012-07-08,2012-07-10,Wed ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,28,2012,2012-07-07,2012-07-13,N,Wk.28 - 13,2012-07-07 00:00:00,2012-07-13 00:00:00,2012W28 ,2012W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2012,N,2012-07-10,2011-07-10,2012-04-10,2012-01-10,2012-06-10,2012-05-10,2012-07-03,2012-06-26,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-27,2012-01-01,2012-01-01,2012-02-01,2012-02-24,0,-3,-9,-39,-273,0,-3,-9,-39,-39,41331,58,58,27,4,9,5904,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-03-02,27-Feb-2012,Feb 27th 2012,Wed 02-27-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-02-24,2012-02-24,2012-02-25,2012-02-27,Wed ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,9,2012,2012-02-24,2012-03-02,N,Wk.09 - 13,2012-02-24 00:00:00,2012-03-02 00:00:00,2012W09 ,2012W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2012,N,2012-02-27,2011-02-27,2012-11-27,2012-08-27,2012-01-27,2012-12-27,2012-02-20,2012-02-13,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-02,2012-01-01,2012-01-01,2012-03-01,2012-02-24,0,-3,-8,-39,-270,0,-3,-9,-39,-39,41334,61,61,2,7,9,5904,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-02,02-Mar-2012,Mar 2nd 2012,Sat 03-02-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-02-24,2012-02-25,2012-03-02,Sat ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,9,2012,2012-02-24,2012-03-02,N,Wk.09 - 13,2012-02-24 00:00:00,2012-03-02 00:00:00,2012W09 ,2012W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2012,N,2012-03-02,2011-03-02,2012-12-02,2012-09-02,2012-02-02,2012-01-02,2012-02-23,2012-02-16,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-02,2012-01-01,2012-10-01,2012-11-01,2012-10-27,0,0,0,-4,-25,0,0,-1,-4,-4,41579,306,33,2,7,44,5939,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-02,02-Nov-2012,Nov 2nd 2012,Sat 11-02-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-10-27,2012-10-28,2012-11-02,Sat ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,44,2012,2012-10-27,2012-11-02,N,Wk.44 - 13,2012-10-27 00:00:00,2012-11-02 00:00:00,2012W44 ,2012W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2012,N,2012-11-02,2011-11-02,2012-08-02,2012-05-02,2012-10-02,2012-09-02,2012-10-26,2012-10-19,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-21,2012-01-01,2012-01-01,2012-03-01,2012-03-17,0,-3,-8,-36,-251,0,-3,-9,-36,-36,41353,80,80,21,5,12,5907,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-23,21-Mar-2012,Mar 21st 2012,Thu 03-21-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-17,2012-03-18,2012-03-21,Thu ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,12,2012,2012-03-17,2012-03-23,N,Wk.12 - 13,2012-03-17 00:00:00,2012-03-23 00:00:00,2012W12 ,2012W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2012,N,2012-03-21,2011-03-21,2012-12-21,2012-09-21,2012-02-21,2012-01-21,2012-03-14,2012-03-07,0,0,0,0,0,0,0,0,3,1,12,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-03,2012-01-01,2012-04-01,2012-04-01,2012-03-31,0,-2,-7,-34,-238,0,-2,-8,-34,-34,41366,93,3,3,4,14,5909,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-06,03-Apr-2012,Apr 3rd 2012,Wed 04-03-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-03-31,2012-04-01,2012-04-03,Wed ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,14,2012,2012-03-31,2012-04-06,N,Wk.14 - 13,2012-03-31 00:00:00,2012-04-06 00:00:00,2012W14 ,2012W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2012,N,2012-04-03,2011-04-03,2012-01-03,2012-10-03,2012-03-03,2012-02-03,2012-03-27,2012-03-20,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-06,2012-01-01,2012-07-01,2012-07-01,2012-06-30,0,-1,-4,-21,-144,0,-1,-5,-21,-21,41460,187,6,6,7,27,5922,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-06,06-Jul-2012,Jul 6th 2012,Sat 07-06-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-06-30,2012-07-01,2012-07-06,Sat ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,27,2012,2012-06-30,2012-07-06,N,Wk.27 - 13,2012-06-30 00:00:00,2012-07-06 00:00:00,2012W27 ,2012W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2012,N,2012-07-06,2011-07-06,2012-04-06,2012-01-06,2012-06-06,2012-05-06,2012-06-29,2012-06-22,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-26,2012-01-01,2012-04-01,2012-06-01,2012-06-23,0,-2,-5,-22,-154,0,-2,-6,-22,-22,41450,177,87,26,4,26,5921,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-29,26-Jun-2012,Jun 26th 2012,Wed 06-26-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-23,2012-06-24,2012-06-26,Wed ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,26,2012,2012-06-23,2012-06-29,N,Wk.26 - 13,2012-06-23 00:00:00,2012-06-29 00:00:00,2012W26 ,2012W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2012,N,2012-06-26,2011-06-26,2012-03-26,2012-12-26,2012-05-26,2012-04-26,2012-06-19,2012-06-12,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-26,2012-01-01,2012-07-01,2012-08-01,2012-08-25,0,-1,-3,-13,-93,0,-1,-3,-13,-13,41511,238,57,26,2,35,5930,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-31,26-Aug-2012,Aug 26th 2012,Mon 08-26-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-08-25,2012-08-25,2012-08-26,2012-08-26,Mon ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,35,2012,2012-08-25,2012-08-31,N,Wk.35 - 13,2012-08-25 00:00:00,2012-08-31 00:00:00,2012W35 ,2012W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2012,N,2012-08-26,2011-08-26,2012-05-26,2012-02-26,2012-07-26,2012-06-26,2012-08-19,2012-08-12,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-13,2012-01-01,2012-10-01,2012-12-01,2012-12-08,0,0,1,2,16,0,0,0,2,2,41620,347,74,13,6,50,5945,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-14,13-Dec-2012,Dec 13th 2012,Fri 12-13-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-08,2012-12-09,2012-12-13,Fri ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,50,2012,2012-12-08,2012-12-14,N,Wk.50 - 13,2012-12-08 00:00:00,2012-12-14 00:00:00,2012W50 ,2012W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2012,N,2012-12-13,2011-12-13,2012-09-13,2012-06-13,2012-11-13,2012-10-13,2012-12-06,2012-11-29,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-02,2012-01-01,2012-07-01,2012-07-01,2012-06-30,0,-1,-4,-21,-148,0,-1,-5,-21,-21,41456,183,2,2,3,27,5922,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-06,02-Jul-2012,Jul 2nd 2012,Tue 07-02-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-06-30,2012-07-01,2012-07-02,Tue ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,27,2012,2012-06-30,2012-07-06,N,Wk.27 - 13,2012-06-30 00:00:00,2012-07-06 00:00:00,2012W27 ,2012W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2012,N,2012-07-02,2011-07-02,2012-04-02,2012-01-02,2012-06-02,2012-05-02,2012-06-25,2012-06-18,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-05,2012-01-01,2012-07-01,2012-08-01,2012-08-04,0,-1,-3,-16,-114,0,-1,-4,-16,-16,41490,217,36,5,2,32,5927,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-10,05-Aug-2012,Aug 5th 2012,Mon 08-05-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-04,2012-08-05,2012-08-05,Mon ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,32,2012,2012-08-04,2012-08-10,N,Wk.32 - 13,2012-08-04 00:00:00,2012-08-10 00:00:00,2012W32 ,2012W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2012,N,2012-08-05,2011-08-05,2012-05-05,2012-02-05,2012-07-05,2012-06-05,2012-07-29,2012-07-22,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-08,2012-01-01,2012-01-01,2012-02-01,2012-02-03,0,-3,-9,-42,-292,0,-3,-10,-42,-42,41312,39,39,8,6,6,5901,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-09,08-Feb-2012,Feb 8th 2012,Fri 02-08-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-03,2012-02-04,2012-02-08,Fri ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,6,2012,2012-02-03,2012-02-09,N,Wk.06 - 13,2012-02-03 00:00:00,2012-02-09 00:00:00,2012W06 ,2012W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2012,N,2012-02-08,2011-02-08,2012-11-08,2012-08-08,2012-01-08,2012-12-08,2012-02-01,2012-01-25,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-14,2012-01-01,2012-01-01,2012-02-01,2012-02-10,0,-3,-9,-41,-286,0,-3,-10,-41,-41,41318,45,45,14,5,7,5902,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-16,14-Feb-2012,Feb 14th 2012,Thu 02-14-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-10,2012-02-11,2012-02-14,Thu ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,7,2012,2012-02-10,2012-02-16,N,Wk.07 - 13,2012-02-10 00:00:00,2012-02-16 00:00:00,2012W07 ,2012W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2012,N,2012-02-14,2011-02-14,2012-11-14,2012-08-14,2012-01-14,2012-12-14,2012-02-07,2012-01-31,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-21,2012-01-01,2012-07-01,2012-09-01,2012-09-15,0,-1,-2,-10,-67,0,-1,-3,-10,-10,41537,264,83,21,7,38,5933,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-21,21-Sep-2012,Sep 21st 2012,Sat 09-21-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-15,2012-09-16,2012-09-21,Sat ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,38,2012,2012-09-15,2012-09-21,N,Wk.38 - 13,2012-09-15 00:00:00,2012-09-21 00:00:00,2012W38 ,2012W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2012,N,2012-09-21,2011-09-21,2012-06-21,2012-03-21,2012-08-21,2012-07-21,2012-09-14,2012-09-07,0,0,0,0,0,0,0,0,9,3,38,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-19,2012-01-01,2012-01-01,2012-03-01,2012-03-17,0,-3,-8,-36,-253,0,-3,-9,-36,-36,41351,78,78,19,3,12,5907,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-23,19-Mar-2012,Mar 19th 2012,Tue 03-19-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-17,2012-03-18,2012-03-19,Tue ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,12,2012,2012-03-17,2012-03-23,N,Wk.12 - 13,2012-03-17 00:00:00,2012-03-23 00:00:00,2012W12 ,2012W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2012,N,2012-03-19,2011-03-19,2012-12-19,2012-09-19,2012-02-19,2012-01-19,2012-03-12,2012-03-05,0,0,0,0,0,0,0,0,3,1,12,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-28,2012-01-01,2012-01-01,2012-01-01,2012-01-27,0,-3,-10,-43,-303,0,-3,-10,-43,-43,41301,28,28,28,2,5,5900,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-02-02,28-Jan-2012,Jan 28th 2012,Mon 01-28-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-01-27,2012-01-27,2012-01-28,2012-01-28,Mon ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,5,2012,2012-01-27,2012-02-02,N,Wk.05 - 13,2012-01-27 00:00:00,2012-02-02 00:00:00,2012W05 ,2012W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2012,N,2012-01-28,2011-01-28,2012-10-28,2012-07-28,2012-12-28,2012-11-28,2012-01-21,2012-01-14,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-03,2012-01-01,2012-07-01,2012-08-01,2012-07-28,0,-1,-3,-17,-116,0,-1,-4,-17,-17,41488,215,34,3,7,31,5926,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-03,03-Aug-2012,Aug 3rd 2012,Sat 08-03-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-07-28,2012-07-29,2012-08-03,Sat ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,31,2012,2012-07-28,2012-08-03,N,Wk.31 - 13,2012-07-28 00:00:00,2012-08-03 00:00:00,2012W31 ,2012W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2012,N,2012-08-03,2011-08-03,2012-05-03,2012-02-03,2012-07-03,2012-06-03,2012-07-27,2012-07-20,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-14,2012-01-01,2012-04-01,2012-06-01,2012-06-09,0,-2,-5,-24,-166,0,-2,-6,-24,-24,41438,165,75,14,6,24,5919,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-15,14-Jun-2012,Jun 14th 2012,Fri 06-14-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-09,2012-06-10,2012-06-14,Fri ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,24,2012,2012-06-09,2012-06-15,N,Wk.24 - 13,2012-06-09 00:00:00,2012-06-15 00:00:00,2012W24 ,2012W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2012,N,2012-06-14,2011-06-14,2012-03-14,2012-12-14,2012-05-14,2012-04-14,2012-06-07,2012-05-31,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-08,2012-01-01,2012-07-01,2012-07-01,2012-07-07,0,-1,-4,-20,-142,0,-1,-5,-20,-20,41462,189,8,8,2,28,5923,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-13,08-Jul-2012,Jul 8th 2012,Mon 07-08-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-07,2012-07-08,2012-07-08,Mon ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,28,2012,2012-07-07,2012-07-13,N,Wk.28 - 13,2012-07-07 00:00:00,2012-07-13 00:00:00,2012W28 ,2012W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2012,N,2012-07-08,2011-07-08,2012-04-08,2012-01-08,2012-06-08,2012-05-08,2012-07-01,2012-06-24,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-30,2012-01-01,2012-10-01,2012-11-01,2012-11-24,0,0,0,0,3,0,0,0,0,0,41607,334,61,30,7,48,5943,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-30,30-Nov-2012,Nov 30th 2012,Sat 11-30-13,0,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-11-24,2012-11-24,2012-11-25,2012-11-30,Sat ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,48,2012,2012-11-24,2012-11-30,N,Wk.48 - 13,2012-11-24 00:00:00,2012-11-30 00:00:00,2012W48 ,2012W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2012,N,2012-11-30,2011-11-30,2012-08-30,2012-05-30,2012-10-30,2012-09-30,2012-11-23,2012-11-16,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-10,2012-01-01,2012-01-01,2012-01-01,2012-01-06,0,-3,-10,-46,-321,0,-3,-11,-46,-46,41283,10,10,10,5,2,5897,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-12,10-Jan-2012,Jan 10th 2012,Thu 01-10-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-06,2012-01-07,2012-01-10,Thu ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,2,2012,2012-01-06,2012-01-12,N,Wk.02 - 13,2012-01-06 00:00:00,2012-01-12 00:00:00,2012W02 ,2012W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2012,N,2012-01-10,2011-01-10,2012-10-10,2012-07-10,2012-12-10,2012-11-10,2012-01-03,2012-12-27,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-18,2012-01-01,2012-04-01,2012-05-01,2012-05-12,0,-2,-6,-28,-193,0,-2,-7,-28,-28,41411,138,48,18,7,20,5915,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-18,18-May-2012,May 18th 2012,Sat 05-18-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-12,2012-05-13,2012-05-18,Sat ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,20,2012,2012-05-12,2012-05-18,N,Wk.20 - 13,2012-05-12 00:00:00,2012-05-18 00:00:00,2012W20 ,2012W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2012,N,2012-05-18,2011-05-18,2012-02-18,2012-11-18,2012-04-18,2012-03-18,2012-05-11,2012-05-04,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-15,2012-01-01,2012-04-01,2012-04-01,2012-04-14,0,-2,-7,-32,-226,0,-2,-8,-32,-32,41378,105,15,15,2,16,5911,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-20,15-Apr-2012,Apr 15th 2012,Mon 04-15-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-14,2012-04-15,2012-04-15,Mon ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,16,2012,2012-04-14,2012-04-20,N,Wk.16 - 13,2012-04-14 00:00:00,2012-04-20 00:00:00,2012W16 ,2012W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2012,N,2012-04-15,2011-04-15,2012-01-15,2012-10-15,2012-03-15,2012-02-15,2012-04-08,2012-04-01,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-12,2012-01-01,2012-01-01,2012-03-01,2012-03-10,0,-3,-8,-37,-260,0,-3,-9,-37,-37,41344,71,71,12,3,11,5906,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-16,12-Mar-2012,Mar 12th 2012,Tue 03-12-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-10,2012-03-11,2012-03-12,Tue ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,11,2012,2012-03-10,2012-03-16,N,Wk.11 - 13,2012-03-10 00:00:00,2012-03-16 00:00:00,2012W11 ,2012W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2012,N,2012-03-12,2011-03-12,2012-12-12,2012-09-12,2012-02-12,2012-01-12,2012-03-05,2012-02-26,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-09,2012-01-01,2012-10-01,2012-11-01,2012-11-03,0,0,0,-3,-18,0,0,-1,-3,-3,41586,313,40,9,7,45,5940,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-09,09-Nov-2012,Nov 9th 2012,Sat 11-09-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-03,2012-11-04,2012-11-09,Sat ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,45,2012,2012-11-03,2012-11-09,N,Wk.45 - 13,2012-11-03 00:00:00,2012-11-09 00:00:00,2012W45 ,2012W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2012,N,2012-11-09,2011-11-09,2012-08-09,2012-05-09,2012-10-09,2012-09-09,2012-11-02,2012-10-26,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-14,2012-01-01,2012-01-01,2012-03-01,2012-03-10,0,-3,-8,-37,-258,0,-3,-9,-37,-37,41346,73,73,14,5,11,5906,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-16,14-Mar-2012,Mar 14th 2012,Thu 03-14-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-10,2012-03-11,2012-03-14,Thu ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,11,2012,2012-03-10,2012-03-16,N,Wk.11 - 13,2012-03-10 00:00:00,2012-03-16 00:00:00,2012W11 ,2012W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2012,N,2012-03-14,2011-03-14,2012-12-14,2012-09-14,2012-02-14,2012-01-14,2012-03-07,2012-02-28,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-03,2012-01-01,2012-07-01,2012-09-01,2012-09-01,0,-1,-2,-12,-85,0,-1,-3,-12,-12,41519,246,65,3,3,36,5931,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-07,03-Sep-2012,Sep 3rd 2012,Tue 09-03-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-01,2012-09-02,2012-09-03,Tue ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,36,2012,2012-09-01,2012-09-07,N,Wk.36 - 13,2012-09-01 00:00:00,2012-09-07 00:00:00,2012W36 ,2012W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2012,N,2012-09-03,2011-09-03,2012-06-03,2012-03-03,2012-08-03,2012-07-03,2012-08-27,2012-08-20,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-16,2012-01-01,2012-04-01,2012-05-01,2012-05-12,0,-2,-6,-28,-195,0,-2,-7,-28,-28,41409,136,46,16,5,20,5915,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-18,16-May-2012,May 16th 2012,Thu 05-16-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-12,2012-05-13,2012-05-16,Thu ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,20,2012,2012-05-12,2012-05-18,N,Wk.20 - 13,2012-05-12 00:00:00,2012-05-18 00:00:00,2012W20 ,2012W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2012,N,2012-05-16,2011-05-16,2012-02-16,2012-11-16,2012-04-16,2012-03-16,2012-05-09,2012-05-02,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-27,2012-01-01,2012-10-01,2012-10-01,2012-10-27,0,0,-1,-4,-31,0,0,-1,-4,-5,41573,300,27,27,1,44,5939,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-11-02,27-Oct-2012,Oct 27th 2012,Sun 10-27-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-10-27,2012-10-27,2012-10-21,2012-10-27,Sun ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,44,2012,2012-10-27,2012-11-02,Y,Wk.44 - 13,2012-10-27 00:00:00,2012-11-02 00:00:00,2012W44 ,2012W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2012,N,2012-10-27,2011-10-27,2012-07-27,2012-04-27,2012-09-27,2012-08-27,2012-10-20,2012-10-13,0,0,0,0,1,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-21,2012-01-01,2012-07-01,2012-08-01,2012-08-18,0,-1,-3,-14,-98,0,-1,-4,-14,-14,41506,233,52,21,4,34,5929,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-24,21-Aug-2012,Aug 21st 2012,Wed 08-21-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-18,2012-08-19,2012-08-21,Wed ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,34,2012,2012-08-18,2012-08-24,N,Wk.34 - 13,2012-08-18 00:00:00,2012-08-24 00:00:00,2012W34 ,2012W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2012,N,2012-08-21,2011-08-21,2012-05-21,2012-02-21,2012-07-21,2012-06-21,2012-08-14,2012-08-07,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-25,2012-01-01,2012-10-01,2012-10-01,2012-10-20,0,0,-1,-5,-33,0,0,-2,-5,-5,41571,298,25,25,6,43,5938,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-26,25-Oct-2012,Oct 25th 2012,Fri 10-25-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-20,2012-10-21,2012-10-25,Fri ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,43,2012,2012-10-20,2012-10-26,N,Wk.43 - 13,2012-10-20 00:00:00,2012-10-26 00:00:00,2012W43 ,2012W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2012,N,2012-10-25,2011-10-25,2012-07-25,2012-04-25,2012-09-25,2012-08-25,2012-10-18,2012-10-11,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-24,2012-01-01,2012-07-01,2012-09-01,2012-09-22,0,-1,-2,-9,-64,0,-1,-3,-9,-9,41540,267,86,24,3,39,5934,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-28,24-Sep-2012,Sep 24th 2012,Tue 09-24-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-22,2012-09-23,2012-09-24,Tue ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,39,2012,2012-09-22,2012-09-28,N,Wk.39 - 13,2012-09-22 00:00:00,2012-09-28 00:00:00,2012W39 ,2012W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2012,N,2012-09-24,2011-09-24,2012-06-24,2012-03-24,2012-08-24,2012-07-24,2012-09-17,2012-09-10,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-27,2012-01-01,2012-01-01,2012-01-01,2012-01-27,0,-3,-10,-43,-304,0,-3,-10,-43,-44,41300,27,27,27,1,5,5900,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-02-02,27-Jan-2012,Jan 27th 2012,Sun 01-27-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-01-27,2012-01-27,2012-01-21,2012-01-27,Sun ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,5,2012,2012-01-27,2012-02-02,Y,Wk.05 - 13,2012-01-27 00:00:00,2012-02-02 00:00:00,2012W05 ,2012W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2012,N,2012-01-27,2011-01-27,2012-10-27,2012-07-27,2012-12-27,2012-11-27,2012-01-20,2012-01-13,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-10,2012-01-01,2012-01-01,2012-03-01,2012-03-10,0,-3,-8,-37,-262,0,-3,-9,-37,-38,41342,69,69,10,1,11,5906,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-16,10-Mar-2012,Mar 10th 2012,Sun 03-10-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-10,2012-03-04,2012-03-10,Sun ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,11,2012,2012-03-10,2012-03-16,Y,Wk.11 - 13,2012-03-10 00:00:00,2012-03-16 00:00:00,2012W11 ,2012W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2012,N,2012-03-10,2011-03-10,2012-12-10,2012-09-10,2012-02-10,2012-01-10,2012-03-03,2012-02-24,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-14,2012-01-01,2012-04-01,2012-05-01,2012-05-12,0,-2,-6,-28,-197,0,-2,-7,-28,-28,41407,134,44,14,3,20,5915,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-18,14-May-2012,May 14th 2012,Tue 05-14-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-12,2012-05-13,2012-05-14,Tue ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,20,2012,2012-05-12,2012-05-18,N,Wk.20 - 13,2012-05-12 00:00:00,2012-05-18 00:00:00,2012W20 ,2012W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2012,N,2012-05-14,2011-05-14,2012-02-14,2012-11-14,2012-04-14,2012-03-14,2012-05-07,2012-04-30,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-31,2012-01-01,2012-10-01,2012-12-01,2012-12-29,0,0,1,5,34,1,1,1,5,5,41638,365,92,31,3,53,5948,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-31,31-Dec-2012,Dec 31st 2012,Tue 12-31-13,0,0,0,0,2012-12-21,365,92,31,3,2012-12-29,2012-12-29,2012-12-29,2012-12-29,2012-12-30,2012-12-31,Tue ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,1,2014,2012-12-29,2014-01-04,N,Wk.53 - 13,2012-12-29 00:00:00,2012-12-31 00:00:00,2012W53 ,2012W53 ,12/29/13 - 12/31/13,12/29 - 12/31,2012,N,2012-12-31,2011-12-31,2012-09-30,2012-06-30,2012-11-30,2012-10-31,2012-12-24,2012-12-17,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-01,2012-01-01,2012-07-01,2012-09-01,2012-09-01,0,-1,-2,-12,-87,0,-1,-3,-12,-13,41517,244,63,1,1,36,5931,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-07,01-Sep-2012,Sep 1st 2012,Sun 09-01-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-01,2012-08-26,2012-09-01,Sun ,2012M09,Sep-2012,Y,2012M09 ,Y,Year 2012 - Quarter 03,2012Q03 ,N,36,2012,2012-09-01,2012-09-07,Y,Wk.36 - 13,2012-09-01 00:00:00,2012-09-07 00:00:00,2012W36 ,2012W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2012,N,2012-09-01,2011-09-01,2012-06-01,2012-03-01,2012-08-01,2012-07-01,2012-08-25,2012-08-18,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-13,2012-01-01,2012-04-01,2012-04-01,2012-04-07,0,-2,-7,-33,-228,0,-2,-8,-33,-33,41376,103,13,13,7,15,5910,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-13,13-Apr-2012,Apr 13th 2012,Sat 04-13-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-07,2012-04-08,2012-04-13,Sat ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,15,2012,2012-04-07,2012-04-13,N,Wk.15 - 13,2012-04-07 00:00:00,2012-04-13 00:00:00,2012W15 ,2012W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2012,N,2012-04-13,2011-04-13,2012-01-13,2012-10-13,2012-03-13,2012-02-13,2012-04-06,2012-03-30,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-09,2012-01-01,2012-01-01,2012-02-01,2012-02-03,0,-3,-9,-42,-291,0,-3,-10,-42,-42,41313,40,40,9,7,6,5901,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-09,09-Feb-2012,Feb 9th 2012,Sat 02-09-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-03,2012-02-04,2012-02-09,Sat ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,6,2012,2012-02-03,2012-02-09,N,Wk.06 - 13,2012-02-03 00:00:00,2012-02-09 00:00:00,2012W06 ,2012W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2012,N,2012-02-09,2011-02-09,2012-11-09,2012-08-09,2012-01-09,2012-12-09,2012-02-02,2012-01-26,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-27,2012-01-01,2012-10-01,2012-12-01,2012-12-22,0,0,1,4,30,0,0,0,4,4,41634,361,88,27,6,52,5947,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-28,27-Dec-2012,Dec 27th 2012,Fri 12-27-13,0,0,0,0,2012-12-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-22,2012-12-23,2012-12-27,Fri ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,52,2012,2012-12-22,2012-12-28,N,Wk.52 - 13,2012-12-22 00:00:00,2012-12-28 00:00:00,2012W52 ,2012W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2012,N,2012-12-27,2011-12-27,2012-09-27,2012-06-27,2012-11-27,2012-10-27,2012-12-20,2012-12-13,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-19,2012-01-01,2012-07-01,2012-08-01,2012-08-18,0,-1,-3,-14,-100,0,-1,-4,-14,-14,41504,231,50,19,2,34,5929,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-24,19-Aug-2012,Aug 19th 2012,Mon 08-19-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-18,2012-08-19,2012-08-19,Mon ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,34,2012,2012-08-18,2012-08-24,N,Wk.34 - 13,2012-08-18 00:00:00,2012-08-24 00:00:00,2012W34 ,2012W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2012,N,2012-08-19,2011-08-19,2012-05-19,2012-02-19,2012-07-19,2012-06-19,2012-08-12,2012-08-05,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-11,2012-01-01,2012-04-01,2012-04-01,2012-04-07,0,-2,-7,-33,-230,0,-2,-8,-33,-33,41374,101,11,11,5,15,5910,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-13,11-Apr-2012,Apr 11th 2012,Thu 04-11-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-07,2012-04-08,2012-04-11,Thu ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,15,2012,2012-04-07,2012-04-13,N,Wk.15 - 13,2012-04-07 00:00:00,2012-04-13 00:00:00,2012W15 ,2012W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2012,N,2012-04-11,2011-04-11,2012-01-11,2012-10-11,2012-03-11,2012-02-11,2012-04-04,2012-03-28,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-06,2012-01-01,2012-10-01,2012-12-01,2012-12-01,0,0,1,1,9,0,0,0,1,1,41613,340,67,6,6,49,5944,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-07,06-Dec-2012,Dec 6th 2012,Fri 12-06-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-01,2012-12-02,2012-12-06,Fri ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,49,2012,2012-12-01,2012-12-07,N,Wk.49 - 13,2012-12-01 00:00:00,2012-12-07 00:00:00,2012W49 ,2012W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2012,N,2012-12-06,2011-12-06,2012-09-06,2012-06-06,2012-11-06,2012-10-06,2012-11-29,2012-11-22,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-31,2012-01-01,2012-01-01,2012-03-01,2012-03-31,0,-3,-8,-34,-241,0,-2,-8,-34,-35,41363,90,90,31,1,14,5909,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-04-06,31-Mar-2012,Mar 31st 2012,Sun 03-31-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-03-31,2012-03-31,2012-03-31,2012-03-25,2012-03-31,Sun ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,14,2012,2012-03-31,2012-04-06,Y,Wk.14 - 13,2012-03-31 00:00:00,2012-04-06 00:00:00,2012W14 ,2012W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2012,N,2012-03-31,2011-03-31,2012-12-31,2012-09-30,2012-02-28,2012-01-31,2012-03-24,2012-03-17,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-22,2012-01-01,2012-07-01,2012-09-01,2012-09-22,0,-1,-2,-9,-66,0,-1,-3,-9,-10,41538,265,84,22,1,39,5934,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-28,22-Sep-2012,Sep 22nd 2012,Sun 09-22-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-22,2012-09-16,2012-09-22,Sun ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,39,2012,2012-09-22,2012-09-28,Y,Wk.39 - 13,2012-09-22 00:00:00,2012-09-28 00:00:00,2012W39 ,2012W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2012,N,2012-09-22,2011-09-22,2012-06-22,2012-03-22,2012-08-22,2012-07-22,2012-09-15,2012-09-08,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-06,2012-01-01,2012-01-01,2012-01-01,2012-01-06,0,-3,-10,-46,-325,0,-3,-11,-46,-47,41279,6,6,6,1,2,5897,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-12,06-Jan-2012,Jan 6th 2012,Sun 01-06-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-06,2012-12-31,2012-01-06,Sun ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,2,2012,2012-01-06,2012-01-12,Y,Wk.02 - 13,2012-01-06 00:00:00,2012-01-12 00:00:00,2012W02 ,2012W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2012,N,2012-01-06,2011-01-06,2012-10-06,2012-07-06,2012-12-06,2012-11-06,2012-12-30,2012-12-23,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-04,2012-01-01,2012-01-01,2012-01-01,2012-01-01,0,-3,-10,-47,-327,0,-3,-11,-47,-47,41277,4,4,4,6,1,5896,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-05,04-Jan-2012,Jan 4th 2012,Fri 01-04-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2012-01-04,Fri ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,1,2012,2012-12-30,2012-01-05,N,Wk.01 - 13,2012-01-01 00:00:00,2012-01-05 00:00:00,2012W01 ,2012W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2012,N,2012-01-04,2011-01-04,2012-10-04,2012-07-04,2012-12-04,2012-11-04,2012-12-28,2012-12-21,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-16,2012-01-01,2012-07-01,2012-07-01,2012-07-14,0,-1,-4,-19,-134,0,-1,-5,-19,-19,41470,197,16,16,3,29,5924,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-20,16-Jul-2012,Jul 16th 2012,Tue 07-16-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-14,2012-07-15,2012-07-16,Tue ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,29,2012,2012-07-14,2012-07-20,N,Wk.29 - 13,2012-07-14 00:00:00,2012-07-20 00:00:00,2012W29 ,2012W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2012,N,2012-07-16,2011-07-16,2012-04-16,2012-01-16,2012-06-16,2012-05-16,2012-07-09,2012-07-02,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-03,2012-01-01,2012-10-01,2012-11-01,2012-11-03,0,0,0,-3,-24,0,0,-1,-3,-4,41580,307,34,3,1,45,5940,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-09,03-Nov-2012,Nov 3rd 2012,Sun 11-03-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-03,2012-10-28,2012-11-03,Sun ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,45,2012,2012-11-03,2012-11-09,Y,Wk.45 - 13,2012-11-03 00:00:00,2012-11-09 00:00:00,2012W45 ,2012W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2012,N,2012-11-03,2011-11-03,2012-08-03,2012-05-03,2012-10-03,2012-09-03,2012-10-27,2012-10-20,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-25,2012-01-01,2012-07-01,2012-08-01,2012-08-25,0,-1,-3,-13,-94,0,-1,-3,-13,-14,41510,237,56,25,1,35,5930,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-31,25-Aug-2012,Aug 25th 2012,Sun 08-25-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-08-25,2012-08-25,2012-08-19,2012-08-25,Sun ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,35,2012,2012-08-25,2012-08-31,Y,Wk.35 - 13,2012-08-25 00:00:00,2012-08-31 00:00:00,2012W35 ,2012W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2012,N,2012-08-25,2011-08-25,2012-05-25,2012-02-25,2012-07-25,2012-06-25,2012-08-18,2012-08-11,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-24,2012-01-01,2012-10-01,2012-11-01,2012-11-24,0,0,0,0,-3,0,0,0,0,-1,41601,328,55,24,1,48,5943,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-30,24-Nov-2012,Nov 24th 2012,Sun 11-24-13,1,1,1,1,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-11-24,2012-11-24,2012-11-18,2012-11-24,Sun ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,48,2012,2012-11-24,2012-11-30,Y,Wk.48 - 13,2012-11-24 00:00:00,2012-11-30 00:00:00,2012W48 ,2012W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2012,N,2012-11-24,2011-11-24,2012-08-24,2012-05-24,2012-10-24,2012-09-24,2012-11-17,2012-11-10,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-12,2012-01-01,2012-04-01,2012-05-01,2012-05-12,0,-2,-6,-28,-199,0,-2,-7,-28,-29,41405,132,42,12,1,20,5915,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-18,12-May-2012,May 12th 2012,Sun 05-12-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-12,2012-05-06,2012-05-12,Sun ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,20,2012,2012-05-12,2012-05-18,Y,Wk.20 - 13,2012-05-12 00:00:00,2012-05-18 00:00:00,2012W20 ,2012W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2012,N,2012-05-12,2011-05-12,2012-02-12,2012-11-12,2012-04-12,2012-03-12,2012-05-05,2012-04-28,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-17,2012-01-01,2012-07-01,2012-08-01,2012-08-11,0,-1,-3,-15,-102,0,-1,-4,-15,-15,41502,229,48,17,7,33,5928,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-17,17-Aug-2012,Aug 17th 2012,Sat 08-17-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-11,2012-08-12,2012-08-17,Sat ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,33,2012,2012-08-11,2012-08-17,N,Wk.33 - 13,2012-08-11 00:00:00,2012-08-17 00:00:00,2012W33 ,2012W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2012,N,2012-08-17,2011-08-17,2012-05-17,2012-02-17,2012-07-17,2012-06-17,2012-08-10,2012-08-03,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-21,2012-01-01,2012-10-01,2012-10-01,2012-10-20,0,0,-1,-5,-37,0,0,-2,-5,-5,41567,294,21,21,2,43,5938,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-26,21-Oct-2012,Oct 21st 2012,Mon 10-21-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-20,2012-10-21,2012-10-21,Mon ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,43,2012,2012-10-20,2012-10-26,N,Wk.43 - 13,2012-10-20 00:00:00,2012-10-26 00:00:00,2012W43 ,2012W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2012,N,2012-10-21,2011-10-21,2012-07-21,2012-04-21,2012-09-21,2012-08-21,2012-10-14,2012-10-07,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-27,2012-01-01,2012-01-01,2012-03-01,2012-03-24,0,-3,-8,-35,-245,0,-3,-9,-35,-35,41359,86,86,27,4,13,5908,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-30,27-Mar-2012,Mar 27th 2012,Wed 03-27-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-24,2012-03-25,2012-03-27,Wed ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,13,2012,2012-03-24,2012-03-30,N,Wk.13 - 13,2012-03-24 00:00:00,2012-03-30 00:00:00,2012W13 ,2012W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2012,N,2012-03-27,2011-03-27,2012-12-27,2012-09-27,2012-02-27,2012-01-27,2012-03-20,2012-03-13,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-22,2012-01-01,2012-10-01,2012-11-01,2012-11-17,0,0,0,-1,-5,0,0,-1,-1,-1,41599,326,53,22,6,47,5942,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-23,22-Nov-2012,Nov 22nd 2012,Fri 11-22-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-17,2012-11-18,2012-11-22,Fri ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,47,2012,2012-11-17,2012-11-23,N,Wk.47 - 13,2012-11-17 00:00:00,2012-11-23 00:00:00,2012W47 ,2012W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2012,N,2012-11-22,2011-11-22,2012-08-22,2012-05-22,2012-10-22,2012-09-22,2012-11-15,2012-11-08,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-07,2012-01-01,2012-07-01,2012-07-01,2012-07-07,0,-1,-4,-20,-143,0,-1,-5,-20,-21,41461,188,7,7,1,28,5923,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-13,07-Jul-2012,Jul 7th 2012,Sun 07-07-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-07,2012-07-01,2012-07-07,Sun ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,28,2012,2012-07-07,2012-07-13,Y,Wk.28 - 13,2012-07-07 00:00:00,2012-07-13 00:00:00,2012W28 ,2012W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2012,N,2012-07-07,2011-07-07,2012-04-07,2012-01-07,2012-06-07,2012-05-07,2012-06-30,2012-06-23,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-11,2012-01-01,2012-07-01,2012-09-01,2012-09-08,0,-1,-2,-11,-77,0,-1,-3,-11,-11,41527,254,73,11,4,37,5932,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-14,11-Sep-2012,Sep 11th 2012,Wed 09-11-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-08,2012-09-09,2012-09-11,Wed ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,37,2012,2012-09-08,2012-09-14,N,Wk.37 - 13,2012-09-08 00:00:00,2012-09-14 00:00:00,2012W37 ,2012W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2012,N,2012-09-11,2011-09-11,2012-06-11,2012-03-11,2012-08-11,2012-07-11,2012-09-04,2012-08-28,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-19,2012-01-01,2012-10-01,2012-10-01,2012-10-13,0,0,-1,-6,-39,0,0,-2,-6,-6,41565,292,19,19,7,42,5937,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-19,19-Oct-2012,Oct 19th 2012,Sat 10-19-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-13,2012-10-14,2012-10-19,Sat ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,42,2012,2012-10-13,2012-10-19,N,Wk.42 - 13,2012-10-13 00:00:00,2012-10-19 00:00:00,2012W42 ,2012W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2012,N,2012-10-19,2011-10-19,2012-07-19,2012-04-19,2012-09-19,2012-08-19,2012-10-12,2012-10-05,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-23,2012-01-01,2012-10-01,2012-12-01,2012-12-22,0,0,1,4,26,0,0,0,4,4,41630,357,84,23,2,52,5947,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-28,23-Dec-2012,Dec 23rd 2012,Mon 12-23-13,0,0,0,0,2012-12-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-22,2012-12-23,2012-12-23,Mon ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,52,2012,2012-12-22,2012-12-28,N,Wk.52 - 13,2012-12-22 00:00:00,2012-12-28 00:00:00,2012W52 ,2012W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2012,N,2012-12-23,2011-12-23,2012-09-23,2012-06-23,2012-11-23,2012-10-23,2012-12-16,2012-12-09,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-24,2012-01-01,2012-04-01,2012-05-01,2012-05-19,0,-2,-6,-27,-187,0,-2,-7,-27,-27,41417,144,54,24,6,21,5916,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-25,24-May-2012,May 24th 2012,Fri 05-24-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-19,2012-05-20,2012-05-24,Fri ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,21,2012,2012-05-19,2012-05-25,N,Wk.21 - 13,2012-05-19 00:00:00,2012-05-25 00:00:00,2012W21 ,2012W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2012,N,2012-05-24,2011-05-24,2012-02-24,2012-11-24,2012-04-24,2012-03-24,2012-05-17,2012-05-10,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-05,2012-01-01,2012-10-01,2012-11-01,2012-11-03,0,0,0,-3,-22,0,0,-1,-3,-3,41582,309,36,5,3,45,5940,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-09,05-Nov-2012,Nov 5th 2012,Tue 11-05-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-03,2012-11-04,2012-11-05,Tue ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,45,2012,2012-11-03,2012-11-09,N,Wk.45 - 13,2012-11-03 00:00:00,2012-11-09 00:00:00,2012W45 ,2012W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2012,N,2012-11-05,2011-11-05,2012-08-05,2012-05-05,2012-10-05,2012-09-05,2012-10-29,2012-10-22,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-29,2012-01-01,2012-04-01,2012-05-01,2012-05-26,0,-2,-6,-26,-182,0,-2,-6,-26,-26,41422,149,59,29,4,22,5917,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-06-01,29-May-2012,May 29th 2012,Wed 05-29-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-05-26,2012-05-26,2012-05-27,2012-05-29,Wed ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,22,2012,2012-05-26,2012-06-01,N,Wk.22 - 13,2012-05-26 00:00:00,2012-06-01 00:00:00,2012W22 ,2012W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2012,N,2012-05-29,2011-05-29,2012-02-28,2012-11-29,2012-04-29,2012-03-29,2012-05-22,2012-05-15,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-02,2012-01-01,2012-01-01,2012-01-01,2012-01-01,0,-3,-10,-47,-329,0,-3,-11,-47,-47,41275,2,2,2,4,1,5896,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-05,02-Jan-2012,Jan 2nd 2012,Wed 01-02-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2012-01-02,Wed ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,1,2012,2012-12-30,2012-01-05,N,Wk.01 - 13,2012-01-01 00:00:00,2012-01-05 00:00:00,2012W01 ,2012W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2012,N,2012-01-02,2011-01-02,2012-10-02,2012-07-02,2012-12-02,2012-11-02,2012-12-26,2012-12-19,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-02,2012-01-01,2012-10-01,2012-12-01,2012-12-01,0,0,1,1,5,0,0,0,1,1,41609,336,63,2,2,49,5944,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-07,02-Dec-2012,Dec 2nd 2012,Mon 12-02-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-01,2012-12-02,2012-12-02,Mon ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,49,2012,2012-12-01,2012-12-07,N,Wk.49 - 13,2012-12-01 00:00:00,2012-12-07 00:00:00,2012W49 ,2012W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2012,N,2012-12-02,2011-12-02,2012-09-02,2012-06-02,2012-11-02,2012-10-02,2012-11-25,2012-11-18,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-24,2012-01-01,2012-01-01,2012-02-01,2012-02-24,0,-3,-9,-39,-276,0,-3,-9,-39,-40,41328,55,55,24,1,9,5904,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-03-02,24-Feb-2012,Feb 24th 2012,Sun 02-24-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-02-24,2012-02-24,2012-02-18,2012-02-24,Sun ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,9,2012,2012-02-24,2012-03-02,Y,Wk.09 - 13,2012-02-24 00:00:00,2012-03-02 00:00:00,2012W09 ,2012W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2012,N,2012-02-24,2011-02-24,2012-11-24,2012-08-24,2012-01-24,2012-12-24,2012-02-17,2012-02-10,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-23,2012-01-01,2012-01-01,2012-01-01,2012-01-20,0,-3,-10,-44,-308,0,-3,-11,-44,-44,41296,23,23,23,4,4,5899,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-26,23-Jan-2012,Jan 23rd 2012,Wed 01-23-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-20,2012-01-21,2012-01-23,Wed ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,4,2012,2012-01-20,2012-01-26,N,Wk.04 - 13,2012-01-20 00:00:00,2012-01-26 00:00:00,2012W04 ,2012W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2012,N,2012-01-23,2011-01-23,2012-10-23,2012-07-23,2012-12-23,2012-11-23,2012-01-16,2012-01-09,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-16,2012-01-01,2012-01-01,2012-01-01,2012-01-13,0,-3,-10,-45,-315,0,-3,-11,-45,-45,41289,16,16,16,4,3,5898,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-19,16-Jan-2012,Jan 16th 2012,Wed 01-16-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-13,2012-01-14,2012-01-16,Wed ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,3,2012,2012-01-13,2012-01-19,N,Wk.03 - 13,2012-01-13 00:00:00,2012-01-19 00:00:00,2012W03 ,2012W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2012,N,2012-01-16,2011-01-16,2012-10-16,2012-07-16,2012-12-16,2012-11-16,2012-01-09,2012-01-02,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-05,2012-01-01,2012-04-01,2012-04-01,2012-03-31,0,-2,-7,-34,-236,0,-2,-8,-34,-34,41368,95,5,5,6,14,5909,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-06,05-Apr-2012,Apr 5th 2012,Fri 04-05-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-03-31,2012-04-01,2012-04-05,Fri ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,14,2012,2012-03-31,2012-04-06,N,Wk.14 - 13,2012-03-31 00:00:00,2012-04-06 00:00:00,2012W14 ,2012W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2012,N,2012-04-05,2011-04-05,2012-01-05,2012-10-05,2012-03-05,2012-02-05,2012-03-29,2012-03-22,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-27,2012-01-01,2012-04-01,2012-05-01,2012-05-26,0,-2,-6,-26,-184,0,-2,-6,-26,-26,41420,147,57,27,2,22,5917,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-06-01,27-May-2012,May 27th 2012,Mon 05-27-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-05-26,2012-05-26,2012-05-27,2012-05-27,Mon ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,22,2012,2012-05-26,2012-06-01,N,Wk.22 - 13,2012-05-26 00:00:00,2012-06-01 00:00:00,2012W22 ,2012W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2012,N,2012-05-27,2011-05-27,2012-02-27,2012-11-27,2012-04-27,2012-03-27,2012-05-20,2012-05-13,0,0,0,1,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-12,2012-01-01,2012-10-01,2012-10-01,2012-10-06,0,0,-1,-7,-46,0,0,-2,-7,-7,41558,285,12,12,7,41,5936,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-12,12-Oct-2012,Oct 12th 2012,Sat 10-12-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-06,2012-10-07,2012-10-12,Sat ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,41,2012,2012-10-06,2012-10-12,N,Wk.41 - 13,2012-10-06 00:00:00,2012-10-12 00:00:00,2012W41 ,2012W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2012,N,2012-10-12,2011-10-12,2012-07-12,2012-04-12,2012-09-12,2012-08-12,2012-10-05,2012-09-28,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-01,2012-01-01,2012-01-01,2012-03-01,2012-02-24,0,-3,-8,-39,-271,0,-3,-9,-39,-39,41333,60,60,1,6,9,5904,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-02,01-Mar-2012,Mar 1st 2012,Fri 03-01-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-02-24,2012-02-25,2012-03-01,Fri ,2012M03,Mar-2012,Y,2012M03 ,Y,Year 2012 - Quarter 01,2012Q01 ,N,9,2012,2012-02-24,2012-03-02,N,Wk.09 - 13,2012-02-24 00:00:00,2012-03-02 00:00:00,2012W09 ,2012W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2012,N,2012-03-01,2011-03-01,2012-12-01,2012-09-01,2012-02-01,2012-01-01,2012-02-22,2012-02-15,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-26,2012-01-01,2012-04-01,2012-04-01,2012-04-21,0,-2,-7,-31,-215,0,-2,-8,-31,-31,41389,116,26,26,6,17,5912,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-27,26-Apr-2012,Apr 26th 2012,Fri 04-26-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-21,2012-04-22,2012-04-26,Fri ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,17,2012,2012-04-21,2012-04-27,N,Wk.17 - 13,2012-04-21 00:00:00,2012-04-27 00:00:00,2012W17 ,2012W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2012,N,2012-04-26,2011-04-26,2012-01-26,2012-10-26,2012-03-26,2012-02-26,2012-04-19,2012-04-12,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-20,2012-01-01,2012-10-01,2012-11-01,2012-11-17,0,0,0,-1,-7,0,0,-1,-1,-1,41597,324,51,20,4,47,5942,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-23,20-Nov-2012,Nov 20th 2012,Wed 11-20-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-17,2012-11-18,2012-11-20,Wed ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,47,2012,2012-11-17,2012-11-23,N,Wk.47 - 13,2012-11-17 00:00:00,2012-11-23 00:00:00,2012W47 ,2012W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2012,N,2012-11-20,2011-11-20,2012-08-20,2012-05-20,2012-10-20,2012-09-20,2012-11-13,2012-11-06,0,0,0,0,0,0,1,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-04,2012-01-01,2012-04-01,2012-06-01,2012-06-02,0,-2,-5,-25,-176,0,-2,-6,-25,-25,41428,155,65,4,3,23,5918,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-08,04-Jun-2012,Jun 4th 2012,Tue 06-04-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-02,2012-06-03,2012-06-04,Tue ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,23,2012,2012-06-02,2012-06-08,N,Wk.23 - 13,2012-06-02 00:00:00,2012-06-08 00:00:00,2012W23 ,2012W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2012,N,2012-06-04,2011-06-04,2012-03-04,2012-12-04,2012-05-04,2012-04-04,2012-05-28,2012-05-21,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-14,2012-01-01,2012-07-01,2012-09-01,2012-09-08,0,-1,-2,-11,-74,0,-1,-3,-11,-11,41530,257,76,14,7,37,5932,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-14,14-Sep-2012,Sep 14th 2012,Sat 09-14-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-08,2012-09-09,2012-09-14,Sat ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,37,2012,2012-09-08,2012-09-14,N,Wk.37 - 13,2012-09-08 00:00:00,2012-09-14 00:00:00,2012W37 ,2012W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2012,N,2012-09-14,2011-09-14,2012-06-14,2012-03-14,2012-08-14,2012-07-14,2012-09-07,2012-08-31,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-06,2012-01-01,2012-04-01,2012-05-01,2012-05-05,0,-2,-6,-29,-205,0,-2,-7,-29,-29,41399,126,36,6,2,19,5914,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-11,06-May-2012,May 6th 2012,Mon 05-06-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-05,2012-05-06,2012-05-06,Mon ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,19,2012,2012-05-05,2012-05-11,N,Wk.19 - 13,2012-05-05 00:00:00,2012-05-11 00:00:00,2012W19 ,2012W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2012,N,2012-05-06,2011-05-06,2012-02-06,2012-11-06,2012-04-06,2012-03-06,2012-04-29,2012-04-22,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-25,2012-01-01,2012-04-01,2012-06-01,2012-06-23,0,-2,-5,-22,-155,0,-2,-6,-22,-22,41449,176,86,25,3,26,5921,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-29,25-Jun-2012,Jun 25th 2012,Tue 06-25-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-23,2012-06-24,2012-06-25,Tue ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,26,2012,2012-06-23,2012-06-29,N,Wk.26 - 13,2012-06-23 00:00:00,2012-06-29 00:00:00,2012W26 ,2012W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2012,N,2012-06-25,2011-06-25,2012-03-25,2012-12-25,2012-05-25,2012-04-25,2012-06-18,2012-06-11,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-22,2012-01-01,2012-01-01,2012-02-01,2012-02-17,0,-3,-9,-40,-278,0,-3,-10,-40,-40,41326,53,53,22,6,8,5903,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-23,22-Feb-2012,Feb 22nd 2012,Fri 02-22-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-17,2012-02-18,2012-02-22,Fri ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,8,2012,2012-02-17,2012-02-23,N,Wk.08 - 13,2012-02-17 00:00:00,2012-02-23 00:00:00,2012W08 ,2012W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2012,N,2012-02-22,2011-02-22,2012-11-22,2012-08-22,2012-01-22,2012-12-22,2012-02-15,2012-02-08,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-19,2012-01-01,2012-10-01,2012-12-01,2012-12-15,0,0,1,3,22,0,0,0,3,3,41626,353,80,19,5,51,5946,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-21,19-Dec-2012,Dec 19th 2012,Thu 12-19-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-15,2012-12-16,2012-12-19,Thu ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,51,2012,2012-12-15,2012-12-21,N,Wk.51 - 13,2012-12-15 00:00:00,2012-12-21 00:00:00,2012W51 ,2012W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2012,N,2012-12-19,2011-12-19,2012-09-19,2012-06-19,2012-11-19,2012-10-19,2012-12-12,2012-12-05,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-30,2012-01-01,2012-07-01,2012-09-01,2012-09-29,0,-1,-2,-8,-58,0,0,-2,-8,-8,41546,273,92,30,2,40,5935,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-10-05,30-Sep-2012,Sep 30th 2012,Mon 09-30-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-09-29,2012-09-29,2012-09-30,2012-09-30,Mon ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,40,2012,2012-09-29,2012-10-05,N,Wk.40 - 13,2012-09-29 00:00:00,2012-10-05 00:00:00,2012W40 ,2012W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2012,N,2012-09-30,2011-09-30,2012-06-30,2012-03-30,2012-08-30,2012-07-30,2012-09-23,2012-09-16,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-26,2012-01-01,2012-10-01,2012-11-01,2012-11-24,0,0,0,0,-1,0,0,0,0,0,41603,330,57,26,3,48,5943,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-30,26-Nov-2012,Nov 26th 2012,Tue 11-26-13,1,1,1,1,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-11-24,2012-11-24,2012-11-25,2012-11-26,Tue ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,48,2012,2012-11-24,2012-11-30,N,Wk.48 - 13,2012-11-24 00:00:00,2012-11-30 00:00:00,2012W48 ,2012W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2012,N,2012-11-26,2011-11-26,2012-08-26,2012-05-26,2012-10-26,2012-09-26,2012-11-19,2012-11-12,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-25,2012-01-01,2012-04-01,2012-05-01,2012-05-19,0,-2,-6,-27,-186,0,-2,-7,-27,-27,41418,145,55,25,7,21,5916,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-25,25-May-2012,May 25th 2012,Sat 05-25-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-19,2012-05-20,2012-05-25,Sat ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,21,2012,2012-05-19,2012-05-25,N,Wk.21 - 13,2012-05-19 00:00:00,2012-05-25 00:00:00,2012W21 ,2012W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2012,N,2012-05-25,2011-05-25,2012-02-25,2012-11-25,2012-04-25,2012-03-25,2012-05-18,2012-05-11,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-14,2012-01-01,2012-10-01,2012-10-01,2012-10-13,0,0,-1,-6,-44,0,0,-2,-6,-6,41560,287,14,14,2,42,5937,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-19,14-Oct-2012,Oct 14th 2012,Mon 10-14-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-13,2012-10-14,2012-10-14,Mon ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,42,2012,2012-10-13,2012-10-19,N,Wk.42 - 13,2012-10-13 00:00:00,2012-10-19 00:00:00,2012W42 ,2012W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2012,N,2012-10-14,2011-10-14,2012-07-14,2012-04-14,2012-09-14,2012-08-14,2012-10-07,2012-09-30,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-30,2012-01-01,2012-04-01,2012-06-01,2012-06-30,0,-2,-5,-21,-150,0,-1,-5,-21,-22,41454,181,91,30,1,27,5922,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-07-06,30-Jun-2012,Jun 30th 2012,Sun 06-30-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-06-30,2012-06-30,2012-06-30,2012-06-24,2012-06-30,Sun ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,27,2012,2012-06-30,2012-07-06,Y,Wk.27 - 13,2012-06-30 00:00:00,2012-07-06 00:00:00,2012W27 ,2012W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2012,N,2012-06-30,2011-06-30,2012-03-30,2012-12-30,2012-05-30,2012-04-30,2012-06-23,2012-06-16,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-21,2012-01-01,2012-04-01,2012-04-01,2012-04-21,0,-2,-7,-31,-220,0,-2,-8,-31,-32,41384,111,21,21,1,17,5912,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-27,21-Apr-2012,Apr 21st 2012,Sun 04-21-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-21,2012-04-15,2012-04-21,Sun ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,17,2012,2012-04-21,2012-04-27,Y,Wk.17 - 13,2012-04-21 00:00:00,2012-04-27 00:00:00,2012W17 ,2012W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2012,N,2012-04-21,2011-04-21,2012-01-21,2012-10-21,2012-03-21,2012-02-21,2012-04-14,2012-04-07,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-16,2012-01-01,2012-10-01,2012-11-01,2012-11-10,0,0,0,-2,-11,0,0,-1,-2,-2,41593,320,47,16,7,46,5941,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-16,16-Nov-2012,Nov 16th 2012,Sat 11-16-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-10,2012-11-11,2012-11-16,Sat ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,46,2012,2012-11-10,2012-11-16,N,Wk.46 - 13,2012-11-10 00:00:00,2012-11-16 00:00:00,2012W46 ,2012W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2012,N,2012-11-16,2011-11-16,2012-08-16,2012-05-16,2012-10-16,2012-09-16,2012-11-09,2012-11-02,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-26,2012-01-01,2012-07-01,2012-07-01,2012-07-21,0,-1,-4,-18,-124,0,-1,-5,-18,-18,41480,207,26,26,6,30,5925,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-27,26-Jul-2012,Jul 26th 2012,Fri 07-26-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-21,2012-07-22,2012-07-26,Fri ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,30,2012,2012-07-21,2012-07-27,N,Wk.30 - 13,2012-07-21 00:00:00,2012-07-27 00:00:00,2012W30 ,2012W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2012,N,2012-07-26,2011-07-26,2012-04-26,2012-01-26,2012-06-26,2012-05-26,2012-07-19,2012-07-12,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-04,2012-01-01,2012-04-01,2012-05-01,2012-04-28,0,-2,-6,-30,-207,0,-2,-7,-30,-30,41397,124,34,4,7,18,5913,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-04,04-May-2012,May 4th 2012,Sat 05-04-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-04-28,2012-04-29,2012-05-04,Sat ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,18,2012,2012-04-28,2012-05-04,N,Wk.18 - 13,2012-04-28 00:00:00,2012-05-04 00:00:00,2012W18 ,2012W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2012,N,2012-05-04,2011-05-04,2012-02-04,2012-11-04,2012-04-04,2012-03-04,2012-04-27,2012-04-20,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-21,2012-01-01,2012-01-01,2012-01-01,2012-01-20,0,-3,-10,-44,-310,0,-3,-11,-44,-44,41294,21,21,21,2,4,5899,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-26,21-Jan-2012,Jan 21st 2012,Mon 01-21-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-20,2012-01-21,2012-01-21,Mon ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,4,2012,2012-01-20,2012-01-26,N,Wk.04 - 13,2012-01-20 00:00:00,2012-01-26 00:00:00,2012W04 ,2012W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2012,N,2012-01-21,2011-01-21,2012-10-21,2012-07-21,2012-12-21,2012-11-21,2012-01-14,2012-01-07,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-17,2012-01-01,2012-10-01,2012-12-01,2012-12-15,0,0,1,3,20,0,0,0,3,3,41624,351,78,17,3,51,5946,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-21,17-Dec-2012,Dec 17th 2012,Tue 12-17-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-15,2012-12-16,2012-12-17,Tue ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,51,2012,2012-12-15,2012-12-21,N,Wk.51 - 13,2012-12-15 00:00:00,2012-12-21 00:00:00,2012W51 ,2012W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2012,N,2012-12-17,2011-12-17,2012-09-17,2012-06-17,2012-11-17,2012-10-17,2012-12-10,2012-12-03,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-12,2012-01-01,2012-07-01,2012-09-01,2012-09-08,0,-1,-2,-11,-76,0,-1,-3,-11,-11,41528,255,74,12,5,37,5932,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-14,12-Sep-2012,Sep 12th 2012,Thu 09-12-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-08,2012-09-09,2012-09-12,Thu ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,37,2012,2012-09-08,2012-09-14,N,Wk.37 - 13,2012-09-08 00:00:00,2012-09-14 00:00:00,2012W37 ,2012W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2012,N,2012-09-12,2011-09-12,2012-06-12,2012-03-12,2012-08-12,2012-07-12,2012-09-05,2012-08-29,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-22,2012-01-01,2012-07-01,2012-07-01,2012-07-21,0,-1,-4,-18,-128,0,-1,-5,-18,-18,41476,203,22,22,2,30,5925,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-27,22-Jul-2012,Jul 22nd 2012,Mon 07-22-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-21,2012-07-22,2012-07-22,Mon ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,30,2012,2012-07-21,2012-07-27,N,Wk.30 - 13,2012-07-21 00:00:00,2012-07-27 00:00:00,2012W30 ,2012W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2012,N,2012-07-22,2011-07-22,2012-04-22,2012-01-22,2012-06-22,2012-05-22,2012-07-15,2012-07-08,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-13,2012-01-01,2012-10-01,2012-10-01,2012-10-13,0,0,-1,-6,-45,0,0,-2,-6,-7,41559,286,13,13,1,42,5937,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-19,13-Oct-2012,Oct 13th 2012,Sun 10-13-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-13,2012-10-07,2012-10-13,Sun ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,42,2012,2012-10-13,2012-10-19,Y,Wk.42 - 13,2012-10-13 00:00:00,2012-10-19 00:00:00,2012W42 ,2012W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2012,N,2012-10-13,2011-10-13,2012-07-13,2012-04-13,2012-09-13,2012-08-13,2012-10-06,2012-09-29,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-11,2012-01-01,2012-07-01,2012-08-01,2012-08-11,0,-1,-3,-15,-108,0,-1,-4,-15,-16,41496,223,42,11,1,33,5928,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-17,11-Aug-2012,Aug 11th 2012,Sun 08-11-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-11,2012-08-05,2012-08-11,Sun ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,33,2012,2012-08-11,2012-08-17,Y,Wk.33 - 13,2012-08-11 00:00:00,2012-08-17 00:00:00,2012W33 ,2012W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2012,N,2012-08-11,2011-08-11,2012-05-11,2012-02-11,2012-07-11,2012-06-11,2012-08-04,2012-07-28,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-08,2012-01-01,2012-07-01,2012-08-01,2012-08-04,0,-1,-3,-16,-111,0,-1,-4,-16,-16,41493,220,39,8,5,32,5927,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-10,08-Aug-2012,Aug 8th 2012,Thu 08-08-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-04,2012-08-05,2012-08-08,Thu ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,32,2012,2012-08-04,2012-08-10,N,Wk.32 - 13,2012-08-04 00:00:00,2012-08-10 00:00:00,2012W32 ,2012W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2012,N,2012-08-08,2011-08-08,2012-05-08,2012-02-08,2012-07-08,2012-06-08,2012-08-01,2012-07-25,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-28,2012-01-01,2012-04-01,2012-06-01,2012-06-23,0,-2,-5,-22,-152,0,-2,-6,-22,-22,41452,179,89,28,6,26,5921,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-29,28-Jun-2012,Jun 28th 2012,Fri 06-28-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-23,2012-06-24,2012-06-28,Fri ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,26,2012,2012-06-23,2012-06-29,N,Wk.26 - 13,2012-06-23 00:00:00,2012-06-29 00:00:00,2012W26 ,2012W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2012,N,2012-06-28,2011-06-28,2012-03-28,2012-12-28,2012-05-28,2012-04-28,2012-06-21,2012-06-14,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-17,2012-01-01,2012-01-01,2012-02-01,2012-02-17,0,-3,-9,-40,-283,0,-3,-10,-40,-41,41321,48,48,17,1,8,5903,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-23,17-Feb-2012,Feb 17th 2012,Sun 02-17-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-17,2012-02-11,2012-02-17,Sun ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,8,2012,2012-02-17,2012-02-23,Y,Wk.08 - 13,2012-02-17 00:00:00,2012-02-23 00:00:00,2012W08 ,2012W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2012,N,2012-02-17,2011-02-17,2012-11-17,2012-08-17,2012-01-17,2012-12-17,2012-02-10,2012-02-03,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-03,2012-01-01,2012-07-01,2012-07-01,2012-06-30,0,-1,-4,-21,-147,0,-1,-5,-21,-21,41457,184,3,3,4,27,5922,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-06,03-Jul-2012,Jul 3rd 2012,Wed 07-03-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-06-30,2012-07-01,2012-07-03,Wed ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,27,2012,2012-06-30,2012-07-06,N,Wk.27 - 13,2012-06-30 00:00:00,2012-07-06 00:00:00,2012W27 ,2012W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2012,N,2012-07-03,2011-07-03,2012-04-03,2012-01-03,2012-06-03,2012-05-03,2012-06-26,2012-06-19,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-05,2012-01-01,2012-04-01,2012-06-01,2012-06-02,0,-2,-5,-25,-175,0,-2,-6,-25,-25,41429,156,66,5,4,23,5918,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-08,05-Jun-2012,Jun 5th 2012,Wed 06-05-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-02,2012-06-03,2012-06-05,Wed ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,23,2012,2012-06-02,2012-06-08,N,Wk.23 - 13,2012-06-02 00:00:00,2012-06-08 00:00:00,2012W23 ,2012W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2012,N,2012-06-05,2011-06-05,2012-03-05,2012-12-05,2012-05-05,2012-04-05,2012-05-29,2012-05-22,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-23,2012-01-01,2012-04-01,2012-05-01,2012-05-19,0,-2,-6,-27,-188,0,-2,-7,-27,-27,41416,143,53,23,5,21,5916,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-25,23-May-2012,May 23rd 2012,Thu 05-23-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-19,2012-05-20,2012-05-23,Thu ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,21,2012,2012-05-19,2012-05-25,N,Wk.21 - 13,2012-05-19 00:00:00,2012-05-25 00:00:00,2012W21 ,2012W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2012,N,2012-05-23,2011-05-23,2012-02-23,2012-11-23,2012-04-23,2012-03-23,2012-05-16,2012-05-09,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-06,2012-01-01,2012-04-01,2012-06-01,2012-06-02,0,-2,-5,-25,-174,0,-2,-6,-25,-25,41430,157,67,6,5,23,5918,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-08,06-Jun-2012,Jun 6th 2012,Thu 06-06-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-02,2012-06-03,2012-06-06,Thu ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,23,2012,2012-06-02,2012-06-08,N,Wk.23 - 13,2012-06-02 00:00:00,2012-06-08 00:00:00,2012W23 ,2012W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2012,N,2012-06-06,2011-06-06,2012-03-06,2012-12-06,2012-05-06,2012-04-06,2012-05-30,2012-05-23,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-23,2012-01-01,2012-04-01,2012-04-01,2012-04-21,0,-2,-7,-31,-218,0,-2,-8,-31,-31,41386,113,23,23,3,17,5912,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-27,23-Apr-2012,Apr 23rd 2012,Tue 04-23-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-21,2012-04-22,2012-04-23,Tue ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,17,2012,2012-04-21,2012-04-27,N,Wk.17 - 13,2012-04-21 00:00:00,2012-04-27 00:00:00,2012W17 ,2012W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2012,N,2012-04-23,2011-04-23,2012-01-23,2012-10-23,2012-03-23,2012-02-23,2012-04-16,2012-04-09,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-13,2012-01-01,2012-07-01,2012-08-01,2012-08-11,0,-1,-3,-15,-106,0,-1,-4,-15,-15,41498,225,44,13,3,33,5928,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-17,13-Aug-2012,Aug 13th 2012,Tue 08-13-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-11,2012-08-12,2012-08-13,Tue ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,33,2012,2012-08-11,2012-08-17,N,Wk.33 - 13,2012-08-11 00:00:00,2012-08-17 00:00:00,2012W33 ,2012W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2012,N,2012-08-13,2011-08-13,2012-05-13,2012-02-13,2012-07-13,2012-06-13,2012-08-06,2012-07-30,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-14,2012-01-01,2012-10-01,2012-11-01,2012-11-10,0,0,0,-2,-13,0,0,-1,-2,-2,41591,318,45,14,5,46,5941,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-16,14-Nov-2012,Nov 14th 2012,Thu 11-14-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-10,2012-11-11,2012-11-14,Thu ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,46,2012,2012-11-10,2012-11-16,N,Wk.46 - 13,2012-11-10 00:00:00,2012-11-16 00:00:00,2012W46 ,2012W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2012,N,2012-11-14,2011-11-14,2012-08-14,2012-05-14,2012-10-14,2012-09-14,2012-11-07,2012-10-31,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-09,2012-01-01,2012-07-01,2012-08-01,2012-08-04,0,-1,-3,-16,-110,0,-1,-4,-16,-16,41494,221,40,9,6,32,5927,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-10,09-Aug-2012,Aug 9th 2012,Fri 08-09-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-04,2012-08-05,2012-08-09,Fri ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,32,2012,2012-08-04,2012-08-10,N,Wk.32 - 13,2012-08-04 00:00:00,2012-08-10 00:00:00,2012W32 ,2012W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2012,N,2012-08-09,2011-08-09,2012-05-09,2012-02-09,2012-07-09,2012-06-09,2012-08-02,2012-07-26,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-10,2012-01-01,2012-07-01,2012-09-01,2012-09-08,0,-1,-2,-11,-78,0,-1,-3,-11,-11,41526,253,72,10,3,37,5932,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-14,10-Sep-2012,Sep 10th 2012,Tue 09-10-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-08,2012-09-09,2012-09-10,Tue ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,37,2012,2012-09-08,2012-09-14,N,Wk.37 - 13,2012-09-08 00:00:00,2012-09-14 00:00:00,2012W37 ,2012W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2012,N,2012-09-10,2011-09-10,2012-06-10,2012-03-10,2012-08-10,2012-07-10,2012-09-03,2012-08-27,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-08,2012-01-01,2012-01-01,2012-03-01,2012-03-03,0,-3,-8,-38,-264,0,-3,-9,-38,-38,41340,67,67,8,6,10,5905,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-09,08-Mar-2012,Mar 8th 2012,Fri 03-08-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-03,2012-03-04,2012-03-08,Fri ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,10,2012,2012-03-03,2012-03-09,N,Wk.10 - 13,2012-03-03 00:00:00,2012-03-09 00:00:00,2012W10 ,2012W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2012,N,2012-03-08,2011-03-08,2012-12-08,2012-09-08,2012-02-08,2012-01-08,2012-03-01,2012-02-22,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-01,2012-01-01,2012-04-01,2012-04-01,2012-03-31,0,-2,-7,-34,-240,0,-2,-8,-34,-34,41364,91,1,1,2,14,5909,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-06,01-Apr-2012,Apr 1st 2012,Mon 04-01-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-03-31,2012-04-01,2012-04-01,Mon ,2012M04,Apr-2012,Y,2012M04 ,Y,Year 2012 - Quarter 02,2012Q02 ,Y,14,2012,2012-03-31,2012-04-06,N,Wk.14 - 13,2012-03-31 00:00:00,2012-04-06 00:00:00,2012W14 ,2012W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2012,N,2012-04-01,2011-04-01,2012-01-01,2012-10-01,2012-03-01,2012-02-01,2012-03-25,2012-03-18,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-25,2012-01-01,2012-01-01,2012-01-01,2012-01-20,0,-3,-10,-44,-306,0,-3,-11,-44,-44,41298,25,25,25,6,4,5899,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-26,25-Jan-2012,Jan 25th 2012,Fri 01-25-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-20,2012-01-21,2012-01-25,Fri ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,4,2012,2012-01-20,2012-01-26,N,Wk.04 - 13,2012-01-20 00:00:00,2012-01-26 00:00:00,2012W04 ,2012W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2012,N,2012-01-25,2011-01-25,2012-10-25,2012-07-25,2012-12-25,2012-11-25,2012-01-18,2012-01-11,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-24,2012-01-01,2012-04-01,2012-06-01,2012-06-23,0,-2,-5,-22,-156,0,-2,-6,-22,-22,41448,175,85,24,2,26,5921,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-29,24-Jun-2012,Jun 24th 2012,Mon 06-24-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-23,2012-06-24,2012-06-24,Mon ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,26,2012,2012-06-23,2012-06-29,N,Wk.26 - 13,2012-06-23 00:00:00,2012-06-29 00:00:00,2012W26 ,2012W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2012,N,2012-06-24,2011-06-24,2012-03-24,2012-12-24,2012-05-24,2012-04-24,2012-06-17,2012-06-10,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-15,2012-01-01,2012-07-01,2012-08-01,2012-08-11,0,-1,-3,-15,-104,0,-1,-4,-15,-15,41500,227,46,15,5,33,5928,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-17,15-Aug-2012,Aug 15th 2012,Thu 08-15-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-11,2012-08-12,2012-08-15,Thu ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,33,2012,2012-08-11,2012-08-17,N,Wk.33 - 13,2012-08-11 00:00:00,2012-08-17 00:00:00,2012W33 ,2012W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2012,N,2012-08-15,2011-08-15,2012-05-15,2012-02-15,2012-07-15,2012-06-15,2012-08-08,2012-08-01,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-17,2012-01-01,2012-01-01,2012-01-01,2012-01-13,0,-3,-10,-45,-314,0,-3,-11,-45,-45,41290,17,17,17,5,3,5898,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-19,17-Jan-2012,Jan 17th 2012,Thu 01-17-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-13,2012-01-14,2012-01-17,Thu ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,3,2012,2012-01-13,2012-01-19,N,Wk.03 - 13,2012-01-13 00:00:00,2012-01-19 00:00:00,2012W03 ,2012W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2012,N,2012-01-17,2011-01-17,2012-10-17,2012-07-17,2012-12-17,2012-11-17,2012-01-10,2012-01-03,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-11,2012-01-01,2012-10-01,2012-10-01,2012-10-06,0,0,-1,-7,-47,0,0,-2,-7,-7,41557,284,11,11,6,41,5936,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-12,11-Oct-2012,Oct 11th 2012,Fri 10-11-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-06,2012-10-07,2012-10-11,Fri ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,41,2012,2012-10-06,2012-10-12,N,Wk.41 - 13,2012-10-06 00:00:00,2012-10-12 00:00:00,2012W41 ,2012W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2012,N,2012-10-11,2011-10-11,2012-07-11,2012-04-11,2012-09-11,2012-08-11,2012-10-04,2012-09-27,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-22,2012-01-01,2012-04-01,2012-05-01,2012-05-19,0,-2,-6,-27,-189,0,-2,-7,-27,-27,41415,142,52,22,4,21,5916,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-25,22-May-2012,May 22nd 2012,Wed 05-22-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-19,2012-05-20,2012-05-22,Wed ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,21,2012,2012-05-19,2012-05-25,N,Wk.21 - 13,2012-05-19 00:00:00,2012-05-25 00:00:00,2012W21 ,2012W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2012,N,2012-05-22,2011-05-22,2012-02-22,2012-11-22,2012-04-22,2012-03-22,2012-05-15,2012-05-08,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-18,2012-01-01,2012-10-01,2012-12-01,2012-12-15,0,0,1,3,21,0,0,0,3,3,41625,352,79,18,4,51,5946,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-21,18-Dec-2012,Dec 18th 2012,Wed 12-18-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-15,2012-12-16,2012-12-18,Wed ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,51,2012,2012-12-15,2012-12-21,N,Wk.51 - 13,2012-12-15 00:00:00,2012-12-21 00:00:00,2012W51 ,2012W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2012,N,2012-12-18,2011-12-18,2012-09-18,2012-06-18,2012-11-18,2012-10-18,2012-12-11,2012-12-04,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-27,2012-01-01,2012-07-01,2012-08-01,2012-08-25,0,-1,-3,-13,-92,0,-1,-3,-13,-13,41512,239,58,27,3,35,5930,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-31,27-Aug-2012,Aug 27th 2012,Tue 08-27-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-08-25,2012-08-25,2012-08-26,2012-08-27,Tue ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,35,2012,2012-08-25,2012-08-31,N,Wk.35 - 13,2012-08-25 00:00:00,2012-08-31 00:00:00,2012W35 ,2012W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2012,N,2012-08-27,2011-08-27,2012-05-27,2012-02-27,2012-07-27,2012-06-27,2012-08-20,2012-08-13,0,0,1,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-28,2012-01-01,2012-07-01,2012-08-01,2012-08-25,0,-1,-3,-13,-91,0,-1,-3,-13,-13,41513,240,59,28,4,35,5930,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-31,28-Aug-2012,Aug 28th 2012,Wed 08-28-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-08-25,2012-08-25,2012-08-26,2012-08-28,Wed ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,35,2012,2012-08-25,2012-08-31,N,Wk.35 - 13,2012-08-25 00:00:00,2012-08-31 00:00:00,2012W35 ,2012W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2012,N,2012-08-28,2011-08-28,2012-05-28,2012-02-28,2012-07-28,2012-06-28,2012-08-21,2012-08-14,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-29,2012-01-01,2012-01-01,2012-01-01,2012-01-27,0,-3,-10,-43,-302,0,-3,-10,-43,-43,41302,29,29,29,3,5,5900,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-02-02,29-Jan-2012,Jan 29th 2012,Tue 01-29-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-01-27,2012-01-27,2012-01-28,2012-01-29,Tue ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,5,2012,2012-01-27,2012-02-02,N,Wk.05 - 13,2012-01-27 00:00:00,2012-02-02 00:00:00,2012W05 ,2012W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2012,N,2012-01-29,2011-01-29,2012-10-29,2012-07-29,2012-12-29,2012-11-29,2012-01-22,2012-01-15,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-20,2012-01-01,2012-01-01,2012-03-01,2012-03-17,0,-3,-8,-36,-252,0,-3,-9,-36,-36,41352,79,79,20,4,12,5907,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-23,20-Mar-2012,Mar 20th 2012,Wed 03-20-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-17,2012-03-18,2012-03-20,Wed ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,12,2012,2012-03-17,2012-03-23,N,Wk.12 - 13,2012-03-17 00:00:00,2012-03-23 00:00:00,2012W12 ,2012W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2012,N,2012-03-20,2011-03-20,2012-12-20,2012-09-20,2012-02-20,2012-01-20,2012-03-13,2012-03-06,0,0,0,0,0,0,0,0,3,1,12,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-28,2012-01-01,2012-07-01,2012-09-01,2012-09-22,0,-1,-2,-9,-60,0,-1,-3,-9,-9,41544,271,90,28,7,39,5934,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-28,28-Sep-2012,Sep 28th 2012,Sat 09-28-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-22,2012-09-23,2012-09-28,Sat ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,39,2012,2012-09-22,2012-09-28,N,Wk.39 - 13,2012-09-22 00:00:00,2012-09-28 00:00:00,2012W39 ,2012W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2012,N,2012-09-28,2011-09-28,2012-06-28,2012-03-28,2012-08-28,2012-07-28,2012-09-21,2012-09-14,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-02,2012-01-01,2012-04-01,2012-04-01,2012-03-31,0,-2,-7,-34,-239,0,-2,-8,-34,-34,41365,92,2,2,3,14,5909,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-06,02-Apr-2012,Apr 2nd 2012,Tue 04-02-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-03-31,2012-04-01,2012-04-02,Tue ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,14,2012,2012-03-31,2012-04-06,N,Wk.14 - 13,2012-03-31 00:00:00,2012-04-06 00:00:00,2012W14 ,2012W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2012,N,2012-04-02,2011-04-02,2012-01-02,2012-10-02,2012-03-02,2012-02-02,2012-03-26,2012-03-19,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-12,2012-01-01,2012-10-01,2012-12-01,2012-12-08,0,0,1,2,15,0,0,0,2,2,41619,346,73,12,5,50,5945,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-14,12-Dec-2012,Dec 12th 2012,Thu 12-12-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-08,2012-12-09,2012-12-12,Thu ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,50,2012,2012-12-08,2012-12-14,N,Wk.50 - 13,2012-12-08 00:00:00,2012-12-14 00:00:00,2012W50 ,2012W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2012,N,2012-12-12,2011-12-12,2012-09-12,2012-06-12,2012-11-12,2012-10-12,2012-12-05,2012-11-28,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-31,2012-01-01,2012-01-01,2012-01-01,2012-01-27,0,-3,-10,-43,-300,0,-3,-10,-43,-43,41304,31,31,31,5,5,5900,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-02-02,31-Jan-2012,Jan 31st 2012,Thu 01-31-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-01-27,2012-01-27,2012-01-28,2012-01-31,Thu ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,5,2012,2012-01-27,2012-02-02,N,Wk.05 - 13,2012-01-27 00:00:00,2012-02-02 00:00:00,2012W05 ,2012W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2012,N,2012-01-31,2011-01-31,2012-10-31,2012-07-31,2012-12-31,2012-11-30,2012-01-24,2012-01-17,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-22,2012-01-01,2012-04-01,2012-06-01,2012-06-16,0,-2,-5,-23,-158,0,-2,-6,-23,-23,41446,173,83,22,7,25,5920,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-22,22-Jun-2012,Jun 22nd 2012,Sat 06-22-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-16,2012-06-17,2012-06-22,Sat ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,25,2012,2012-06-16,2012-06-22,N,Wk.25 - 13,2012-06-16 00:00:00,2012-06-22 00:00:00,2012W25 ,2012W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2012,N,2012-06-22,2011-06-22,2012-03-22,2012-12-22,2012-05-22,2012-04-22,2012-06-15,2012-06-08,0,0,0,0,0,0,0,0,6,2,25,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-08,2012-01-01,2012-07-01,2012-09-01,2012-09-08,0,-1,-2,-11,-80,0,-1,-3,-11,-12,41524,251,70,8,1,37,5932,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-14,08-Sep-2012,Sep 8th 2012,Sun 09-08-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-08,2012-09-02,2012-09-08,Sun ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,37,2012,2012-09-08,2012-09-14,Y,Wk.37 - 13,2012-09-08 00:00:00,2012-09-14 00:00:00,2012W37 ,2012W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2012,N,2012-09-08,2011-09-08,2012-06-08,2012-03-08,2012-08-08,2012-07-08,2012-09-01,2012-08-25,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-15,2012-01-01,2012-01-01,2012-02-01,2012-02-10,0,-3,-9,-41,-285,0,-3,-10,-41,-41,41319,46,46,15,6,7,5902,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-16,15-Feb-2012,Feb 15th 2012,Fri 02-15-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-10,2012-02-11,2012-02-15,Fri ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,7,2012,2012-02-10,2012-02-16,N,Wk.07 - 13,2012-02-10 00:00:00,2012-02-16 00:00:00,2012W07 ,2012W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2012,N,2012-02-15,2011-02-15,2012-11-15,2012-08-15,2012-01-15,2012-12-15,2012-02-08,2012-02-01,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-20,2012-01-01,2012-01-01,2012-02-01,2012-02-17,0,-3,-9,-40,-280,0,-3,-10,-40,-40,41324,51,51,20,4,8,5903,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-23,20-Feb-2012,Feb 20th 2012,Wed 02-20-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-17,2012-02-18,2012-02-20,Wed ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,8,2012,2012-02-17,2012-02-23,N,Wk.08 - 13,2012-02-17 00:00:00,2012-02-23 00:00:00,2012W08 ,2012W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2012,N,2012-02-20,2011-02-20,2012-11-20,2012-08-20,2012-01-20,2012-12-20,2012-02-13,2012-02-06,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-18,2012-01-01,2012-04-01,2012-04-01,2012-04-14,0,-2,-7,-32,-223,0,-2,-8,-32,-32,41381,108,18,18,5,16,5911,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-20,18-Apr-2012,Apr 18th 2012,Thu 04-18-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-14,2012-04-15,2012-04-18,Thu ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,16,2012,2012-04-14,2012-04-20,N,Wk.16 - 13,2012-04-14 00:00:00,2012-04-20 00:00:00,2012W16 ,2012W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2012,N,2012-04-18,2011-04-18,2012-01-18,2012-10-18,2012-03-18,2012-02-18,2012-04-11,2012-04-04,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-03,2012-01-01,2012-04-01,2012-06-01,2012-06-02,0,-2,-5,-25,-177,0,-2,-6,-25,-25,41427,154,64,3,2,23,5918,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-08,03-Jun-2012,Jun 3rd 2012,Mon 06-03-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-02,2012-06-03,2012-06-03,Mon ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,23,2012,2012-06-02,2012-06-08,N,Wk.23 - 13,2012-06-02 00:00:00,2012-06-08 00:00:00,2012W23 ,2012W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2012,N,2012-06-03,2011-06-03,2012-03-03,2012-12-03,2012-05-03,2012-04-03,2012-05-27,2012-05-20,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-18,2012-01-01,2012-07-01,2012-09-01,2012-09-15,0,-1,-2,-10,-70,0,-1,-3,-10,-10,41534,261,80,18,4,38,5933,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-21,18-Sep-2012,Sep 18th 2012,Wed 09-18-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-15,2012-09-16,2012-09-18,Wed ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,38,2012,2012-09-15,2012-09-21,N,Wk.38 - 13,2012-09-15 00:00:00,2012-09-21 00:00:00,2012W38 ,2012W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2012,N,2012-09-18,2011-09-18,2012-06-18,2012-03-18,2012-08-18,2012-07-18,2012-09-11,2012-09-04,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-29,2012-01-01,2012-01-01,2012-03-01,2012-03-24,0,-3,-8,-35,-243,0,-3,-9,-35,-35,41361,88,88,29,6,13,5908,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-30,29-Mar-2012,Mar 29th 2012,Fri 03-29-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-24,2012-03-25,2012-03-29,Fri ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,13,2012,2012-03-24,2012-03-30,N,Wk.13 - 13,2012-03-24 00:00:00,2012-03-30 00:00:00,2012W13 ,2012W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2012,N,2012-03-29,2011-03-29,2012-12-29,2012-09-29,2012-02-28,2012-01-29,2012-03-22,2012-03-15,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-30,2012-01-01,2012-07-01,2012-08-01,2012-08-25,0,-1,-3,-13,-89,0,-1,-3,-13,-13,41515,242,61,30,6,35,5930,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-31,30-Aug-2012,Aug 30th 2012,Fri 08-30-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-08-25,2012-08-25,2012-08-26,2012-08-30,Fri ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,35,2012,2012-08-25,2012-08-31,N,Wk.35 - 13,2012-08-25 00:00:00,2012-08-31 00:00:00,2012W35 ,2012W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2012,N,2012-08-30,2011-08-30,2012-05-30,2012-02-28,2012-07-30,2012-06-30,2012-08-23,2012-08-16,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-29,2012-01-01,2012-07-01,2012-08-01,2012-08-25,0,-1,-3,-13,-90,0,-1,-3,-13,-13,41514,241,60,29,5,35,5930,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-31,29-Aug-2012,Aug 29th 2012,Thu 08-29-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-08-25,2012-08-25,2012-08-26,2012-08-29,Thu ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,35,2012,2012-08-25,2012-08-31,N,Wk.35 - 13,2012-08-25 00:00:00,2012-08-31 00:00:00,2012W35 ,2012W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2012,N,2012-08-29,2011-08-29,2012-05-29,2012-02-28,2012-07-29,2012-06-29,2012-08-22,2012-08-15,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-20,2012-01-01,2012-07-01,2012-07-01,2012-07-14,0,-1,-4,-19,-130,0,-1,-5,-19,-19,41474,201,20,20,7,29,5924,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-20,20-Jul-2012,Jul 20th 2012,Sat 07-20-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-14,2012-07-15,2012-07-20,Sat ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,29,2012,2012-07-14,2012-07-20,N,Wk.29 - 13,2012-07-14 00:00:00,2012-07-20 00:00:00,2012W29 ,2012W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2012,N,2012-07-20,2011-07-20,2012-04-20,2012-01-20,2012-06-20,2012-05-20,2012-07-13,2012-07-06,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-20,2012-01-01,2012-07-01,2012-09-01,2012-09-15,0,-1,-2,-10,-68,0,-1,-3,-10,-10,41536,263,82,20,6,38,5933,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-21,20-Sep-2012,Sep 20th 2012,Fri 09-20-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-15,2012-09-16,2012-09-20,Fri ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,38,2012,2012-09-15,2012-09-21,N,Wk.38 - 13,2012-09-15 00:00:00,2012-09-21 00:00:00,2012W38 ,2012W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2012,N,2012-09-20,2011-09-20,2012-06-20,2012-03-20,2012-08-20,2012-07-20,2012-09-13,2012-09-06,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-23,2012-01-01,2012-07-01,2012-07-01,2012-07-21,0,-1,-4,-18,-127,0,-1,-5,-18,-18,41477,204,23,23,3,30,5925,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-27,23-Jul-2012,Jul 23rd 2012,Tue 07-23-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-21,2012-07-22,2012-07-23,Tue ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,30,2012,2012-07-21,2012-07-27,N,Wk.30 - 13,2012-07-21 00:00:00,2012-07-27 00:00:00,2012W30 ,2012W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2012,N,2012-07-23,2011-07-23,2012-04-23,2012-01-23,2012-06-23,2012-05-23,2012-07-16,2012-07-09,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-19,2012-01-01,2012-04-01,2012-05-01,2012-05-19,0,-2,-6,-27,-192,0,-2,-7,-27,-28,41412,139,49,19,1,21,5916,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-25,19-May-2012,May 19th 2012,Sun 05-19-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-19,2012-05-13,2012-05-19,Sun ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,21,2012,2012-05-19,2012-05-25,Y,Wk.21 - 13,2012-05-19 00:00:00,2012-05-25 00:00:00,2012W21 ,2012W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2012,N,2012-05-19,2011-05-19,2012-02-19,2012-11-19,2012-04-19,2012-03-19,2012-05-12,2012-05-05,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-05,2012-01-01,2012-04-01,2012-05-01,2012-05-05,0,-2,-6,-29,-206,0,-2,-7,-29,-30,41398,125,35,5,1,19,5914,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-11,05-May-2012,May 5th 2012,Sun 05-05-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-05,2012-04-29,2012-05-05,Sun ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,19,2012,2012-05-05,2012-05-11,Y,Wk.19 - 13,2012-05-05 00:00:00,2012-05-11 00:00:00,2012W19 ,2012W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2012,N,2012-05-05,2011-05-05,2012-02-05,2012-11-05,2012-04-05,2012-03-05,2012-04-28,2012-04-21,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-16,2012-01-01,2012-10-01,2012-10-01,2012-10-13,0,0,-1,-6,-42,0,0,-2,-6,-6,41562,289,16,16,4,42,5937,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-19,16-Oct-2012,Oct 16th 2012,Wed 10-16-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-13,2012-10-14,2012-10-16,Wed ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,42,2012,2012-10-13,2012-10-19,N,Wk.42 - 13,2012-10-13 00:00:00,2012-10-19 00:00:00,2012W42 ,2012W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2012,N,2012-10-16,2011-10-16,2012-07-16,2012-04-16,2012-09-16,2012-08-16,2012-10-09,2012-10-02,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-01,2012-01-01,2012-10-01,2012-11-01,2012-10-27,0,0,0,-4,-26,0,0,-1,-4,-4,41578,305,32,1,6,44,5939,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-02,01-Nov-2012,Nov 1st 2012,Fri 11-01-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-10-27,2012-10-28,2012-11-01,Fri ,2012M11,Nov-2012,Y,2012M11 ,Y,Year 2012 - Quarter 04,2012Q04 ,N,44,2012,2012-10-27,2012-11-02,N,Wk.44 - 13,2012-10-27 00:00:00,2012-11-02 00:00:00,2012W44 ,2012W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2012,N,2012-11-01,2011-11-01,2012-08-01,2012-05-01,2012-10-01,2012-09-01,2012-10-25,2012-10-18,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-08,2012-01-01,2012-04-01,2012-05-01,2012-05-05,0,-2,-6,-29,-203,0,-2,-7,-29,-29,41401,128,38,8,4,19,5914,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-11,08-May-2012,May 8th 2012,Wed 05-08-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-05,2012-05-06,2012-05-08,Wed ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,19,2012,2012-05-05,2012-05-11,N,Wk.19 - 13,2012-05-05 00:00:00,2012-05-11 00:00:00,2012W19 ,2012W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2012,N,2012-05-08,2011-05-08,2012-02-08,2012-11-08,2012-04-08,2012-03-08,2012-05-01,2012-04-24,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-21,2012-01-01,2012-01-01,2012-02-01,2012-02-17,0,-3,-9,-40,-279,0,-3,-10,-40,-40,41325,52,52,21,5,8,5903,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-23,21-Feb-2012,Feb 21st 2012,Thu 02-21-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-17,2012-02-18,2012-02-21,Thu ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,8,2012,2012-02-17,2012-02-23,N,Wk.08 - 13,2012-02-17 00:00:00,2012-02-23 00:00:00,2012W08 ,2012W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2012,N,2012-02-21,2011-02-21,2012-11-21,2012-08-21,2012-01-21,2012-12-21,2012-02-14,2012-02-07,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-27,2012-01-01,2012-07-01,2012-09-01,2012-09-22,0,-1,-2,-9,-61,0,-1,-3,-9,-9,41543,270,89,27,6,39,5934,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-28,27-Sep-2012,Sep 27th 2012,Fri 09-27-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-22,2012-09-23,2012-09-27,Fri ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,39,2012,2012-09-22,2012-09-28,N,Wk.39 - 13,2012-09-22 00:00:00,2012-09-28 00:00:00,2012W39 ,2012W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2012,N,2012-09-27,2011-09-27,2012-06-27,2012-03-27,2012-08-27,2012-07-27,2012-09-20,2012-09-13,0,0,0,0,0,1,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-09,2012-01-01,2012-07-01,2012-07-01,2012-07-07,0,-1,-4,-20,-141,0,-1,-5,-20,-20,41463,190,9,9,3,28,5923,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-13,09-Jul-2012,Jul 9th 2012,Tue 07-09-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-07,2012-07-08,2012-07-09,Tue ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,28,2012,2012-07-07,2012-07-13,N,Wk.28 - 13,2012-07-07 00:00:00,2012-07-13 00:00:00,2012W28 ,2012W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2012,N,2012-07-09,2011-07-09,2012-04-09,2012-01-09,2012-06-09,2012-05-09,2012-07-02,2012-06-25,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-04,2012-01-01,2012-10-01,2012-10-01,2012-09-29,0,0,-1,-8,-54,0,0,-2,-8,-8,41550,277,4,4,6,40,5935,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-05,04-Oct-2012,Oct 4th 2012,Fri 10-04-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-09-29,2012-09-30,2012-10-04,Fri ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,40,2012,2012-09-29,2012-10-05,N,Wk.40 - 13,2012-09-29 00:00:00,2012-10-05 00:00:00,2012W40 ,2012W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2012,N,2012-10-04,2011-10-04,2012-07-04,2012-04-04,2012-09-04,2012-08-04,2012-09-27,2012-09-20,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-09,2012-01-01,2012-07-01,2012-09-01,2012-09-08,0,-1,-2,-11,-79,0,-1,-3,-11,-11,41525,252,71,9,2,37,5932,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-14,09-Sep-2012,Sep 9th 2012,Mon 09-09-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-08,2012-09-09,2012-09-09,Mon ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,37,2012,2012-09-08,2012-09-14,N,Wk.37 - 13,2012-09-08 00:00:00,2012-09-14 00:00:00,2012W37 ,2012W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2012,N,2012-09-09,2011-09-09,2012-06-09,2012-03-09,2012-08-09,2012-07-09,2012-09-02,2012-08-26,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-01,2012-01-01,2012-04-01,2012-05-01,2012-04-28,0,-2,-6,-30,-210,0,-2,-7,-30,-30,41394,121,31,1,4,18,5913,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-04,01-May-2012,May 1st 2012,Wed 05-01-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-04-28,2012-04-29,2012-05-01,Wed ,2012M05,May-2012,Y,2012M05 ,Y,Year 2012 - Quarter 02,2012Q02 ,N,18,2012,2012-04-28,2012-05-04,N,Wk.18 - 13,2012-04-28 00:00:00,2012-05-04 00:00:00,2012W18 ,2012W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2012,N,2012-05-01,2011-05-01,2012-02-01,2012-11-01,2012-04-01,2012-03-01,2012-04-24,2012-04-17,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-29,2012-01-01,2012-07-01,2012-09-01,2012-09-29,0,-1,-2,-8,-59,0,0,-2,-8,-9,41545,272,91,29,1,40,5935,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-10-05,29-Sep-2012,Sep 29th 2012,Sun 09-29-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-09-29,2012-09-29,2012-09-23,2012-09-29,Sun ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,40,2012,2012-09-29,2012-10-05,Y,Wk.40 - 13,2012-09-29 00:00:00,2012-10-05 00:00:00,2012W40 ,2012W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2012,N,2012-09-29,2011-09-29,2012-06-29,2012-03-29,2012-08-29,2012-07-29,2012-09-22,2012-09-15,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-02,2012-01-01,2012-04-01,2012-05-01,2012-04-28,0,-2,-6,-30,-209,0,-2,-7,-30,-30,41395,122,32,2,5,18,5913,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-04,02-May-2012,May 2nd 2012,Thu 05-02-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-04-28,2012-04-29,2012-05-02,Thu ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,18,2012,2012-04-28,2012-05-04,N,Wk.18 - 13,2012-04-28 00:00:00,2012-05-04 00:00:00,2012W18 ,2012W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2012,N,2012-05-02,2011-05-02,2012-02-02,2012-11-02,2012-04-02,2012-03-02,2012-04-25,2012-04-18,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-17,2012-01-01,2012-10-01,2012-10-01,2012-10-13,0,0,-1,-6,-41,0,0,-2,-6,-6,41563,290,17,17,5,42,5937,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-19,17-Oct-2012,Oct 17th 2012,Thu 10-17-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-13,2012-10-14,2012-10-17,Thu ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,42,2012,2012-10-13,2012-10-19,N,Wk.42 - 13,2012-10-13 00:00:00,2012-10-19 00:00:00,2012W42 ,2012W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2012,N,2012-10-17,2011-10-17,2012-07-17,2012-04-17,2012-09-17,2012-08-17,2012-10-10,2012-10-03,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-01,2012-01-01,2012-04-01,2012-06-01,2012-05-26,0,-2,-5,-26,-179,0,-2,-6,-26,-26,41425,152,62,1,7,22,5917,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-01,01-Jun-2012,Jun 1st 2012,Sat 06-01-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-05-26,2012-05-27,2012-06-01,Sat ,2012M06,Jun-2012,Y,2012M06 ,Y,Year 2012 - Quarter 02,2012Q02 ,N,22,2012,2012-05-26,2012-06-01,N,Wk.22 - 13,2012-05-26 00:00:00,2012-06-01 00:00:00,2012W22 ,2012W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2012,N,2012-06-01,2011-06-01,2012-03-01,2012-12-01,2012-05-01,2012-04-01,2012-05-25,2012-05-18,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-21,2012-01-01,2012-04-01,2012-05-01,2012-05-19,0,-2,-6,-27,-190,0,-2,-7,-27,-27,41414,141,51,21,3,21,5916,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-25,21-May-2012,May 21st 2012,Tue 05-21-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-19,2012-05-20,2012-05-21,Tue ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,21,2012,2012-05-19,2012-05-25,N,Wk.21 - 13,2012-05-19 00:00:00,2012-05-25 00:00:00,2012W21 ,2012W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2012,N,2012-05-21,2011-05-21,2012-02-21,2012-11-21,2012-04-21,2012-03-21,2012-05-14,2012-05-07,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-30,2012-01-01,2012-10-01,2012-10-01,2012-10-27,0,0,-1,-4,-28,0,0,-1,-4,-4,41576,303,30,30,4,44,5939,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-11-02,30-Oct-2012,Oct 30th 2012,Wed 10-30-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-10-27,2012-10-27,2012-10-28,2012-10-30,Wed ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,44,2012,2012-10-27,2012-11-02,N,Wk.44 - 13,2012-10-27 00:00:00,2012-11-02 00:00:00,2012W44 ,2012W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2012,N,2012-10-30,2011-10-30,2012-07-30,2012-04-30,2012-09-30,2012-08-30,2012-10-23,2012-10-16,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-11,2012-01-01,2012-01-01,2012-01-01,2012-01-06,0,-3,-10,-46,-320,0,-3,-11,-46,-46,41284,11,11,11,6,2,5897,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-12,11-Jan-2012,Jan 11th 2012,Fri 01-11-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-06,2012-01-07,2012-01-11,Fri ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,2,2012,2012-01-06,2012-01-12,N,Wk.02 - 13,2012-01-06 00:00:00,2012-01-12 00:00:00,2012W02 ,2012W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2012,N,2012-01-11,2011-01-11,2012-10-11,2012-07-11,2012-12-11,2012-11-11,2012-01-04,2012-12-28,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-25,2012-01-01,2012-01-01,2012-03-01,2012-03-24,0,-3,-8,-35,-247,0,-3,-9,-35,-35,41357,84,84,25,2,13,5908,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-30,25-Mar-2012,Mar 25th 2012,Mon 03-25-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-24,2012-03-25,2012-03-25,Mon ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,13,2012,2012-03-24,2012-03-30,N,Wk.13 - 13,2012-03-24 00:00:00,2012-03-30 00:00:00,2012W13 ,2012W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2012,N,2012-03-25,2011-03-25,2012-12-25,2012-09-25,2012-02-25,2012-01-25,2012-03-18,2012-03-11,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-16,2012-01-01,2012-04-01,2012-04-01,2012-04-14,0,-2,-7,-32,-225,0,-2,-8,-32,-32,41379,106,16,16,3,16,5911,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-20,16-Apr-2012,Apr 16th 2012,Tue 04-16-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-14,2012-04-15,2012-04-16,Tue ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,16,2012,2012-04-14,2012-04-20,N,Wk.16 - 13,2012-04-14 00:00:00,2012-04-20 00:00:00,2012W16 ,2012W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2012,N,2012-04-16,2011-04-16,2012-01-16,2012-10-16,2012-03-16,2012-02-16,2012-04-09,2012-04-02,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-20,2012-01-01,2012-04-01,2012-06-01,2012-06-16,0,-2,-5,-23,-160,0,-2,-6,-23,-23,41444,171,81,20,5,25,5920,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-22,20-Jun-2012,Jun 20th 2012,Thu 06-20-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-16,2012-06-17,2012-06-20,Thu ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,25,2012,2012-06-16,2012-06-22,N,Wk.25 - 13,2012-06-16 00:00:00,2012-06-22 00:00:00,2012W25 ,2012W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2012,N,2012-06-20,2011-06-20,2012-03-20,2012-12-20,2012-05-20,2012-04-20,2012-06-13,2012-06-06,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-19,2012-01-01,2012-01-01,2012-02-01,2012-02-17,0,-3,-9,-40,-281,0,-3,-10,-40,-40,41323,50,50,19,3,8,5903,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-23,19-Feb-2012,Feb 19th 2012,Tue 02-19-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-17,2012-02-18,2012-02-19,Tue ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,8,2012,2012-02-17,2012-02-23,N,Wk.08 - 13,2012-02-17 00:00:00,2012-02-23 00:00:00,2012W08 ,2012W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2012,N,2012-02-19,2011-02-19,2012-11-19,2012-08-19,2012-01-19,2012-12-19,2012-02-12,2012-02-05,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-09,2012-01-01,2012-04-01,2012-04-01,2012-04-07,0,-2,-7,-33,-232,0,-2,-8,-33,-33,41372,99,9,9,3,15,5910,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-13,09-Apr-2012,Apr 9th 2012,Tue 04-09-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-07,2012-04-08,2012-04-09,Tue ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,15,2012,2012-04-07,2012-04-13,N,Wk.15 - 13,2012-04-07 00:00:00,2012-04-13 00:00:00,2012W15 ,2012W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2012,N,2012-04-09,2011-04-09,2012-01-09,2012-10-09,2012-03-09,2012-02-09,2012-04-02,2012-03-26,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-03,2012-01-01,2012-01-01,2012-02-01,2012-02-03,0,-3,-9,-42,-297,0,-3,-10,-42,-43,41307,34,34,3,1,6,5901,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-09,03-Feb-2012,Feb 3rd 2012,Sun 02-03-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-03,2012-01-28,2012-02-03,Sun ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,6,2012,2012-02-03,2012-02-09,Y,Wk.06 - 13,2012-02-03 00:00:00,2012-02-09 00:00:00,2012W06 ,2012W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2012,N,2012-02-03,2011-02-03,2012-11-03,2012-08-03,2012-01-03,2012-12-03,2012-01-27,2012-01-20,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-27,2012-01-01,2012-07-01,2012-07-01,2012-07-21,0,-1,-4,-18,-123,0,-1,-5,-18,-18,41481,208,27,27,7,30,5925,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-27,27-Jul-2012,Jul 27th 2012,Sat 07-27-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-21,2012-07-22,2012-07-27,Sat ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,30,2012,2012-07-21,2012-07-27,N,Wk.30 - 13,2012-07-21 00:00:00,2012-07-27 00:00:00,2012W30 ,2012W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2012,N,2012-07-27,2011-07-27,2012-04-27,2012-01-27,2012-06-27,2012-05-27,2012-07-20,2012-07-13,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-20,2012-01-01,2012-04-01,2012-05-01,2012-05-19,0,-2,-6,-27,-191,0,-2,-7,-27,-27,41413,140,50,20,2,21,5916,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-25,20-May-2012,May 20th 2012,Mon 05-20-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-19,2012-05-20,2012-05-20,Mon ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,21,2012,2012-05-19,2012-05-25,N,Wk.21 - 13,2012-05-19 00:00:00,2012-05-25 00:00:00,2012W21 ,2012W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2012,N,2012-05-20,2011-05-20,2012-02-20,2012-11-20,2012-04-20,2012-03-20,2012-05-13,2012-05-06,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-25,2012-01-01,2012-04-01,2012-04-01,2012-04-21,0,-2,-7,-31,-216,0,-2,-8,-31,-31,41388,115,25,25,5,17,5912,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-27,25-Apr-2012,Apr 25th 2012,Thu 04-25-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-21,2012-04-22,2012-04-25,Thu ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,17,2012,2012-04-21,2012-04-27,N,Wk.17 - 13,2012-04-21 00:00:00,2012-04-27 00:00:00,2012W17 ,2012W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2012,N,2012-04-25,2011-04-25,2012-01-25,2012-10-25,2012-03-25,2012-02-25,2012-04-18,2012-04-11,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-07,2012-01-01,2012-04-01,2012-05-01,2012-05-05,0,-2,-6,-29,-204,0,-2,-7,-29,-29,41400,127,37,7,3,19,5914,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-11,07-May-2012,May 7th 2012,Tue 05-07-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-05,2012-05-06,2012-05-07,Tue ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,19,2012,2012-05-05,2012-05-11,N,Wk.19 - 13,2012-05-05 00:00:00,2012-05-11 00:00:00,2012W19 ,2012W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2012,N,2012-05-07,2011-05-07,2012-02-07,2012-11-07,2012-04-07,2012-03-07,2012-04-30,2012-04-23,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-05,2012-01-01,2012-07-01,2012-09-01,2012-09-01,0,-1,-2,-12,-83,0,-1,-3,-12,-12,41521,248,67,5,5,36,5931,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-07,05-Sep-2012,Sep 5th 2012,Thu 09-05-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-01,2012-09-02,2012-09-05,Thu ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,36,2012,2012-09-01,2012-09-07,N,Wk.36 - 13,2012-09-01 00:00:00,2012-09-07 00:00:00,2012W36 ,2012W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2012,N,2012-09-05,2011-09-05,2012-06-05,2012-03-05,2012-08-05,2012-07-05,2012-08-29,2012-08-22,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-16,2012-01-01,2012-01-01,2012-03-01,2012-03-10,0,-3,-8,-37,-256,0,-3,-9,-37,-37,41348,75,75,16,7,11,5906,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-16,16-Mar-2012,Mar 16th 2012,Sat 03-16-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-10,2012-03-11,2012-03-16,Sat ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,11,2012,2012-03-10,2012-03-16,N,Wk.11 - 13,2012-03-10 00:00:00,2012-03-16 00:00:00,2012W11 ,2012W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2012,N,2012-03-16,2011-03-16,2012-12-16,2012-09-16,2012-02-16,2012-01-16,2012-03-09,2012-03-02,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-17,2012-01-01,2012-04-01,2012-05-01,2012-05-12,0,-2,-6,-28,-194,0,-2,-7,-28,-28,41410,137,47,17,6,20,5915,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-18,17-May-2012,May 17th 2012,Fri 05-17-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-12,2012-05-13,2012-05-17,Fri ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,20,2012,2012-05-12,2012-05-18,N,Wk.20 - 13,2012-05-12 00:00:00,2012-05-18 00:00:00,2012W20 ,2012W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2012,N,2012-05-17,2011-05-17,2012-02-17,2012-11-17,2012-04-17,2012-03-17,2012-05-10,2012-05-03,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-23,2012-01-01,2012-07-01,2012-08-01,2012-08-18,0,-1,-3,-14,-96,0,-1,-4,-14,-14,41508,235,54,23,6,34,5929,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-24,23-Aug-2012,Aug 23rd 2012,Fri 08-23-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-18,2012-08-19,2012-08-23,Fri ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,34,2012,2012-08-18,2012-08-24,N,Wk.34 - 13,2012-08-18 00:00:00,2012-08-24 00:00:00,2012W34 ,2012W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2012,N,2012-08-23,2011-08-23,2012-05-23,2012-02-23,2012-07-23,2012-06-23,2012-08-16,2012-08-09,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-07,2012-01-01,2012-07-01,2012-09-01,2012-09-01,0,-1,-2,-12,-81,0,-1,-3,-12,-12,41523,250,69,7,7,36,5931,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-07,07-Sep-2012,Sep 7th 2012,Sat 09-07-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-01,2012-09-02,2012-09-07,Sat ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,36,2012,2012-09-01,2012-09-07,N,Wk.36 - 13,2012-09-01 00:00:00,2012-09-07 00:00:00,2012W36 ,2012W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2012,N,2012-09-07,2011-09-07,2012-06-07,2012-03-07,2012-08-07,2012-07-07,2012-08-31,2012-08-24,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-06,2012-01-01,2012-07-01,2012-09-01,2012-09-01,0,-1,-2,-12,-82,0,-1,-3,-12,-12,41522,249,68,6,6,36,5931,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-07,06-Sep-2012,Sep 6th 2012,Fri 09-06-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-01,2012-09-02,2012-09-06,Fri ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,36,2012,2012-09-01,2012-09-07,N,Wk.36 - 13,2012-09-01 00:00:00,2012-09-07 00:00:00,2012W36 ,2012W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2012,N,2012-09-06,2011-09-06,2012-06-06,2012-03-06,2012-08-06,2012-07-06,2012-08-30,2012-08-23,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-03,2012-01-01,2012-04-01,2012-05-01,2012-04-28,0,-2,-6,-30,-208,0,-2,-7,-30,-30,41396,123,33,3,6,18,5913,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-04,03-May-2012,May 3rd 2012,Fri 05-03-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-04-28,2012-04-29,2012-05-03,Fri ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,18,2012,2012-04-28,2012-05-04,N,Wk.18 - 13,2012-04-28 00:00:00,2012-05-04 00:00:00,2012W18 ,2012W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2012,N,2012-05-03,2011-05-03,2012-02-03,2012-11-03,2012-04-03,2012-03-03,2012-04-26,2012-04-19,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-04,2012-01-01,2012-10-01,2012-12-01,2012-12-01,0,0,1,1,7,0,0,0,1,1,41611,338,65,4,4,49,5944,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-07,04-Dec-2012,Dec 4th 2012,Wed 12-04-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-01,2012-12-02,2012-12-04,Wed ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,49,2012,2012-12-01,2012-12-07,N,Wk.49 - 13,2012-12-01 00:00:00,2012-12-07 00:00:00,2012W49 ,2012W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2012,N,2012-12-04,2011-12-04,2012-09-04,2012-06-04,2012-11-04,2012-10-04,2012-11-27,2012-11-20,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-19,2012-01-01,2012-10-01,2012-11-01,2012-11-17,0,0,0,-1,-8,0,0,-1,-1,-1,41596,323,50,19,3,47,5942,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-23,19-Nov-2012,Nov 19th 2012,Tue 11-19-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-17,2012-11-18,2012-11-19,Tue ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,47,2012,2012-11-17,2012-11-23,N,Wk.47 - 13,2012-11-17 00:00:00,2012-11-23 00:00:00,2012W47 ,2012W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2012,N,2012-11-19,2011-11-19,2012-08-19,2012-05-19,2012-10-19,2012-09-19,2012-11-12,2012-11-05,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-18,2012-01-01,2012-01-01,2012-03-01,2012-03-17,0,-3,-8,-36,-254,0,-3,-9,-36,-36,41350,77,77,18,2,12,5907,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-23,18-Mar-2012,Mar 18th 2012,Mon 03-18-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-17,2012-03-18,2012-03-18,Mon ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,12,2012,2012-03-17,2012-03-23,N,Wk.12 - 13,2012-03-17 00:00:00,2012-03-23 00:00:00,2012W12 ,2012W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2012,N,2012-03-18,2011-03-18,2012-12-18,2012-09-18,2012-02-18,2012-01-18,2012-03-11,2012-03-04,0,0,0,0,0,0,0,0,3,1,12,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-11,2012-01-01,2012-07-01,2012-07-01,2012-07-07,0,-1,-4,-20,-139,0,-1,-5,-20,-20,41465,192,11,11,5,28,5923,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-13,11-Jul-2012,Jul 11th 2012,Thu 07-11-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-07,2012-07-08,2012-07-11,Thu ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,28,2012,2012-07-07,2012-07-13,N,Wk.28 - 13,2012-07-07 00:00:00,2012-07-13 00:00:00,2012W28 ,2012W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2012,N,2012-07-11,2011-07-11,2012-04-11,2012-01-11,2012-06-11,2012-05-11,2012-07-04,2012-06-27,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-07,2012-01-01,2012-04-01,2012-04-01,2012-04-07,0,-2,-7,-33,-234,0,-2,-8,-33,-34,41370,97,7,7,1,15,5910,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-13,07-Apr-2012,Apr 7th 2012,Sun 04-07-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-07,2012-04-01,2012-04-07,Sun ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,15,2012,2012-04-07,2012-04-13,Y,Wk.15 - 13,2012-04-07 00:00:00,2012-04-13 00:00:00,2012W15 ,2012W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2012,N,2012-04-07,2011-04-07,2012-01-07,2012-10-07,2012-03-07,2012-02-07,2012-03-31,2012-03-24,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-11,2012-01-01,2012-10-01,2012-12-01,2012-12-08,0,0,1,2,14,0,0,0,2,2,41618,345,72,11,4,50,5945,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-14,11-Dec-2012,Dec 11th 2012,Wed 12-11-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-08,2012-12-09,2012-12-11,Wed ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,50,2012,2012-12-08,2012-12-14,N,Wk.50 - 13,2012-12-08 00:00:00,2012-12-14 00:00:00,2012W50 ,2012W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2012,N,2012-12-11,2011-12-11,2012-09-11,2012-06-11,2012-11-11,2012-10-11,2012-12-04,2012-11-27,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-26,2012-01-01,2012-10-01,2012-10-01,2012-10-20,0,0,-1,-5,-32,0,0,-2,-5,-5,41572,299,26,26,7,43,5938,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-26,26-Oct-2012,Oct 26th 2012,Sat 10-26-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-20,2012-10-21,2012-10-26,Sat ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,43,2012,2012-10-20,2012-10-26,N,Wk.43 - 13,2012-10-20 00:00:00,2012-10-26 00:00:00,2012W43 ,2012W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2012,N,2012-10-26,2011-10-26,2012-07-26,2012-04-26,2012-09-26,2012-08-26,2012-10-19,2012-10-12,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-20,2012-01-01,2012-01-01,2012-01-01,2012-01-20,0,-3,-10,-44,-311,0,-3,-11,-44,-45,41293,20,20,20,1,4,5899,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-26,20-Jan-2012,Jan 20th 2012,Sun 01-20-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-20,2012-01-14,2012-01-20,Sun ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,4,2012,2012-01-20,2012-01-26,Y,Wk.04 - 13,2012-01-20 00:00:00,2012-01-26 00:00:00,2012W04 ,2012W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2012,N,2012-01-20,2011-01-20,2012-10-20,2012-07-20,2012-12-20,2012-11-20,2012-01-13,2012-01-06,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-27,2012-01-01,2012-04-01,2012-06-01,2012-06-23,0,-2,-5,-22,-153,0,-2,-6,-22,-22,41451,178,88,27,5,26,5921,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-29,27-Jun-2012,Jun 27th 2012,Thu 06-27-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-23,2012-06-24,2012-06-27,Thu ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,26,2012,2012-06-23,2012-06-29,N,Wk.26 - 13,2012-06-23 00:00:00,2012-06-29 00:00:00,2012W26 ,2012W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2012,N,2012-06-27,2011-06-27,2012-03-27,2012-12-27,2012-05-27,2012-04-27,2012-06-20,2012-06-13,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-16,2012-01-01,2012-07-01,2012-09-01,2012-09-15,0,-1,-2,-10,-72,0,-1,-3,-10,-10,41532,259,78,16,2,38,5933,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-21,16-Sep-2012,Sep 16th 2012,Mon 09-16-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-15,2012-09-16,2012-09-16,Mon ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,38,2012,2012-09-15,2012-09-21,N,Wk.38 - 13,2012-09-15 00:00:00,2012-09-21 00:00:00,2012W38 ,2012W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2012,N,2012-09-16,2011-09-16,2012-06-16,2012-03-16,2012-08-16,2012-07-16,2012-09-09,2012-09-02,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-20,2012-01-01,2012-04-01,2012-04-01,2012-04-14,0,-2,-7,-32,-221,0,-2,-8,-32,-32,41383,110,20,20,7,16,5911,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-20,20-Apr-2012,Apr 20th 2012,Sat 04-20-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-14,2012-04-15,2012-04-20,Sat ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,16,2012,2012-04-14,2012-04-20,N,Wk.16 - 13,2012-04-14 00:00:00,2012-04-20 00:00:00,2012W16 ,2012W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2012,N,2012-04-20,2011-04-20,2012-01-20,2012-10-20,2012-03-20,2012-02-20,2012-04-13,2012-04-06,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-14,2012-01-01,2012-04-01,2012-04-01,2012-04-14,0,-2,-7,-32,-227,0,-2,-8,-32,-33,41377,104,14,14,1,16,5911,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-20,14-Apr-2012,Apr 14th 2012,Sun 04-14-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-14,2012-04-08,2012-04-14,Sun ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,16,2012,2012-04-14,2012-04-20,Y,Wk.16 - 13,2012-04-14 00:00:00,2012-04-20 00:00:00,2012W16 ,2012W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2012,N,2012-04-14,2011-04-14,2012-01-14,2012-10-14,2012-03-14,2012-02-14,2012-04-07,2012-03-31,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-28,2012-01-01,2012-10-01,2012-10-01,2012-10-27,0,0,-1,-4,-30,0,0,-1,-4,-4,41574,301,28,28,2,44,5939,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-11-02,28-Oct-2012,Oct 28th 2012,Mon 10-28-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-10-27,2012-10-27,2012-10-28,2012-10-28,Mon ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,44,2012,2012-10-27,2012-11-02,N,Wk.44 - 13,2012-10-27 00:00:00,2012-11-02 00:00:00,2012W44 ,2012W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2012,N,2012-10-28,2011-10-28,2012-07-28,2012-04-28,2012-09-28,2012-08-28,2012-10-21,2012-10-14,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-08,2012-01-01,2012-01-01,2012-01-01,2012-01-06,0,-3,-10,-46,-323,0,-3,-11,-46,-46,41281,8,8,8,3,2,5897,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-12,08-Jan-2012,Jan 8th 2012,Tue 01-08-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-06,2012-01-07,2012-01-08,Tue ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,2,2012,2012-01-06,2012-01-12,N,Wk.02 - 13,2012-01-06 00:00:00,2012-01-12 00:00:00,2012W02 ,2012W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2012,N,2012-01-08,2011-01-08,2012-10-08,2012-07-08,2012-12-08,2012-11-08,2012-01-01,2012-12-25,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-13,2012-01-01,2012-01-01,2012-03-01,2012-03-10,0,-3,-8,-37,-259,0,-3,-9,-37,-37,41345,72,72,13,4,11,5906,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-16,13-Mar-2012,Mar 13th 2012,Wed 03-13-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-10,2012-03-11,2012-03-13,Wed ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,11,2012,2012-03-10,2012-03-16,N,Wk.11 - 13,2012-03-10 00:00:00,2012-03-16 00:00:00,2012W11 ,2012W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2012,N,2012-03-13,2011-03-13,2012-12-13,2012-09-13,2012-02-13,2012-01-13,2012-03-06,2012-02-27,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-28,2012-01-01,2012-04-01,2012-05-01,2012-05-26,0,-2,-6,-26,-183,0,-2,-6,-26,-26,41421,148,58,28,3,22,5917,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-06-01,28-May-2012,May 28th 2012,Tue 05-28-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-05-26,2012-05-26,2012-05-27,2012-05-28,Tue ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,22,2012,2012-05-26,2012-06-01,N,Wk.22 - 13,2012-05-26 00:00:00,2012-06-01 00:00:00,2012W22 ,2012W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2012,N,2012-05-28,2011-05-28,2012-02-28,2012-11-28,2012-04-28,2012-03-28,2012-05-21,2012-05-14,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-14,2012-01-01,2012-01-01,2012-01-01,2012-01-13,0,-3,-10,-45,-317,0,-3,-11,-45,-45,41287,14,14,14,2,3,5898,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-19,14-Jan-2012,Jan 14th 2012,Mon 01-14-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-13,2012-01-14,2012-01-14,Mon ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,3,2012,2012-01-13,2012-01-19,N,Wk.03 - 13,2012-01-13 00:00:00,2012-01-19 00:00:00,2012W03 ,2012W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2012,N,2012-01-14,2011-01-14,2012-10-14,2012-07-14,2012-12-14,2012-11-14,2012-01-07,2012-12-31,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-30,2012-01-01,2012-04-01,2012-04-01,2012-04-28,0,-2,-7,-30,-211,0,-2,-7,-30,-30,41393,120,30,30,3,18,5913,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-05-04,30-Apr-2012,Apr 30th 2012,Tue 04-30-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-04-28,2012-04-28,2012-04-29,2012-04-30,Tue ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,18,2012,2012-04-28,2012-05-04,N,Wk.18 - 13,2012-04-28 00:00:00,2012-05-04 00:00:00,2012W18 ,2012W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2012,N,2012-04-30,2011-04-30,2012-01-30,2012-10-30,2012-03-30,2012-02-28,2012-04-23,2012-04-16,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-14,2012-01-01,2012-07-01,2012-07-01,2012-07-14,0,-1,-4,-19,-136,0,-1,-5,-19,-20,41468,195,14,14,1,29,5924,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-20,14-Jul-2012,Jul 14th 2012,Sun 07-14-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-14,2012-07-08,2012-07-14,Sun ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,29,2012,2012-07-14,2012-07-20,Y,Wk.29 - 13,2012-07-14 00:00:00,2012-07-20 00:00:00,2012W29 ,2012W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2012,N,2012-07-14,2011-07-14,2012-04-14,2012-01-14,2012-06-14,2012-05-14,2012-07-07,2012-06-30,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-24,2012-01-01,2012-07-01,2012-07-01,2012-07-21,0,-1,-4,-18,-126,0,-1,-5,-18,-18,41478,205,24,24,4,30,5925,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-27,24-Jul-2012,Jul 24th 2012,Wed 07-24-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-21,2012-07-22,2012-07-24,Wed ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,30,2012,2012-07-21,2012-07-27,N,Wk.30 - 13,2012-07-21 00:00:00,2012-07-27 00:00:00,2012W30 ,2012W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2012,N,2012-07-24,2011-07-24,2012-04-24,2012-01-24,2012-06-24,2012-05-24,2012-07-17,2012-07-10,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-04,2012-01-01,2012-07-01,2012-09-01,2012-09-01,0,-1,-2,-12,-84,0,-1,-3,-12,-12,41520,247,66,4,4,36,5931,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-07,04-Sep-2012,Sep 4th 2012,Wed 09-04-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-01,2012-09-02,2012-09-04,Wed ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,36,2012,2012-09-01,2012-09-07,N,Wk.36 - 13,2012-09-01 00:00:00,2012-09-07 00:00:00,2012W36 ,2012W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2012,N,2012-09-04,2011-09-04,2012-06-04,2012-03-04,2012-08-04,2012-07-04,2012-08-28,2012-08-21,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-18,2012-01-01,2012-10-01,2012-11-01,2012-11-17,0,0,0,-1,-9,0,0,-1,-1,-1,41595,322,49,18,2,47,5942,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-23,18-Nov-2012,Nov 18th 2012,Mon 11-18-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-17,2012-11-18,2012-11-18,Mon ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,47,2012,2012-11-17,2012-11-23,N,Wk.47 - 13,2012-11-17 00:00:00,2012-11-23 00:00:00,2012W47 ,2012W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2012,N,2012-11-18,2011-11-18,2012-08-18,2012-05-18,2012-10-18,2012-09-18,2012-11-11,2012-11-04,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-18,2012-01-01,2012-01-01,2012-02-01,2012-02-17,0,-3,-9,-40,-282,0,-3,-10,-40,-40,41322,49,49,18,2,8,5903,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-23,18-Feb-2012,Feb 18th 2012,Mon 02-18-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-17,2012-02-18,2012-02-18,Mon ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,8,2012,2012-02-17,2012-02-23,N,Wk.08 - 13,2012-02-17 00:00:00,2012-02-23 00:00:00,2012W08 ,2012W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2012,N,2012-02-18,2011-02-18,2012-11-18,2012-08-18,2012-01-18,2012-12-18,2012-02-11,2012-02-04,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-13,2012-01-01,2012-10-01,2012-11-01,2012-11-10,0,0,0,-2,-14,0,0,-1,-2,-2,41590,317,44,13,4,46,5941,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-16,13-Nov-2012,Nov 13th 2012,Wed 11-13-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-10,2012-11-11,2012-11-13,Wed ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,46,2012,2012-11-10,2012-11-16,N,Wk.46 - 13,2012-11-10 00:00:00,2012-11-16 00:00:00,2012W46 ,2012W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2012,N,2012-11-13,2011-11-13,2012-08-13,2012-05-13,2012-10-13,2012-09-13,2012-11-06,2012-10-30,0,0,0,0,0,0,0,1,11,4,46,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-02,2012-01-01,2012-10-01,2012-10-01,2012-09-29,0,0,-1,-8,-56,0,0,-2,-8,-8,41548,275,2,2,4,40,5935,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-05,02-Oct-2012,Oct 2nd 2012,Wed 10-02-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-09-29,2012-09-30,2012-10-02,Wed ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,40,2012,2012-09-29,2012-10-05,N,Wk.40 - 13,2012-09-29 00:00:00,2012-10-05 00:00:00,2012W40 ,2012W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2012,N,2012-10-02,2011-10-02,2012-07-02,2012-04-02,2012-09-02,2012-08-02,2012-09-25,2012-09-18,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-05,2012-01-01,2012-01-01,2012-02-01,2012-02-03,0,-3,-9,-42,-295,0,-3,-10,-42,-42,41309,36,36,5,3,6,5901,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-09,05-Feb-2012,Feb 5th 2012,Tue 02-05-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-03,2012-02-04,2012-02-05,Tue ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,6,2012,2012-02-03,2012-02-09,N,Wk.06 - 13,2012-02-03 00:00:00,2012-02-09 00:00:00,2012W06 ,2012W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2012,N,2012-02-05,2011-02-05,2012-11-05,2012-08-05,2012-01-05,2012-12-05,2012-01-29,2012-01-22,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-02,2012-01-01,2012-04-01,2012-06-01,2012-06-02,0,-2,-5,-25,-178,0,-2,-6,-25,-26,41426,153,63,2,1,23,5918,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-08,02-Jun-2012,Jun 2nd 2012,Sun 06-02-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-02,2012-05-27,2012-06-02,Sun ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,23,2012,2012-06-02,2012-06-08,Y,Wk.23 - 13,2012-06-02 00:00:00,2012-06-08 00:00:00,2012W23 ,2012W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2012,N,2012-06-02,2011-06-02,2012-03-02,2012-12-02,2012-05-02,2012-04-02,2012-05-26,2012-05-19,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-12,2012-01-01,2012-01-01,2012-02-01,2012-02-10,0,-3,-9,-41,-288,0,-3,-10,-41,-41,41316,43,43,12,3,7,5902,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-16,12-Feb-2012,Feb 12th 2012,Tue 02-12-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-10,2012-02-11,2012-02-12,Tue ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,7,2012,2012-02-10,2012-02-16,N,Wk.07 - 13,2012-02-10 00:00:00,2012-02-16 00:00:00,2012W07 ,2012W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2012,N,2012-02-12,2011-02-12,2012-11-12,2012-08-12,2012-01-12,2012-12-12,2012-02-05,2012-01-29,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-23,2012-01-01,2012-10-01,2012-10-01,2012-10-20,0,0,-1,-5,-35,0,0,-2,-5,-5,41569,296,23,23,4,43,5938,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-26,23-Oct-2012,Oct 23rd 2012,Wed 10-23-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-20,2012-10-21,2012-10-23,Wed ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,43,2012,2012-10-20,2012-10-26,N,Wk.43 - 13,2012-10-20 00:00:00,2012-10-26 00:00:00,2012W43 ,2012W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2012,N,2012-10-23,2011-10-23,2012-07-23,2012-04-23,2012-09-23,2012-08-23,2012-10-16,2012-10-09,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-12,2012-01-01,2012-01-01,2012-01-01,2012-01-06,0,-3,-10,-46,-319,0,-3,-11,-46,-46,41285,12,12,12,7,2,5897,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-12,12-Jan-2012,Jan 12th 2012,Sat 01-12-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-06,2012-01-07,2012-01-12,Sat ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,2,2012,2012-01-06,2012-01-12,N,Wk.02 - 13,2012-01-06 00:00:00,2012-01-12 00:00:00,2012W02 ,2012W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2012,N,2012-01-12,2011-01-12,2012-10-12,2012-07-12,2012-12-12,2012-11-12,2012-01-05,2012-12-29,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-04,2012-01-01,2012-04-01,2012-04-01,2012-03-31,0,-2,-7,-34,-237,0,-2,-8,-34,-34,41367,94,4,4,5,14,5909,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-06,04-Apr-2012,Apr 4th 2012,Thu 04-04-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-03-31,2012-04-01,2012-04-04,Thu ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,14,2012,2012-03-31,2012-04-06,N,Wk.14 - 13,2012-03-31 00:00:00,2012-04-06 00:00:00,2012W14 ,2012W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2012,N,2012-04-04,2011-04-04,2012-01-04,2012-10-04,2012-03-04,2012-02-04,2012-03-28,2012-03-21,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-17,2012-01-01,2012-04-01,2012-04-01,2012-04-14,0,-2,-7,-32,-224,0,-2,-8,-32,-32,41380,107,17,17,4,16,5911,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-20,17-Apr-2012,Apr 17th 2012,Wed 04-17-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-14,2012-04-15,2012-04-17,Wed ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,16,2012,2012-04-14,2012-04-20,N,Wk.16 - 13,2012-04-14 00:00:00,2012-04-20 00:00:00,2012W16 ,2012W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2012,N,2012-04-17,2011-04-17,2012-01-17,2012-10-17,2012-03-17,2012-02-17,2012-04-10,2012-04-03,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-21,2012-01-01,2012-04-01,2012-06-01,2012-06-16,0,-2,-5,-23,-159,0,-2,-6,-23,-23,41445,172,82,21,6,25,5920,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-22,21-Jun-2012,Jun 21st 2012,Fri 06-21-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-16,2012-06-17,2012-06-21,Fri ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,25,2012,2012-06-16,2012-06-22,N,Wk.25 - 13,2012-06-16 00:00:00,2012-06-22 00:00:00,2012W25 ,2012W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2012,N,2012-06-21,2011-06-21,2012-03-21,2012-12-21,2012-05-21,2012-04-21,2012-06-14,2012-06-07,0,0,0,0,0,0,0,0,6,2,25,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-15,2012-01-01,2012-10-01,2012-10-01,2012-10-13,0,0,-1,-6,-43,0,0,-2,-6,-6,41561,288,15,15,3,42,5937,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-19,15-Oct-2012,Oct 15th 2012,Tue 10-15-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-13,2012-10-14,2012-10-15,Tue ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,42,2012,2012-10-13,2012-10-19,N,Wk.42 - 13,2012-10-13 00:00:00,2012-10-19 00:00:00,2012W42 ,2012W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2012,N,2012-10-15,2011-10-15,2012-07-15,2012-04-15,2012-09-15,2012-08-15,2012-10-08,2012-10-01,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-01,2012-01-01,2012-07-01,2012-07-01,2012-06-30,0,-1,-4,-21,-149,0,-1,-5,-21,-21,41455,182,1,1,2,27,5922,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-06,01-Jul-2012,Jul 1st 2012,Mon 07-01-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-06-30,2012-07-01,2012-07-01,Mon ,2012M07,Jul-2012,Y,2012M07 ,Y,Year 2012 - Quarter 03,2012Q03 ,Y,27,2012,2012-06-30,2012-07-06,N,Wk.27 - 13,2012-06-30 00:00:00,2012-07-06 00:00:00,2012W27 ,2012W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2012,N,2012-07-01,2011-07-01,2012-04-01,2012-01-01,2012-06-01,2012-05-01,2012-06-24,2012-06-17,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-05,2012-01-01,2012-07-01,2012-07-01,2012-06-30,0,-1,-4,-21,-145,0,-1,-5,-21,-21,41459,186,5,5,6,27,5922,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-06,05-Jul-2012,Jul 5th 2012,Fri 07-05-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-06-30,2012-07-01,2012-07-05,Fri ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,27,2012,2012-06-30,2012-07-06,N,Wk.27 - 13,2012-06-30 00:00:00,2012-07-06 00:00:00,2012W27 ,2012W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2012,N,2012-07-05,2011-07-05,2012-04-05,2012-01-05,2012-06-05,2012-05-05,2012-06-28,2012-06-21,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-25,2012-01-01,2012-07-01,2012-07-01,2012-07-21,0,-1,-4,-18,-125,0,-1,-5,-18,-18,41479,206,25,25,5,30,5925,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-27,25-Jul-2012,Jul 25th 2012,Thu 07-25-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-21,2012-07-22,2012-07-25,Thu ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,30,2012,2012-07-21,2012-07-27,N,Wk.30 - 13,2012-07-21 00:00:00,2012-07-27 00:00:00,2012W30 ,2012W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2012,N,2012-07-25,2011-07-25,2012-04-25,2012-01-25,2012-06-25,2012-05-25,2012-07-18,2012-07-11,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-13,2012-01-01,2012-07-01,2012-09-01,2012-09-08,0,-1,-2,-11,-75,0,-1,-3,-11,-11,41529,256,75,13,6,37,5932,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-14,13-Sep-2012,Sep 13th 2012,Fri 09-13-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-08,2012-09-09,2012-09-13,Fri ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,37,2012,2012-09-08,2012-09-14,N,Wk.37 - 13,2012-09-08 00:00:00,2012-09-14 00:00:00,2012W37 ,2012W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2012,N,2012-09-13,2011-09-13,2012-06-13,2012-03-13,2012-08-13,2012-07-13,2012-09-06,2012-08-30,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-23,2012-01-01,2012-07-01,2012-09-01,2012-09-22,0,-1,-2,-9,-65,0,-1,-3,-9,-9,41539,266,85,23,2,39,5934,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-28,23-Sep-2012,Sep 23rd 2012,Mon 09-23-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-22,2012-09-23,2012-09-23,Mon ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,39,2012,2012-09-22,2012-09-28,N,Wk.39 - 13,2012-09-22 00:00:00,2012-09-28 00:00:00,2012W39 ,2012W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2012,N,2012-09-23,2011-09-23,2012-06-23,2012-03-23,2012-08-23,2012-07-23,2012-09-16,2012-09-09,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-24,2012-01-01,2012-01-01,2012-03-01,2012-03-24,0,-3,-8,-35,-248,0,-3,-9,-35,-36,41356,83,83,24,1,13,5908,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-30,24-Mar-2012,Mar 24th 2012,Sun 03-24-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-24,2012-03-18,2012-03-24,Sun ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,13,2012,2012-03-24,2012-03-30,Y,Wk.13 - 13,2012-03-24 00:00:00,2012-03-30 00:00:00,2012W13 ,2012W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2012,N,2012-03-24,2011-03-24,2012-12-24,2012-09-24,2012-02-24,2012-01-24,2012-03-17,2012-03-10,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-15,2012-01-01,2012-01-01,2012-01-01,2012-01-13,0,-3,-10,-45,-316,0,-3,-11,-45,-45,41288,15,15,15,3,3,5898,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-19,15-Jan-2012,Jan 15th 2012,Tue 01-15-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-13,2012-01-14,2012-01-15,Tue ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,3,2012,2012-01-13,2012-01-19,N,Wk.03 - 13,2012-01-13 00:00:00,2012-01-19 00:00:00,2012W03 ,2012W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2012,N,2012-01-15,2011-01-15,2012-10-15,2012-07-15,2012-12-15,2012-11-15,2012-01-08,2012-01-01,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-07,2012-01-01,2012-10-01,2012-11-01,2012-11-03,0,0,0,-3,-20,0,0,-1,-3,-3,41584,311,38,7,5,45,5940,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-09,07-Nov-2012,Nov 7th 2012,Thu 11-07-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-03,2012-11-04,2012-11-07,Thu ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,45,2012,2012-11-03,2012-11-09,N,Wk.45 - 13,2012-11-03 00:00:00,2012-11-09 00:00:00,2012W45 ,2012W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2012,N,2012-11-07,2011-11-07,2012-08-07,2012-05-07,2012-10-07,2012-09-07,2012-10-31,2012-10-24,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-31,2012-01-01,2012-07-01,2012-08-01,2012-08-25,0,-1,-3,-13,-88,0,-1,-3,-13,-13,41516,243,62,31,7,35,5930,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-31,31-Aug-2012,Aug 31st 2012,Sat 08-31-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-08-25,2012-08-25,2012-08-26,2012-08-31,Sat ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,35,2012,2012-08-25,2012-08-31,N,Wk.35 - 13,2012-08-25 00:00:00,2012-08-31 00:00:00,2012W35 ,2012W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2012,N,2012-08-31,2011-08-31,2012-05-31,2012-02-28,2012-07-31,2012-06-30,2012-08-24,2012-08-17,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-20,2012-01-01,2012-10-01,2012-12-01,2012-12-15,0,0,1,3,23,0,0,0,3,3,41627,354,81,20,6,51,5946,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-21,20-Dec-2012,Dec 20th 2012,Fri 12-20-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-15,2012-12-16,2012-12-20,Fri ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,51,2012,2012-12-15,2012-12-21,N,Wk.51 - 13,2012-12-15 00:00:00,2012-12-21 00:00:00,2012W51 ,2012W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2012,N,2012-12-20,2011-12-20,2012-09-20,2012-06-20,2012-11-20,2012-10-20,2012-12-13,2012-12-06,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-11,2012-01-01,2012-04-01,2012-06-01,2012-06-09,0,-2,-5,-24,-169,0,-2,-6,-24,-24,41435,162,72,11,3,24,5919,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-15,11-Jun-2012,Jun 11th 2012,Tue 06-11-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-09,2012-06-10,2012-06-11,Tue ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,24,2012,2012-06-09,2012-06-15,N,Wk.24 - 13,2012-06-09 00:00:00,2012-06-15 00:00:00,2012W24 ,2012W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2012,N,2012-06-11,2011-06-11,2012-03-11,2012-12-11,2012-05-11,2012-04-11,2012-06-04,2012-05-28,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-01,2012-01-01,2012-07-01,2012-08-01,2012-07-28,0,-1,-3,-17,-118,0,-1,-4,-17,-17,41486,213,32,1,5,31,5926,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-03,01-Aug-2012,Aug 1st 2012,Thu 08-01-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-07-28,2012-07-29,2012-08-01,Thu ,2012M08,Aug-2012,Y,2012M08 ,Y,Year 2012 - Quarter 03,2012Q03 ,N,31,2012,2012-07-28,2012-08-03,N,Wk.31 - 13,2012-07-28 00:00:00,2012-08-03 00:00:00,2012W31 ,2012W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2012,N,2012-08-01,2011-08-01,2012-05-01,2012-02-01,2012-07-01,2012-06-01,2012-07-25,2012-07-18,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-26,2012-01-01,2012-07-01,2012-09-01,2012-09-22,0,-1,-2,-9,-62,0,-1,-3,-9,-9,41542,269,88,26,5,39,5934,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-28,26-Sep-2012,Sep 26th 2012,Thu 09-26-13,1,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-22,2012-09-23,2012-09-26,Thu ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,39,2012,2012-09-22,2012-09-28,N,Wk.39 - 13,2012-09-22 00:00:00,2012-09-28 00:00:00,2012W39 ,2012W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2012,N,2012-09-26,2011-09-26,2012-06-26,2012-03-26,2012-08-26,2012-07-26,2012-09-19,2012-09-12,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-16,2012-01-01,2012-01-01,2012-02-01,2012-02-10,0,-3,-9,-41,-284,0,-3,-10,-41,-41,41320,47,47,16,7,7,5902,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-16,16-Feb-2012,Feb 16th 2012,Sat 02-16-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-10,2012-02-11,2012-02-16,Sat ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,7,2012,2012-02-10,2012-02-16,N,Wk.07 - 13,2012-02-10 00:00:00,2012-02-16 00:00:00,2012W07 ,2012W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2012,N,2012-02-16,2011-02-16,2012-11-16,2012-08-16,2012-01-16,2012-12-16,2012-02-09,2012-02-02,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-13,2012-01-01,2012-01-01,2012-01-01,2012-01-13,0,-3,-10,-45,-318,0,-3,-11,-45,-46,41286,13,13,13,1,3,5898,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-19,13-Jan-2012,Jan 13th 2012,Sun 01-13-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-13,2012-01-07,2012-01-13,Sun ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,3,2012,2012-01-13,2012-01-19,Y,Wk.03 - 13,2012-01-13 00:00:00,2012-01-19 00:00:00,2012W03 ,2012W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2012,N,2012-01-13,2011-01-13,2012-10-13,2012-07-13,2012-12-13,2012-11-13,2012-01-06,2012-12-30,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-08,2012-01-01,2012-04-01,2012-06-01,2012-06-02,0,-2,-5,-25,-172,0,-2,-6,-25,-25,41432,159,69,8,7,23,5918,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-08,08-Jun-2012,Jun 8th 2012,Sat 06-08-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-02,2012-06-03,2012-06-08,Sat ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,23,2012,2012-06-02,2012-06-08,N,Wk.23 - 13,2012-06-02 00:00:00,2012-06-08 00:00:00,2012W23 ,2012W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2012,N,2012-06-08,2011-06-08,2012-03-08,2012-12-08,2012-05-08,2012-04-08,2012-06-01,2012-05-25,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-30,2012-01-01,2012-01-01,2012-01-01,2012-01-27,0,-3,-10,-43,-301,0,-3,-10,-43,-43,41303,30,30,30,4,5,5900,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-02-02,30-Jan-2012,Jan 30th 2012,Wed 01-30-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-01-27,2012-01-27,2012-01-28,2012-01-30,Wed ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,5,2012,2012-01-27,2012-02-02,N,Wk.05 - 13,2012-01-27 00:00:00,2012-02-02 00:00:00,2012W05 ,2012W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2012,N,2012-01-30,2011-01-30,2012-10-30,2012-07-30,2012-12-30,2012-11-30,2012-01-23,2012-01-16,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-13,2012-01-01,2012-04-01,2012-06-01,2012-06-09,0,-2,-5,-24,-167,0,-2,-6,-24,-24,41437,164,74,13,5,24,5919,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-15,13-Jun-2012,Jun 13th 2012,Thu 06-13-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-09,2012-06-10,2012-06-13,Thu ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,24,2012,2012-06-09,2012-06-15,N,Wk.24 - 13,2012-06-09 00:00:00,2012-06-15 00:00:00,2012W24 ,2012W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2012,N,2012-06-13,2011-06-13,2012-03-13,2012-12-13,2012-05-13,2012-04-13,2012-06-06,2012-05-30,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-06,2012-01-01,2012-01-01,2012-03-01,2012-03-03,0,-3,-8,-38,-266,0,-3,-9,-38,-38,41338,65,65,6,4,10,5905,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-09,06-Mar-2012,Mar 6th 2012,Wed 03-06-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-03,2012-03-04,2012-03-06,Wed ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,10,2012,2012-03-03,2012-03-09,N,Wk.10 - 13,2012-03-03 00:00:00,2012-03-09 00:00:00,2012W10 ,2012W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2012,N,2012-03-06,2011-03-06,2012-12-06,2012-09-06,2012-02-06,2012-01-06,2012-02-27,2012-02-20,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-15,2012-01-01,2012-01-01,2012-03-01,2012-03-10,0,-3,-8,-37,-257,0,-3,-9,-37,-37,41347,74,74,15,6,11,5906,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-16,15-Mar-2012,Mar 15th 2012,Fri 03-15-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-10,2012-03-11,2012-03-15,Fri ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,11,2012,2012-03-10,2012-03-16,N,Wk.11 - 13,2012-03-10 00:00:00,2012-03-16 00:00:00,2012W11 ,2012W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2012,N,2012-03-15,2011-03-15,2012-12-15,2012-09-15,2012-02-15,2012-01-15,2012-03-08,2012-03-01,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-15,2012-01-01,2012-10-01,2012-12-01,2012-12-15,0,0,1,3,18,0,0,0,3,2,41622,349,76,15,1,51,5946,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-21,15-Dec-2012,Dec 15th 2012,Sun 12-15-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-15,2012-12-09,2012-12-15,Sun ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,51,2012,2012-12-15,2012-12-21,Y,Wk.51 - 13,2012-12-15 00:00:00,2012-12-21 00:00:00,2012W51 ,2012W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2012,N,2012-12-15,2011-12-15,2012-09-15,2012-06-15,2012-11-15,2012-10-15,2012-12-08,2012-12-01,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-19,2012-01-01,2012-04-01,2012-04-01,2012-04-14,0,-2,-7,-32,-222,0,-2,-8,-32,-32,41382,109,19,19,6,16,5911,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-20,19-Apr-2012,Apr 19th 2012,Fri 04-19-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-14,2012-04-15,2012-04-19,Fri ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,16,2012,2012-04-14,2012-04-20,N,Wk.16 - 13,2012-04-14 00:00:00,2012-04-20 00:00:00,2012W16 ,2012W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2012,N,2012-04-19,2011-04-19,2012-01-19,2012-10-19,2012-03-19,2012-02-19,2012-04-12,2012-04-05,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-14,2012-01-01,2012-10-01,2012-12-01,2012-12-08,0,0,1,2,17,0,0,0,2,2,41621,348,75,14,7,50,5945,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-14,14-Dec-2012,Dec 14th 2012,Sat 12-14-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-08,2012-12-09,2012-12-14,Sat ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,50,2012,2012-12-08,2012-12-14,N,Wk.50 - 13,2012-12-08 00:00:00,2012-12-14 00:00:00,2012W50 ,2012W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2012,N,2012-12-14,2011-12-14,2012-09-14,2012-06-14,2012-11-14,2012-10-14,2012-12-07,2012-11-30,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-28,2012-01-01,2012-01-01,2012-02-01,2012-02-24,0,-3,-9,-39,-272,0,-3,-9,-39,-39,41332,59,59,28,5,9,5904,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-03-02,28-Feb-2012,Feb 28th 2012,Thu 02-28-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-02-24,2012-02-24,2012-02-25,2012-02-28,Thu ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,9,2012,2012-02-24,2012-03-02,N,Wk.09 - 13,2012-02-24 00:00:00,2012-03-02 00:00:00,2012W09 ,2012W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2012,N,2012-02-28,2011-02-28,2012-11-28,2012-08-28,2012-01-28,2012-12-28,2012-02-21,2012-02-14,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-26,2012-01-01,2012-01-01,2012-02-01,2012-02-24,0,-3,-9,-39,-274,0,-3,-9,-39,-39,41330,57,57,26,3,9,5904,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-03-02,26-Feb-2012,Feb 26th 2012,Tue 02-26-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-02-24,2012-02-24,2012-02-25,2012-02-26,Tue ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,9,2012,2012-02-24,2012-03-02,N,Wk.09 - 13,2012-02-24 00:00:00,2012-03-02 00:00:00,2012W09 ,2012W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2012,N,2012-02-26,2011-02-26,2012-11-26,2012-08-26,2012-01-26,2012-12-26,2012-02-19,2012-02-12,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-14,2012-01-01,2012-07-01,2012-08-01,2012-08-11,0,-1,-3,-15,-105,0,-1,-4,-15,-15,41499,226,45,14,4,33,5928,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-17,14-Aug-2012,Aug 14th 2012,Wed 08-14-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-11,2012-08-12,2012-08-14,Wed ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,33,2012,2012-08-11,2012-08-17,N,Wk.33 - 13,2012-08-11 00:00:00,2012-08-17 00:00:00,2012W33 ,2012W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2012,N,2012-08-14,2011-08-14,2012-05-14,2012-02-14,2012-07-14,2012-06-14,2012-08-07,2012-07-31,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-23,2012-01-01,2012-04-01,2012-06-01,2012-06-23,0,-2,-5,-22,-157,0,-2,-6,-22,-23,41447,174,84,23,1,26,5921,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-29,23-Jun-2012,Jun 23rd 2012,Sun 06-23-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-23,2012-06-17,2012-06-23,Sun ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,26,2012,2012-06-23,2012-06-29,Y,Wk.26 - 13,2012-06-23 00:00:00,2012-06-29 00:00:00,2012W26 ,2012W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2012,N,2012-06-23,2011-06-23,2012-03-23,2012-12-23,2012-05-23,2012-04-23,2012-06-16,2012-06-09,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-07,2012-01-01,2012-04-01,2012-06-01,2012-06-02,0,-2,-5,-25,-173,0,-2,-6,-25,-25,41431,158,68,7,6,23,5918,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-08,07-Jun-2012,Jun 7th 2012,Fri 06-07-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-02,2012-06-03,2012-06-07,Fri ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,23,2012,2012-06-02,2012-06-08,N,Wk.23 - 13,2012-06-02 00:00:00,2012-06-08 00:00:00,2012W23 ,2012W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2012,N,2012-06-07,2011-06-07,2012-03-07,2012-12-07,2012-05-07,2012-04-07,2012-05-31,2012-05-24,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-08,2012-01-01,2012-10-01,2012-10-01,2012-10-06,0,0,-1,-7,-50,0,0,-2,-7,-7,41554,281,8,8,3,41,5936,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-12,08-Oct-2012,Oct 8th 2012,Tue 10-08-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-06,2012-10-07,2012-10-08,Tue ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,41,2012,2012-10-06,2012-10-12,N,Wk.41 - 13,2012-10-06 00:00:00,2012-10-12 00:00:00,2012W41 ,2012W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2012,N,2012-10-08,2011-10-08,2012-07-08,2012-04-08,2012-09-08,2012-08-08,2012-10-01,2012-09-24,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-12,2012-01-01,2012-10-01,2012-11-01,2012-11-10,0,0,0,-2,-15,0,0,-1,-2,-2,41589,316,43,12,3,46,5941,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-16,12-Nov-2012,Nov 12th 2012,Tue 11-12-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-10,2012-11-11,2012-11-12,Tue ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,46,2012,2012-11-10,2012-11-16,N,Wk.46 - 13,2012-11-10 00:00:00,2012-11-16 00:00:00,2012W46 ,2012W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2012,N,2012-11-12,2011-11-12,2012-08-12,2012-05-12,2012-10-12,2012-09-12,2012-11-05,2012-10-29,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-22,2012-01-01,2012-04-01,2012-04-01,2012-04-21,0,-2,-7,-31,-219,0,-2,-8,-31,-31,41385,112,22,22,2,17,5912,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-27,22-Apr-2012,Apr 22nd 2012,Mon 04-22-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-21,2012-04-22,2012-04-22,Mon ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,17,2012,2012-04-21,2012-04-27,N,Wk.17 - 13,2012-04-21 00:00:00,2012-04-27 00:00:00,2012W17 ,2012W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2012,N,2012-04-22,2011-04-22,2012-01-22,2012-10-22,2012-03-22,2012-02-22,2012-04-15,2012-04-08,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-31,2012-01-01,2012-10-01,2012-10-01,2012-10-27,0,0,-1,-4,-27,0,0,-1,-4,-4,41577,304,31,31,5,44,5939,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-11-02,31-Oct-2012,Oct 31st 2012,Thu 10-31-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-10-27,2012-10-27,2012-10-28,2012-10-31,Thu ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,44,2012,2012-10-27,2012-11-02,N,Wk.44 - 13,2012-10-27 00:00:00,2012-11-02 00:00:00,2012W44 ,2012W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2012,N,2012-10-31,2011-10-31,2012-07-31,2012-04-30,2012-09-30,2012-08-31,2012-10-24,2012-10-17,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-07,2012-01-01,2012-01-01,2012-01-01,2012-01-06,0,-3,-10,-46,-324,0,-3,-11,-46,-46,41280,7,7,7,2,2,5897,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-12,07-Jan-2012,Jan 7th 2012,Mon 01-07-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-06,2012-01-07,2012-01-07,Mon ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,2,2012,2012-01-06,2012-01-12,N,Wk.02 - 13,2012-01-06 00:00:00,2012-01-12 00:00:00,2012W02 ,2012W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2012,N,2012-01-07,2011-01-07,2012-10-07,2012-07-07,2012-12-07,2012-11-07,2012-12-31,2012-12-24,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-25,2012-01-01,2012-10-01,2012-12-01,2012-12-22,0,0,1,4,28,0,0,0,4,4,41632,359,86,25,4,52,5947,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-28,25-Dec-2012,Dec 25th 2012,Wed 12-25-13,0,0,0,0,2012-12-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-22,2012-12-23,2012-12-25,Wed ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,52,2012,2012-12-22,2012-12-28,N,Wk.52 - 13,2012-12-22 00:00:00,2012-12-28 00:00:00,2012W52 ,2012W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2012,N,2012-12-25,2011-12-25,2012-09-25,2012-06-25,2012-11-25,2012-10-25,2012-12-18,2012-12-11,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-10,2012-01-01,2012-10-01,2012-12-01,2012-12-08,0,0,1,2,13,0,0,0,2,2,41617,344,71,10,3,50,5945,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-14,10-Dec-2012,Dec 10th 2012,Tue 12-10-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-08,2012-12-09,2012-12-10,Tue ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,50,2012,2012-12-08,2012-12-14,N,Wk.50 - 13,2012-12-08 00:00:00,2012-12-14 00:00:00,2012W50 ,2012W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2012,N,2012-12-10,2011-12-10,2012-09-10,2012-06-10,2012-11-10,2012-10-10,2012-12-03,2012-11-26,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-29,2012-01-01,2012-04-01,2012-06-01,2012-06-23,0,-2,-5,-22,-151,0,-2,-6,-22,-22,41453,180,90,29,7,26,5921,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-29,29-Jun-2012,Jun 29th 2012,Sat 06-29-13,1,0,0,0,2012-06-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-23,2012-06-24,2012-06-29,Sat ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,26,2012,2012-06-23,2012-06-29,N,Wk.26 - 13,2012-06-23 00:00:00,2012-06-29 00:00:00,2012W26 ,2012W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2012,N,2012-06-29,2011-06-29,2012-03-29,2012-12-29,2012-05-29,2012-04-29,2012-06-22,2012-06-15,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-01,2012-01-01,2012-01-01,2012-02-01,2012-01-27,0,-3,-9,-43,-299,0,-3,-10,-43,-43,41305,32,32,1,6,5,5900,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-02,01-Feb-2012,Feb 1st 2012,Fri 02-01-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-01-27,2012-01-28,2012-02-01,Fri ,2012M02,Feb-2012,Y,2012M02 ,Y,Year 2012 - Quarter 01,2012Q01 ,N,5,2012,2012-01-27,2012-02-02,N,Wk.05 - 13,2012-01-27 00:00:00,2012-02-02 00:00:00,2012W05 ,2012W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2012,N,2012-02-01,2011-02-01,2012-11-01,2012-08-01,2012-01-01,2012-12-01,2012-01-25,2012-01-18,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-30,2012-01-01,2012-10-01,2012-12-01,2012-12-29,0,0,1,5,33,1,1,1,5,5,41637,364,91,30,2,53,5948,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-31,30-Dec-2012,Dec 30th 2012,Mon 12-30-13,0,0,0,0,2012-12-21,365,92,31,3,2012-12-29,2012-12-29,2012-12-29,2012-12-29,2012-12-30,2012-12-30,Mon ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,1,2014,2012-12-29,2014-01-04,N,Wk.53 - 13,2012-12-29 00:00:00,2012-12-31 00:00:00,2012W53 ,2012W53 ,12/29/13 - 12/31/13,12/29 - 12/31,2012,N,2012-12-30,2011-12-30,2012-09-30,2012-06-30,2012-11-30,2012-10-30,2012-12-23,2012-12-16,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-13,2012-01-01,2012-01-01,2012-02-01,2012-02-10,0,-3,-9,-41,-287,0,-3,-10,-41,-41,41317,44,44,13,4,7,5902,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-16,13-Feb-2012,Feb 13th 2012,Wed 02-13-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-10,2012-02-11,2012-02-13,Wed ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,7,2012,2012-02-10,2012-02-16,N,Wk.07 - 13,2012-02-10 00:00:00,2012-02-16 00:00:00,2012W07 ,2012W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2012,N,2012-02-13,2011-02-13,2012-11-13,2012-08-13,2012-01-13,2012-12-13,2012-02-06,2012-01-30,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-29,2012-01-01,2012-10-01,2012-11-01,2012-11-24,0,0,0,0,2,0,0,0,0,0,41606,333,60,29,6,48,5943,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-30,29-Nov-2012,Nov 29th 2012,Fri 11-29-13,0,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-11-24,2012-11-24,2012-11-25,2012-11-29,Fri ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,48,2012,2012-11-24,2012-11-30,N,Wk.48 - 13,2012-11-24 00:00:00,2012-11-30 00:00:00,2012W48 ,2012W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2012,N,2012-11-29,2011-11-29,2012-08-29,2012-05-29,2012-10-29,2012-09-29,2012-11-22,2012-11-15,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-09,2012-01-01,2012-10-01,2012-10-01,2012-10-06,0,0,-1,-7,-49,0,0,-2,-7,-7,41555,282,9,9,4,41,5936,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-12,09-Oct-2012,Oct 9th 2012,Wed 10-09-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-06,2012-10-07,2012-10-09,Wed ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,41,2012,2012-10-06,2012-10-12,N,Wk.41 - 13,2012-10-06 00:00:00,2012-10-12 00:00:00,2012W41 ,2012W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2012,N,2012-10-09,2011-10-09,2012-07-09,2012-04-09,2012-09-09,2012-08-09,2012-10-02,2012-09-25,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-09,2012-01-01,2012-04-01,2012-06-01,2012-06-09,0,-2,-5,-24,-171,0,-2,-6,-24,-25,41433,160,70,9,1,24,5919,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-15,09-Jun-2012,Jun 9th 2012,Sun 06-09-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-09,2012-06-03,2012-06-09,Sun ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,24,2012,2012-06-09,2012-06-15,Y,Wk.24 - 13,2012-06-09 00:00:00,2012-06-15 00:00:00,2012W24 ,2012W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2012,N,2012-06-09,2011-06-09,2012-03-09,2012-12-09,2012-05-09,2012-04-09,2012-06-02,2012-05-26,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-10,2012-01-01,2012-10-01,2012-10-01,2012-10-06,0,0,-1,-7,-48,0,0,-2,-7,-7,41556,283,10,10,5,41,5936,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-12,10-Oct-2012,Oct 10th 2012,Thu 10-10-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-06,2012-10-07,2012-10-10,Thu ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,41,2012,2012-10-06,2012-10-12,N,Wk.41 - 13,2012-10-06 00:00:00,2012-10-12 00:00:00,2012W41 ,2012W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2012,N,2012-10-10,2011-10-10,2012-07-10,2012-04-10,2012-09-10,2012-08-10,2012-10-03,2012-09-26,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-28,2012-01-01,2012-10-01,2012-11-01,2012-11-24,0,0,0,0,1,0,0,0,0,0,41605,332,59,28,5,48,5943,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-30,28-Nov-2012,Nov 28th 2012,Thu 11-28-13,0,0,0,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-11-24,2012-11-24,2012-11-25,2012-11-28,Thu ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,48,2012,2012-11-24,2012-11-30,N,Wk.48 - 13,2012-11-24 00:00:00,2012-11-30 00:00:00,2012W48 ,2012W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2012,N,2012-11-28,2011-11-28,2012-08-28,2012-05-28,2012-10-28,2012-09-28,2012-11-21,2012-11-14,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-31,2012-01-01,2012-04-01,2012-05-01,2012-05-26,0,-2,-6,-26,-180,0,-2,-6,-26,-26,41424,151,61,31,6,22,5917,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-06-01,31-May-2012,May 31st 2012,Fri 05-31-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-05-26,2012-05-26,2012-05-27,2012-05-31,Fri ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,22,2012,2012-05-26,2012-06-01,N,Wk.22 - 13,2012-05-26 00:00:00,2012-06-01 00:00:00,2012W22 ,2012W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2012,N,2012-05-31,2011-05-31,2012-02-28,2012-11-30,2012-04-30,2012-03-31,2012-05-24,2012-05-17,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-09-15,2012-01-01,2012-07-01,2012-09-01,2012-09-15,0,-1,-2,-10,-73,0,-1,-3,-10,-11,41531,258,77,15,1,38,5933,3,9,1365,3,455,114,2012-12-31,2012-09-30,2012-09-30,2012-09-21,15-Sep-2012,Sep 15th 2012,Sun 09-15-13,1,0,0,0,2012-06-21,365,92,30,7,2012-12-30,2012-06-30,2012-08-25,2012-09-15,2012-09-09,2012-09-15,Sun ,2012M09,Sep-2012,N,2012M09 ,N,Year 2012 - Quarter 03,2012Q03 ,N,38,2012,2012-09-15,2012-09-21,Y,Wk.38 - 13,2012-09-15 00:00:00,2012-09-21 00:00:00,2012W38 ,2012W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2012,N,2012-09-15,2011-09-15,2012-06-15,2012-03-15,2012-08-15,2012-07-15,2012-09-08,2012-09-01,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-31,2012-01-01,2012-07-01,2012-07-01,2012-07-28,0,-1,-4,-17,-119,0,-1,-4,-17,-17,41485,212,31,31,4,31,5926,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-08-03,31-Jul-2012,Jul 31st 2012,Wed 07-31-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-07-28,2012-07-29,2012-07-31,Wed ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,31,2012,2012-07-28,2012-08-03,N,Wk.31 - 13,2012-07-28 00:00:00,2012-08-03 00:00:00,2012W31 ,2012W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2012,N,2012-07-31,2011-07-31,2012-04-30,2012-01-31,2012-06-30,2012-05-31,2012-07-24,2012-07-17,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-17,2012-01-01,2012-10-01,2012-11-01,2012-11-17,0,0,0,-1,-10,0,0,-1,-1,-2,41594,321,48,17,1,47,5942,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-23,17-Nov-2012,Nov 17th 2012,Sun 11-17-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-17,2012-11-11,2012-11-17,Sun ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,47,2012,2012-11-17,2012-11-23,Y,Wk.47 - 13,2012-11-17 00:00:00,2012-11-23 00:00:00,2012W47 ,2012W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2012,N,2012-11-17,2011-11-17,2012-08-17,2012-05-17,2012-10-17,2012-09-17,2012-11-10,2012-11-03,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-18,2012-01-01,2012-01-01,2012-01-01,2012-01-13,0,-3,-10,-45,-313,0,-3,-11,-45,-45,41291,18,18,18,6,3,5898,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-19,18-Jan-2012,Jan 18th 2012,Fri 01-18-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-13,2012-01-14,2012-01-18,Fri ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,3,2012,2012-01-13,2012-01-19,N,Wk.03 - 13,2012-01-13 00:00:00,2012-01-19 00:00:00,2012W03 ,2012W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2012,N,2012-01-18,2011-01-18,2012-10-18,2012-07-18,2012-12-18,2012-11-18,2012-01-11,2012-01-04,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-26,2012-01-01,2012-04-01,2012-05-01,2012-05-26,0,-2,-6,-26,-185,0,-2,-6,-26,-27,41419,146,56,26,1,22,5917,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-06-01,26-May-2012,May 26th 2012,Sun 05-26-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-05-26,2012-05-26,2012-05-20,2012-05-26,Sun ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,22,2012,2012-05-26,2012-06-01,Y,Wk.22 - 13,2012-05-26 00:00:00,2012-06-01 00:00:00,2012W22 ,2012W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2012,N,2012-05-26,2011-05-26,2012-02-26,2012-11-26,2012-04-26,2012-03-26,2012-05-19,2012-05-12,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-06,2012-01-01,2012-04-01,2012-04-01,2012-03-31,0,-2,-7,-34,-235,0,-2,-8,-34,-34,41369,96,6,6,7,14,5909,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-06,06-Apr-2012,Apr 6th 2012,Sat 04-06-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-03-31,2012-04-01,2012-04-06,Sat ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,14,2012,2012-03-31,2012-04-06,N,Wk.14 - 13,2012-03-31 00:00:00,2012-04-06 00:00:00,2012W14 ,2012W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2012,N,2012-04-06,2011-04-06,2012-01-06,2012-10-06,2012-03-06,2012-02-06,2012-03-30,2012-03-23,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-27,2012-01-01,2012-10-01,2012-11-01,2012-11-24,0,0,0,0,0,0,0,0,0,0,41604,331,58,27,4,48,5943,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-30,27-Nov-2012,Nov 27th 2012,Wed 11-27-13,1,1,1,1,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-11-24,2012-11-24,2012-11-25,2012-11-27,Wed ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,48,2012,2012-11-24,2012-11-30,N,Wk.48 - 13,2012-11-24 00:00:00,2012-11-30 00:00:00,2012W48 ,2012W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2012,N,2012-11-27,2011-11-27,2012-08-27,2012-05-27,2012-10-27,2012-09-27,2012-11-20,2012-11-13,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-10,2012-01-01,2012-07-01,2012-08-01,2012-08-04,0,-1,-3,-16,-109,0,-1,-4,-16,-16,41495,222,41,10,7,32,5927,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-10,10-Aug-2012,Aug 10th 2012,Sat 08-10-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-04,2012-08-05,2012-08-10,Sat ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,32,2012,2012-08-04,2012-08-10,N,Wk.32 - 13,2012-08-04 00:00:00,2012-08-10 00:00:00,2012W32 ,2012W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2012,N,2012-08-10,2011-08-10,2012-05-10,2012-02-10,2012-07-10,2012-06-10,2012-08-03,2012-07-27,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-24,2012-01-01,2012-04-01,2012-04-01,2012-04-21,0,-2,-7,-31,-217,0,-2,-8,-31,-31,41387,114,24,24,4,17,5912,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-27,24-Apr-2012,Apr 24th 2012,Wed 04-24-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-21,2012-04-22,2012-04-24,Wed ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,17,2012,2012-04-21,2012-04-27,N,Wk.17 - 13,2012-04-21 00:00:00,2012-04-27 00:00:00,2012W17 ,2012W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2012,N,2012-04-24,2011-04-24,2012-01-24,2012-10-24,2012-03-24,2012-02-24,2012-04-17,2012-04-10,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-29,2012-01-01,2012-07-01,2012-07-01,2012-07-28,0,-1,-4,-17,-121,0,-1,-4,-17,-17,41483,210,29,29,2,31,5926,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-08-03,29-Jul-2012,Jul 29th 2012,Mon 07-29-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-07-28,2012-07-29,2012-07-29,Mon ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,31,2012,2012-07-28,2012-08-03,N,Wk.31 - 13,2012-07-28 00:00:00,2012-08-03 00:00:00,2012W31 ,2012W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2012,N,2012-07-29,2011-07-29,2012-04-29,2012-01-29,2012-06-29,2012-05-29,2012-07-22,2012-07-15,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-29,2012-01-01,2012-10-01,2012-10-01,2012-10-27,0,0,-1,-4,-29,0,0,-1,-4,-4,41575,302,29,29,3,44,5939,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-11-02,29-Oct-2012,Oct 29th 2012,Tue 10-29-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-10-27,2012-10-27,2012-10-28,2012-10-29,Tue ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,44,2012,2012-10-27,2012-11-02,N,Wk.44 - 13,2012-10-27 00:00:00,2012-11-02 00:00:00,2012W44 ,2012W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2012,N,2012-10-29,2011-10-29,2012-07-29,2012-04-29,2012-09-29,2012-08-29,2012-10-22,2012-10-15,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-17,2012-01-01,2012-07-01,2012-07-01,2012-07-14,0,-1,-4,-19,-133,0,-1,-5,-19,-19,41471,198,17,17,4,29,5924,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-20,17-Jul-2012,Jul 17th 2012,Wed 07-17-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-14,2012-07-15,2012-07-17,Wed ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,29,2012,2012-07-14,2012-07-20,N,Wk.29 - 13,2012-07-14 00:00:00,2012-07-20 00:00:00,2012W29 ,2012W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2012,N,2012-07-17,2011-07-17,2012-04-17,2012-01-17,2012-06-17,2012-05-17,2012-07-10,2012-07-03,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-22,2012-01-01,2012-10-01,2012-12-01,2012-12-22,0,0,1,4,25,0,0,0,4,3,41629,356,83,22,1,52,5947,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-28,22-Dec-2012,Dec 22nd 2012,Sun 12-22-13,0,0,0,0,2012-12-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-22,2012-12-16,2012-12-22,Sun ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,52,2012,2012-12-22,2012-12-28,Y,Wk.52 - 13,2012-12-22 00:00:00,2012-12-28 00:00:00,2012W52 ,2012W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2012,N,2012-12-22,2011-12-22,2012-09-22,2012-06-22,2012-11-22,2012-10-22,2012-12-15,2012-12-08,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-23,2012-01-01,2012-01-01,2012-03-01,2012-03-17,0,-3,-8,-36,-249,0,-3,-9,-36,-36,41355,82,82,23,7,12,5907,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-23,23-Mar-2012,Mar 23rd 2012,Sat 03-23-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-17,2012-03-18,2012-03-23,Sat ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,12,2012,2012-03-17,2012-03-23,N,Wk.12 - 13,2012-03-17 00:00:00,2012-03-23 00:00:00,2012W12 ,2012W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2012,N,2012-03-23,2011-03-23,2012-12-23,2012-09-23,2012-02-23,2012-01-23,2012-03-16,2012-03-09,0,0,0,0,0,0,0,0,3,1,12,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-11,2012-01-01,2012-10-01,2012-11-01,2012-11-10,0,0,0,-2,-16,0,0,-1,-2,-2,41588,315,42,11,2,46,5941,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-16,11-Nov-2012,Nov 11th 2012,Mon 11-11-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-10,2012-11-11,2012-11-11,Mon ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,46,2012,2012-11-10,2012-11-16,N,Wk.46 - 13,2012-11-10 00:00:00,2012-11-16 00:00:00,2012W46 ,2012W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2012,N,2012-11-11,2011-11-11,2012-08-11,2012-05-11,2012-10-11,2012-09-11,2012-11-04,2012-10-28,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-06,2012-01-01,2012-07-01,2012-08-01,2012-08-04,0,-1,-3,-16,-113,0,-1,-4,-16,-16,41491,218,37,6,3,32,5927,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-10,06-Aug-2012,Aug 6th 2012,Tue 08-06-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-04,2012-08-05,2012-08-06,Tue ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,32,2012,2012-08-04,2012-08-10,N,Wk.32 - 13,2012-08-04 00:00:00,2012-08-10 00:00:00,2012W32 ,2012W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2012,N,2012-08-06,2011-08-06,2012-05-06,2012-02-06,2012-07-06,2012-06-06,2012-07-30,2012-07-23,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-02,2012-01-01,2012-01-01,2012-02-01,2012-01-27,0,-3,-9,-43,-298,0,-3,-10,-43,-43,41306,33,33,2,7,5,5900,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-02,02-Feb-2012,Feb 2nd 2012,Sat 02-02-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-01-27,2012-01-28,2012-02-02,Sat ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,5,2012,2012-01-27,2012-02-02,N,Wk.05 - 13,2012-01-27 00:00:00,2012-02-02 00:00:00,2012W05 ,2012W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2012,N,2012-02-02,2011-02-02,2012-11-02,2012-08-02,2012-01-02,2012-12-02,2012-01-26,2012-01-19,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-22,2012-01-01,2012-01-01,2012-03-01,2012-03-17,0,-3,-8,-36,-250,0,-3,-9,-36,-36,41354,81,81,22,6,12,5907,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-23,22-Mar-2012,Mar 22nd 2012,Fri 03-22-13,1,0,0,0,2012-03-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-17,2012-03-18,2012-03-22,Fri ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,12,2012,2012-03-17,2012-03-23,N,Wk.12 - 13,2012-03-17 00:00:00,2012-03-23 00:00:00,2012W12 ,2012W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2012,N,2012-03-22,2011-03-22,2012-12-22,2012-09-22,2012-02-22,2012-01-22,2012-03-15,2012-03-08,0,0,0,0,0,0,0,0,3,1,12,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-04-28,2012-01-01,2012-04-01,2012-04-01,2012-04-28,0,-2,-7,-30,-213,0,-2,-7,-30,-31,41391,118,28,28,1,18,5913,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-05-04,28-Apr-2012,Apr 28th 2012,Sun 04-28-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-04-28,2012-04-28,2012-04-22,2012-04-28,Sun ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,18,2012,2012-04-28,2012-05-04,Y,Wk.18 - 13,2012-04-28 00:00:00,2012-05-04 00:00:00,2012W18 ,2012W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2012,N,2012-04-28,2011-04-28,2012-01-28,2012-10-28,2012-03-28,2012-02-28,2012-04-21,2012-04-14,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-04,2012-01-01,2012-01-01,2012-03-01,2012-03-03,0,-3,-8,-38,-268,0,-3,-9,-38,-38,41336,63,63,4,2,10,5905,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-09,04-Mar-2012,Mar 4th 2012,Mon 03-04-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-03,2012-03-04,2012-03-04,Mon ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,10,2012,2012-03-03,2012-03-09,N,Wk.10 - 13,2012-03-03 00:00:00,2012-03-09 00:00:00,2012W10 ,2012W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2012,N,2012-03-04,2011-03-04,2012-12-04,2012-09-04,2012-02-04,2012-01-04,2012-02-25,2012-02-18,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-12,2012-01-01,2012-07-01,2012-07-01,2012-07-07,0,-1,-4,-20,-138,0,-1,-5,-20,-20,41466,193,12,12,6,28,5923,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-13,12-Jul-2012,Jul 12th 2012,Fri 07-12-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-07,2012-07-08,2012-07-12,Fri ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,28,2012,2012-07-07,2012-07-13,N,Wk.28 - 13,2012-07-07 00:00:00,2012-07-13 00:00:00,2012W28 ,2012W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2012,N,2012-07-12,2011-07-12,2012-04-12,2012-01-12,2012-06-12,2012-05-12,2012-07-05,2012-06-28,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-05,2012-01-01,2012-01-01,2012-01-01,2012-01-01,0,-3,-10,-47,-326,0,-3,-11,-47,-47,41278,5,5,5,7,1,5896,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-05,05-Jan-2012,Jan 5th 2012,Sat 01-05-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2012-01-05,Sat ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,1,2012,2012-12-30,2012-01-05,N,Wk.01 - 13,2012-01-01 00:00:00,2012-01-05 00:00:00,2012W01 ,2012W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2012,N,2012-01-05,2011-01-05,2012-10-05,2012-07-05,2012-12-05,2012-11-05,2012-12-29,2012-12-22,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-12,2012-01-01,2012-07-01,2012-08-01,2012-08-11,0,-1,-3,-15,-107,0,-1,-4,-15,-15,41497,224,43,12,2,33,5928,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-17,12-Aug-2012,Aug 12th 2012,Mon 08-12-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-11,2012-08-12,2012-08-12,Mon ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,33,2012,2012-08-11,2012-08-17,N,Wk.33 - 13,2012-08-11 00:00:00,2012-08-17 00:00:00,2012W33 ,2012W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2012,N,2012-08-12,2011-08-12,2012-05-12,2012-02-12,2012-07-12,2012-06-12,2012-08-05,2012-07-29,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-04,2012-01-01,2012-07-01,2012-08-01,2012-08-04,0,-1,-3,-16,-115,0,-1,-4,-16,-17,41489,216,35,4,1,32,5927,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-10,04-Aug-2012,Aug 4th 2012,Sun 08-04-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-04,2012-07-29,2012-08-04,Sun ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,32,2012,2012-08-04,2012-08-10,Y,Wk.32 - 13,2012-08-04 00:00:00,2012-08-10 00:00:00,2012W32 ,2012W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2012,N,2012-08-04,2011-08-04,2012-05-04,2012-02-04,2012-07-04,2012-06-04,2012-07-28,2012-07-21,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-17,2012-01-01,2012-01-01,2012-03-01,2012-03-17,0,-3,-8,-36,-255,0,-3,-9,-36,-37,41349,76,76,17,1,12,5907,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-23,17-Mar-2012,Mar 17th 2012,Sun 03-17-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-17,2012-03-11,2012-03-17,Sun ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,12,2012,2012-03-17,2012-03-23,Y,Wk.12 - 13,2012-03-17 00:00:00,2012-03-23 00:00:00,2012W12 ,2012W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2012,N,2012-03-17,2011-03-17,2012-12-17,2012-09-17,2012-02-17,2012-01-17,2012-03-10,2012-03-03,0,0,0,0,0,0,0,0,3,1,12,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-18,2012-01-01,2012-07-01,2012-07-01,2012-07-14,0,-1,-4,-19,-132,0,-1,-5,-19,-19,41472,199,18,18,5,29,5924,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-20,18-Jul-2012,Jul 18th 2012,Thu 07-18-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-14,2012-07-15,2012-07-18,Thu ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,29,2012,2012-07-14,2012-07-20,N,Wk.29 - 13,2012-07-14 00:00:00,2012-07-20 00:00:00,2012W29 ,2012W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2012,N,2012-07-18,2011-07-18,2012-04-18,2012-01-18,2012-06-18,2012-05-18,2012-07-11,2012-07-04,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-01,2012-01-01,2012-10-01,2012-12-01,2012-12-01,0,0,1,1,4,0,0,0,1,0,41608,335,62,1,1,49,5944,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-07,01-Dec-2012,Dec 1st 2012,Sun 12-01-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-01,2012-11-25,2012-12-01,Sun ,2012M12,Dec-2012,Y,2012M12 ,Y,Year 2012 - Quarter 04,2012Q04 ,N,49,2012,2012-12-01,2012-12-07,Y,Wk.49 - 13,2012-12-01 00:00:00,2012-12-07 00:00:00,2012W49 ,2012W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2012,N,2012-12-01,2011-12-01,2012-09-01,2012-06-01,2012-11-01,2012-10-01,2012-11-24,2012-11-17,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-16,2012-01-01,2012-10-01,2012-12-01,2012-12-15,0,0,1,3,19,0,0,0,3,3,41623,350,77,16,2,51,5946,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-21,16-Dec-2012,Dec 16th 2012,Mon 12-16-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-15,2012-12-16,2012-12-16,Mon ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,51,2012,2012-12-15,2012-12-21,N,Wk.51 - 13,2012-12-15 00:00:00,2012-12-21 00:00:00,2012W51 ,2012W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2012,N,2012-12-16,2011-12-16,2012-09-16,2012-06-16,2012-11-16,2012-10-16,2012-12-09,2012-12-02,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-21,2012-01-01,2012-07-01,2012-07-01,2012-07-21,0,-1,-4,-18,-129,0,-1,-5,-18,-19,41475,202,21,21,1,30,5925,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-07-27,21-Jul-2012,Jul 21st 2012,Sun 07-21-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-06-30,2012-07-21,2012-07-15,2012-07-21,Sun ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,30,2012,2012-07-21,2012-07-27,Y,Wk.30 - 13,2012-07-21 00:00:00,2012-07-27 00:00:00,2012W30 ,2012W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2012,N,2012-07-21,2011-07-21,2012-04-21,2012-01-21,2012-06-21,2012-05-21,2012-07-14,2012-07-07,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-30,2012-01-01,2012-07-01,2012-07-01,2012-07-28,0,-1,-4,-17,-120,0,-1,-4,-17,-17,41484,211,30,30,3,31,5926,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-08-03,30-Jul-2012,Jul 30th 2012,Tue 07-30-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-07-28,2012-07-29,2012-07-30,Tue ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,31,2012,2012-07-28,2012-08-03,N,Wk.31 - 13,2012-07-28 00:00:00,2012-08-03 00:00:00,2012W31 ,2012W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2012,N,2012-07-30,2011-07-30,2012-04-30,2012-01-30,2012-06-30,2012-05-30,2012-07-23,2012-07-16,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-18,2012-01-01,2012-10-01,2012-10-01,2012-10-13,0,0,-1,-6,-40,0,0,-2,-6,-6,41564,291,18,18,6,42,5937,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-19,18-Oct-2012,Oct 18th 2012,Fri 10-18-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-13,2012-10-14,2012-10-18,Fri ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,42,2012,2012-10-13,2012-10-19,N,Wk.42 - 13,2012-10-13 00:00:00,2012-10-19 00:00:00,2012W42 ,2012W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2012,N,2012-10-18,2011-10-18,2012-07-18,2012-04-18,2012-09-18,2012-08-18,2012-10-11,2012-10-04,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-10,2012-01-01,2012-04-01,2012-06-01,2012-06-09,0,-2,-5,-24,-170,0,-2,-6,-24,-24,41434,161,71,10,2,24,5919,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-15,10-Jun-2012,Jun 10th 2012,Mon 06-10-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-09,2012-06-10,2012-06-10,Mon ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,24,2012,2012-06-09,2012-06-15,N,Wk.24 - 13,2012-06-09 00:00:00,2012-06-15 00:00:00,2012W24 ,2012W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2012,N,2012-06-10,2011-06-10,2012-03-10,2012-12-10,2012-05-10,2012-04-10,2012-06-03,2012-05-27,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-09,2012-01-01,2012-04-01,2012-05-01,2012-05-05,0,-2,-6,-29,-202,0,-2,-7,-29,-29,41402,129,39,9,5,19,5914,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-11,09-May-2012,May 9th 2012,Thu 05-09-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-05,2012-05-06,2012-05-09,Thu ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,19,2012,2012-05-05,2012-05-11,N,Wk.19 - 13,2012-05-05 00:00:00,2012-05-11 00:00:00,2012W19 ,2012W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2012,N,2012-05-09,2011-05-09,2012-02-09,2012-11-09,2012-04-09,2012-03-09,2012-05-02,2012-04-25,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-06,2012-01-01,2012-01-01,2012-02-01,2012-02-03,0,-3,-9,-42,-294,0,-3,-10,-42,-42,41310,37,37,6,4,6,5901,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-09,06-Feb-2012,Feb 6th 2012,Wed 02-06-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-03,2012-02-04,2012-02-06,Wed ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,6,2012,2012-02-03,2012-02-09,N,Wk.06 - 13,2012-02-03 00:00:00,2012-02-09 00:00:00,2012W06 ,2012W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2012,N,2012-02-06,2011-02-06,2012-11-06,2012-08-06,2012-01-06,2012-12-06,2012-01-30,2012-01-23,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-23,2012-01-01,2012-01-01,2012-02-01,2012-02-17,0,-3,-9,-40,-277,0,-3,-10,-40,-40,41327,54,54,23,7,8,5903,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-23,23-Feb-2012,Feb 23rd 2012,Sat 02-23-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-17,2012-02-18,2012-02-23,Sat ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,8,2012,2012-02-17,2012-02-23,N,Wk.08 - 13,2012-02-17 00:00:00,2012-02-23 00:00:00,2012W08 ,2012W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2012,N,2012-02-23,2011-02-23,2012-11-23,2012-08-23,2012-01-23,2012-12-23,2012-02-16,2012-02-09,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-18,2012-01-01,2012-07-01,2012-08-01,2012-08-18,0,-1,-3,-14,-101,0,-1,-4,-14,-15,41503,230,49,18,1,34,5929,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-24,18-Aug-2012,Aug 18th 2012,Sun 08-18-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-18,2012-08-12,2012-08-18,Sun ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,34,2012,2012-08-18,2012-08-24,Y,Wk.34 - 13,2012-08-18 00:00:00,2012-08-24 00:00:00,2012W34 ,2012W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2012,N,2012-08-18,2011-08-18,2012-05-18,2012-02-18,2012-07-18,2012-06-18,2012-08-11,2012-08-04,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-09,2012-01-01,2012-01-01,2012-01-01,2012-01-06,0,-3,-10,-46,-322,0,-3,-11,-46,-46,41282,9,9,9,4,2,5897,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-12,09-Jan-2012,Jan 9th 2012,Wed 01-09-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-06,2012-01-07,2012-01-09,Wed ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,2,2012,2012-01-06,2012-01-12,N,Wk.02 - 13,2012-01-06 00:00:00,2012-01-12 00:00:00,2012W02 ,2012W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2012,N,2012-01-09,2011-01-09,2012-10-09,2012-07-09,2012-12-09,2012-11-09,2012-01-02,2012-12-26,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-11,2012-01-01,2012-01-01,2012-03-01,2012-03-10,0,-3,-8,-37,-261,0,-3,-9,-37,-37,41343,70,70,11,2,11,5906,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-16,11-Mar-2012,Mar 11th 2012,Mon 03-11-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-10,2012-03-11,2012-03-11,Mon ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,11,2012,2012-03-10,2012-03-16,N,Wk.11 - 13,2012-03-10 00:00:00,2012-03-16 00:00:00,2012W11 ,2012W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2012,N,2012-03-11,2011-03-11,2012-12-11,2012-09-11,2012-02-11,2012-01-11,2012-03-04,2012-02-25,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-10-06,2012-01-01,2012-10-01,2012-10-01,2012-10-06,0,0,-1,-7,-52,0,0,-2,-7,-8,41552,279,6,6,1,41,5936,1,10,1366,4,456,114,2012-12-31,2012-12-31,2012-10-31,2012-10-12,06-Oct-2012,Oct 6th 2012,Sun 10-06-13,1,1,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-09-29,2012-10-06,2012-09-30,2012-10-06,Sun ,2012M10,Oct-2012,N,2012M10 ,N,Year 2012 - Quarter 04,2012Q04 ,N,41,2012,2012-10-06,2012-10-12,Y,Wk.41 - 13,2012-10-06 00:00:00,2012-10-12 00:00:00,2012W41 ,2012W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2012,N,2012-10-06,2011-10-06,2012-07-06,2012-04-06,2012-09-06,2012-08-06,2012-09-29,2012-09-22,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-08-02,2012-01-01,2012-07-01,2012-08-01,2012-07-28,0,-1,-3,-17,-117,0,-1,-4,-17,-17,41487,214,33,2,6,31,5926,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-03,02-Aug-2012,Aug 2nd 2012,Fri 08-02-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-07-28,2012-07-29,2012-08-02,Fri ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,31,2012,2012-07-28,2012-08-03,N,Wk.31 - 13,2012-07-28 00:00:00,2012-08-03 00:00:00,2012W31 ,2012W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2012,N,2012-08-02,2011-08-02,2012-05-02,2012-02-02,2012-07-02,2012-06-02,2012-07-26,2012-07-19,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-08,2012-01-01,2012-10-01,2012-12-01,2012-12-08,0,0,1,2,11,0,0,0,2,1,41615,342,69,8,1,50,5945,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-14,08-Dec-2012,Dec 8th 2012,Sun 12-08-13,0,0,0,0,2012-09-21,365,92,31,7,2012-12-30,2012-09-29,2012-11-24,2012-12-08,2012-12-02,2012-12-08,Sun ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,50,2012,2012-12-08,2012-12-14,Y,Wk.50 - 13,2012-12-08 00:00:00,2012-12-14 00:00:00,2012W50 ,2012W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2012,N,2012-12-08,2011-12-08,2012-09-08,2012-06-08,2012-11-08,2012-10-08,2012-12-01,2012-11-24,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-12-29,2012-01-01,2012-10-01,2012-12-01,2012-12-29,0,0,1,5,32,1,1,1,5,4,41636,363,90,29,1,53,5948,3,12,1368,4,456,114,2012-12-31,2012-12-31,2012-12-31,2012-12-31,29-Dec-2012,Dec 29th 2012,Sun 12-29-13,0,0,0,0,2012-12-21,365,92,31,3,2012-12-29,2012-12-29,2012-12-29,2012-12-29,2012-12-23,2012-12-29,Sun ,2012M12,Dec-2012,N,2012M12 ,N,Year 2012 - Quarter 04,2012Q04 ,N,1,2014,2012-12-29,2014-01-04,Y,Wk.53 - 13,2012-12-29 00:00:00,2012-12-31 00:00:00,2012W53 ,2012W53 ,12/29/13 - 12/31/13,12/29 - 12/31,2012,N,2012-12-29,2011-12-29,2012-09-29,2012-06-29,2012-11-29,2012-10-29,2012-12-22,2012-12-15,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-15,2012-01-01,2012-04-01,2012-06-01,2012-06-09,0,-2,-5,-24,-165,0,-2,-6,-24,-24,41439,166,76,15,7,24,5919,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-15,15-Jun-2012,Jun 15th 2012,Sat 06-15-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-09,2012-06-10,2012-06-15,Sat ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,24,2012,2012-06-09,2012-06-15,N,Wk.24 - 13,2012-06-09 00:00:00,2012-06-15 00:00:00,2012W24 ,2012W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2012,N,2012-06-15,2011-06-15,2012-03-15,2012-12-15,2012-05-15,2012-04-15,2012-06-08,2012-06-01,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-07,2012-01-01,2012-01-01,2012-02-01,2012-02-03,0,-3,-9,-42,-293,0,-3,-10,-42,-42,41311,38,38,7,5,6,5901,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-09,07-Feb-2012,Feb 7th 2012,Thu 02-07-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-03,2012-02-04,2012-02-07,Thu ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,6,2012,2012-02-03,2012-02-09,N,Wk.06 - 13,2012-02-03 00:00:00,2012-02-09 00:00:00,2012W06 ,2012W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2012,N,2012-02-07,2011-02-07,2012-11-07,2012-08-07,2012-01-07,2012-12-07,2012-01-31,2012-01-24,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-11-15,2012-01-01,2012-10-01,2012-11-01,2012-11-10,0,0,0,-2,-12,0,0,-1,-2,-2,41592,319,46,15,6,46,5941,2,11,1367,4,456,114,2012-12-31,2012-12-31,2012-11-30,2012-11-16,15-Nov-2012,Nov 15th 2012,Fri 11-15-13,1,1,1,0,2012-09-21,365,92,30,7,2012-12-30,2012-09-29,2012-10-27,2012-11-10,2012-11-11,2012-11-15,Fri ,2012M11,Nov-2012,N,2012M11 ,N,Year 2012 - Quarter 04,2012Q04 ,N,46,2012,2012-11-10,2012-11-16,N,Wk.46 - 13,2012-11-10 00:00:00,2012-11-16 00:00:00,2012W46 ,2012W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2012,N,2012-11-15,2011-11-15,2012-08-15,2012-05-15,2012-10-15,2012-09-15,2012-11-08,2012-11-01,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-02-11,2012-01-01,2012-01-01,2012-02-01,2012-02-10,0,-3,-9,-41,-289,0,-3,-10,-41,-41,41315,42,42,11,2,7,5902,2,2,1358,1,453,114,2012-12-31,2012-03-31,2012-02-28,2012-02-16,11-Feb-2012,Feb 11th 2012,Mon 02-11-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2012-01-27,2012-02-10,2012-02-11,2012-02-11,Mon ,2012M02,Feb-2012,N,2012M02 ,N,Year 2012 - Quarter 01,2012Q01 ,N,7,2012,2012-02-10,2012-02-16,N,Wk.07 - 13,2012-02-10 00:00:00,2012-02-16 00:00:00,2012W07 ,2012W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2012,N,2012-02-11,2011-02-11,2012-11-11,2012-08-11,2012-01-11,2012-12-11,2012-02-04,2012-01-28,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-19,2012-01-01,2012-04-01,2012-06-01,2012-06-16,0,-2,-5,-23,-161,0,-2,-6,-23,-23,41443,170,80,19,4,25,5920,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-22,19-Jun-2012,Jun 19th 2012,Wed 06-19-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-16,2012-06-17,2012-06-19,Wed ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,25,2012,2012-06-16,2012-06-22,N,Wk.25 - 13,2012-06-16 00:00:00,2012-06-22 00:00:00,2012W25 ,2012W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2012,N,2012-06-19,2011-06-19,2012-03-19,2012-12-19,2012-05-19,2012-04-19,2012-06-12,2012-06-05,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-17,2012-01-01,2012-04-01,2012-06-01,2012-06-16,0,-2,-5,-23,-163,0,-2,-6,-23,-23,41441,168,78,17,2,25,5920,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-22,17-Jun-2012,Jun 17th 2012,Mon 06-17-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-16,2012-06-17,2012-06-17,Mon ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,25,2012,2012-06-16,2012-06-22,N,Wk.25 - 13,2012-06-16 00:00:00,2012-06-22 00:00:00,2012W25 ,2012W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2012,N,2012-06-17,2011-06-17,2012-03-17,2012-12-17,2012-05-17,2012-04-17,2012-06-10,2012-06-03,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-05-10,2012-01-01,2012-04-01,2012-05-01,2012-05-05,0,-2,-6,-29,-201,0,-2,-7,-29,-29,41403,130,40,10,6,19,5914,2,5,1361,2,454,114,2012-12-31,2012-06-30,2012-05-31,2012-05-11,10-May-2012,May 10th 2012,Fri 05-10-13,1,0,0,0,2012-03-21,365,91,31,7,2012-12-30,2012-03-31,2012-04-28,2012-05-05,2012-05-06,2012-05-10,Fri ,2012M05,May-2012,N,2012M05 ,N,Year 2012 - Quarter 02,2012Q02 ,N,19,2012,2012-05-05,2012-05-11,N,Wk.19 - 13,2012-05-05 00:00:00,2012-05-11 00:00:00,2012W19 ,2012W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2012,N,2012-05-10,2011-05-10,2012-02-10,2012-11-10,2012-04-10,2012-03-10,2012-05-03,2012-04-26,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-06-16,2012-01-01,2012-04-01,2012-06-01,2012-06-16,0,-2,-5,-23,-164,0,-2,-6,-23,-24,41440,167,77,16,1,25,5920,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-22,16-Jun-2012,Jun 16th 2012,Sun 06-16-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-16,2012-06-10,2012-06-16,Sun ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,25,2012,2012-06-16,2012-06-22,Y,Wk.25 - 13,2012-06-16 00:00:00,2012-06-22 00:00:00,2012W25 ,2012W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2012,N,2012-06-16,2011-06-16,2012-03-16,2012-12-16,2012-05-16,2012-04-16,2012-06-09,2012-06-02,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-07-28,2012-01-01,2012-07-01,2012-07-01,2012-07-28,0,-1,-4,-17,-122,0,-1,-4,-17,-18,41482,209,28,28,1,31,5926,1,7,1363,3,455,114,2012-12-31,2012-09-30,2012-07-31,2012-08-03,28-Jul-2012,Jul 28th 2012,Sun 07-28-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-07-28,2012-07-22,2012-07-28,Sun ,2012M07,Jul-2012,N,2012M07 ,N,Year 2012 - Quarter 03,2012Q03 ,N,31,2012,2012-07-28,2012-08-03,Y,Wk.31 - 13,2012-07-28 00:00:00,2012-08-03 00:00:00,2012W31 ,2012W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2012,N,2012-07-28,2011-07-28,2012-04-28,2012-01-28,2012-06-28,2012-05-28,2012-07-21,2012-07-14,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-03-03,2012-01-01,2012-01-01,2012-03-01,2012-03-03,0,-3,-8,-38,-269,0,-3,-9,-38,-39,41335,62,62,3,1,10,5905,3,3,1359,1,453,114,2012-12-31,2012-03-31,2012-03-31,2012-03-09,03-Mar-2012,Mar 3rd 2012,Sun 03-03-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-02-24,2012-03-03,2012-02-25,2012-03-03,Sun ,2012M03,Mar-2012,N,2012M03 ,N,Year 2012 - Quarter 01,2012Q01 ,N,10,2012,2012-03-03,2012-03-09,Y,Wk.10 - 13,2012-03-03 00:00:00,2012-03-09 00:00:00,2012W10 ,2012W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2012,N,2012-03-03,2011-03-03,2012-12-03,2012-09-03,2012-02-03,2012-01-03,2012-02-24,2012-02-17,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2012-01-19,2012-01-01,2012-01-01,2012-01-01,2012-01-13,0,-3,-10,-45,-312,0,-3,-11,-45,-45,41292,19,19,19,7,3,5898,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-19,19-Jan-2012,Jan 19th 2012,Sat 01-19-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2012-01-13,2012-01-14,2012-01-19,Sat ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,3,2012,2012-01-13,2012-01-19,N,Wk.03 - 13,2012-01-13 00:00:00,2012-01-19 00:00:00,2012W03 ,2012W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2012,N,2012-01-19,2011-01-19,2012-10-19,2012-07-19,2012-12-19,2012-11-19,2012-01-12,2012-01-05,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X -2013-08-16,2013-01-01,2013-07-01,2013-08-01,2013-08-11,0,-1,-3,-15,-103,0,-1,-4,-15,-15,41501,228,47,16,6,33,5928,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-17,16-Aug-2013,Aug 16th 2013,Fri 08-16-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-11,2013-08-12,2013-08-16,Fri ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,33,2013,2013-08-11,2013-08-17,N,Wk.33 - 13,2013-08-11 00:00:00,2013-08-17 00:00:00,2013W33 ,2013W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2013,N,2012-08-16,2011-08-16,2013-05-16,2013-02-16,2013-07-16,2013-06-16,2013-08-09,2013-08-02,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-03,2013-01-01,2013-01-01,2013-01-01,2013-01-01,0,-3,-10,-47,-328,0,-3,-11,-47,-47,41276,3,3,3,5,1,5896,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-05,03-Jan-2013,Jan 3rd 2013,Thu 01-03-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2013-01-03,Thu ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,1,2013,2012-12-30,2013-01-05,N,Wk.01 - 13,2013-01-01 00:00:00,2013-01-05 00:00:00,2013W01 ,2013W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2013,N,2012-01-03,2011-01-03,2012-10-03,2012-07-03,2012-12-03,2012-11-03,2012-12-27,2012-12-20,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-10,2013-01-01,2013-04-01,2013-04-01,2013-04-07,0,-2,-7,-33,-231,0,-2,-8,-33,-33,41373,100,10,10,4,15,5910,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-13,10-Apr-2013,Apr 10th 2013,Wed 04-10-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-07,2013-04-08,2013-04-10,Wed ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,15,2013,2013-04-07,2013-04-13,N,Wk.15 - 13,2013-04-07 00:00:00,2013-04-13 00:00:00,2013W15 ,2013W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2013,N,2012-04-10,2011-04-10,2013-01-10,2012-10-10,2013-03-10,2013-02-10,2013-04-03,2013-03-27,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-12,2013-01-01,2013-04-01,2013-06-01,2013-06-09,0,-2,-5,-24,-168,0,-2,-6,-24,-24,41436,163,73,12,4,24,5919,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-15,12-Jun-2013,Jun 12th 2013,Wed 06-12-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-09,2013-06-10,2013-06-12,Wed ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,24,2013,2013-06-09,2013-06-15,N,Wk.24 - 13,2013-06-09 00:00:00,2013-06-15 00:00:00,2013W24 ,2013W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2013,N,2012-06-12,2011-06-12,2013-03-12,2012-12-12,2013-05-12,2013-04-12,2013-06-05,2013-05-29,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-27,2013-01-01,2013-04-01,2013-04-01,2013-04-21,0,-2,-7,-31,-214,0,-2,-8,-31,-31,41390,117,27,27,7,17,5912,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-27,27-Apr-2013,Apr 27th 2013,Sat 04-27-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-21,2013-04-22,2013-04-27,Sat ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,17,2013,2013-04-21,2013-04-27,N,Wk.17 - 13,2013-04-21 00:00:00,2013-04-27 00:00:00,2013W17 ,2013W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2013,N,2012-04-27,2011-04-27,2013-01-27,2012-10-27,2013-03-27,2013-02-27,2013-04-20,2013-04-13,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-19,2013-01-01,2013-07-01,2013-09-01,2013-09-15,0,-1,-2,-10,-69,0,-1,-3,-10,-10,41535,262,81,19,5,38,5933,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-21,19-Sep-2013,Sep 19th 2013,Thu 09-19-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-15,2013-09-16,2013-09-19,Thu ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,38,2013,2013-09-15,2013-09-21,N,Wk.38 - 13,2013-09-15 00:00:00,2013-09-21 00:00:00,2013W38 ,2013W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2013,N,2012-09-19,2011-09-19,2013-06-19,2013-03-19,2013-08-19,2013-07-19,2013-09-12,2013-09-05,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-07,2013-01-01,2013-01-01,2013-03-01,2013-03-03,0,-3,-8,-38,-265,0,-3,-9,-38,-38,41339,66,66,7,5,10,5905,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-09,07-Mar-2013,Mar 7th 2013,Thu 03-07-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-03,2013-03-04,2013-03-07,Thu ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,10,2013,2013-03-03,2013-03-09,N,Wk.10 - 13,2013-03-03 00:00:00,2013-03-09 00:00:00,2013W10 ,2013W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2013,N,2012-03-07,2011-03-07,2012-12-07,2012-09-07,2013-02-07,2013-01-07,2013-02-28,2013-02-21,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-28,2013-01-01,2013-01-01,2013-03-01,2013-03-24,0,-3,-8,-35,-244,0,-3,-9,-35,-35,41360,87,87,28,5,13,5908,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-30,28-Mar-2013,Mar 28th 2013,Thu 03-28-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-24,2013-03-25,2013-03-28,Thu ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,13,2013,2013-03-24,2013-03-30,N,Wk.13 - 13,2013-03-24 00:00:00,2013-03-30 00:00:00,2013W13 ,2013W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2013,N,2012-03-28,2011-03-28,2012-12-28,2012-09-28,2013-02-28,2013-01-28,2013-03-21,2013-03-14,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-23,2013-01-01,2013-10-01,2013-11-01,2013-11-17,0,0,0,-1,-4,0,0,-1,-1,-1,41600,327,54,23,7,47,5942,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-23,23-Nov-2013,Nov 23rd 2013,Sat 11-23-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-17,2013-11-18,2013-11-23,Sat ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,47,2013,2013-11-17,2013-11-23,N,Wk.47 - 13,2013-11-17 00:00:00,2013-11-23 00:00:00,2013W47 ,2013W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2013,N,2012-11-23,2011-11-23,2013-08-23,2013-05-23,2013-10-23,2013-09-23,2013-11-16,2013-11-09,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-09,2013-01-01,2013-01-01,2013-03-01,2013-03-03,0,-3,-8,-38,-263,0,-3,-9,-38,-38,41341,68,68,9,7,10,5905,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-09,09-Mar-2013,Mar 9th 2013,Sat 03-09-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-03,2013-03-04,2013-03-09,Sat ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,10,2013,2013-03-03,2013-03-09,N,Wk.10 - 13,2013-03-03 00:00:00,2013-03-09 00:00:00,2013W10 ,2013W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2013,N,2012-03-09,2011-03-09,2012-12-09,2012-09-09,2013-02-09,2013-01-09,2013-03-02,2013-02-23,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-21,2013-01-01,2013-10-01,2013-11-01,2013-11-17,0,0,0,-1,-6,0,0,-1,-1,-1,41598,325,52,21,5,47,5942,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-23,21-Nov-2013,Nov 21st 2013,Thu 11-21-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-17,2013-11-18,2013-11-21,Thu ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,47,2013,2013-11-17,2013-11-23,N,Wk.47 - 13,2013-11-17 00:00:00,2013-11-23 00:00:00,2013W47 ,2013W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2013,N,2012-11-21,2011-11-21,2013-08-21,2013-05-21,2013-10-21,2013-09-21,2013-11-14,2013-11-07,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-26,2013-01-01,2013-01-01,2013-03-01,2013-03-24,0,-3,-8,-35,-246,0,-3,-9,-35,-35,41358,85,85,26,3,13,5908,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-30,26-Mar-2013,Mar 26th 2013,Tue 03-26-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-24,2013-03-25,2013-03-26,Tue ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,13,2013,2013-03-24,2013-03-30,N,Wk.13 - 13,2013-03-24 00:00:00,2013-03-30 00:00:00,2013W13 ,2013W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2013,N,2012-03-26,2011-03-26,2012-12-26,2012-09-26,2013-02-26,2013-01-26,2013-03-19,2013-03-12,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-24,2013-01-01,2013-01-01,2013-01-01,2013-01-20,0,-3,-10,-44,-307,0,-3,-11,-44,-44,41297,24,24,24,5,4,5899,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-26,24-Jan-2013,Jan 24th 2013,Thu 01-24-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-20,2013-01-21,2013-01-24,Thu ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,4,2013,2013-01-20,2013-01-26,N,Wk.04 - 13,2013-01-20 00:00:00,2013-01-26 00:00:00,2013W04 ,2013W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2013,N,2012-01-24,2011-01-24,2012-10-24,2012-07-24,2012-12-24,2012-11-24,2013-01-17,2013-01-10,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-01,2013-01-01,2013-01-01,2013-01-01,2013-01-01,0,-3,-10,-47,-330,0,-3,-11,-47,-47,41274,1,1,1,3,1,5896,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-05,01-Jan-2013,Jan 1st 2013,Tue 01-01-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2013-01-01,Tue ,2013M01,Jan-2013,Y,2013M01 ,Y,Year 2013 - Quarter 01,2013Q01 ,Y,1,2013,2012-12-30,2013-01-05,Y,Wk.01 - 13,2013-01-01 00:00:00,2013-01-05 00:00:00,2013W01 ,2013W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2013,Y,2012-01-01,2011-01-01,2012-10-01,2012-07-01,2012-12-01,2012-11-01,2012-12-25,2012-12-18,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-29,2013-01-01,2013-04-01,2013-04-01,2013-04-28,0,-2,-7,-30,-212,0,-2,-7,-30,-30,41392,119,29,29,2,18,5913,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-05-04,29-Apr-2013,Apr 29th 2013,Mon 04-29-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-04-28,2013-04-28,2013-04-29,2013-04-29,Mon ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,18,2013,2013-04-28,2013-05-04,N,Wk.18 - 13,2013-04-28 00:00:00,2013-05-04 00:00:00,2013W18 ,2013W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2013,N,2012-04-29,2011-04-29,2013-01-29,2012-10-29,2013-03-29,2013-02-28,2013-04-22,2013-04-15,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-11,2013-01-01,2013-04-01,2013-05-01,2013-05-05,0,-2,-6,-29,-200,0,-2,-7,-29,-29,41404,131,41,11,7,19,5914,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-11,11-May-2013,May 11th 2013,Sat 05-11-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-05,2013-05-06,2013-05-11,Sat ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,19,2013,2013-05-05,2013-05-11,N,Wk.19 - 13,2013-05-05 00:00:00,2013-05-11 00:00:00,2013W19 ,2013W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2013,N,2012-05-11,2011-05-11,2013-02-11,2012-11-11,2013-04-11,2013-03-11,2013-05-04,2013-04-27,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-01,2013-01-01,2013-10-01,2013-10-01,2013-09-29,0,0,-1,-8,-57,0,0,-2,-8,-8,41547,274,1,1,3,40,5935,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-05,01-Oct-2013,Oct 1st 2013,Tue 10-01-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-09-29,2013-09-30,2013-10-01,Tue ,2013M10,Oct-2013,Y,2013M10 ,Y,Year 2013 - Quarter 04,2013Q04 ,Y,40,2013,2013-09-29,2013-10-05,N,Wk.40 - 13,2013-09-29 00:00:00,2013-10-05 00:00:00,2013W40 ,2013W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2013,N,2012-10-01,2011-10-01,2013-07-01,2013-04-01,2013-09-01,2013-08-01,2013-09-24,2013-09-17,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-05,2013-01-01,2013-10-01,2013-12-01,2013-12-01,0,0,1,1,8,0,0,0,1,1,41612,339,66,5,5,49,5944,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-07,05-Dec-2013,Dec 5th 2013,Thu 12-05-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-01,2013-12-02,2013-12-05,Thu ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,49,2013,2013-12-01,2013-12-07,N,Wk.49 - 13,2013-12-01 00:00:00,2013-12-07 00:00:00,2013W49 ,2013W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2013,N,2012-12-05,2011-12-05,2013-09-05,2013-06-05,2013-11-05,2013-10-05,2013-11-28,2013-11-21,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-05,2013-01-01,2013-01-01,2013-03-01,2013-03-03,0,-3,-8,-38,-267,0,-3,-9,-38,-38,41337,64,64,5,3,10,5905,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-09,05-Mar-2013,Mar 5th 2013,Tue 03-05-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-03,2013-03-04,2013-03-05,Tue ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,10,2013,2013-03-03,2013-03-09,N,Wk.10 - 13,2013-03-03 00:00:00,2013-03-09 00:00:00,2013W10 ,2013W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2013,N,2012-03-05,2011-03-05,2012-12-05,2012-09-05,2013-02-05,2013-01-05,2013-02-26,2013-02-19,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-03,2013-01-01,2013-10-01,2013-10-01,2013-09-29,0,0,-1,-8,-55,0,0,-2,-8,-8,41549,276,3,3,5,40,5935,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-05,03-Oct-2013,Oct 3rd 2013,Thu 10-03-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-09-29,2013-09-30,2013-10-03,Thu ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,40,2013,2013-09-29,2013-10-05,N,Wk.40 - 13,2013-09-29 00:00:00,2013-10-05 00:00:00,2013W40 ,2013W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2013,N,2012-10-03,2011-10-03,2013-07-03,2013-04-03,2013-09-03,2013-08-03,2013-09-26,2013-09-19,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-22,2013-01-01,2013-01-01,2013-01-01,2013-01-20,0,-3,-10,-44,-309,0,-3,-11,-44,-44,41295,22,22,22,3,4,5899,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-26,22-Jan-2013,Jan 22nd 2013,Tue 01-22-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-20,2013-01-21,2013-01-22,Tue ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,4,2013,2013-01-20,2013-01-26,N,Wk.04 - 13,2013-01-20 00:00:00,2013-01-26 00:00:00,2013W04 ,2013W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2013,N,2012-01-22,2011-01-22,2012-10-22,2012-07-22,2012-12-22,2012-11-22,2013-01-15,2013-01-08,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-26,2013-01-01,2013-10-01,2013-12-01,2013-12-22,0,0,1,4,29,0,0,0,4,4,41633,360,87,26,5,52,5947,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-28,26-Dec-2013,Dec 26th 2013,Thu 12-26-13,0,0,0,0,2013-12-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-22,2013-12-23,2013-12-26,Thu ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,52,2013,2013-12-22,2013-12-28,N,Wk.52 - 13,2013-12-22 00:00:00,2013-12-28 00:00:00,2013W52 ,2013W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2013,N,2012-12-26,2011-12-26,2013-09-26,2013-06-26,2013-11-26,2013-10-26,2013-12-19,2013-12-12,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-17,2013-01-01,2013-07-01,2013-09-01,2013-09-15,0,-1,-2,-10,-71,0,-1,-3,-10,-10,41533,260,79,17,3,38,5933,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-21,17-Sep-2013,Sep 17th 2013,Tue 09-17-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-15,2013-09-16,2013-09-17,Tue ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,38,2013,2013-09-15,2013-09-21,N,Wk.38 - 13,2013-09-15 00:00:00,2013-09-21 00:00:00,2013W38 ,2013W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2013,N,2012-09-17,2011-09-17,2013-06-17,2013-03-17,2013-08-17,2013-07-17,2013-09-10,2013-09-03,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-20,2013-01-01,2013-10-01,2013-10-01,2013-10-20,0,0,-1,-5,-38,0,0,-2,-5,-6,41566,293,20,20,1,43,5938,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-26,20-Oct-2013,Oct 20th 2013,Sun 10-20-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-20,2013-10-14,2013-10-20,Sun ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,43,2013,2013-10-20,2013-10-26,Y,Wk.43 - 13,2013-10-20 00:00:00,2013-10-26 00:00:00,2013W43 ,2013W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2013,N,2012-10-20,2011-10-20,2013-07-20,2013-04-20,2013-09-20,2013-08-20,2013-10-13,2013-10-06,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-25,2013-01-01,2013-10-01,2013-11-01,2013-11-24,0,0,0,0,-2,0,0,0,0,0,41602,329,56,25,2,48,5943,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-30,25-Nov-2013,Nov 25th 2013,Mon 11-25-13,1,1,1,1,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-11-24,2013-11-24,2013-11-25,2013-11-25,Mon ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,48,2013,2013-11-24,2013-11-30,N,Wk.48 - 13,2013-11-24 00:00:00,2013-11-30 00:00:00,2013W48 ,2013W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2013,N,2012-11-25,2011-11-25,2013-08-25,2013-05-25,2013-10-25,2013-09-25,2013-11-18,2013-11-11,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-26,2013-01-01,2013-01-01,2013-01-01,2013-01-20,0,-3,-10,-44,-305,0,-3,-11,-44,-44,41299,26,26,26,7,4,5899,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-26,26-Jan-2013,Jan 26th 2013,Sat 01-26-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-20,2013-01-21,2013-01-26,Sat ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,4,2013,2013-01-20,2013-01-26,N,Wk.04 - 13,2013-01-20 00:00:00,2013-01-26 00:00:00,2013W04 ,2013W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2013,N,2012-01-26,2011-01-26,2012-10-26,2012-07-26,2012-12-26,2012-11-26,2013-01-19,2013-01-12,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-24,2013-01-01,2013-10-01,2013-12-01,2013-12-22,0,0,1,4,27,0,0,0,4,4,41631,358,85,24,3,52,5947,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-28,24-Dec-2013,Dec 24th 2013,Tue 12-24-13,0,0,0,0,2013-12-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-22,2013-12-23,2013-12-24,Tue ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,52,2013,2013-12-22,2013-12-28,N,Wk.52 - 13,2013-12-22 00:00:00,2013-12-28 00:00:00,2013W52 ,2013W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2013,N,2012-12-24,2011-12-24,2013-09-24,2013-06-24,2013-11-24,2013-10-24,2013-12-17,2013-12-10,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-04,2013-01-01,2013-01-01,2013-02-01,2013-02-03,0,-3,-9,-42,-296,0,-3,-10,-42,-42,41308,35,35,4,2,6,5901,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-09,04-Feb-2013,Feb 4th 2013,Mon 02-04-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-03,2013-02-04,2013-02-04,Mon ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,6,2013,2013-02-03,2013-02-09,N,Wk.06 - 13,2013-02-03 00:00:00,2013-02-09 00:00:00,2013W06 ,2013W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2013,N,2012-02-04,2011-02-04,2012-11-04,2012-08-04,2013-01-04,2012-12-04,2013-01-28,2013-01-21,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-30,2013-01-01,2013-04-01,2013-05-01,2013-05-26,0,-2,-6,-26,-181,0,-2,-6,-26,-26,41423,150,60,30,5,22,5917,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-06-01,30-May-2013,May 30th 2013,Thu 05-30-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-05-26,2013-05-26,2013-05-27,2013-05-30,Thu ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,22,2013,2013-05-26,2013-06-01,N,Wk.22 - 13,2013-05-26 00:00:00,2013-06-01 00:00:00,2013W22 ,2013W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2013,N,2012-05-30,2011-05-30,2013-02-28,2012-11-30,2013-04-30,2013-03-30,2013-05-23,2013-05-16,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-12,2013-01-01,2013-04-01,2013-04-01,2013-04-07,0,-2,-7,-33,-229,0,-2,-8,-33,-33,41375,102,12,12,6,15,5910,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-13,12-Apr-2013,Apr 12th 2013,Fri 04-12-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-07,2013-04-08,2013-04-12,Fri ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,15,2013,2013-04-07,2013-04-13,N,Wk.15 - 13,2013-04-07 00:00:00,2013-04-13 00:00:00,2013W15 ,2013W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2013,N,2012-04-12,2011-04-12,2013-01-12,2012-10-12,2013-03-12,2013-02-12,2013-04-05,2013-03-29,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-08,2013-01-01,2013-04-01,2013-04-01,2013-04-07,0,-2,-7,-33,-233,0,-2,-8,-33,-33,41371,98,8,8,2,15,5910,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-13,08-Apr-2013,Apr 8th 2013,Mon 04-08-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-07,2013-04-08,2013-04-08,Mon ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,15,2013,2013-04-07,2013-04-13,N,Wk.15 - 13,2013-04-07 00:00:00,2013-04-13 00:00:00,2013W15 ,2013W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2013,N,2012-04-08,2011-04-08,2013-01-08,2012-10-08,2013-03-08,2013-02-08,2013-04-01,2013-03-25,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-28,2013-01-01,2013-10-01,2013-12-01,2013-12-22,0,0,1,4,31,0,0,0,4,4,41635,362,89,28,7,52,5947,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-28,28-Dec-2013,Dec 28th 2013,Sat 12-28-13,0,0,0,0,2013-12-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-22,2013-12-23,2013-12-28,Sat ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,52,2013,2013-12-22,2013-12-28,N,Wk.52 - 13,2013-12-22 00:00:00,2013-12-28 00:00:00,2013W52 ,2013W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2013,N,2012-12-28,2011-12-28,2013-09-28,2013-06-28,2013-11-28,2013-10-28,2013-12-21,2013-12-14,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-03,2013-01-01,2013-10-01,2013-12-01,2013-12-01,0,0,1,1,6,0,0,0,1,1,41610,337,64,3,3,49,5944,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-07,03-Dec-2013,Dec 3rd 2013,Tue 12-03-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-01,2013-12-02,2013-12-03,Tue ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,49,2013,2013-12-01,2013-12-07,N,Wk.49 - 13,2013-12-01 00:00:00,2013-12-07 00:00:00,2013W49 ,2013W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2013,N,2012-12-03,2011-12-03,2013-09-03,2013-06-03,2013-11-03,2013-10-03,2013-11-26,2013-11-19,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-15,2013-01-01,2013-07-01,2013-07-01,2013-07-14,0,-1,-4,-19,-135,0,-1,-5,-19,-19,41469,196,15,15,2,29,5924,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-20,15-Jul-2013,Jul 15th 2013,Mon 07-15-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-14,2013-07-15,2013-07-15,Mon ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,29,2013,2013-07-14,2013-07-20,N,Wk.29 - 13,2013-07-14 00:00:00,2013-07-20 00:00:00,2013W29 ,2013W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2013,N,2012-07-15,2011-07-15,2013-04-15,2013-01-15,2013-06-15,2013-05-15,2013-07-08,2013-07-01,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-13,2013-01-01,2013-04-01,2013-05-01,2013-05-12,0,-2,-6,-28,-198,0,-2,-7,-28,-28,41406,133,43,13,2,20,5915,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-18,13-May-2013,May 13th 2013,Mon 05-13-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-12,2013-05-13,2013-05-13,Mon ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,20,2013,2013-05-12,2013-05-18,N,Wk.20 - 13,2013-05-12 00:00:00,2013-05-18 00:00:00,2013W20 ,2013W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2013,N,2012-05-13,2011-05-13,2013-02-13,2012-11-13,2013-04-13,2013-03-13,2013-05-06,2013-04-29,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-30,2013-01-01,2013-01-01,2013-03-01,2013-03-24,0,-3,-8,-35,-242,0,-3,-9,-35,-35,41362,89,89,30,7,13,5908,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-30,30-Mar-2013,Mar 30th 2013,Sat 03-30-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-24,2013-03-25,2013-03-30,Sat ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,13,2013,2013-03-24,2013-03-30,N,Wk.13 - 13,2013-03-24 00:00:00,2013-03-30 00:00:00,2013W13 ,2013W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2013,N,2012-03-30,2011-03-30,2012-12-30,2012-09-30,2013-02-28,2013-01-30,2013-03-23,2013-03-16,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-09,2013-01-01,2013-10-01,2013-12-01,2013-12-08,0,0,1,2,12,0,0,0,2,2,41616,343,70,9,2,50,5945,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-14,09-Dec-2013,Dec 9th 2013,Mon 12-09-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-08,2013-12-09,2013-12-09,Mon ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,50,2013,2013-12-08,2013-12-14,N,Wk.50 - 13,2013-12-08 00:00:00,2013-12-14 00:00:00,2013W50 ,2013W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2013,N,2012-12-09,2011-12-09,2013-09-09,2013-06-09,2013-11-09,2013-10-09,2013-12-02,2013-11-25,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-25,2013-01-01,2013-01-01,2013-02-01,2013-02-24,0,-3,-9,-39,-275,0,-3,-9,-39,-39,41329,56,56,25,2,9,5904,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-03-02,25-Feb-2013,Feb 25th 2013,Mon 02-25-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-02-24,2013-02-24,2013-02-25,2013-02-25,Mon ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,9,2013,2013-02-24,2013-03-02,N,Wk.09 - 13,2013-02-24 00:00:00,2013-03-02 00:00:00,2013W09 ,2013W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2013,N,2012-02-25,2011-02-25,2012-11-25,2012-08-25,2013-01-25,2012-12-25,2013-02-18,2013-02-11,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-04,2013-01-01,2013-10-01,2013-11-01,2013-11-03,0,0,0,-3,-23,0,0,-1,-3,-3,41581,308,35,4,2,45,5940,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-09,04-Nov-2013,Nov 4th 2013,Mon 11-04-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-03,2013-11-04,2013-11-04,Mon ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,45,2013,2013-11-03,2013-11-09,N,Wk.45 - 13,2013-11-03 00:00:00,2013-11-09 00:00:00,2013W45 ,2013W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2013,N,2012-11-04,2011-11-04,2013-08-04,2013-05-04,2013-10-04,2013-09-04,2013-10-28,2013-10-21,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-08,2013-01-01,2013-10-01,2013-11-01,2013-11-03,0,0,0,-3,-19,0,0,-1,-3,-3,41585,312,39,8,6,45,5940,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-09,08-Nov-2013,Nov 8th 2013,Fri 11-08-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-03,2013-11-04,2013-11-08,Fri ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,45,2013,2013-11-03,2013-11-09,N,Wk.45 - 13,2013-11-03 00:00:00,2013-11-09 00:00:00,2013W45 ,2013W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2013,N,2012-11-08,2011-11-08,2013-08-08,2013-05-08,2013-10-08,2013-09-08,2013-11-01,2013-10-25,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-22,2013-01-01,2013-07-01,2013-08-01,2013-08-18,0,-1,-3,-14,-97,0,-1,-4,-14,-14,41507,234,53,22,5,34,5929,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-24,22-Aug-2013,Aug 22nd 2013,Thu 08-22-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-18,2013-08-19,2013-08-22,Thu ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,34,2013,2013-08-18,2013-08-24,N,Wk.34 - 13,2013-08-18 00:00:00,2013-08-24 00:00:00,2013W34 ,2013W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2013,N,2012-08-22,2011-08-22,2013-05-22,2013-02-22,2013-07-22,2013-06-22,2013-08-15,2013-08-08,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-18,2013-01-01,2013-04-01,2013-06-01,2013-06-16,0,-2,-5,-23,-162,0,-2,-6,-23,-23,41442,169,79,18,3,25,5920,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-22,18-Jun-2013,Jun 18th 2013,Tue 06-18-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-16,2013-06-17,2013-06-18,Tue ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,25,2013,2013-06-16,2013-06-22,N,Wk.25 - 13,2013-06-16 00:00:00,2013-06-22 00:00:00,2013W25 ,2013W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2013,N,2012-06-18,2011-06-18,2013-03-18,2012-12-18,2013-05-18,2013-04-18,2013-06-11,2013-06-04,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-19,2013-01-01,2013-07-01,2013-07-01,2013-07-14,0,-1,-4,-19,-131,0,-1,-5,-19,-19,41473,200,19,19,6,29,5924,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-20,19-Jul-2013,Jul 19th 2013,Fri 07-19-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-14,2013-07-15,2013-07-19,Fri ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,29,2013,2013-07-14,2013-07-20,N,Wk.29 - 13,2013-07-14 00:00:00,2013-07-20 00:00:00,2013W29 ,2013W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2013,N,2012-07-19,2011-07-19,2013-04-19,2013-01-19,2013-06-19,2013-05-19,2013-07-12,2013-07-05,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-20,2013-01-01,2013-07-01,2013-08-01,2013-08-18,0,-1,-3,-14,-99,0,-1,-4,-14,-14,41505,232,51,20,3,34,5929,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-24,20-Aug-2013,Aug 20th 2013,Tue 08-20-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-18,2013-08-19,2013-08-20,Tue ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,34,2013,2013-08-18,2013-08-24,N,Wk.34 - 13,2013-08-18 00:00:00,2013-08-24 00:00:00,2013W34 ,2013W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2013,N,2012-08-20,2011-08-20,2013-05-20,2013-02-20,2013-07-20,2013-06-20,2013-08-13,2013-08-06,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-24,2013-01-01,2013-07-01,2013-08-01,2013-08-18,0,-1,-3,-14,-95,0,-1,-4,-14,-14,41509,236,55,24,7,34,5929,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-24,24-Aug-2013,Aug 24th 2013,Sat 08-24-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-18,2013-08-19,2013-08-24,Sat ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,34,2013,2013-08-18,2013-08-24,N,Wk.34 - 13,2013-08-18 00:00:00,2013-08-24 00:00:00,2013W34 ,2013W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2013,N,2012-08-24,2011-08-24,2013-05-24,2013-02-24,2013-07-24,2013-06-24,2013-08-17,2013-08-10,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-13,2013-01-01,2013-07-01,2013-07-01,2013-07-07,0,-1,-4,-20,-137,0,-1,-5,-20,-20,41467,194,13,13,7,28,5923,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-13,13-Jul-2013,Jul 13th 2013,Sat 07-13-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-07,2013-07-08,2013-07-13,Sat ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,28,2013,2013-07-07,2013-07-13,N,Wk.28 - 13,2013-07-07 00:00:00,2013-07-13 00:00:00,2013W28 ,2013W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2013,N,2012-07-13,2011-07-13,2013-04-13,2013-01-13,2013-06-13,2013-05-13,2013-07-06,2013-06-29,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-06,2013-01-01,2013-10-01,2013-11-01,2013-11-03,0,0,0,-3,-21,0,0,-1,-3,-3,41583,310,37,6,4,45,5940,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-09,06-Nov-2013,Nov 6th 2013,Wed 11-06-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-03,2013-11-04,2013-11-06,Wed ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,45,2013,2013-11-03,2013-11-09,N,Wk.45 - 13,2013-11-03 00:00:00,2013-11-09 00:00:00,2013W45 ,2013W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2013,N,2012-11-06,2011-11-06,2013-08-06,2013-05-06,2013-10-06,2013-09-06,2013-10-30,2013-10-23,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-07,2013-01-01,2013-10-01,2013-12-01,2013-12-01,0,0,1,1,10,0,0,0,1,1,41614,341,68,7,7,49,5944,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-07,07-Dec-2013,Dec 7th 2013,Sat 12-07-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-01,2013-12-02,2013-12-07,Sat ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,49,2013,2013-12-01,2013-12-07,N,Wk.49 - 13,2013-12-01 00:00:00,2013-12-07 00:00:00,2013W49 ,2013W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2013,N,2012-12-07,2011-12-07,2013-09-07,2013-06-07,2013-11-07,2013-10-07,2013-11-30,2013-11-23,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-04,2013-01-01,2013-07-01,2013-07-01,2013-06-30,0,-1,-4,-21,-146,0,-1,-5,-21,-21,41458,185,4,4,5,27,5922,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-06,04-Jul-2013,Jul 4th 2013,Thu 07-04-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-06-30,2013-07-01,2013-07-04,Thu ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,27,2013,2013-06-30,2013-07-06,N,Wk.27 - 13,2013-06-30 00:00:00,2013-07-06 00:00:00,2013W27 ,2013W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2013,N,2012-07-04,2011-07-04,2013-04-04,2013-01-04,2013-06-04,2013-05-04,2013-06-27,2013-06-20,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-07,2013-01-01,2013-10-01,2013-10-01,2013-10-06,0,0,-1,-7,-51,0,0,-2,-7,-7,41553,280,7,7,2,41,5936,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-12,07-Oct-2013,Oct 7th 2013,Mon 10-07-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-06,2013-10-07,2013-10-07,Mon ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,41,2013,2013-10-06,2013-10-12,N,Wk.41 - 13,2013-10-06 00:00:00,2013-10-12 00:00:00,2013W41 ,2013W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2013,N,2012-10-07,2011-10-07,2013-07-07,2013-04-07,2013-09-07,2013-08-07,2013-09-30,2013-09-23,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-10,2013-01-01,2013-10-01,2013-11-01,2013-11-10,0,0,0,-2,-17,0,0,-1,-2,-3,41587,314,41,10,1,46,5941,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-16,10-Nov-2013,Nov 10th 2013,Sun 11-10-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-10,2013-11-04,2013-11-10,Sun ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,46,2013,2013-11-10,2013-11-16,Y,Wk.46 - 13,2013-11-10 00:00:00,2013-11-16 00:00:00,2013W46 ,2013W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2013,N,2012-11-10,2011-11-10,2013-08-10,2013-05-10,2013-10-10,2013-09-10,2013-11-03,2013-10-27,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-07,2013-01-01,2013-07-01,2013-08-01,2013-08-04,0,-1,-3,-16,-112,0,-1,-4,-16,-16,41492,219,38,7,4,32,5927,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-10,07-Aug-2013,Aug 7th 2013,Wed 08-07-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-04,2013-08-05,2013-08-07,Wed ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,32,2013,2013-08-04,2013-08-10,N,Wk.32 - 13,2013-08-04 00:00:00,2013-08-10 00:00:00,2013W32 ,2013W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2013,N,2012-08-07,2011-08-07,2013-05-07,2013-02-07,2013-07-07,2013-06-07,2013-07-31,2013-07-24,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-25,2013-01-01,2013-07-01,2013-09-01,2013-09-22,0,-1,-2,-9,-63,0,-1,-3,-9,-9,41541,268,87,25,4,39,5934,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-28,25-Sep-2013,Sep 25th 2013,Wed 09-25-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-22,2013-09-23,2013-09-25,Wed ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,39,2013,2013-09-22,2013-09-28,N,Wk.39 - 13,2013-09-22 00:00:00,2013-09-28 00:00:00,2013W39 ,2013W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2013,N,2012-09-25,2011-09-25,2013-06-25,2013-03-25,2013-08-25,2013-07-25,2013-09-18,2013-09-11,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-05,2013-01-01,2013-10-01,2013-10-01,2013-09-29,0,0,-1,-8,-53,0,0,-2,-8,-8,41551,278,5,5,7,40,5935,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-05,05-Oct-2013,Oct 5th 2013,Sat 10-05-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-09-29,2013-09-30,2013-10-05,Sat ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,40,2013,2013-09-29,2013-10-05,N,Wk.40 - 13,2013-09-29 00:00:00,2013-10-05 00:00:00,2013W40 ,2013W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2013,N,2012-10-05,2011-10-05,2013-07-05,2013-04-05,2013-09-05,2013-08-05,2013-09-28,2013-09-21,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-02,2013-01-01,2013-07-01,2013-09-01,2013-09-01,0,-1,-2,-12,-86,0,-1,-3,-12,-12,41518,245,64,2,2,36,5931,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-07,02-Sep-2013,Sep 2nd 2013,Mon 09-02-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-01,2013-09-02,2013-09-02,Mon ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,36,2013,2013-09-01,2013-09-07,N,Wk.36 - 13,2013-09-01 00:00:00,2013-09-07 00:00:00,2013W36 ,2013W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2013,N,2012-09-02,2011-09-02,2013-06-02,2013-03-02,2013-08-02,2013-07-02,2013-08-26,2013-08-19,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-15,2013-01-01,2013-04-01,2013-05-01,2013-05-12,0,-2,-6,-28,-196,0,-2,-7,-28,-28,41408,135,45,15,4,20,5915,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-18,15-May-2013,May 15th 2013,Wed 05-15-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-12,2013-05-13,2013-05-15,Wed ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,20,2013,2013-05-12,2013-05-18,N,Wk.20 - 13,2013-05-12 00:00:00,2013-05-18 00:00:00,2013W20 ,2013W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2013,N,2012-05-15,2011-05-15,2013-02-15,2012-11-15,2013-04-15,2013-03-15,2013-05-08,2013-05-01,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-10,2013-01-01,2013-01-01,2013-02-01,2013-02-10,0,-3,-9,-41,-290,0,-3,-10,-41,-42,41314,41,41,10,1,7,5902,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-16,10-Feb-2013,Feb 10th 2013,Sun 02-10-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-10,2013-02-04,2013-02-10,Sun ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,7,2013,2013-02-10,2013-02-16,Y,Wk.07 - 13,2013-02-10 00:00:00,2013-02-16 00:00:00,2013W07 ,2013W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2013,N,2012-02-10,2011-02-10,2012-11-10,2012-08-10,2013-01-10,2012-12-10,2013-02-03,2013-01-27,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-21,2013-01-01,2013-10-01,2013-12-01,2013-12-15,0,0,1,3,24,0,0,0,3,3,41628,355,82,21,7,51,5946,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-21,21-Dec-2013,Dec 21st 2013,Sat 12-21-13,0,0,0,0,2013-12-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-15,2013-12-16,2013-12-21,Sat ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,51,2013,2013-12-15,2013-12-21,N,Wk.51 - 13,2013-12-15 00:00:00,2013-12-21 00:00:00,2013W51 ,2013W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2013,N,2012-12-21,2011-12-21,2013-09-21,2013-06-21,2013-11-21,2013-10-21,2013-12-14,2013-12-07,0,0,0,0,0,0,0,0,12,4,51,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-22,2013-01-01,2013-10-01,2013-10-01,2013-10-20,0,0,-1,-5,-36,0,0,-2,-5,-5,41568,295,22,22,3,43,5938,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-26,22-Oct-2013,Oct 22nd 2013,Tue 10-22-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-20,2013-10-21,2013-10-22,Tue ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,43,2013,2013-10-20,2013-10-26,N,Wk.43 - 13,2013-10-20 00:00:00,2013-10-26 00:00:00,2013W43 ,2013W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2013,N,2012-10-22,2011-10-22,2013-07-22,2013-04-22,2013-09-22,2013-08-22,2013-10-15,2013-10-08,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-24,2013-01-01,2013-10-01,2013-10-01,2013-10-20,0,0,-1,-5,-34,0,0,-2,-5,-5,41570,297,24,24,5,43,5938,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-26,24-Oct-2013,Oct 24th 2013,Thu 10-24-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-20,2013-10-21,2013-10-24,Thu ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,43,2013,2013-10-20,2013-10-26,N,Wk.43 - 13,2013-10-20 00:00:00,2013-10-26 00:00:00,2013W43 ,2013W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2013,N,2012-10-24,2011-10-24,2013-07-24,2013-04-24,2013-09-24,2013-08-24,2013-10-17,2013-10-10,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-10,2013-01-01,2013-07-01,2013-07-01,2013-07-07,0,-1,-4,-20,-140,0,-1,-5,-20,-20,41464,191,10,10,4,28,5923,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-13,10-Jul-2013,Jul 10th 2013,Wed 07-10-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-07,2013-07-08,2013-07-10,Wed ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,28,2013,2013-07-07,2013-07-13,N,Wk.28 - 13,2013-07-07 00:00:00,2013-07-13 00:00:00,2013W28 ,2013W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2013,N,2012-07-10,2011-07-10,2013-04-10,2013-01-10,2013-06-10,2013-05-10,2013-07-03,2013-06-26,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-27,2013-01-01,2013-01-01,2013-02-01,2013-02-24,0,-3,-9,-39,-273,0,-3,-9,-39,-39,41331,58,58,27,4,9,5904,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-03-02,27-Feb-2013,Feb 27th 2013,Wed 02-27-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-02-24,2013-02-24,2013-02-25,2013-02-27,Wed ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,9,2013,2013-02-24,2013-03-02,N,Wk.09 - 13,2013-02-24 00:00:00,2013-03-02 00:00:00,2013W09 ,2013W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2013,N,2012-02-27,2011-02-27,2012-11-27,2012-08-27,2013-01-27,2012-12-27,2013-02-20,2013-02-13,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-02,2013-01-01,2013-01-01,2013-03-01,2013-02-24,0,-3,-8,-39,-270,0,-3,-9,-39,-39,41334,61,61,2,7,9,5904,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-02,02-Mar-2013,Mar 2nd 2013,Sat 03-02-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-02-24,2013-02-25,2013-03-02,Sat ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,9,2013,2013-02-24,2013-03-02,N,Wk.09 - 13,2013-02-24 00:00:00,2013-03-02 00:00:00,2013W09 ,2013W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2013,N,2012-03-02,2011-03-02,2012-12-02,2012-09-02,2013-02-02,2013-01-02,2013-02-23,2013-02-16,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-02,2013-01-01,2013-10-01,2013-11-01,2013-10-27,0,0,0,-4,-25,0,0,-1,-4,-4,41579,306,33,2,7,44,5939,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-02,02-Nov-2013,Nov 2nd 2013,Sat 11-02-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-10-27,2013-10-28,2013-11-02,Sat ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,44,2013,2013-10-27,2013-11-02,N,Wk.44 - 13,2013-10-27 00:00:00,2013-11-02 00:00:00,2013W44 ,2013W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2013,N,2012-11-02,2011-11-02,2013-08-02,2013-05-02,2013-10-02,2013-09-02,2013-10-26,2013-10-19,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-21,2013-01-01,2013-01-01,2013-03-01,2013-03-17,0,-3,-8,-36,-251,0,-3,-9,-36,-36,41353,80,80,21,5,12,5907,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-23,21-Mar-2013,Mar 21st 2013,Thu 03-21-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-17,2013-03-18,2013-03-21,Thu ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,12,2013,2013-03-17,2013-03-23,N,Wk.12 - 13,2013-03-17 00:00:00,2013-03-23 00:00:00,2013W12 ,2013W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2013,N,2012-03-21,2011-03-21,2012-12-21,2012-09-21,2013-02-21,2013-01-21,2013-03-14,2013-03-07,0,0,0,0,0,0,0,0,3,1,12,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-03,2013-01-01,2013-04-01,2013-04-01,2013-03-31,0,-2,-7,-34,-238,0,-2,-8,-34,-34,41366,93,3,3,4,14,5909,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-06,03-Apr-2013,Apr 3rd 2013,Wed 04-03-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-03-31,2013-04-01,2013-04-03,Wed ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,14,2013,2013-03-31,2013-04-06,N,Wk.14 - 13,2013-03-31 00:00:00,2013-04-06 00:00:00,2013W14 ,2013W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2013,N,2012-04-03,2011-04-03,2013-01-03,2012-10-03,2013-03-03,2013-02-03,2013-03-27,2013-03-20,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-06,2013-01-01,2013-07-01,2013-07-01,2013-06-30,0,-1,-4,-21,-144,0,-1,-5,-21,-21,41460,187,6,6,7,27,5922,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-06,06-Jul-2013,Jul 6th 2013,Sat 07-06-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-06-30,2013-07-01,2013-07-06,Sat ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,27,2013,2013-06-30,2013-07-06,N,Wk.27 - 13,2013-06-30 00:00:00,2013-07-06 00:00:00,2013W27 ,2013W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2013,N,2012-07-06,2011-07-06,2013-04-06,2013-01-06,2013-06-06,2013-05-06,2013-06-29,2013-06-22,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-26,2013-01-01,2013-04-01,2013-06-01,2013-06-23,0,-2,-5,-22,-154,0,-2,-6,-22,-22,41450,177,87,26,4,26,5921,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-29,26-Jun-2013,Jun 26th 2013,Wed 06-26-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-23,2013-06-24,2013-06-26,Wed ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,26,2013,2013-06-23,2013-06-29,N,Wk.26 - 13,2013-06-23 00:00:00,2013-06-29 00:00:00,2013W26 ,2013W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2013,N,2012-06-26,2011-06-26,2013-03-26,2012-12-26,2013-05-26,2013-04-26,2013-06-19,2013-06-12,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-26,2013-01-01,2013-07-01,2013-08-01,2013-08-25,0,-1,-3,-13,-93,0,-1,-3,-13,-13,41511,238,57,26,2,35,5930,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-31,26-Aug-2013,Aug 26th 2013,Mon 08-26-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-08-25,2013-08-25,2013-08-26,2013-08-26,Mon ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,35,2013,2013-08-25,2013-08-31,N,Wk.35 - 13,2013-08-25 00:00:00,2013-08-31 00:00:00,2013W35 ,2013W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2013,N,2012-08-26,2011-08-26,2013-05-26,2013-02-26,2013-07-26,2013-06-26,2013-08-19,2013-08-12,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-13,2013-01-01,2013-10-01,2013-12-01,2013-12-08,0,0,1,2,16,0,0,0,2,2,41620,347,74,13,6,50,5945,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-14,13-Dec-2013,Dec 13th 2013,Fri 12-13-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-08,2013-12-09,2013-12-13,Fri ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,50,2013,2013-12-08,2013-12-14,N,Wk.50 - 13,2013-12-08 00:00:00,2013-12-14 00:00:00,2013W50 ,2013W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2013,N,2012-12-13,2011-12-13,2013-09-13,2013-06-13,2013-11-13,2013-10-13,2013-12-06,2013-11-29,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-02,2013-01-01,2013-07-01,2013-07-01,2013-06-30,0,-1,-4,-21,-148,0,-1,-5,-21,-21,41456,183,2,2,3,27,5922,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-06,02-Jul-2013,Jul 2nd 2013,Tue 07-02-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-06-30,2013-07-01,2013-07-02,Tue ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,27,2013,2013-06-30,2013-07-06,N,Wk.27 - 13,2013-06-30 00:00:00,2013-07-06 00:00:00,2013W27 ,2013W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2013,N,2012-07-02,2011-07-02,2013-04-02,2013-01-02,2013-06-02,2013-05-02,2013-06-25,2013-06-18,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-05,2013-01-01,2013-07-01,2013-08-01,2013-08-04,0,-1,-3,-16,-114,0,-1,-4,-16,-16,41490,217,36,5,2,32,5927,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-10,05-Aug-2013,Aug 5th 2013,Mon 08-05-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-04,2013-08-05,2013-08-05,Mon ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,32,2013,2013-08-04,2013-08-10,N,Wk.32 - 13,2013-08-04 00:00:00,2013-08-10 00:00:00,2013W32 ,2013W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2013,N,2012-08-05,2011-08-05,2013-05-05,2013-02-05,2013-07-05,2013-06-05,2013-07-29,2013-07-22,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-08,2013-01-01,2013-01-01,2013-02-01,2013-02-03,0,-3,-9,-42,-292,0,-3,-10,-42,-42,41312,39,39,8,6,6,5901,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-09,08-Feb-2013,Feb 8th 2013,Fri 02-08-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-03,2013-02-04,2013-02-08,Fri ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,6,2013,2013-02-03,2013-02-09,N,Wk.06 - 13,2013-02-03 00:00:00,2013-02-09 00:00:00,2013W06 ,2013W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2013,N,2012-02-08,2011-02-08,2012-11-08,2012-08-08,2013-01-08,2012-12-08,2013-02-01,2013-01-25,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-14,2013-01-01,2013-01-01,2013-02-01,2013-02-10,0,-3,-9,-41,-286,0,-3,-10,-41,-41,41318,45,45,14,5,7,5902,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-16,14-Feb-2013,Feb 14th 2013,Thu 02-14-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-10,2013-02-11,2013-02-14,Thu ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,7,2013,2013-02-10,2013-02-16,N,Wk.07 - 13,2013-02-10 00:00:00,2013-02-16 00:00:00,2013W07 ,2013W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2013,N,2012-02-14,2011-02-14,2012-11-14,2012-08-14,2013-01-14,2012-12-14,2013-02-07,2013-01-31,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-21,2013-01-01,2013-07-01,2013-09-01,2013-09-15,0,-1,-2,-10,-67,0,-1,-3,-10,-10,41537,264,83,21,7,38,5933,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-21,21-Sep-2013,Sep 21st 2013,Sat 09-21-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-15,2013-09-16,2013-09-21,Sat ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,38,2013,2013-09-15,2013-09-21,N,Wk.38 - 13,2013-09-15 00:00:00,2013-09-21 00:00:00,2013W38 ,2013W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2013,N,2012-09-21,2011-09-21,2013-06-21,2013-03-21,2013-08-21,2013-07-21,2013-09-14,2013-09-07,0,0,0,0,0,0,0,0,9,3,38,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-19,2013-01-01,2013-01-01,2013-03-01,2013-03-17,0,-3,-8,-36,-253,0,-3,-9,-36,-36,41351,78,78,19,3,12,5907,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-23,19-Mar-2013,Mar 19th 2013,Tue 03-19-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-17,2013-03-18,2013-03-19,Tue ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,12,2013,2013-03-17,2013-03-23,N,Wk.12 - 13,2013-03-17 00:00:00,2013-03-23 00:00:00,2013W12 ,2013W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2013,N,2012-03-19,2011-03-19,2012-12-19,2012-09-19,2013-02-19,2013-01-19,2013-03-12,2013-03-05,0,0,0,0,0,0,0,0,3,1,12,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-28,2013-01-01,2013-01-01,2013-01-01,2013-01-27,0,-3,-10,-43,-303,0,-3,-10,-43,-43,41301,28,28,28,2,5,5900,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-02-02,28-Jan-2013,Jan 28th 2013,Mon 01-28-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-01-27,2013-01-27,2013-01-28,2013-01-28,Mon ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,5,2013,2013-01-27,2013-02-02,N,Wk.05 - 13,2013-01-27 00:00:00,2013-02-02 00:00:00,2013W05 ,2013W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2013,N,2012-01-28,2011-01-28,2012-10-28,2012-07-28,2012-12-28,2012-11-28,2013-01-21,2013-01-14,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-03,2013-01-01,2013-07-01,2013-08-01,2013-07-28,0,-1,-3,-17,-116,0,-1,-4,-17,-17,41488,215,34,3,7,31,5926,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-03,03-Aug-2013,Aug 3rd 2013,Sat 08-03-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-07-28,2013-07-29,2013-08-03,Sat ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,31,2013,2013-07-28,2013-08-03,N,Wk.31 - 13,2013-07-28 00:00:00,2013-08-03 00:00:00,2013W31 ,2013W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2013,N,2012-08-03,2011-08-03,2013-05-03,2013-02-03,2013-07-03,2013-06-03,2013-07-27,2013-07-20,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-14,2013-01-01,2013-04-01,2013-06-01,2013-06-09,0,-2,-5,-24,-166,0,-2,-6,-24,-24,41438,165,75,14,6,24,5919,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-15,14-Jun-2013,Jun 14th 2013,Fri 06-14-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-09,2013-06-10,2013-06-14,Fri ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,24,2013,2013-06-09,2013-06-15,N,Wk.24 - 13,2013-06-09 00:00:00,2013-06-15 00:00:00,2013W24 ,2013W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2013,N,2012-06-14,2011-06-14,2013-03-14,2012-12-14,2013-05-14,2013-04-14,2013-06-07,2013-05-31,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-08,2013-01-01,2013-07-01,2013-07-01,2013-07-07,0,-1,-4,-20,-142,0,-1,-5,-20,-20,41462,189,8,8,2,28,5923,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-13,08-Jul-2013,Jul 8th 2013,Mon 07-08-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-07,2013-07-08,2013-07-08,Mon ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,28,2013,2013-07-07,2013-07-13,N,Wk.28 - 13,2013-07-07 00:00:00,2013-07-13 00:00:00,2013W28 ,2013W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2013,N,2012-07-08,2011-07-08,2013-04-08,2013-01-08,2013-06-08,2013-05-08,2013-07-01,2013-06-24,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-30,2013-01-01,2013-10-01,2013-11-01,2013-11-24,0,0,0,0,3,0,0,0,0,0,41607,334,61,30,7,48,5943,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-30,30-Nov-2013,Nov 30th 2013,Sat 11-30-13,0,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-11-24,2013-11-24,2013-11-25,2013-11-30,Sat ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,48,2013,2013-11-24,2013-11-30,N,Wk.48 - 13,2013-11-24 00:00:00,2013-11-30 00:00:00,2013W48 ,2013W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2013,N,2012-11-30,2011-11-30,2013-08-30,2013-05-30,2013-10-30,2013-09-30,2013-11-23,2013-11-16,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-10,2013-01-01,2013-01-01,2013-01-01,2013-01-06,0,-3,-10,-46,-321,0,-3,-11,-46,-46,41283,10,10,10,5,2,5897,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-12,10-Jan-2013,Jan 10th 2013,Thu 01-10-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-06,2013-01-07,2013-01-10,Thu ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,2,2013,2013-01-06,2013-01-12,N,Wk.02 - 13,2013-01-06 00:00:00,2013-01-12 00:00:00,2013W02 ,2013W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2013,N,2012-01-10,2011-01-10,2012-10-10,2012-07-10,2012-12-10,2012-11-10,2013-01-03,2012-12-27,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-18,2013-01-01,2013-04-01,2013-05-01,2013-05-12,0,-2,-6,-28,-193,0,-2,-7,-28,-28,41411,138,48,18,7,20,5915,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-18,18-May-2013,May 18th 2013,Sat 05-18-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-12,2013-05-13,2013-05-18,Sat ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,20,2013,2013-05-12,2013-05-18,N,Wk.20 - 13,2013-05-12 00:00:00,2013-05-18 00:00:00,2013W20 ,2013W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2013,N,2012-05-18,2011-05-18,2013-02-18,2012-11-18,2013-04-18,2013-03-18,2013-05-11,2013-05-04,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-15,2013-01-01,2013-04-01,2013-04-01,2013-04-14,0,-2,-7,-32,-226,0,-2,-8,-32,-32,41378,105,15,15,2,16,5911,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-20,15-Apr-2013,Apr 15th 2013,Mon 04-15-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-14,2013-04-15,2013-04-15,Mon ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,16,2013,2013-04-14,2013-04-20,N,Wk.16 - 13,2013-04-14 00:00:00,2013-04-20 00:00:00,2013W16 ,2013W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2013,N,2012-04-15,2011-04-15,2013-01-15,2012-10-15,2013-03-15,2013-02-15,2013-04-08,2013-04-01,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-12,2013-01-01,2013-01-01,2013-03-01,2013-03-10,0,-3,-8,-37,-260,0,-3,-9,-37,-37,41344,71,71,12,3,11,5906,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-16,12-Mar-2013,Mar 12th 2013,Tue 03-12-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-10,2013-03-11,2013-03-12,Tue ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,11,2013,2013-03-10,2013-03-16,N,Wk.11 - 13,2013-03-10 00:00:00,2013-03-16 00:00:00,2013W11 ,2013W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2013,N,2012-03-12,2011-03-12,2012-12-12,2012-09-12,2013-02-12,2013-01-12,2013-03-05,2013-02-26,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-09,2013-01-01,2013-10-01,2013-11-01,2013-11-03,0,0,0,-3,-18,0,0,-1,-3,-3,41586,313,40,9,7,45,5940,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-09,09-Nov-2013,Nov 9th 2013,Sat 11-09-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-03,2013-11-04,2013-11-09,Sat ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,45,2013,2013-11-03,2013-11-09,N,Wk.45 - 13,2013-11-03 00:00:00,2013-11-09 00:00:00,2013W45 ,2013W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2013,N,2012-11-09,2011-11-09,2013-08-09,2013-05-09,2013-10-09,2013-09-09,2013-11-02,2013-10-26,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-14,2013-01-01,2013-01-01,2013-03-01,2013-03-10,0,-3,-8,-37,-258,0,-3,-9,-37,-37,41346,73,73,14,5,11,5906,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-16,14-Mar-2013,Mar 14th 2013,Thu 03-14-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-10,2013-03-11,2013-03-14,Thu ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,11,2013,2013-03-10,2013-03-16,N,Wk.11 - 13,2013-03-10 00:00:00,2013-03-16 00:00:00,2013W11 ,2013W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2013,N,2012-03-14,2011-03-14,2012-12-14,2012-09-14,2013-02-14,2013-01-14,2013-03-07,2013-02-28,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-03,2013-01-01,2013-07-01,2013-09-01,2013-09-01,0,-1,-2,-12,-85,0,-1,-3,-12,-12,41519,246,65,3,3,36,5931,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-07,03-Sep-2013,Sep 3rd 2013,Tue 09-03-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-01,2013-09-02,2013-09-03,Tue ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,36,2013,2013-09-01,2013-09-07,N,Wk.36 - 13,2013-09-01 00:00:00,2013-09-07 00:00:00,2013W36 ,2013W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2013,N,2012-09-03,2011-09-03,2013-06-03,2013-03-03,2013-08-03,2013-07-03,2013-08-27,2013-08-20,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-16,2013-01-01,2013-04-01,2013-05-01,2013-05-12,0,-2,-6,-28,-195,0,-2,-7,-28,-28,41409,136,46,16,5,20,5915,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-18,16-May-2013,May 16th 2013,Thu 05-16-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-12,2013-05-13,2013-05-16,Thu ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,20,2013,2013-05-12,2013-05-18,N,Wk.20 - 13,2013-05-12 00:00:00,2013-05-18 00:00:00,2013W20 ,2013W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2013,N,2012-05-16,2011-05-16,2013-02-16,2012-11-16,2013-04-16,2013-03-16,2013-05-09,2013-05-02,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-27,2013-01-01,2013-10-01,2013-10-01,2013-10-27,0,0,-1,-4,-31,0,0,-1,-4,-5,41573,300,27,27,1,44,5939,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-11-02,27-Oct-2013,Oct 27th 2013,Sun 10-27-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-10-27,2013-10-27,2013-10-21,2013-10-27,Sun ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,44,2013,2013-10-27,2013-11-02,Y,Wk.44 - 13,2013-10-27 00:00:00,2013-11-02 00:00:00,2013W44 ,2013W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2013,N,2012-10-27,2011-10-27,2013-07-27,2013-04-27,2013-09-27,2013-08-27,2013-10-20,2013-10-13,0,0,0,0,1,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-21,2013-01-01,2013-07-01,2013-08-01,2013-08-18,0,-1,-3,-14,-98,0,-1,-4,-14,-14,41506,233,52,21,4,34,5929,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-24,21-Aug-2013,Aug 21st 2013,Wed 08-21-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-18,2013-08-19,2013-08-21,Wed ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,34,2013,2013-08-18,2013-08-24,N,Wk.34 - 13,2013-08-18 00:00:00,2013-08-24 00:00:00,2013W34 ,2013W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2013,N,2012-08-21,2011-08-21,2013-05-21,2013-02-21,2013-07-21,2013-06-21,2013-08-14,2013-08-07,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-25,2013-01-01,2013-10-01,2013-10-01,2013-10-20,0,0,-1,-5,-33,0,0,-2,-5,-5,41571,298,25,25,6,43,5938,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-26,25-Oct-2013,Oct 25th 2013,Fri 10-25-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-20,2013-10-21,2013-10-25,Fri ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,43,2013,2013-10-20,2013-10-26,N,Wk.43 - 13,2013-10-20 00:00:00,2013-10-26 00:00:00,2013W43 ,2013W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2013,N,2012-10-25,2011-10-25,2013-07-25,2013-04-25,2013-09-25,2013-08-25,2013-10-18,2013-10-11,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-24,2013-01-01,2013-07-01,2013-09-01,2013-09-22,0,-1,-2,-9,-64,0,-1,-3,-9,-9,41540,267,86,24,3,39,5934,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-28,24-Sep-2013,Sep 24th 2013,Tue 09-24-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-22,2013-09-23,2013-09-24,Tue ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,39,2013,2013-09-22,2013-09-28,N,Wk.39 - 13,2013-09-22 00:00:00,2013-09-28 00:00:00,2013W39 ,2013W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2013,N,2012-09-24,2011-09-24,2013-06-24,2013-03-24,2013-08-24,2013-07-24,2013-09-17,2013-09-10,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-27,2013-01-01,2013-01-01,2013-01-01,2013-01-27,0,-3,-10,-43,-304,0,-3,-10,-43,-44,41300,27,27,27,1,5,5900,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-02-02,27-Jan-2013,Jan 27th 2013,Sun 01-27-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-01-27,2013-01-27,2013-01-21,2013-01-27,Sun ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,5,2013,2013-01-27,2013-02-02,Y,Wk.05 - 13,2013-01-27 00:00:00,2013-02-02 00:00:00,2013W05 ,2013W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2013,N,2012-01-27,2011-01-27,2012-10-27,2012-07-27,2012-12-27,2012-11-27,2013-01-20,2013-01-13,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-10,2013-01-01,2013-01-01,2013-03-01,2013-03-10,0,-3,-8,-37,-262,0,-3,-9,-37,-38,41342,69,69,10,1,11,5906,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-16,10-Mar-2013,Mar 10th 2013,Sun 03-10-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-10,2013-03-04,2013-03-10,Sun ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,11,2013,2013-03-10,2013-03-16,Y,Wk.11 - 13,2013-03-10 00:00:00,2013-03-16 00:00:00,2013W11 ,2013W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2013,N,2012-03-10,2011-03-10,2012-12-10,2012-09-10,2013-02-10,2013-01-10,2013-03-03,2013-02-24,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-14,2013-01-01,2013-04-01,2013-05-01,2013-05-12,0,-2,-6,-28,-197,0,-2,-7,-28,-28,41407,134,44,14,3,20,5915,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-18,14-May-2013,May 14th 2013,Tue 05-14-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-12,2013-05-13,2013-05-14,Tue ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,20,2013,2013-05-12,2013-05-18,N,Wk.20 - 13,2013-05-12 00:00:00,2013-05-18 00:00:00,2013W20 ,2013W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2013,N,2012-05-14,2011-05-14,2013-02-14,2012-11-14,2013-04-14,2013-03-14,2013-05-07,2013-04-30,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-31,2013-01-01,2013-10-01,2013-12-01,2013-12-29,0,0,1,5,34,1,1,1,5,5,41638,365,92,31,3,53,5948,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-31,31-Dec-2013,Dec 31st 2013,Tue 12-31-13,0,0,0,0,2013-12-21,365,92,31,3,2013-12-29,2013-12-29,2013-12-29,2013-12-29,2013-12-30,2013-12-31,Tue ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,1,2014,2013-12-29,2014-01-04,N,Wk.53 - 13,2013-12-29 00:00:00,2013-12-31 00:00:00,2013W53 ,2013W53 ,12/29/13 - 12/31/13,12/29 - 12/31,2013,N,2012-12-31,2011-12-31,2013-09-30,2013-06-30,2013-11-30,2013-10-31,2013-12-24,2013-12-17,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-01,2013-01-01,2013-07-01,2013-09-01,2013-09-01,0,-1,-2,-12,-87,0,-1,-3,-12,-13,41517,244,63,1,1,36,5931,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-07,01-Sep-2013,Sep 1st 2013,Sun 09-01-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-01,2013-08-26,2013-09-01,Sun ,2013M09,Sep-2013,Y,2013M09 ,Y,Year 2013 - Quarter 03,2013Q03 ,N,36,2013,2013-09-01,2013-09-07,Y,Wk.36 - 13,2013-09-01 00:00:00,2013-09-07 00:00:00,2013W36 ,2013W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2013,N,2012-09-01,2011-09-01,2013-06-01,2013-03-01,2013-08-01,2013-07-01,2013-08-25,2013-08-18,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-13,2013-01-01,2013-04-01,2013-04-01,2013-04-07,0,-2,-7,-33,-228,0,-2,-8,-33,-33,41376,103,13,13,7,15,5910,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-13,13-Apr-2013,Apr 13th 2013,Sat 04-13-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-07,2013-04-08,2013-04-13,Sat ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,15,2013,2013-04-07,2013-04-13,N,Wk.15 - 13,2013-04-07 00:00:00,2013-04-13 00:00:00,2013W15 ,2013W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2013,N,2012-04-13,2011-04-13,2013-01-13,2012-10-13,2013-03-13,2013-02-13,2013-04-06,2013-03-30,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-09,2013-01-01,2013-01-01,2013-02-01,2013-02-03,0,-3,-9,-42,-291,0,-3,-10,-42,-42,41313,40,40,9,7,6,5901,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-09,09-Feb-2013,Feb 9th 2013,Sat 02-09-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-03,2013-02-04,2013-02-09,Sat ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,6,2013,2013-02-03,2013-02-09,N,Wk.06 - 13,2013-02-03 00:00:00,2013-02-09 00:00:00,2013W06 ,2013W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2013,N,2012-02-09,2011-02-09,2012-11-09,2012-08-09,2013-01-09,2012-12-09,2013-02-02,2013-01-26,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-27,2013-01-01,2013-10-01,2013-12-01,2013-12-22,0,0,1,4,30,0,0,0,4,4,41634,361,88,27,6,52,5947,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-28,27-Dec-2013,Dec 27th 2013,Fri 12-27-13,0,0,0,0,2013-12-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-22,2013-12-23,2013-12-27,Fri ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,52,2013,2013-12-22,2013-12-28,N,Wk.52 - 13,2013-12-22 00:00:00,2013-12-28 00:00:00,2013W52 ,2013W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2013,N,2012-12-27,2011-12-27,2013-09-27,2013-06-27,2013-11-27,2013-10-27,2013-12-20,2013-12-13,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-19,2013-01-01,2013-07-01,2013-08-01,2013-08-18,0,-1,-3,-14,-100,0,-1,-4,-14,-14,41504,231,50,19,2,34,5929,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-24,19-Aug-2013,Aug 19th 2013,Mon 08-19-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-18,2013-08-19,2013-08-19,Mon ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,34,2013,2013-08-18,2013-08-24,N,Wk.34 - 13,2013-08-18 00:00:00,2013-08-24 00:00:00,2013W34 ,2013W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2013,N,2012-08-19,2011-08-19,2013-05-19,2013-02-19,2013-07-19,2013-06-19,2013-08-12,2013-08-05,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-11,2013-01-01,2013-04-01,2013-04-01,2013-04-07,0,-2,-7,-33,-230,0,-2,-8,-33,-33,41374,101,11,11,5,15,5910,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-13,11-Apr-2013,Apr 11th 2013,Thu 04-11-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-07,2013-04-08,2013-04-11,Thu ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,15,2013,2013-04-07,2013-04-13,N,Wk.15 - 13,2013-04-07 00:00:00,2013-04-13 00:00:00,2013W15 ,2013W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2013,N,2012-04-11,2011-04-11,2013-01-11,2012-10-11,2013-03-11,2013-02-11,2013-04-04,2013-03-28,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-06,2013-01-01,2013-10-01,2013-12-01,2013-12-01,0,0,1,1,9,0,0,0,1,1,41613,340,67,6,6,49,5944,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-07,06-Dec-2013,Dec 6th 2013,Fri 12-06-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-01,2013-12-02,2013-12-06,Fri ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,49,2013,2013-12-01,2013-12-07,N,Wk.49 - 13,2013-12-01 00:00:00,2013-12-07 00:00:00,2013W49 ,2013W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2013,N,2012-12-06,2011-12-06,2013-09-06,2013-06-06,2013-11-06,2013-10-06,2013-11-29,2013-11-22,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-31,2013-01-01,2013-01-01,2013-03-01,2013-03-31,0,-3,-8,-34,-241,0,-2,-8,-34,-35,41363,90,90,31,1,14,5909,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-04-06,31-Mar-2013,Mar 31st 2013,Sun 03-31-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2013-03-31,2013-03-31,2013-03-31,2013-03-25,2013-03-31,Sun ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,14,2013,2013-03-31,2013-04-06,Y,Wk.14 - 13,2013-03-31 00:00:00,2013-04-06 00:00:00,2013W14 ,2013W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2013,N,2012-03-31,2011-03-31,2012-12-31,2012-09-30,2013-02-28,2013-01-31,2013-03-24,2013-03-17,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-22,2013-01-01,2013-07-01,2013-09-01,2013-09-22,0,-1,-2,-9,-66,0,-1,-3,-9,-10,41538,265,84,22,1,39,5934,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-28,22-Sep-2013,Sep 22nd 2013,Sun 09-22-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-22,2013-09-16,2013-09-22,Sun ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,39,2013,2013-09-22,2013-09-28,Y,Wk.39 - 13,2013-09-22 00:00:00,2013-09-28 00:00:00,2013W39 ,2013W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2013,N,2012-09-22,2011-09-22,2013-06-22,2013-03-22,2013-08-22,2013-07-22,2013-09-15,2013-09-08,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-06,2013-01-01,2013-01-01,2013-01-01,2013-01-06,0,-3,-10,-46,-325,0,-3,-11,-46,-47,41279,6,6,6,1,2,5897,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-12,06-Jan-2013,Jan 6th 2013,Sun 01-06-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-06,2012-12-31,2013-01-06,Sun ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,2,2013,2013-01-06,2013-01-12,Y,Wk.02 - 13,2013-01-06 00:00:00,2013-01-12 00:00:00,2013W02 ,2013W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2013,N,2012-01-06,2011-01-06,2012-10-06,2012-07-06,2012-12-06,2012-11-06,2012-12-30,2012-12-23,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-04,2013-01-01,2013-01-01,2013-01-01,2013-01-01,0,-3,-10,-47,-327,0,-3,-11,-47,-47,41277,4,4,4,6,1,5896,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-05,04-Jan-2013,Jan 4th 2013,Fri 01-04-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2013-01-04,Fri ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,1,2013,2012-12-30,2013-01-05,N,Wk.01 - 13,2013-01-01 00:00:00,2013-01-05 00:00:00,2013W01 ,2013W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2013,N,2012-01-04,2011-01-04,2012-10-04,2012-07-04,2012-12-04,2012-11-04,2012-12-28,2012-12-21,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-16,2013-01-01,2013-07-01,2013-07-01,2013-07-14,0,-1,-4,-19,-134,0,-1,-5,-19,-19,41470,197,16,16,3,29,5924,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-20,16-Jul-2013,Jul 16th 2013,Tue 07-16-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-14,2013-07-15,2013-07-16,Tue ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,29,2013,2013-07-14,2013-07-20,N,Wk.29 - 13,2013-07-14 00:00:00,2013-07-20 00:00:00,2013W29 ,2013W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2013,N,2012-07-16,2011-07-16,2013-04-16,2013-01-16,2013-06-16,2013-05-16,2013-07-09,2013-07-02,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-03,2013-01-01,2013-10-01,2013-11-01,2013-11-03,0,0,0,-3,-24,0,0,-1,-3,-4,41580,307,34,3,1,45,5940,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-09,03-Nov-2013,Nov 3rd 2013,Sun 11-03-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-03,2013-10-28,2013-11-03,Sun ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,45,2013,2013-11-03,2013-11-09,Y,Wk.45 - 13,2013-11-03 00:00:00,2013-11-09 00:00:00,2013W45 ,2013W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2013,N,2012-11-03,2011-11-03,2013-08-03,2013-05-03,2013-10-03,2013-09-03,2013-10-27,2013-10-20,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-25,2013-01-01,2013-07-01,2013-08-01,2013-08-25,0,-1,-3,-13,-94,0,-1,-3,-13,-14,41510,237,56,25,1,35,5930,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-31,25-Aug-2013,Aug 25th 2013,Sun 08-25-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-08-25,2013-08-25,2013-08-19,2013-08-25,Sun ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,35,2013,2013-08-25,2013-08-31,Y,Wk.35 - 13,2013-08-25 00:00:00,2013-08-31 00:00:00,2013W35 ,2013W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2013,N,2012-08-25,2011-08-25,2013-05-25,2013-02-25,2013-07-25,2013-06-25,2013-08-18,2013-08-11,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-24,2013-01-01,2013-10-01,2013-11-01,2013-11-24,0,0,0,0,-3,0,0,0,0,-1,41601,328,55,24,1,48,5943,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-30,24-Nov-2013,Nov 24th 2013,Sun 11-24-13,1,1,1,1,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-11-24,2013-11-24,2013-11-18,2013-11-24,Sun ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,48,2013,2013-11-24,2013-11-30,Y,Wk.48 - 13,2013-11-24 00:00:00,2013-11-30 00:00:00,2013W48 ,2013W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2013,N,2012-11-24,2011-11-24,2013-08-24,2013-05-24,2013-10-24,2013-09-24,2013-11-17,2013-11-10,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-12,2013-01-01,2013-04-01,2013-05-01,2013-05-12,0,-2,-6,-28,-199,0,-2,-7,-28,-29,41405,132,42,12,1,20,5915,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-18,12-May-2013,May 12th 2013,Sun 05-12-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-12,2013-05-06,2013-05-12,Sun ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,20,2013,2013-05-12,2013-05-18,Y,Wk.20 - 13,2013-05-12 00:00:00,2013-05-18 00:00:00,2013W20 ,2013W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2013,N,2012-05-12,2011-05-12,2013-02-12,2012-11-12,2013-04-12,2013-03-12,2013-05-05,2013-04-28,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-17,2013-01-01,2013-07-01,2013-08-01,2013-08-11,0,-1,-3,-15,-102,0,-1,-4,-15,-15,41502,229,48,17,7,33,5928,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-17,17-Aug-2013,Aug 17th 2013,Sat 08-17-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-11,2013-08-12,2013-08-17,Sat ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,33,2013,2013-08-11,2013-08-17,N,Wk.33 - 13,2013-08-11 00:00:00,2013-08-17 00:00:00,2013W33 ,2013W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2013,N,2012-08-17,2011-08-17,2013-05-17,2013-02-17,2013-07-17,2013-06-17,2013-08-10,2013-08-03,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-21,2013-01-01,2013-10-01,2013-10-01,2013-10-20,0,0,-1,-5,-37,0,0,-2,-5,-5,41567,294,21,21,2,43,5938,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-26,21-Oct-2013,Oct 21st 2013,Mon 10-21-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-20,2013-10-21,2013-10-21,Mon ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,43,2013,2013-10-20,2013-10-26,N,Wk.43 - 13,2013-10-20 00:00:00,2013-10-26 00:00:00,2013W43 ,2013W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2013,N,2012-10-21,2011-10-21,2013-07-21,2013-04-21,2013-09-21,2013-08-21,2013-10-14,2013-10-07,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-27,2013-01-01,2013-01-01,2013-03-01,2013-03-24,0,-3,-8,-35,-245,0,-3,-9,-35,-35,41359,86,86,27,4,13,5908,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-30,27-Mar-2013,Mar 27th 2013,Wed 03-27-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-24,2013-03-25,2013-03-27,Wed ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,13,2013,2013-03-24,2013-03-30,N,Wk.13 - 13,2013-03-24 00:00:00,2013-03-30 00:00:00,2013W13 ,2013W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2013,N,2012-03-27,2011-03-27,2012-12-27,2012-09-27,2013-02-27,2013-01-27,2013-03-20,2013-03-13,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-22,2013-01-01,2013-10-01,2013-11-01,2013-11-17,0,0,0,-1,-5,0,0,-1,-1,-1,41599,326,53,22,6,47,5942,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-23,22-Nov-2013,Nov 22nd 2013,Fri 11-22-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-17,2013-11-18,2013-11-22,Fri ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,47,2013,2013-11-17,2013-11-23,N,Wk.47 - 13,2013-11-17 00:00:00,2013-11-23 00:00:00,2013W47 ,2013W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2013,N,2012-11-22,2011-11-22,2013-08-22,2013-05-22,2013-10-22,2013-09-22,2013-11-15,2013-11-08,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-07,2013-01-01,2013-07-01,2013-07-01,2013-07-07,0,-1,-4,-20,-143,0,-1,-5,-20,-21,41461,188,7,7,1,28,5923,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-13,07-Jul-2013,Jul 7th 2013,Sun 07-07-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-07,2013-07-01,2013-07-07,Sun ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,28,2013,2013-07-07,2013-07-13,Y,Wk.28 - 13,2013-07-07 00:00:00,2013-07-13 00:00:00,2013W28 ,2013W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2013,N,2012-07-07,2011-07-07,2013-04-07,2013-01-07,2013-06-07,2013-05-07,2013-06-30,2013-06-23,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-11,2013-01-01,2013-07-01,2013-09-01,2013-09-08,0,-1,-2,-11,-77,0,-1,-3,-11,-11,41527,254,73,11,4,37,5932,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-14,11-Sep-2013,Sep 11th 2013,Wed 09-11-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-08,2013-09-09,2013-09-11,Wed ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,37,2013,2013-09-08,2013-09-14,N,Wk.37 - 13,2013-09-08 00:00:00,2013-09-14 00:00:00,2013W37 ,2013W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2013,N,2012-09-11,2011-09-11,2013-06-11,2013-03-11,2013-08-11,2013-07-11,2013-09-04,2013-08-28,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-19,2013-01-01,2013-10-01,2013-10-01,2013-10-13,0,0,-1,-6,-39,0,0,-2,-6,-6,41565,292,19,19,7,42,5937,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-19,19-Oct-2013,Oct 19th 2013,Sat 10-19-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-13,2013-10-14,2013-10-19,Sat ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,42,2013,2013-10-13,2013-10-19,N,Wk.42 - 13,2013-10-13 00:00:00,2013-10-19 00:00:00,2013W42 ,2013W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2013,N,2012-10-19,2011-10-19,2013-07-19,2013-04-19,2013-09-19,2013-08-19,2013-10-12,2013-10-05,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-23,2013-01-01,2013-10-01,2013-12-01,2013-12-22,0,0,1,4,26,0,0,0,4,4,41630,357,84,23,2,52,5947,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-28,23-Dec-2013,Dec 23rd 2013,Mon 12-23-13,0,0,0,0,2013-12-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-22,2013-12-23,2013-12-23,Mon ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,52,2013,2013-12-22,2013-12-28,N,Wk.52 - 13,2013-12-22 00:00:00,2013-12-28 00:00:00,2013W52 ,2013W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2013,N,2012-12-23,2011-12-23,2013-09-23,2013-06-23,2013-11-23,2013-10-23,2013-12-16,2013-12-09,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-24,2013-01-01,2013-04-01,2013-05-01,2013-05-19,0,-2,-6,-27,-187,0,-2,-7,-27,-27,41417,144,54,24,6,21,5916,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-25,24-May-2013,May 24th 2013,Fri 05-24-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-19,2013-05-20,2013-05-24,Fri ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,21,2013,2013-05-19,2013-05-25,N,Wk.21 - 13,2013-05-19 00:00:00,2013-05-25 00:00:00,2013W21 ,2013W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2013,N,2012-05-24,2011-05-24,2013-02-24,2012-11-24,2013-04-24,2013-03-24,2013-05-17,2013-05-10,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-05,2013-01-01,2013-10-01,2013-11-01,2013-11-03,0,0,0,-3,-22,0,0,-1,-3,-3,41582,309,36,5,3,45,5940,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-09,05-Nov-2013,Nov 5th 2013,Tue 11-05-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-03,2013-11-04,2013-11-05,Tue ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,45,2013,2013-11-03,2013-11-09,N,Wk.45 - 13,2013-11-03 00:00:00,2013-11-09 00:00:00,2013W45 ,2013W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2013,N,2012-11-05,2011-11-05,2013-08-05,2013-05-05,2013-10-05,2013-09-05,2013-10-29,2013-10-22,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-29,2013-01-01,2013-04-01,2013-05-01,2013-05-26,0,-2,-6,-26,-182,0,-2,-6,-26,-26,41422,149,59,29,4,22,5917,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-06-01,29-May-2013,May 29th 2013,Wed 05-29-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-05-26,2013-05-26,2013-05-27,2013-05-29,Wed ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,22,2013,2013-05-26,2013-06-01,N,Wk.22 - 13,2013-05-26 00:00:00,2013-06-01 00:00:00,2013W22 ,2013W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2013,N,2012-05-29,2011-05-29,2013-02-28,2012-11-29,2013-04-29,2013-03-29,2013-05-22,2013-05-15,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-02,2013-01-01,2013-01-01,2013-01-01,2013-01-01,0,-3,-10,-47,-329,0,-3,-11,-47,-47,41275,2,2,2,4,1,5896,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-05,02-Jan-2013,Jan 2nd 2013,Wed 01-02-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2013-01-02,Wed ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,1,2013,2012-12-30,2013-01-05,N,Wk.01 - 13,2013-01-01 00:00:00,2013-01-05 00:00:00,2013W01 ,2013W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2013,N,2012-01-02,2011-01-02,2012-10-02,2012-07-02,2012-12-02,2012-11-02,2012-12-26,2012-12-19,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-02,2013-01-01,2013-10-01,2013-12-01,2013-12-01,0,0,1,1,5,0,0,0,1,1,41609,336,63,2,2,49,5944,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-07,02-Dec-2013,Dec 2nd 2013,Mon 12-02-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-01,2013-12-02,2013-12-02,Mon ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,49,2013,2013-12-01,2013-12-07,N,Wk.49 - 13,2013-12-01 00:00:00,2013-12-07 00:00:00,2013W49 ,2013W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2013,N,2012-12-02,2011-12-02,2013-09-02,2013-06-02,2013-11-02,2013-10-02,2013-11-25,2013-11-18,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-24,2013-01-01,2013-01-01,2013-02-01,2013-02-24,0,-3,-9,-39,-276,0,-3,-9,-39,-40,41328,55,55,24,1,9,5904,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-03-02,24-Feb-2013,Feb 24th 2013,Sun 02-24-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-02-24,2013-02-24,2013-02-18,2013-02-24,Sun ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,9,2013,2013-02-24,2013-03-02,Y,Wk.09 - 13,2013-02-24 00:00:00,2013-03-02 00:00:00,2013W09 ,2013W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2013,N,2012-02-24,2011-02-24,2012-11-24,2012-08-24,2013-01-24,2012-12-24,2013-02-17,2013-02-10,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-23,2013-01-01,2013-01-01,2013-01-01,2013-01-20,0,-3,-10,-44,-308,0,-3,-11,-44,-44,41296,23,23,23,4,4,5899,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-26,23-Jan-2013,Jan 23rd 2013,Wed 01-23-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-20,2013-01-21,2013-01-23,Wed ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,4,2013,2013-01-20,2013-01-26,N,Wk.04 - 13,2013-01-20 00:00:00,2013-01-26 00:00:00,2013W04 ,2013W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2013,N,2012-01-23,2011-01-23,2012-10-23,2012-07-23,2012-12-23,2012-11-23,2013-01-16,2013-01-09,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-16,2013-01-01,2013-01-01,2013-01-01,2013-01-13,0,-3,-10,-45,-315,0,-3,-11,-45,-45,41289,16,16,16,4,3,5898,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-19,16-Jan-2013,Jan 16th 2013,Wed 01-16-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-13,2013-01-14,2013-01-16,Wed ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,3,2013,2013-01-13,2013-01-19,N,Wk.03 - 13,2013-01-13 00:00:00,2013-01-19 00:00:00,2013W03 ,2013W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2013,N,2012-01-16,2011-01-16,2012-10-16,2012-07-16,2012-12-16,2012-11-16,2013-01-09,2013-01-02,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-05,2013-01-01,2013-04-01,2013-04-01,2013-03-31,0,-2,-7,-34,-236,0,-2,-8,-34,-34,41368,95,5,5,6,14,5909,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-06,05-Apr-2013,Apr 5th 2013,Fri 04-05-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-03-31,2013-04-01,2013-04-05,Fri ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,14,2013,2013-03-31,2013-04-06,N,Wk.14 - 13,2013-03-31 00:00:00,2013-04-06 00:00:00,2013W14 ,2013W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2013,N,2012-04-05,2011-04-05,2013-01-05,2012-10-05,2013-03-05,2013-02-05,2013-03-29,2013-03-22,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-27,2013-01-01,2013-04-01,2013-05-01,2013-05-26,0,-2,-6,-26,-184,0,-2,-6,-26,-26,41420,147,57,27,2,22,5917,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-06-01,27-May-2013,May 27th 2013,Mon 05-27-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-05-26,2013-05-26,2013-05-27,2013-05-27,Mon ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,22,2013,2013-05-26,2013-06-01,N,Wk.22 - 13,2013-05-26 00:00:00,2013-06-01 00:00:00,2013W22 ,2013W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2013,N,2012-05-27,2011-05-27,2013-02-27,2012-11-27,2013-04-27,2013-03-27,2013-05-20,2013-05-13,0,0,0,1,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-12,2013-01-01,2013-10-01,2013-10-01,2013-10-06,0,0,-1,-7,-46,0,0,-2,-7,-7,41558,285,12,12,7,41,5936,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-12,12-Oct-2013,Oct 12th 2013,Sat 10-12-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-06,2013-10-07,2013-10-12,Sat ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,41,2013,2013-10-06,2013-10-12,N,Wk.41 - 13,2013-10-06 00:00:00,2013-10-12 00:00:00,2013W41 ,2013W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2013,N,2012-10-12,2011-10-12,2013-07-12,2013-04-12,2013-09-12,2013-08-12,2013-10-05,2013-09-28,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-01,2013-01-01,2013-01-01,2013-03-01,2013-02-24,0,-3,-8,-39,-271,0,-3,-9,-39,-39,41333,60,60,1,6,9,5904,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-02,01-Mar-2013,Mar 1st 2013,Fri 03-01-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-02-24,2013-02-25,2013-03-01,Fri ,2013M03,Mar-2013,Y,2013M03 ,Y,Year 2013 - Quarter 01,2013Q01 ,N,9,2013,2013-02-24,2013-03-02,N,Wk.09 - 13,2013-02-24 00:00:00,2013-03-02 00:00:00,2013W09 ,2013W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2013,N,2012-03-01,2011-03-01,2012-12-01,2012-09-01,2013-02-01,2013-01-01,2013-02-22,2013-02-15,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-26,2013-01-01,2013-04-01,2013-04-01,2013-04-21,0,-2,-7,-31,-215,0,-2,-8,-31,-31,41389,116,26,26,6,17,5912,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-27,26-Apr-2013,Apr 26th 2013,Fri 04-26-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-21,2013-04-22,2013-04-26,Fri ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,17,2013,2013-04-21,2013-04-27,N,Wk.17 - 13,2013-04-21 00:00:00,2013-04-27 00:00:00,2013W17 ,2013W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2013,N,2012-04-26,2011-04-26,2013-01-26,2012-10-26,2013-03-26,2013-02-26,2013-04-19,2013-04-12,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-20,2013-01-01,2013-10-01,2013-11-01,2013-11-17,0,0,0,-1,-7,0,0,-1,-1,-1,41597,324,51,20,4,47,5942,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-23,20-Nov-2013,Nov 20th 2013,Wed 11-20-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-17,2013-11-18,2013-11-20,Wed ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,47,2013,2013-11-17,2013-11-23,N,Wk.47 - 13,2013-11-17 00:00:00,2013-11-23 00:00:00,2013W47 ,2013W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2013,N,2012-11-20,2011-11-20,2013-08-20,2013-05-20,2013-10-20,2013-09-20,2013-11-13,2013-11-06,0,0,0,0,0,0,1,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-04,2013-01-01,2013-04-01,2013-06-01,2013-06-02,0,-2,-5,-25,-176,0,-2,-6,-25,-25,41428,155,65,4,3,23,5918,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-08,04-Jun-2013,Jun 4th 2013,Tue 06-04-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-02,2013-06-03,2013-06-04,Tue ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,23,2013,2013-06-02,2013-06-08,N,Wk.23 - 13,2013-06-02 00:00:00,2013-06-08 00:00:00,2013W23 ,2013W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2013,N,2012-06-04,2011-06-04,2013-03-04,2012-12-04,2013-05-04,2013-04-04,2013-05-28,2013-05-21,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-14,2013-01-01,2013-07-01,2013-09-01,2013-09-08,0,-1,-2,-11,-74,0,-1,-3,-11,-11,41530,257,76,14,7,37,5932,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-14,14-Sep-2013,Sep 14th 2013,Sat 09-14-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-08,2013-09-09,2013-09-14,Sat ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,37,2013,2013-09-08,2013-09-14,N,Wk.37 - 13,2013-09-08 00:00:00,2013-09-14 00:00:00,2013W37 ,2013W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2013,N,2012-09-14,2011-09-14,2013-06-14,2013-03-14,2013-08-14,2013-07-14,2013-09-07,2013-08-31,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-06,2013-01-01,2013-04-01,2013-05-01,2013-05-05,0,-2,-6,-29,-205,0,-2,-7,-29,-29,41399,126,36,6,2,19,5914,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-11,06-May-2013,May 6th 2013,Mon 05-06-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-05,2013-05-06,2013-05-06,Mon ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,19,2013,2013-05-05,2013-05-11,N,Wk.19 - 13,2013-05-05 00:00:00,2013-05-11 00:00:00,2013W19 ,2013W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2013,N,2012-05-06,2011-05-06,2013-02-06,2012-11-06,2013-04-06,2013-03-06,2013-04-29,2013-04-22,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-25,2013-01-01,2013-04-01,2013-06-01,2013-06-23,0,-2,-5,-22,-155,0,-2,-6,-22,-22,41449,176,86,25,3,26,5921,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-29,25-Jun-2013,Jun 25th 2013,Tue 06-25-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-23,2013-06-24,2013-06-25,Tue ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,26,2013,2013-06-23,2013-06-29,N,Wk.26 - 13,2013-06-23 00:00:00,2013-06-29 00:00:00,2013W26 ,2013W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2013,N,2012-06-25,2011-06-25,2013-03-25,2012-12-25,2013-05-25,2013-04-25,2013-06-18,2013-06-11,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-22,2013-01-01,2013-01-01,2013-02-01,2013-02-17,0,-3,-9,-40,-278,0,-3,-10,-40,-40,41326,53,53,22,6,8,5903,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-23,22-Feb-2013,Feb 22nd 2013,Fri 02-22-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-17,2013-02-18,2013-02-22,Fri ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,8,2013,2013-02-17,2013-02-23,N,Wk.08 - 13,2013-02-17 00:00:00,2013-02-23 00:00:00,2013W08 ,2013W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2013,N,2012-02-22,2011-02-22,2012-11-22,2012-08-22,2013-01-22,2012-12-22,2013-02-15,2013-02-08,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-19,2013-01-01,2013-10-01,2013-12-01,2013-12-15,0,0,1,3,22,0,0,0,3,3,41626,353,80,19,5,51,5946,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-21,19-Dec-2013,Dec 19th 2013,Thu 12-19-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-15,2013-12-16,2013-12-19,Thu ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,51,2013,2013-12-15,2013-12-21,N,Wk.51 - 13,2013-12-15 00:00:00,2013-12-21 00:00:00,2013W51 ,2013W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2013,N,2012-12-19,2011-12-19,2013-09-19,2013-06-19,2013-11-19,2013-10-19,2013-12-12,2013-12-05,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-30,2013-01-01,2013-07-01,2013-09-01,2013-09-29,0,-1,-2,-8,-58,0,0,-2,-8,-8,41546,273,92,30,2,40,5935,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-10-05,30-Sep-2013,Sep 30th 2013,Mon 09-30-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-09-29,2013-09-29,2013-09-30,2013-09-30,Mon ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,40,2013,2013-09-29,2013-10-05,N,Wk.40 - 13,2013-09-29 00:00:00,2013-10-05 00:00:00,2013W40 ,2013W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2013,N,2012-09-30,2011-09-30,2013-06-30,2013-03-30,2013-08-30,2013-07-30,2013-09-23,2013-09-16,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-26,2013-01-01,2013-10-01,2013-11-01,2013-11-24,0,0,0,0,-1,0,0,0,0,0,41603,330,57,26,3,48,5943,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-30,26-Nov-2013,Nov 26th 2013,Tue 11-26-13,1,1,1,1,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-11-24,2013-11-24,2013-11-25,2013-11-26,Tue ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,48,2013,2013-11-24,2013-11-30,N,Wk.48 - 13,2013-11-24 00:00:00,2013-11-30 00:00:00,2013W48 ,2013W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2013,N,2012-11-26,2011-11-26,2013-08-26,2013-05-26,2013-10-26,2013-09-26,2013-11-19,2013-11-12,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-25,2013-01-01,2013-04-01,2013-05-01,2013-05-19,0,-2,-6,-27,-186,0,-2,-7,-27,-27,41418,145,55,25,7,21,5916,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-25,25-May-2013,May 25th 2013,Sat 05-25-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-19,2013-05-20,2013-05-25,Sat ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,21,2013,2013-05-19,2013-05-25,N,Wk.21 - 13,2013-05-19 00:00:00,2013-05-25 00:00:00,2013W21 ,2013W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2013,N,2012-05-25,2011-05-25,2013-02-25,2012-11-25,2013-04-25,2013-03-25,2013-05-18,2013-05-11,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-14,2013-01-01,2013-10-01,2013-10-01,2013-10-13,0,0,-1,-6,-44,0,0,-2,-6,-6,41560,287,14,14,2,42,5937,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-19,14-Oct-2013,Oct 14th 2013,Mon 10-14-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-13,2013-10-14,2013-10-14,Mon ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,42,2013,2013-10-13,2013-10-19,N,Wk.42 - 13,2013-10-13 00:00:00,2013-10-19 00:00:00,2013W42 ,2013W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2013,N,2012-10-14,2011-10-14,2013-07-14,2013-04-14,2013-09-14,2013-08-14,2013-10-07,2013-09-30,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-30,2013-01-01,2013-04-01,2013-06-01,2013-06-30,0,-2,-5,-21,-150,0,-1,-5,-21,-22,41454,181,91,30,1,27,5922,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-07-06,30-Jun-2013,Jun 30th 2013,Sun 06-30-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-06-30,2013-06-30,2013-06-30,2013-06-24,2013-06-30,Sun ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,27,2013,2013-06-30,2013-07-06,Y,Wk.27 - 13,2013-06-30 00:00:00,2013-07-06 00:00:00,2013W27 ,2013W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2013,N,2012-06-30,2011-06-30,2013-03-30,2012-12-30,2013-05-30,2013-04-30,2013-06-23,2013-06-16,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-21,2013-01-01,2013-04-01,2013-04-01,2013-04-21,0,-2,-7,-31,-220,0,-2,-8,-31,-32,41384,111,21,21,1,17,5912,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-27,21-Apr-2013,Apr 21st 2013,Sun 04-21-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-21,2013-04-15,2013-04-21,Sun ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,17,2013,2013-04-21,2013-04-27,Y,Wk.17 - 13,2013-04-21 00:00:00,2013-04-27 00:00:00,2013W17 ,2013W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2013,N,2012-04-21,2011-04-21,2013-01-21,2012-10-21,2013-03-21,2013-02-21,2013-04-14,2013-04-07,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-16,2013-01-01,2013-10-01,2013-11-01,2013-11-10,0,0,0,-2,-11,0,0,-1,-2,-2,41593,320,47,16,7,46,5941,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-16,16-Nov-2013,Nov 16th 2013,Sat 11-16-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-10,2013-11-11,2013-11-16,Sat ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,46,2013,2013-11-10,2013-11-16,N,Wk.46 - 13,2013-11-10 00:00:00,2013-11-16 00:00:00,2013W46 ,2013W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2013,N,2012-11-16,2011-11-16,2013-08-16,2013-05-16,2013-10-16,2013-09-16,2013-11-09,2013-11-02,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-26,2013-01-01,2013-07-01,2013-07-01,2013-07-21,0,-1,-4,-18,-124,0,-1,-5,-18,-18,41480,207,26,26,6,30,5925,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-27,26-Jul-2013,Jul 26th 2013,Fri 07-26-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-21,2013-07-22,2013-07-26,Fri ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,30,2013,2013-07-21,2013-07-27,N,Wk.30 - 13,2013-07-21 00:00:00,2013-07-27 00:00:00,2013W30 ,2013W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2013,N,2012-07-26,2011-07-26,2013-04-26,2013-01-26,2013-06-26,2013-05-26,2013-07-19,2013-07-12,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-04,2013-01-01,2013-04-01,2013-05-01,2013-04-28,0,-2,-6,-30,-207,0,-2,-7,-30,-30,41397,124,34,4,7,18,5913,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-04,04-May-2013,May 4th 2013,Sat 05-04-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-04-28,2013-04-29,2013-05-04,Sat ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,18,2013,2013-04-28,2013-05-04,N,Wk.18 - 13,2013-04-28 00:00:00,2013-05-04 00:00:00,2013W18 ,2013W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2013,N,2012-05-04,2011-05-04,2013-02-04,2012-11-04,2013-04-04,2013-03-04,2013-04-27,2013-04-20,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-21,2013-01-01,2013-01-01,2013-01-01,2013-01-20,0,-3,-10,-44,-310,0,-3,-11,-44,-44,41294,21,21,21,2,4,5899,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-26,21-Jan-2013,Jan 21st 2013,Mon 01-21-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-20,2013-01-21,2013-01-21,Mon ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,4,2013,2013-01-20,2013-01-26,N,Wk.04 - 13,2013-01-20 00:00:00,2013-01-26 00:00:00,2013W04 ,2013W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2013,N,2012-01-21,2011-01-21,2012-10-21,2012-07-21,2012-12-21,2012-11-21,2013-01-14,2013-01-07,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-17,2013-01-01,2013-10-01,2013-12-01,2013-12-15,0,0,1,3,20,0,0,0,3,3,41624,351,78,17,3,51,5946,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-21,17-Dec-2013,Dec 17th 2013,Tue 12-17-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-15,2013-12-16,2013-12-17,Tue ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,51,2013,2013-12-15,2013-12-21,N,Wk.51 - 13,2013-12-15 00:00:00,2013-12-21 00:00:00,2013W51 ,2013W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2013,N,2012-12-17,2011-12-17,2013-09-17,2013-06-17,2013-11-17,2013-10-17,2013-12-10,2013-12-03,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-12,2013-01-01,2013-07-01,2013-09-01,2013-09-08,0,-1,-2,-11,-76,0,-1,-3,-11,-11,41528,255,74,12,5,37,5932,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-14,12-Sep-2013,Sep 12th 2013,Thu 09-12-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-08,2013-09-09,2013-09-12,Thu ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,37,2013,2013-09-08,2013-09-14,N,Wk.37 - 13,2013-09-08 00:00:00,2013-09-14 00:00:00,2013W37 ,2013W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2013,N,2012-09-12,2011-09-12,2013-06-12,2013-03-12,2013-08-12,2013-07-12,2013-09-05,2013-08-29,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-22,2013-01-01,2013-07-01,2013-07-01,2013-07-21,0,-1,-4,-18,-128,0,-1,-5,-18,-18,41476,203,22,22,2,30,5925,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-27,22-Jul-2013,Jul 22nd 2013,Mon 07-22-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-21,2013-07-22,2013-07-22,Mon ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,30,2013,2013-07-21,2013-07-27,N,Wk.30 - 13,2013-07-21 00:00:00,2013-07-27 00:00:00,2013W30 ,2013W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2013,N,2012-07-22,2011-07-22,2013-04-22,2013-01-22,2013-06-22,2013-05-22,2013-07-15,2013-07-08,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-13,2013-01-01,2013-10-01,2013-10-01,2013-10-13,0,0,-1,-6,-45,0,0,-2,-6,-7,41559,286,13,13,1,42,5937,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-19,13-Oct-2013,Oct 13th 2013,Sun 10-13-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-13,2013-10-07,2013-10-13,Sun ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,42,2013,2013-10-13,2013-10-19,Y,Wk.42 - 13,2013-10-13 00:00:00,2013-10-19 00:00:00,2013W42 ,2013W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2013,N,2012-10-13,2011-10-13,2013-07-13,2013-04-13,2013-09-13,2013-08-13,2013-10-06,2013-09-29,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-11,2013-01-01,2013-07-01,2013-08-01,2013-08-11,0,-1,-3,-15,-108,0,-1,-4,-15,-16,41496,223,42,11,1,33,5928,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-17,11-Aug-2013,Aug 11th 2013,Sun 08-11-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-11,2013-08-05,2013-08-11,Sun ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,33,2013,2013-08-11,2013-08-17,Y,Wk.33 - 13,2013-08-11 00:00:00,2013-08-17 00:00:00,2013W33 ,2013W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2013,N,2012-08-11,2011-08-11,2013-05-11,2013-02-11,2013-07-11,2013-06-11,2013-08-04,2013-07-28,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-08,2013-01-01,2013-07-01,2013-08-01,2013-08-04,0,-1,-3,-16,-111,0,-1,-4,-16,-16,41493,220,39,8,5,32,5927,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-10,08-Aug-2013,Aug 8th 2013,Thu 08-08-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-04,2013-08-05,2013-08-08,Thu ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,32,2013,2013-08-04,2013-08-10,N,Wk.32 - 13,2013-08-04 00:00:00,2013-08-10 00:00:00,2013W32 ,2013W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2013,N,2012-08-08,2011-08-08,2013-05-08,2013-02-08,2013-07-08,2013-06-08,2013-08-01,2013-07-25,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-28,2013-01-01,2013-04-01,2013-06-01,2013-06-23,0,-2,-5,-22,-152,0,-2,-6,-22,-22,41452,179,89,28,6,26,5921,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-29,28-Jun-2013,Jun 28th 2013,Fri 06-28-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-23,2013-06-24,2013-06-28,Fri ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,26,2013,2013-06-23,2013-06-29,N,Wk.26 - 13,2013-06-23 00:00:00,2013-06-29 00:00:00,2013W26 ,2013W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2013,N,2012-06-28,2011-06-28,2013-03-28,2012-12-28,2013-05-28,2013-04-28,2013-06-21,2013-06-14,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-17,2013-01-01,2013-01-01,2013-02-01,2013-02-17,0,-3,-9,-40,-283,0,-3,-10,-40,-41,41321,48,48,17,1,8,5903,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-23,17-Feb-2013,Feb 17th 2013,Sun 02-17-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-17,2013-02-11,2013-02-17,Sun ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,8,2013,2013-02-17,2013-02-23,Y,Wk.08 - 13,2013-02-17 00:00:00,2013-02-23 00:00:00,2013W08 ,2013W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2013,N,2012-02-17,2011-02-17,2012-11-17,2012-08-17,2013-01-17,2012-12-17,2013-02-10,2013-02-03,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-03,2013-01-01,2013-07-01,2013-07-01,2013-06-30,0,-1,-4,-21,-147,0,-1,-5,-21,-21,41457,184,3,3,4,27,5922,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-06,03-Jul-2013,Jul 3rd 2013,Wed 07-03-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-06-30,2013-07-01,2013-07-03,Wed ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,27,2013,2013-06-30,2013-07-06,N,Wk.27 - 13,2013-06-30 00:00:00,2013-07-06 00:00:00,2013W27 ,2013W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2013,N,2012-07-03,2011-07-03,2013-04-03,2013-01-03,2013-06-03,2013-05-03,2013-06-26,2013-06-19,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-05,2013-01-01,2013-04-01,2013-06-01,2013-06-02,0,-2,-5,-25,-175,0,-2,-6,-25,-25,41429,156,66,5,4,23,5918,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-08,05-Jun-2013,Jun 5th 2013,Wed 06-05-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-02,2013-06-03,2013-06-05,Wed ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,23,2013,2013-06-02,2013-06-08,N,Wk.23 - 13,2013-06-02 00:00:00,2013-06-08 00:00:00,2013W23 ,2013W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2013,N,2012-06-05,2011-06-05,2013-03-05,2012-12-05,2013-05-05,2013-04-05,2013-05-29,2013-05-22,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-23,2013-01-01,2013-04-01,2013-05-01,2013-05-19,0,-2,-6,-27,-188,0,-2,-7,-27,-27,41416,143,53,23,5,21,5916,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-25,23-May-2013,May 23rd 2013,Thu 05-23-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-19,2013-05-20,2013-05-23,Thu ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,21,2013,2013-05-19,2013-05-25,N,Wk.21 - 13,2013-05-19 00:00:00,2013-05-25 00:00:00,2013W21 ,2013W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2013,N,2012-05-23,2011-05-23,2013-02-23,2012-11-23,2013-04-23,2013-03-23,2013-05-16,2013-05-09,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-06,2013-01-01,2013-04-01,2013-06-01,2013-06-02,0,-2,-5,-25,-174,0,-2,-6,-25,-25,41430,157,67,6,5,23,5918,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-08,06-Jun-2013,Jun 6th 2013,Thu 06-06-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-02,2013-06-03,2013-06-06,Thu ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,23,2013,2013-06-02,2013-06-08,N,Wk.23 - 13,2013-06-02 00:00:00,2013-06-08 00:00:00,2013W23 ,2013W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2013,N,2012-06-06,2011-06-06,2013-03-06,2012-12-06,2013-05-06,2013-04-06,2013-05-30,2013-05-23,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-23,2013-01-01,2013-04-01,2013-04-01,2013-04-21,0,-2,-7,-31,-218,0,-2,-8,-31,-31,41386,113,23,23,3,17,5912,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-27,23-Apr-2013,Apr 23rd 2013,Tue 04-23-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-21,2013-04-22,2013-04-23,Tue ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,17,2013,2013-04-21,2013-04-27,N,Wk.17 - 13,2013-04-21 00:00:00,2013-04-27 00:00:00,2013W17 ,2013W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2013,N,2012-04-23,2011-04-23,2013-01-23,2012-10-23,2013-03-23,2013-02-23,2013-04-16,2013-04-09,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-13,2013-01-01,2013-07-01,2013-08-01,2013-08-11,0,-1,-3,-15,-106,0,-1,-4,-15,-15,41498,225,44,13,3,33,5928,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-17,13-Aug-2013,Aug 13th 2013,Tue 08-13-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-11,2013-08-12,2013-08-13,Tue ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,33,2013,2013-08-11,2013-08-17,N,Wk.33 - 13,2013-08-11 00:00:00,2013-08-17 00:00:00,2013W33 ,2013W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2013,N,2012-08-13,2011-08-13,2013-05-13,2013-02-13,2013-07-13,2013-06-13,2013-08-06,2013-07-30,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-14,2013-01-01,2013-10-01,2013-11-01,2013-11-10,0,0,0,-2,-13,0,0,-1,-2,-2,41591,318,45,14,5,46,5941,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-16,14-Nov-2013,Nov 14th 2013,Thu 11-14-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-10,2013-11-11,2013-11-14,Thu ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,46,2013,2013-11-10,2013-11-16,N,Wk.46 - 13,2013-11-10 00:00:00,2013-11-16 00:00:00,2013W46 ,2013W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2013,N,2012-11-14,2011-11-14,2013-08-14,2013-05-14,2013-10-14,2013-09-14,2013-11-07,2013-10-31,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-09,2013-01-01,2013-07-01,2013-08-01,2013-08-04,0,-1,-3,-16,-110,0,-1,-4,-16,-16,41494,221,40,9,6,32,5927,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-10,09-Aug-2013,Aug 9th 2013,Fri 08-09-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-04,2013-08-05,2013-08-09,Fri ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,32,2013,2013-08-04,2013-08-10,N,Wk.32 - 13,2013-08-04 00:00:00,2013-08-10 00:00:00,2013W32 ,2013W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2013,N,2012-08-09,2011-08-09,2013-05-09,2013-02-09,2013-07-09,2013-06-09,2013-08-02,2013-07-26,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-10,2013-01-01,2013-07-01,2013-09-01,2013-09-08,0,-1,-2,-11,-78,0,-1,-3,-11,-11,41526,253,72,10,3,37,5932,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-14,10-Sep-2013,Sep 10th 2013,Tue 09-10-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-08,2013-09-09,2013-09-10,Tue ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,37,2013,2013-09-08,2013-09-14,N,Wk.37 - 13,2013-09-08 00:00:00,2013-09-14 00:00:00,2013W37 ,2013W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2013,N,2012-09-10,2011-09-10,2013-06-10,2013-03-10,2013-08-10,2013-07-10,2013-09-03,2013-08-27,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-08,2013-01-01,2013-01-01,2013-03-01,2013-03-03,0,-3,-8,-38,-264,0,-3,-9,-38,-38,41340,67,67,8,6,10,5905,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-09,08-Mar-2013,Mar 8th 2013,Fri 03-08-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-03,2013-03-04,2013-03-08,Fri ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,10,2013,2013-03-03,2013-03-09,N,Wk.10 - 13,2013-03-03 00:00:00,2013-03-09 00:00:00,2013W10 ,2013W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2013,N,2012-03-08,2011-03-08,2012-12-08,2012-09-08,2013-02-08,2013-01-08,2013-03-01,2013-02-22,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-01,2013-01-01,2013-04-01,2013-04-01,2013-03-31,0,-2,-7,-34,-240,0,-2,-8,-34,-34,41364,91,1,1,2,14,5909,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-06,01-Apr-2013,Apr 1st 2013,Mon 04-01-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-03-31,2013-04-01,2013-04-01,Mon ,2013M04,Apr-2013,Y,2013M04 ,Y,Year 2013 - Quarter 02,2013Q02 ,Y,14,2013,2013-03-31,2013-04-06,N,Wk.14 - 13,2013-03-31 00:00:00,2013-04-06 00:00:00,2013W14 ,2013W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2013,N,2012-04-01,2011-04-01,2013-01-01,2012-10-01,2013-03-01,2013-02-01,2013-03-25,2013-03-18,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-25,2013-01-01,2013-01-01,2013-01-01,2013-01-20,0,-3,-10,-44,-306,0,-3,-11,-44,-44,41298,25,25,25,6,4,5899,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-26,25-Jan-2013,Jan 25th 2013,Fri 01-25-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-20,2013-01-21,2013-01-25,Fri ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,4,2013,2013-01-20,2013-01-26,N,Wk.04 - 13,2013-01-20 00:00:00,2013-01-26 00:00:00,2013W04 ,2013W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2013,N,2012-01-25,2011-01-25,2012-10-25,2012-07-25,2012-12-25,2012-11-25,2013-01-18,2013-01-11,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-24,2013-01-01,2013-04-01,2013-06-01,2013-06-23,0,-2,-5,-22,-156,0,-2,-6,-22,-22,41448,175,85,24,2,26,5921,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-29,24-Jun-2013,Jun 24th 2013,Mon 06-24-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-23,2013-06-24,2013-06-24,Mon ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,26,2013,2013-06-23,2013-06-29,N,Wk.26 - 13,2013-06-23 00:00:00,2013-06-29 00:00:00,2013W26 ,2013W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2013,N,2012-06-24,2011-06-24,2013-03-24,2012-12-24,2013-05-24,2013-04-24,2013-06-17,2013-06-10,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-15,2013-01-01,2013-07-01,2013-08-01,2013-08-11,0,-1,-3,-15,-104,0,-1,-4,-15,-15,41500,227,46,15,5,33,5928,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-17,15-Aug-2013,Aug 15th 2013,Thu 08-15-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-11,2013-08-12,2013-08-15,Thu ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,33,2013,2013-08-11,2013-08-17,N,Wk.33 - 13,2013-08-11 00:00:00,2013-08-17 00:00:00,2013W33 ,2013W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2013,N,2012-08-15,2011-08-15,2013-05-15,2013-02-15,2013-07-15,2013-06-15,2013-08-08,2013-08-01,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-17,2013-01-01,2013-01-01,2013-01-01,2013-01-13,0,-3,-10,-45,-314,0,-3,-11,-45,-45,41290,17,17,17,5,3,5898,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-19,17-Jan-2013,Jan 17th 2013,Thu 01-17-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-13,2013-01-14,2013-01-17,Thu ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,3,2013,2013-01-13,2013-01-19,N,Wk.03 - 13,2013-01-13 00:00:00,2013-01-19 00:00:00,2013W03 ,2013W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2013,N,2012-01-17,2011-01-17,2012-10-17,2012-07-17,2012-12-17,2012-11-17,2013-01-10,2013-01-03,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-11,2013-01-01,2013-10-01,2013-10-01,2013-10-06,0,0,-1,-7,-47,0,0,-2,-7,-7,41557,284,11,11,6,41,5936,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-12,11-Oct-2013,Oct 11th 2013,Fri 10-11-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-06,2013-10-07,2013-10-11,Fri ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,41,2013,2013-10-06,2013-10-12,N,Wk.41 - 13,2013-10-06 00:00:00,2013-10-12 00:00:00,2013W41 ,2013W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2013,N,2012-10-11,2011-10-11,2013-07-11,2013-04-11,2013-09-11,2013-08-11,2013-10-04,2013-09-27,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-22,2013-01-01,2013-04-01,2013-05-01,2013-05-19,0,-2,-6,-27,-189,0,-2,-7,-27,-27,41415,142,52,22,4,21,5916,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-25,22-May-2013,May 22nd 2013,Wed 05-22-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-19,2013-05-20,2013-05-22,Wed ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,21,2013,2013-05-19,2013-05-25,N,Wk.21 - 13,2013-05-19 00:00:00,2013-05-25 00:00:00,2013W21 ,2013W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2013,N,2012-05-22,2011-05-22,2013-02-22,2012-11-22,2013-04-22,2013-03-22,2013-05-15,2013-05-08,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-18,2013-01-01,2013-10-01,2013-12-01,2013-12-15,0,0,1,3,21,0,0,0,3,3,41625,352,79,18,4,51,5946,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-21,18-Dec-2013,Dec 18th 2013,Wed 12-18-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-15,2013-12-16,2013-12-18,Wed ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,51,2013,2013-12-15,2013-12-21,N,Wk.51 - 13,2013-12-15 00:00:00,2013-12-21 00:00:00,2013W51 ,2013W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2013,N,2012-12-18,2011-12-18,2013-09-18,2013-06-18,2013-11-18,2013-10-18,2013-12-11,2013-12-04,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-27,2013-01-01,2013-07-01,2013-08-01,2013-08-25,0,-1,-3,-13,-92,0,-1,-3,-13,-13,41512,239,58,27,3,35,5930,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-31,27-Aug-2013,Aug 27th 2013,Tue 08-27-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-08-25,2013-08-25,2013-08-26,2013-08-27,Tue ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,35,2013,2013-08-25,2013-08-31,N,Wk.35 - 13,2013-08-25 00:00:00,2013-08-31 00:00:00,2013W35 ,2013W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2013,N,2012-08-27,2011-08-27,2013-05-27,2013-02-27,2013-07-27,2013-06-27,2013-08-20,2013-08-13,0,0,1,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-28,2013-01-01,2013-07-01,2013-08-01,2013-08-25,0,-1,-3,-13,-91,0,-1,-3,-13,-13,41513,240,59,28,4,35,5930,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-31,28-Aug-2013,Aug 28th 2013,Wed 08-28-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-08-25,2013-08-25,2013-08-26,2013-08-28,Wed ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,35,2013,2013-08-25,2013-08-31,N,Wk.35 - 13,2013-08-25 00:00:00,2013-08-31 00:00:00,2013W35 ,2013W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2013,N,2012-08-28,2011-08-28,2013-05-28,2013-02-28,2013-07-28,2013-06-28,2013-08-21,2013-08-14,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-29,2013-01-01,2013-01-01,2013-01-01,2013-01-27,0,-3,-10,-43,-302,0,-3,-10,-43,-43,41302,29,29,29,3,5,5900,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-02-02,29-Jan-2013,Jan 29th 2013,Tue 01-29-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-01-27,2013-01-27,2013-01-28,2013-01-29,Tue ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,5,2013,2013-01-27,2013-02-02,N,Wk.05 - 13,2013-01-27 00:00:00,2013-02-02 00:00:00,2013W05 ,2013W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2013,N,2012-01-29,2011-01-29,2012-10-29,2012-07-29,2012-12-29,2012-11-29,2013-01-22,2013-01-15,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-20,2013-01-01,2013-01-01,2013-03-01,2013-03-17,0,-3,-8,-36,-252,0,-3,-9,-36,-36,41352,79,79,20,4,12,5907,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-23,20-Mar-2013,Mar 20th 2013,Wed 03-20-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-17,2013-03-18,2013-03-20,Wed ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,12,2013,2013-03-17,2013-03-23,N,Wk.12 - 13,2013-03-17 00:00:00,2013-03-23 00:00:00,2013W12 ,2013W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2013,N,2012-03-20,2011-03-20,2012-12-20,2012-09-20,2013-02-20,2013-01-20,2013-03-13,2013-03-06,0,0,0,0,0,0,0,0,3,1,12,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-28,2013-01-01,2013-07-01,2013-09-01,2013-09-22,0,-1,-2,-9,-60,0,-1,-3,-9,-9,41544,271,90,28,7,39,5934,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-28,28-Sep-2013,Sep 28th 2013,Sat 09-28-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-22,2013-09-23,2013-09-28,Sat ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,39,2013,2013-09-22,2013-09-28,N,Wk.39 - 13,2013-09-22 00:00:00,2013-09-28 00:00:00,2013W39 ,2013W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2013,N,2012-09-28,2011-09-28,2013-06-28,2013-03-28,2013-08-28,2013-07-28,2013-09-21,2013-09-14,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-02,2013-01-01,2013-04-01,2013-04-01,2013-03-31,0,-2,-7,-34,-239,0,-2,-8,-34,-34,41365,92,2,2,3,14,5909,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-06,02-Apr-2013,Apr 2nd 2013,Tue 04-02-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-03-31,2013-04-01,2013-04-02,Tue ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,14,2013,2013-03-31,2013-04-06,N,Wk.14 - 13,2013-03-31 00:00:00,2013-04-06 00:00:00,2013W14 ,2013W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2013,N,2012-04-02,2011-04-02,2013-01-02,2012-10-02,2013-03-02,2013-02-02,2013-03-26,2013-03-19,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-12,2013-01-01,2013-10-01,2013-12-01,2013-12-08,0,0,1,2,15,0,0,0,2,2,41619,346,73,12,5,50,5945,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-14,12-Dec-2013,Dec 12th 2013,Thu 12-12-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-08,2013-12-09,2013-12-12,Thu ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,50,2013,2013-12-08,2013-12-14,N,Wk.50 - 13,2013-12-08 00:00:00,2013-12-14 00:00:00,2013W50 ,2013W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2013,N,2012-12-12,2011-12-12,2013-09-12,2013-06-12,2013-11-12,2013-10-12,2013-12-05,2013-11-28,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-31,2013-01-01,2013-01-01,2013-01-01,2013-01-27,0,-3,-10,-43,-300,0,-3,-10,-43,-43,41304,31,31,31,5,5,5900,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-02-02,31-Jan-2013,Jan 31st 2013,Thu 01-31-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-01-27,2013-01-27,2013-01-28,2013-01-31,Thu ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,5,2013,2013-01-27,2013-02-02,N,Wk.05 - 13,2013-01-27 00:00:00,2013-02-02 00:00:00,2013W05 ,2013W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2013,N,2012-01-31,2011-01-31,2012-10-31,2012-07-31,2012-12-31,2012-11-30,2013-01-24,2013-01-17,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-22,2013-01-01,2013-04-01,2013-06-01,2013-06-16,0,-2,-5,-23,-158,0,-2,-6,-23,-23,41446,173,83,22,7,25,5920,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-22,22-Jun-2013,Jun 22nd 2013,Sat 06-22-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-16,2013-06-17,2013-06-22,Sat ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,25,2013,2013-06-16,2013-06-22,N,Wk.25 - 13,2013-06-16 00:00:00,2013-06-22 00:00:00,2013W25 ,2013W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2013,N,2012-06-22,2011-06-22,2013-03-22,2012-12-22,2013-05-22,2013-04-22,2013-06-15,2013-06-08,0,0,0,0,0,0,0,0,6,2,25,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-08,2013-01-01,2013-07-01,2013-09-01,2013-09-08,0,-1,-2,-11,-80,0,-1,-3,-11,-12,41524,251,70,8,1,37,5932,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-14,08-Sep-2013,Sep 8th 2013,Sun 09-08-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-08,2013-09-02,2013-09-08,Sun ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,37,2013,2013-09-08,2013-09-14,Y,Wk.37 - 13,2013-09-08 00:00:00,2013-09-14 00:00:00,2013W37 ,2013W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2013,N,2012-09-08,2011-09-08,2013-06-08,2013-03-08,2013-08-08,2013-07-08,2013-09-01,2013-08-25,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-15,2013-01-01,2013-01-01,2013-02-01,2013-02-10,0,-3,-9,-41,-285,0,-3,-10,-41,-41,41319,46,46,15,6,7,5902,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-16,15-Feb-2013,Feb 15th 2013,Fri 02-15-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-10,2013-02-11,2013-02-15,Fri ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,7,2013,2013-02-10,2013-02-16,N,Wk.07 - 13,2013-02-10 00:00:00,2013-02-16 00:00:00,2013W07 ,2013W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2013,N,2012-02-15,2011-02-15,2012-11-15,2012-08-15,2013-01-15,2012-12-15,2013-02-08,2013-02-01,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-20,2013-01-01,2013-01-01,2013-02-01,2013-02-17,0,-3,-9,-40,-280,0,-3,-10,-40,-40,41324,51,51,20,4,8,5903,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-23,20-Feb-2013,Feb 20th 2013,Wed 02-20-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-17,2013-02-18,2013-02-20,Wed ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,8,2013,2013-02-17,2013-02-23,N,Wk.08 - 13,2013-02-17 00:00:00,2013-02-23 00:00:00,2013W08 ,2013W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2013,N,2012-02-20,2011-02-20,2012-11-20,2012-08-20,2013-01-20,2012-12-20,2013-02-13,2013-02-06,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-18,2013-01-01,2013-04-01,2013-04-01,2013-04-14,0,-2,-7,-32,-223,0,-2,-8,-32,-32,41381,108,18,18,5,16,5911,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-20,18-Apr-2013,Apr 18th 2013,Thu 04-18-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-14,2013-04-15,2013-04-18,Thu ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,16,2013,2013-04-14,2013-04-20,N,Wk.16 - 13,2013-04-14 00:00:00,2013-04-20 00:00:00,2013W16 ,2013W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2013,N,2012-04-18,2011-04-18,2013-01-18,2012-10-18,2013-03-18,2013-02-18,2013-04-11,2013-04-04,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-03,2013-01-01,2013-04-01,2013-06-01,2013-06-02,0,-2,-5,-25,-177,0,-2,-6,-25,-25,41427,154,64,3,2,23,5918,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-08,03-Jun-2013,Jun 3rd 2013,Mon 06-03-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-02,2013-06-03,2013-06-03,Mon ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,23,2013,2013-06-02,2013-06-08,N,Wk.23 - 13,2013-06-02 00:00:00,2013-06-08 00:00:00,2013W23 ,2013W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2013,N,2012-06-03,2011-06-03,2013-03-03,2012-12-03,2013-05-03,2013-04-03,2013-05-27,2013-05-20,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-18,2013-01-01,2013-07-01,2013-09-01,2013-09-15,0,-1,-2,-10,-70,0,-1,-3,-10,-10,41534,261,80,18,4,38,5933,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-21,18-Sep-2013,Sep 18th 2013,Wed 09-18-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-15,2013-09-16,2013-09-18,Wed ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,38,2013,2013-09-15,2013-09-21,N,Wk.38 - 13,2013-09-15 00:00:00,2013-09-21 00:00:00,2013W38 ,2013W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2013,N,2012-09-18,2011-09-18,2013-06-18,2013-03-18,2013-08-18,2013-07-18,2013-09-11,2013-09-04,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-29,2013-01-01,2013-01-01,2013-03-01,2013-03-24,0,-3,-8,-35,-243,0,-3,-9,-35,-35,41361,88,88,29,6,13,5908,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-30,29-Mar-2013,Mar 29th 2013,Fri 03-29-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-24,2013-03-25,2013-03-29,Fri ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,13,2013,2013-03-24,2013-03-30,N,Wk.13 - 13,2013-03-24 00:00:00,2013-03-30 00:00:00,2013W13 ,2013W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2013,N,2012-03-29,2011-03-29,2012-12-29,2012-09-29,2013-02-28,2013-01-29,2013-03-22,2013-03-15,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-30,2013-01-01,2013-07-01,2013-08-01,2013-08-25,0,-1,-3,-13,-89,0,-1,-3,-13,-13,41515,242,61,30,6,35,5930,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-31,30-Aug-2013,Aug 30th 2013,Fri 08-30-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-08-25,2013-08-25,2013-08-26,2013-08-30,Fri ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,35,2013,2013-08-25,2013-08-31,N,Wk.35 - 13,2013-08-25 00:00:00,2013-08-31 00:00:00,2013W35 ,2013W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2013,N,2012-08-30,2011-08-30,2013-05-30,2013-02-28,2013-07-30,2013-06-30,2013-08-23,2013-08-16,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-29,2013-01-01,2013-07-01,2013-08-01,2013-08-25,0,-1,-3,-13,-90,0,-1,-3,-13,-13,41514,241,60,29,5,35,5930,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-31,29-Aug-2013,Aug 29th 2013,Thu 08-29-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-08-25,2013-08-25,2013-08-26,2013-08-29,Thu ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,35,2013,2013-08-25,2013-08-31,N,Wk.35 - 13,2013-08-25 00:00:00,2013-08-31 00:00:00,2013W35 ,2013W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2013,N,2012-08-29,2011-08-29,2013-05-29,2013-02-28,2013-07-29,2013-06-29,2013-08-22,2013-08-15,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-20,2013-01-01,2013-07-01,2013-07-01,2013-07-14,0,-1,-4,-19,-130,0,-1,-5,-19,-19,41474,201,20,20,7,29,5924,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-20,20-Jul-2013,Jul 20th 2013,Sat 07-20-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-14,2013-07-15,2013-07-20,Sat ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,29,2013,2013-07-14,2013-07-20,N,Wk.29 - 13,2013-07-14 00:00:00,2013-07-20 00:00:00,2013W29 ,2013W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2013,N,2012-07-20,2011-07-20,2013-04-20,2013-01-20,2013-06-20,2013-05-20,2013-07-13,2013-07-06,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-20,2013-01-01,2013-07-01,2013-09-01,2013-09-15,0,-1,-2,-10,-68,0,-1,-3,-10,-10,41536,263,82,20,6,38,5933,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-21,20-Sep-2013,Sep 20th 2013,Fri 09-20-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-15,2013-09-16,2013-09-20,Fri ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,38,2013,2013-09-15,2013-09-21,N,Wk.38 - 13,2013-09-15 00:00:00,2013-09-21 00:00:00,2013W38 ,2013W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2013,N,2012-09-20,2011-09-20,2013-06-20,2013-03-20,2013-08-20,2013-07-20,2013-09-13,2013-09-06,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-23,2013-01-01,2013-07-01,2013-07-01,2013-07-21,0,-1,-4,-18,-127,0,-1,-5,-18,-18,41477,204,23,23,3,30,5925,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-27,23-Jul-2013,Jul 23rd 2013,Tue 07-23-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-21,2013-07-22,2013-07-23,Tue ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,30,2013,2013-07-21,2013-07-27,N,Wk.30 - 13,2013-07-21 00:00:00,2013-07-27 00:00:00,2013W30 ,2013W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2013,N,2012-07-23,2011-07-23,2013-04-23,2013-01-23,2013-06-23,2013-05-23,2013-07-16,2013-07-09,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-19,2013-01-01,2013-04-01,2013-05-01,2013-05-19,0,-2,-6,-27,-192,0,-2,-7,-27,-28,41412,139,49,19,1,21,5916,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-25,19-May-2013,May 19th 2013,Sun 05-19-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-19,2013-05-13,2013-05-19,Sun ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,21,2013,2013-05-19,2013-05-25,Y,Wk.21 - 13,2013-05-19 00:00:00,2013-05-25 00:00:00,2013W21 ,2013W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2013,N,2012-05-19,2011-05-19,2013-02-19,2012-11-19,2013-04-19,2013-03-19,2013-05-12,2013-05-05,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-05,2013-01-01,2013-04-01,2013-05-01,2013-05-05,0,-2,-6,-29,-206,0,-2,-7,-29,-30,41398,125,35,5,1,19,5914,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-11,05-May-2013,May 5th 2013,Sun 05-05-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-05,2013-04-29,2013-05-05,Sun ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,19,2013,2013-05-05,2013-05-11,Y,Wk.19 - 13,2013-05-05 00:00:00,2013-05-11 00:00:00,2013W19 ,2013W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2013,N,2012-05-05,2011-05-05,2013-02-05,2012-11-05,2013-04-05,2013-03-05,2013-04-28,2013-04-21,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-16,2013-01-01,2013-10-01,2013-10-01,2013-10-13,0,0,-1,-6,-42,0,0,-2,-6,-6,41562,289,16,16,4,42,5937,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-19,16-Oct-2013,Oct 16th 2013,Wed 10-16-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-13,2013-10-14,2013-10-16,Wed ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,42,2013,2013-10-13,2013-10-19,N,Wk.42 - 13,2013-10-13 00:00:00,2013-10-19 00:00:00,2013W42 ,2013W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2013,N,2012-10-16,2011-10-16,2013-07-16,2013-04-16,2013-09-16,2013-08-16,2013-10-09,2013-10-02,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-01,2013-01-01,2013-10-01,2013-11-01,2013-10-27,0,0,0,-4,-26,0,0,-1,-4,-4,41578,305,32,1,6,44,5939,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-02,01-Nov-2013,Nov 1st 2013,Fri 11-01-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-10-27,2013-10-28,2013-11-01,Fri ,2013M11,Nov-2013,Y,2013M11 ,Y,Year 2013 - Quarter 04,2013Q04 ,N,44,2013,2013-10-27,2013-11-02,N,Wk.44 - 13,2013-10-27 00:00:00,2013-11-02 00:00:00,2013W44 ,2013W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2013,N,2012-11-01,2011-11-01,2013-08-01,2013-05-01,2013-10-01,2013-09-01,2013-10-25,2013-10-18,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-08,2013-01-01,2013-04-01,2013-05-01,2013-05-05,0,-2,-6,-29,-203,0,-2,-7,-29,-29,41401,128,38,8,4,19,5914,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-11,08-May-2013,May 8th 2013,Wed 05-08-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-05,2013-05-06,2013-05-08,Wed ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,19,2013,2013-05-05,2013-05-11,N,Wk.19 - 13,2013-05-05 00:00:00,2013-05-11 00:00:00,2013W19 ,2013W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2013,N,2012-05-08,2011-05-08,2013-02-08,2012-11-08,2013-04-08,2013-03-08,2013-05-01,2013-04-24,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-21,2013-01-01,2013-01-01,2013-02-01,2013-02-17,0,-3,-9,-40,-279,0,-3,-10,-40,-40,41325,52,52,21,5,8,5903,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-23,21-Feb-2013,Feb 21st 2013,Thu 02-21-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-17,2013-02-18,2013-02-21,Thu ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,8,2013,2013-02-17,2013-02-23,N,Wk.08 - 13,2013-02-17 00:00:00,2013-02-23 00:00:00,2013W08 ,2013W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2013,N,2012-02-21,2011-02-21,2012-11-21,2012-08-21,2013-01-21,2012-12-21,2013-02-14,2013-02-07,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-27,2013-01-01,2013-07-01,2013-09-01,2013-09-22,0,-1,-2,-9,-61,0,-1,-3,-9,-9,41543,270,89,27,6,39,5934,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-28,27-Sep-2013,Sep 27th 2013,Fri 09-27-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-22,2013-09-23,2013-09-27,Fri ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,39,2013,2013-09-22,2013-09-28,N,Wk.39 - 13,2013-09-22 00:00:00,2013-09-28 00:00:00,2013W39 ,2013W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2013,N,2012-09-27,2011-09-27,2013-06-27,2013-03-27,2013-08-27,2013-07-27,2013-09-20,2013-09-13,0,0,0,0,0,1,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-09,2013-01-01,2013-07-01,2013-07-01,2013-07-07,0,-1,-4,-20,-141,0,-1,-5,-20,-20,41463,190,9,9,3,28,5923,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-13,09-Jul-2013,Jul 9th 2013,Tue 07-09-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-07,2013-07-08,2013-07-09,Tue ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,28,2013,2013-07-07,2013-07-13,N,Wk.28 - 13,2013-07-07 00:00:00,2013-07-13 00:00:00,2013W28 ,2013W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2013,N,2012-07-09,2011-07-09,2013-04-09,2013-01-09,2013-06-09,2013-05-09,2013-07-02,2013-06-25,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-04,2013-01-01,2013-10-01,2013-10-01,2013-09-29,0,0,-1,-8,-54,0,0,-2,-8,-8,41550,277,4,4,6,40,5935,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-05,04-Oct-2013,Oct 4th 2013,Fri 10-04-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-09-29,2013-09-30,2013-10-04,Fri ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,40,2013,2013-09-29,2013-10-05,N,Wk.40 - 13,2013-09-29 00:00:00,2013-10-05 00:00:00,2013W40 ,2013W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2013,N,2012-10-04,2011-10-04,2013-07-04,2013-04-04,2013-09-04,2013-08-04,2013-09-27,2013-09-20,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-09,2013-01-01,2013-07-01,2013-09-01,2013-09-08,0,-1,-2,-11,-79,0,-1,-3,-11,-11,41525,252,71,9,2,37,5932,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-14,09-Sep-2013,Sep 9th 2013,Mon 09-09-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-08,2013-09-09,2013-09-09,Mon ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,37,2013,2013-09-08,2013-09-14,N,Wk.37 - 13,2013-09-08 00:00:00,2013-09-14 00:00:00,2013W37 ,2013W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2013,N,2012-09-09,2011-09-09,2013-06-09,2013-03-09,2013-08-09,2013-07-09,2013-09-02,2013-08-26,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-01,2013-01-01,2013-04-01,2013-05-01,2013-04-28,0,-2,-6,-30,-210,0,-2,-7,-30,-30,41394,121,31,1,4,18,5913,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-04,01-May-2013,May 1st 2013,Wed 05-01-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-04-28,2013-04-29,2013-05-01,Wed ,2013M05,May-2013,Y,2013M05 ,Y,Year 2013 - Quarter 02,2013Q02 ,N,18,2013,2013-04-28,2013-05-04,N,Wk.18 - 13,2013-04-28 00:00:00,2013-05-04 00:00:00,2013W18 ,2013W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2013,N,2012-05-01,2011-05-01,2013-02-01,2012-11-01,2013-04-01,2013-03-01,2013-04-24,2013-04-17,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-29,2013-01-01,2013-07-01,2013-09-01,2013-09-29,0,-1,-2,-8,-59,0,0,-2,-8,-9,41545,272,91,29,1,40,5935,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-10-05,29-Sep-2013,Sep 29th 2013,Sun 09-29-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-09-29,2013-09-29,2013-09-23,2013-09-29,Sun ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,40,2013,2013-09-29,2013-10-05,Y,Wk.40 - 13,2013-09-29 00:00:00,2013-10-05 00:00:00,2013W40 ,2013W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2013,N,2012-09-29,2011-09-29,2013-06-29,2013-03-29,2013-08-29,2013-07-29,2013-09-22,2013-09-15,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-02,2013-01-01,2013-04-01,2013-05-01,2013-04-28,0,-2,-6,-30,-209,0,-2,-7,-30,-30,41395,122,32,2,5,18,5913,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-04,02-May-2013,May 2nd 2013,Thu 05-02-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-04-28,2013-04-29,2013-05-02,Thu ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,18,2013,2013-04-28,2013-05-04,N,Wk.18 - 13,2013-04-28 00:00:00,2013-05-04 00:00:00,2013W18 ,2013W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2013,N,2012-05-02,2011-05-02,2013-02-02,2012-11-02,2013-04-02,2013-03-02,2013-04-25,2013-04-18,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-17,2013-01-01,2013-10-01,2013-10-01,2013-10-13,0,0,-1,-6,-41,0,0,-2,-6,-6,41563,290,17,17,5,42,5937,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-19,17-Oct-2013,Oct 17th 2013,Thu 10-17-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-13,2013-10-14,2013-10-17,Thu ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,42,2013,2013-10-13,2013-10-19,N,Wk.42 - 13,2013-10-13 00:00:00,2013-10-19 00:00:00,2013W42 ,2013W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2013,N,2012-10-17,2011-10-17,2013-07-17,2013-04-17,2013-09-17,2013-08-17,2013-10-10,2013-10-03,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-01,2013-01-01,2013-04-01,2013-06-01,2013-05-26,0,-2,-5,-26,-179,0,-2,-6,-26,-26,41425,152,62,1,7,22,5917,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-01,01-Jun-2013,Jun 1st 2013,Sat 06-01-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-05-26,2013-05-27,2013-06-01,Sat ,2013M06,Jun-2013,Y,2013M06 ,Y,Year 2013 - Quarter 02,2013Q02 ,N,22,2013,2013-05-26,2013-06-01,N,Wk.22 - 13,2013-05-26 00:00:00,2013-06-01 00:00:00,2013W22 ,2013W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2013,N,2012-06-01,2011-06-01,2013-03-01,2012-12-01,2013-05-01,2013-04-01,2013-05-25,2013-05-18,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-21,2013-01-01,2013-04-01,2013-05-01,2013-05-19,0,-2,-6,-27,-190,0,-2,-7,-27,-27,41414,141,51,21,3,21,5916,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-25,21-May-2013,May 21st 2013,Tue 05-21-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-19,2013-05-20,2013-05-21,Tue ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,21,2013,2013-05-19,2013-05-25,N,Wk.21 - 13,2013-05-19 00:00:00,2013-05-25 00:00:00,2013W21 ,2013W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2013,N,2012-05-21,2011-05-21,2013-02-21,2012-11-21,2013-04-21,2013-03-21,2013-05-14,2013-05-07,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-30,2013-01-01,2013-10-01,2013-10-01,2013-10-27,0,0,-1,-4,-28,0,0,-1,-4,-4,41576,303,30,30,4,44,5939,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-11-02,30-Oct-2013,Oct 30th 2013,Wed 10-30-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-10-27,2013-10-27,2013-10-28,2013-10-30,Wed ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,44,2013,2013-10-27,2013-11-02,N,Wk.44 - 13,2013-10-27 00:00:00,2013-11-02 00:00:00,2013W44 ,2013W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2013,N,2012-10-30,2011-10-30,2013-07-30,2013-04-30,2013-09-30,2013-08-30,2013-10-23,2013-10-16,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-11,2013-01-01,2013-01-01,2013-01-01,2013-01-06,0,-3,-10,-46,-320,0,-3,-11,-46,-46,41284,11,11,11,6,2,5897,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-12,11-Jan-2013,Jan 11th 2013,Fri 01-11-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-06,2013-01-07,2013-01-11,Fri ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,2,2013,2013-01-06,2013-01-12,N,Wk.02 - 13,2013-01-06 00:00:00,2013-01-12 00:00:00,2013W02 ,2013W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2013,N,2012-01-11,2011-01-11,2012-10-11,2012-07-11,2012-12-11,2012-11-11,2013-01-04,2012-12-28,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-25,2013-01-01,2013-01-01,2013-03-01,2013-03-24,0,-3,-8,-35,-247,0,-3,-9,-35,-35,41357,84,84,25,2,13,5908,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-30,25-Mar-2013,Mar 25th 2013,Mon 03-25-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-24,2013-03-25,2013-03-25,Mon ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,13,2013,2013-03-24,2013-03-30,N,Wk.13 - 13,2013-03-24 00:00:00,2013-03-30 00:00:00,2013W13 ,2013W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2013,N,2012-03-25,2011-03-25,2012-12-25,2012-09-25,2013-02-25,2013-01-25,2013-03-18,2013-03-11,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-16,2013-01-01,2013-04-01,2013-04-01,2013-04-14,0,-2,-7,-32,-225,0,-2,-8,-32,-32,41379,106,16,16,3,16,5911,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-20,16-Apr-2013,Apr 16th 2013,Tue 04-16-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-14,2013-04-15,2013-04-16,Tue ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,16,2013,2013-04-14,2013-04-20,N,Wk.16 - 13,2013-04-14 00:00:00,2013-04-20 00:00:00,2013W16 ,2013W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2013,N,2012-04-16,2011-04-16,2013-01-16,2012-10-16,2013-03-16,2013-02-16,2013-04-09,2013-04-02,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-20,2013-01-01,2013-04-01,2013-06-01,2013-06-16,0,-2,-5,-23,-160,0,-2,-6,-23,-23,41444,171,81,20,5,25,5920,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-22,20-Jun-2013,Jun 20th 2013,Thu 06-20-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-16,2013-06-17,2013-06-20,Thu ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,25,2013,2013-06-16,2013-06-22,N,Wk.25 - 13,2013-06-16 00:00:00,2013-06-22 00:00:00,2013W25 ,2013W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2013,N,2012-06-20,2011-06-20,2013-03-20,2012-12-20,2013-05-20,2013-04-20,2013-06-13,2013-06-06,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-19,2013-01-01,2013-01-01,2013-02-01,2013-02-17,0,-3,-9,-40,-281,0,-3,-10,-40,-40,41323,50,50,19,3,8,5903,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-23,19-Feb-2013,Feb 19th 2013,Tue 02-19-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-17,2013-02-18,2013-02-19,Tue ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,8,2013,2013-02-17,2013-02-23,N,Wk.08 - 13,2013-02-17 00:00:00,2013-02-23 00:00:00,2013W08 ,2013W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2013,N,2012-02-19,2011-02-19,2012-11-19,2012-08-19,2013-01-19,2012-12-19,2013-02-12,2013-02-05,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-09,2013-01-01,2013-04-01,2013-04-01,2013-04-07,0,-2,-7,-33,-232,0,-2,-8,-33,-33,41372,99,9,9,3,15,5910,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-13,09-Apr-2013,Apr 9th 2013,Tue 04-09-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-07,2013-04-08,2013-04-09,Tue ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,15,2013,2013-04-07,2013-04-13,N,Wk.15 - 13,2013-04-07 00:00:00,2013-04-13 00:00:00,2013W15 ,2013W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2013,N,2012-04-09,2011-04-09,2013-01-09,2012-10-09,2013-03-09,2013-02-09,2013-04-02,2013-03-26,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-03,2013-01-01,2013-01-01,2013-02-01,2013-02-03,0,-3,-9,-42,-297,0,-3,-10,-42,-43,41307,34,34,3,1,6,5901,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-09,03-Feb-2013,Feb 3rd 2013,Sun 02-03-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-03,2013-01-28,2013-02-03,Sun ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,6,2013,2013-02-03,2013-02-09,Y,Wk.06 - 13,2013-02-03 00:00:00,2013-02-09 00:00:00,2013W06 ,2013W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2013,N,2012-02-03,2011-02-03,2012-11-03,2012-08-03,2013-01-03,2012-12-03,2013-01-27,2013-01-20,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-27,2013-01-01,2013-07-01,2013-07-01,2013-07-21,0,-1,-4,-18,-123,0,-1,-5,-18,-18,41481,208,27,27,7,30,5925,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-27,27-Jul-2013,Jul 27th 2013,Sat 07-27-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-21,2013-07-22,2013-07-27,Sat ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,30,2013,2013-07-21,2013-07-27,N,Wk.30 - 13,2013-07-21 00:00:00,2013-07-27 00:00:00,2013W30 ,2013W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2013,N,2012-07-27,2011-07-27,2013-04-27,2013-01-27,2013-06-27,2013-05-27,2013-07-20,2013-07-13,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-20,2013-01-01,2013-04-01,2013-05-01,2013-05-19,0,-2,-6,-27,-191,0,-2,-7,-27,-27,41413,140,50,20,2,21,5916,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-25,20-May-2013,May 20th 2013,Mon 05-20-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-19,2013-05-20,2013-05-20,Mon ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,21,2013,2013-05-19,2013-05-25,N,Wk.21 - 13,2013-05-19 00:00:00,2013-05-25 00:00:00,2013W21 ,2013W21 ,05/19/13 - 05/25/13,05/19 - 05/25,2013,N,2012-05-20,2011-05-20,2013-02-20,2012-11-20,2013-04-20,2013-03-20,2013-05-13,2013-05-06,0,0,0,0,0,0,0,0,5,2,21,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-25,2013-01-01,2013-04-01,2013-04-01,2013-04-21,0,-2,-7,-31,-216,0,-2,-8,-31,-31,41388,115,25,25,5,17,5912,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-27,25-Apr-2013,Apr 25th 2013,Thu 04-25-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-21,2013-04-22,2013-04-25,Thu ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,17,2013,2013-04-21,2013-04-27,N,Wk.17 - 13,2013-04-21 00:00:00,2013-04-27 00:00:00,2013W17 ,2013W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2013,N,2012-04-25,2011-04-25,2013-01-25,2012-10-25,2013-03-25,2013-02-25,2013-04-18,2013-04-11,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-07,2013-01-01,2013-04-01,2013-05-01,2013-05-05,0,-2,-6,-29,-204,0,-2,-7,-29,-29,41400,127,37,7,3,19,5914,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-11,07-May-2013,May 7th 2013,Tue 05-07-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-05,2013-05-06,2013-05-07,Tue ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,19,2013,2013-05-05,2013-05-11,N,Wk.19 - 13,2013-05-05 00:00:00,2013-05-11 00:00:00,2013W19 ,2013W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2013,N,2012-05-07,2011-05-07,2013-02-07,2012-11-07,2013-04-07,2013-03-07,2013-04-30,2013-04-23,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-05,2013-01-01,2013-07-01,2013-09-01,2013-09-01,0,-1,-2,-12,-83,0,-1,-3,-12,-12,41521,248,67,5,5,36,5931,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-07,05-Sep-2013,Sep 5th 2013,Thu 09-05-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-01,2013-09-02,2013-09-05,Thu ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,36,2013,2013-09-01,2013-09-07,N,Wk.36 - 13,2013-09-01 00:00:00,2013-09-07 00:00:00,2013W36 ,2013W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2013,N,2012-09-05,2011-09-05,2013-06-05,2013-03-05,2013-08-05,2013-07-05,2013-08-29,2013-08-22,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-16,2013-01-01,2013-01-01,2013-03-01,2013-03-10,0,-3,-8,-37,-256,0,-3,-9,-37,-37,41348,75,75,16,7,11,5906,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-16,16-Mar-2013,Mar 16th 2013,Sat 03-16-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-10,2013-03-11,2013-03-16,Sat ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,11,2013,2013-03-10,2013-03-16,N,Wk.11 - 13,2013-03-10 00:00:00,2013-03-16 00:00:00,2013W11 ,2013W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2013,N,2012-03-16,2011-03-16,2012-12-16,2012-09-16,2013-02-16,2013-01-16,2013-03-09,2013-03-02,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-17,2013-01-01,2013-04-01,2013-05-01,2013-05-12,0,-2,-6,-28,-194,0,-2,-7,-28,-28,41410,137,47,17,6,20,5915,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-18,17-May-2013,May 17th 2013,Fri 05-17-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-12,2013-05-13,2013-05-17,Fri ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,20,2013,2013-05-12,2013-05-18,N,Wk.20 - 13,2013-05-12 00:00:00,2013-05-18 00:00:00,2013W20 ,2013W20 ,05/12/13 - 05/18/13,05/12 - 05/18,2013,N,2012-05-17,2011-05-17,2013-02-17,2012-11-17,2013-04-17,2013-03-17,2013-05-10,2013-05-03,0,0,0,0,0,0,0,0,5,2,20,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-23,2013-01-01,2013-07-01,2013-08-01,2013-08-18,0,-1,-3,-14,-96,0,-1,-4,-14,-14,41508,235,54,23,6,34,5929,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-24,23-Aug-2013,Aug 23rd 2013,Fri 08-23-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-18,2013-08-19,2013-08-23,Fri ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,34,2013,2013-08-18,2013-08-24,N,Wk.34 - 13,2013-08-18 00:00:00,2013-08-24 00:00:00,2013W34 ,2013W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2013,N,2012-08-23,2011-08-23,2013-05-23,2013-02-23,2013-07-23,2013-06-23,2013-08-16,2013-08-09,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-07,2013-01-01,2013-07-01,2013-09-01,2013-09-01,0,-1,-2,-12,-81,0,-1,-3,-12,-12,41523,250,69,7,7,36,5931,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-07,07-Sep-2013,Sep 7th 2013,Sat 09-07-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-01,2013-09-02,2013-09-07,Sat ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,36,2013,2013-09-01,2013-09-07,N,Wk.36 - 13,2013-09-01 00:00:00,2013-09-07 00:00:00,2013W36 ,2013W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2013,N,2012-09-07,2011-09-07,2013-06-07,2013-03-07,2013-08-07,2013-07-07,2013-08-31,2013-08-24,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-06,2013-01-01,2013-07-01,2013-09-01,2013-09-01,0,-1,-2,-12,-82,0,-1,-3,-12,-12,41522,249,68,6,6,36,5931,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-07,06-Sep-2013,Sep 6th 2013,Fri 09-06-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-01,2013-09-02,2013-09-06,Fri ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,36,2013,2013-09-01,2013-09-07,N,Wk.36 - 13,2013-09-01 00:00:00,2013-09-07 00:00:00,2013W36 ,2013W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2013,N,2012-09-06,2011-09-06,2013-06-06,2013-03-06,2013-08-06,2013-07-06,2013-08-30,2013-08-23,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-03,2013-01-01,2013-04-01,2013-05-01,2013-04-28,0,-2,-6,-30,-208,0,-2,-7,-30,-30,41396,123,33,3,6,18,5913,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-04,03-May-2013,May 3rd 2013,Fri 05-03-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-04-28,2013-04-29,2013-05-03,Fri ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,18,2013,2013-04-28,2013-05-04,N,Wk.18 - 13,2013-04-28 00:00:00,2013-05-04 00:00:00,2013W18 ,2013W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2013,N,2012-05-03,2011-05-03,2013-02-03,2012-11-03,2013-04-03,2013-03-03,2013-04-26,2013-04-19,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-04,2013-01-01,2013-10-01,2013-12-01,2013-12-01,0,0,1,1,7,0,0,0,1,1,41611,338,65,4,4,49,5944,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-07,04-Dec-2013,Dec 4th 2013,Wed 12-04-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-01,2013-12-02,2013-12-04,Wed ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,49,2013,2013-12-01,2013-12-07,N,Wk.49 - 13,2013-12-01 00:00:00,2013-12-07 00:00:00,2013W49 ,2013W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2013,N,2012-12-04,2011-12-04,2013-09-04,2013-06-04,2013-11-04,2013-10-04,2013-11-27,2013-11-20,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2014-01-01,2014-01-01,2014-01-01,2014-01-01,2014-01-01,1,1,2,6,35,1,1,1,5,5,41639,1,1,1,4,1,5948,1,1,1369,1,457,115,2014-12-31,2014-03-31,2014-01-31,2014-01-04,01-Jan-2014,Jan 1st 2014,Wed 01-01-14,0,0,0,0,2013-12-21,365,90,31,4,2013-12-29,2013-12-29,2013-12-29,2013-12-29,2013-12-30,2014-01-01,Wed ,2014M01,Jan-2014,Y,2014M01 ,Y,Year 2014 - Quarter 01,2014Q01 ,Y,1,2014,2013-12-29,2014-01-04,Y,Wk.01 - 14,2014-01-01 00:00:00,2014-01-04 00:00:00,2014W01 ,2014W01 ,01/01/14 - 01/04/14,01/01 - 01/04,2014,Y,2013-01-01,2012-01-01,2013-10-01,2013-07-01,2013-12-01,2013-11-01,2013-12-25,2013-12-18,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-19,2013-01-01,2013-10-01,2013-11-01,2013-11-17,0,0,0,-1,-8,0,0,-1,-1,-1,41596,323,50,19,3,47,5942,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-23,19-Nov-2013,Nov 19th 2013,Tue 11-19-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-17,2013-11-18,2013-11-19,Tue ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,47,2013,2013-11-17,2013-11-23,N,Wk.47 - 13,2013-11-17 00:00:00,2013-11-23 00:00:00,2013W47 ,2013W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2013,N,2012-11-19,2011-11-19,2013-08-19,2013-05-19,2013-10-19,2013-09-19,2013-11-12,2013-11-05,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-18,2013-01-01,2013-01-01,2013-03-01,2013-03-17,0,-3,-8,-36,-254,0,-3,-9,-36,-36,41350,77,77,18,2,12,5907,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-23,18-Mar-2013,Mar 18th 2013,Mon 03-18-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-17,2013-03-18,2013-03-18,Mon ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,12,2013,2013-03-17,2013-03-23,N,Wk.12 - 13,2013-03-17 00:00:00,2013-03-23 00:00:00,2013W12 ,2013W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2013,N,2012-03-18,2011-03-18,2012-12-18,2012-09-18,2013-02-18,2013-01-18,2013-03-11,2013-03-04,0,0,0,0,0,0,0,0,3,1,12,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-11,2013-01-01,2013-07-01,2013-07-01,2013-07-07,0,-1,-4,-20,-139,0,-1,-5,-20,-20,41465,192,11,11,5,28,5923,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-13,11-Jul-2013,Jul 11th 2013,Thu 07-11-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-07,2013-07-08,2013-07-11,Thu ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,28,2013,2013-07-07,2013-07-13,N,Wk.28 - 13,2013-07-07 00:00:00,2013-07-13 00:00:00,2013W28 ,2013W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2013,N,2012-07-11,2011-07-11,2013-04-11,2013-01-11,2013-06-11,2013-05-11,2013-07-04,2013-06-27,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-07,2013-01-01,2013-04-01,2013-04-01,2013-04-07,0,-2,-7,-33,-234,0,-2,-8,-33,-34,41370,97,7,7,1,15,5910,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-13,07-Apr-2013,Apr 7th 2013,Sun 04-07-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-07,2013-04-01,2013-04-07,Sun ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,15,2013,2013-04-07,2013-04-13,Y,Wk.15 - 13,2013-04-07 00:00:00,2013-04-13 00:00:00,2013W15 ,2013W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2013,N,2012-04-07,2011-04-07,2013-01-07,2012-10-07,2013-03-07,2013-02-07,2013-03-31,2013-03-24,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-11,2013-01-01,2013-10-01,2013-12-01,2013-12-08,0,0,1,2,14,0,0,0,2,2,41618,345,72,11,4,50,5945,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-14,11-Dec-2013,Dec 11th 2013,Wed 12-11-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-08,2013-12-09,2013-12-11,Wed ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,50,2013,2013-12-08,2013-12-14,N,Wk.50 - 13,2013-12-08 00:00:00,2013-12-14 00:00:00,2013W50 ,2013W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2013,N,2012-12-11,2011-12-11,2013-09-11,2013-06-11,2013-11-11,2013-10-11,2013-12-04,2013-11-27,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-26,2013-01-01,2013-10-01,2013-10-01,2013-10-20,0,0,-1,-5,-32,0,0,-2,-5,-5,41572,299,26,26,7,43,5938,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-26,26-Oct-2013,Oct 26th 2013,Sat 10-26-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-20,2013-10-21,2013-10-26,Sat ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,43,2013,2013-10-20,2013-10-26,N,Wk.43 - 13,2013-10-20 00:00:00,2013-10-26 00:00:00,2013W43 ,2013W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2013,N,2012-10-26,2011-10-26,2013-07-26,2013-04-26,2013-09-26,2013-08-26,2013-10-19,2013-10-12,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-20,2013-01-01,2013-01-01,2013-01-01,2013-01-20,0,-3,-10,-44,-311,0,-3,-11,-44,-45,41293,20,20,20,1,4,5899,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-26,20-Jan-2013,Jan 20th 2013,Sun 01-20-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-20,2013-01-14,2013-01-20,Sun ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,4,2013,2013-01-20,2013-01-26,Y,Wk.04 - 13,2013-01-20 00:00:00,2013-01-26 00:00:00,2013W04 ,2013W04 ,01/20/13 - 01/26/13,01/20 - 01/26,2013,N,2012-01-20,2011-01-20,2012-10-20,2012-07-20,2012-12-20,2012-11-20,2013-01-13,2013-01-06,0,0,0,0,0,0,0,0,1,1,4,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-27,2013-01-01,2013-04-01,2013-06-01,2013-06-23,0,-2,-5,-22,-153,0,-2,-6,-22,-22,41451,178,88,27,5,26,5921,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-29,27-Jun-2013,Jun 27th 2013,Thu 06-27-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-23,2013-06-24,2013-06-27,Thu ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,26,2013,2013-06-23,2013-06-29,N,Wk.26 - 13,2013-06-23 00:00:00,2013-06-29 00:00:00,2013W26 ,2013W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2013,N,2012-06-27,2011-06-27,2013-03-27,2012-12-27,2013-05-27,2013-04-27,2013-06-20,2013-06-13,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-16,2013-01-01,2013-07-01,2013-09-01,2013-09-15,0,-1,-2,-10,-72,0,-1,-3,-10,-10,41532,259,78,16,2,38,5933,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-21,16-Sep-2013,Sep 16th 2013,Mon 09-16-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-15,2013-09-16,2013-09-16,Mon ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,38,2013,2013-09-15,2013-09-21,N,Wk.38 - 13,2013-09-15 00:00:00,2013-09-21 00:00:00,2013W38 ,2013W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2013,N,2012-09-16,2011-09-16,2013-06-16,2013-03-16,2013-08-16,2013-07-16,2013-09-09,2013-09-02,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-20,2013-01-01,2013-04-01,2013-04-01,2013-04-14,0,-2,-7,-32,-221,0,-2,-8,-32,-32,41383,110,20,20,7,16,5911,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-20,20-Apr-2013,Apr 20th 2013,Sat 04-20-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-14,2013-04-15,2013-04-20,Sat ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,16,2013,2013-04-14,2013-04-20,N,Wk.16 - 13,2013-04-14 00:00:00,2013-04-20 00:00:00,2013W16 ,2013W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2013,N,2012-04-20,2011-04-20,2013-01-20,2012-10-20,2013-03-20,2013-02-20,2013-04-13,2013-04-06,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-14,2013-01-01,2013-04-01,2013-04-01,2013-04-14,0,-2,-7,-32,-227,0,-2,-8,-32,-33,41377,104,14,14,1,16,5911,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-20,14-Apr-2013,Apr 14th 2013,Sun 04-14-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-14,2013-04-08,2013-04-14,Sun ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,16,2013,2013-04-14,2013-04-20,Y,Wk.16 - 13,2013-04-14 00:00:00,2013-04-20 00:00:00,2013W16 ,2013W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2013,N,2012-04-14,2011-04-14,2013-01-14,2012-10-14,2013-03-14,2013-02-14,2013-04-07,2013-03-31,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-28,2013-01-01,2013-10-01,2013-10-01,2013-10-27,0,0,-1,-4,-30,0,0,-1,-4,-4,41574,301,28,28,2,44,5939,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-11-02,28-Oct-2013,Oct 28th 2013,Mon 10-28-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-10-27,2013-10-27,2013-10-28,2013-10-28,Mon ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,44,2013,2013-10-27,2013-11-02,N,Wk.44 - 13,2013-10-27 00:00:00,2013-11-02 00:00:00,2013W44 ,2013W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2013,N,2012-10-28,2011-10-28,2013-07-28,2013-04-28,2013-09-28,2013-08-28,2013-10-21,2013-10-14,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-08,2013-01-01,2013-01-01,2013-01-01,2013-01-06,0,-3,-10,-46,-323,0,-3,-11,-46,-46,41281,8,8,8,3,2,5897,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-12,08-Jan-2013,Jan 8th 2013,Tue 01-08-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-06,2013-01-07,2013-01-08,Tue ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,2,2013,2013-01-06,2013-01-12,N,Wk.02 - 13,2013-01-06 00:00:00,2013-01-12 00:00:00,2013W02 ,2013W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2013,N,2012-01-08,2011-01-08,2012-10-08,2012-07-08,2012-12-08,2012-11-08,2013-01-01,2012-12-25,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-13,2013-01-01,2013-01-01,2013-03-01,2013-03-10,0,-3,-8,-37,-259,0,-3,-9,-37,-37,41345,72,72,13,4,11,5906,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-16,13-Mar-2013,Mar 13th 2013,Wed 03-13-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-10,2013-03-11,2013-03-13,Wed ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,11,2013,2013-03-10,2013-03-16,N,Wk.11 - 13,2013-03-10 00:00:00,2013-03-16 00:00:00,2013W11 ,2013W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2013,N,2012-03-13,2011-03-13,2012-12-13,2012-09-13,2013-02-13,2013-01-13,2013-03-06,2013-02-27,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-28,2013-01-01,2013-04-01,2013-05-01,2013-05-26,0,-2,-6,-26,-183,0,-2,-6,-26,-26,41421,148,58,28,3,22,5917,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-06-01,28-May-2013,May 28th 2013,Tue 05-28-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-05-26,2013-05-26,2013-05-27,2013-05-28,Tue ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,22,2013,2013-05-26,2013-06-01,N,Wk.22 - 13,2013-05-26 00:00:00,2013-06-01 00:00:00,2013W22 ,2013W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2013,N,2012-05-28,2011-05-28,2013-02-28,2012-11-28,2013-04-28,2013-03-28,2013-05-21,2013-05-14,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-14,2013-01-01,2013-01-01,2013-01-01,2013-01-13,0,-3,-10,-45,-317,0,-3,-11,-45,-45,41287,14,14,14,2,3,5898,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-19,14-Jan-2013,Jan 14th 2013,Mon 01-14-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-13,2013-01-14,2013-01-14,Mon ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,3,2013,2013-01-13,2013-01-19,N,Wk.03 - 13,2013-01-13 00:00:00,2013-01-19 00:00:00,2013W03 ,2013W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2013,N,2012-01-14,2011-01-14,2012-10-14,2012-07-14,2012-12-14,2012-11-14,2013-01-07,2012-12-31,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-30,2013-01-01,2013-04-01,2013-04-01,2013-04-28,0,-2,-7,-30,-211,0,-2,-7,-30,-30,41393,120,30,30,3,18,5913,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-05-04,30-Apr-2013,Apr 30th 2013,Tue 04-30-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-04-28,2013-04-28,2013-04-29,2013-04-30,Tue ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,18,2013,2013-04-28,2013-05-04,N,Wk.18 - 13,2013-04-28 00:00:00,2013-05-04 00:00:00,2013W18 ,2013W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2013,N,2012-04-30,2011-04-30,2013-01-30,2012-10-30,2013-03-30,2013-02-28,2013-04-23,2013-04-16,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-14,2013-01-01,2013-07-01,2013-07-01,2013-07-14,0,-1,-4,-19,-136,0,-1,-5,-19,-20,41468,195,14,14,1,29,5924,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-20,14-Jul-2013,Jul 14th 2013,Sun 07-14-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-14,2013-07-08,2013-07-14,Sun ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,29,2013,2013-07-14,2013-07-20,Y,Wk.29 - 13,2013-07-14 00:00:00,2013-07-20 00:00:00,2013W29 ,2013W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2013,N,2012-07-14,2011-07-14,2013-04-14,2013-01-14,2013-06-14,2013-05-14,2013-07-07,2013-06-30,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-24,2013-01-01,2013-07-01,2013-07-01,2013-07-21,0,-1,-4,-18,-126,0,-1,-5,-18,-18,41478,205,24,24,4,30,5925,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-27,24-Jul-2013,Jul 24th 2013,Wed 07-24-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-21,2013-07-22,2013-07-24,Wed ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,30,2013,2013-07-21,2013-07-27,N,Wk.30 - 13,2013-07-21 00:00:00,2013-07-27 00:00:00,2013W30 ,2013W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2013,N,2012-07-24,2011-07-24,2013-04-24,2013-01-24,2013-06-24,2013-05-24,2013-07-17,2013-07-10,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-04,2013-01-01,2013-07-01,2013-09-01,2013-09-01,0,-1,-2,-12,-84,0,-1,-3,-12,-12,41520,247,66,4,4,36,5931,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-07,04-Sep-2013,Sep 4th 2013,Wed 09-04-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-01,2013-09-02,2013-09-04,Wed ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,36,2013,2013-09-01,2013-09-07,N,Wk.36 - 13,2013-09-01 00:00:00,2013-09-07 00:00:00,2013W36 ,2013W36 ,09/01/13 - 09/07/13,09/01 - 09/07,2013,N,2012-09-04,2011-09-04,2013-06-04,2013-03-04,2013-08-04,2013-07-04,2013-08-28,2013-08-21,0,0,0,0,0,0,0,0,9,3,36,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-18,2013-01-01,2013-10-01,2013-11-01,2013-11-17,0,0,0,-1,-9,0,0,-1,-1,-1,41595,322,49,18,2,47,5942,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-23,18-Nov-2013,Nov 18th 2013,Mon 11-18-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-17,2013-11-18,2013-11-18,Mon ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,47,2013,2013-11-17,2013-11-23,N,Wk.47 - 13,2013-11-17 00:00:00,2013-11-23 00:00:00,2013W47 ,2013W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2013,N,2012-11-18,2011-11-18,2013-08-18,2013-05-18,2013-10-18,2013-09-18,2013-11-11,2013-11-04,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-18,2013-01-01,2013-01-01,2013-02-01,2013-02-17,0,-3,-9,-40,-282,0,-3,-10,-40,-40,41322,49,49,18,2,8,5903,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-23,18-Feb-2013,Feb 18th 2013,Mon 02-18-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-17,2013-02-18,2013-02-18,Mon ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,8,2013,2013-02-17,2013-02-23,N,Wk.08 - 13,2013-02-17 00:00:00,2013-02-23 00:00:00,2013W08 ,2013W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2013,N,2012-02-18,2011-02-18,2012-11-18,2012-08-18,2013-01-18,2012-12-18,2013-02-11,2013-02-04,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-13,2013-01-01,2013-10-01,2013-11-01,2013-11-10,0,0,0,-2,-14,0,0,-1,-2,-2,41590,317,44,13,4,46,5941,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-16,13-Nov-2013,Nov 13th 2013,Wed 11-13-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-10,2013-11-11,2013-11-13,Wed ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,46,2013,2013-11-10,2013-11-16,N,Wk.46 - 13,2013-11-10 00:00:00,2013-11-16 00:00:00,2013W46 ,2013W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2013,N,2012-11-13,2011-11-13,2013-08-13,2013-05-13,2013-10-13,2013-09-13,2013-11-06,2013-10-30,0,0,0,0,0,0,0,1,11,4,46,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-02,2013-01-01,2013-10-01,2013-10-01,2013-09-29,0,0,-1,-8,-56,0,0,-2,-8,-8,41548,275,2,2,4,40,5935,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-05,02-Oct-2013,Oct 2nd 2013,Wed 10-02-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-09-29,2013-09-30,2013-10-02,Wed ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,40,2013,2013-09-29,2013-10-05,N,Wk.40 - 13,2013-09-29 00:00:00,2013-10-05 00:00:00,2013W40 ,2013W40 ,09/29/13 - 10/05/13,09/29 - 10/05,2013,N,2012-10-02,2011-10-02,2013-07-02,2013-04-02,2013-09-02,2013-08-02,2013-09-25,2013-09-18,0,0,0,0,0,0,0,0,10,4,40,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-05,2013-01-01,2013-01-01,2013-02-01,2013-02-03,0,-3,-9,-42,-295,0,-3,-10,-42,-42,41309,36,36,5,3,6,5901,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-09,05-Feb-2013,Feb 5th 2013,Tue 02-05-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-03,2013-02-04,2013-02-05,Tue ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,6,2013,2013-02-03,2013-02-09,N,Wk.06 - 13,2013-02-03 00:00:00,2013-02-09 00:00:00,2013W06 ,2013W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2013,N,2012-02-05,2011-02-05,2012-11-05,2012-08-05,2013-01-05,2012-12-05,2013-01-29,2013-01-22,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-02,2013-01-01,2013-04-01,2013-06-01,2013-06-02,0,-2,-5,-25,-178,0,-2,-6,-25,-26,41426,153,63,2,1,23,5918,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-08,02-Jun-2013,Jun 2nd 2013,Sun 06-02-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-02,2013-05-27,2013-06-02,Sun ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,23,2013,2013-06-02,2013-06-08,Y,Wk.23 - 13,2013-06-02 00:00:00,2013-06-08 00:00:00,2013W23 ,2013W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2013,N,2012-06-02,2011-06-02,2013-03-02,2012-12-02,2013-05-02,2013-04-02,2013-05-26,2013-05-19,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-12,2013-01-01,2013-01-01,2013-02-01,2013-02-10,0,-3,-9,-41,-288,0,-3,-10,-41,-41,41316,43,43,12,3,7,5902,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-16,12-Feb-2013,Feb 12th 2013,Tue 02-12-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-10,2013-02-11,2013-02-12,Tue ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,7,2013,2013-02-10,2013-02-16,N,Wk.07 - 13,2013-02-10 00:00:00,2013-02-16 00:00:00,2013W07 ,2013W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2013,N,2012-02-12,2011-02-12,2012-11-12,2012-08-12,2013-01-12,2012-12-12,2013-02-05,2013-01-29,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-23,2013-01-01,2013-10-01,2013-10-01,2013-10-20,0,0,-1,-5,-35,0,0,-2,-5,-5,41569,296,23,23,4,43,5938,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-26,23-Oct-2013,Oct 23rd 2013,Wed 10-23-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-20,2013-10-21,2013-10-23,Wed ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,43,2013,2013-10-20,2013-10-26,N,Wk.43 - 13,2013-10-20 00:00:00,2013-10-26 00:00:00,2013W43 ,2013W43 ,10/20/13 - 10/26/13,10/20 - 10/26,2013,N,2012-10-23,2011-10-23,2013-07-23,2013-04-23,2013-09-23,2013-08-23,2013-10-16,2013-10-09,0,0,0,0,0,0,0,0,10,4,43,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-12,2013-01-01,2013-01-01,2013-01-01,2013-01-06,0,-3,-10,-46,-319,0,-3,-11,-46,-46,41285,12,12,12,7,2,5897,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-12,12-Jan-2013,Jan 12th 2013,Sat 01-12-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-06,2013-01-07,2013-01-12,Sat ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,2,2013,2013-01-06,2013-01-12,N,Wk.02 - 13,2013-01-06 00:00:00,2013-01-12 00:00:00,2013W02 ,2013W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2013,N,2012-01-12,2011-01-12,2012-10-12,2012-07-12,2012-12-12,2012-11-12,2013-01-05,2012-12-29,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-04,2013-01-01,2013-04-01,2013-04-01,2013-03-31,0,-2,-7,-34,-237,0,-2,-8,-34,-34,41367,94,4,4,5,14,5909,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-06,04-Apr-2013,Apr 4th 2013,Thu 04-04-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-03-31,2013-04-01,2013-04-04,Thu ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,14,2013,2013-03-31,2013-04-06,N,Wk.14 - 13,2013-03-31 00:00:00,2013-04-06 00:00:00,2013W14 ,2013W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2013,N,2012-04-04,2011-04-04,2013-01-04,2012-10-04,2013-03-04,2013-02-04,2013-03-28,2013-03-21,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-17,2013-01-01,2013-04-01,2013-04-01,2013-04-14,0,-2,-7,-32,-224,0,-2,-8,-32,-32,41380,107,17,17,4,16,5911,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-20,17-Apr-2013,Apr 17th 2013,Wed 04-17-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-14,2013-04-15,2013-04-17,Wed ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,16,2013,2013-04-14,2013-04-20,N,Wk.16 - 13,2013-04-14 00:00:00,2013-04-20 00:00:00,2013W16 ,2013W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2013,N,2012-04-17,2011-04-17,2013-01-17,2012-10-17,2013-03-17,2013-02-17,2013-04-10,2013-04-03,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-21,2013-01-01,2013-04-01,2013-06-01,2013-06-16,0,-2,-5,-23,-159,0,-2,-6,-23,-23,41445,172,82,21,6,25,5920,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-22,21-Jun-2013,Jun 21st 2013,Fri 06-21-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-16,2013-06-17,2013-06-21,Fri ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,25,2013,2013-06-16,2013-06-22,N,Wk.25 - 13,2013-06-16 00:00:00,2013-06-22 00:00:00,2013W25 ,2013W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2013,N,2012-06-21,2011-06-21,2013-03-21,2012-12-21,2013-05-21,2013-04-21,2013-06-14,2013-06-07,0,0,0,0,0,0,0,0,6,2,25,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-15,2013-01-01,2013-10-01,2013-10-01,2013-10-13,0,0,-1,-6,-43,0,0,-2,-6,-6,41561,288,15,15,3,42,5937,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-19,15-Oct-2013,Oct 15th 2013,Tue 10-15-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-13,2013-10-14,2013-10-15,Tue ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,42,2013,2013-10-13,2013-10-19,N,Wk.42 - 13,2013-10-13 00:00:00,2013-10-19 00:00:00,2013W42 ,2013W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2013,N,2012-10-15,2011-10-15,2013-07-15,2013-04-15,2013-09-15,2013-08-15,2013-10-08,2013-10-01,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-01,2013-01-01,2013-07-01,2013-07-01,2013-06-30,0,-1,-4,-21,-149,0,-1,-5,-21,-21,41455,182,1,1,2,27,5922,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-06,01-Jul-2013,Jul 1st 2013,Mon 07-01-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-06-30,2013-07-01,2013-07-01,Mon ,2013M07,Jul-2013,Y,2013M07 ,Y,Year 2013 - Quarter 03,2013Q03 ,Y,27,2013,2013-06-30,2013-07-06,N,Wk.27 - 13,2013-06-30 00:00:00,2013-07-06 00:00:00,2013W27 ,2013W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2013,N,2012-07-01,2011-07-01,2013-04-01,2013-01-01,2013-06-01,2013-05-01,2013-06-24,2013-06-17,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-05,2013-01-01,2013-07-01,2013-07-01,2013-06-30,0,-1,-4,-21,-145,0,-1,-5,-21,-21,41459,186,5,5,6,27,5922,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-06,05-Jul-2013,Jul 5th 2013,Fri 07-05-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-06-30,2013-07-01,2013-07-05,Fri ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,27,2013,2013-06-30,2013-07-06,N,Wk.27 - 13,2013-06-30 00:00:00,2013-07-06 00:00:00,2013W27 ,2013W27 ,06/30/13 - 07/06/13,06/30 - 07/06,2013,N,2012-07-05,2011-07-05,2013-04-05,2013-01-05,2013-06-05,2013-05-05,2013-06-28,2013-06-21,0,0,0,0,0,0,0,0,7,3,27,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-25,2013-01-01,2013-07-01,2013-07-01,2013-07-21,0,-1,-4,-18,-125,0,-1,-5,-18,-18,41479,206,25,25,5,30,5925,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-27,25-Jul-2013,Jul 25th 2013,Thu 07-25-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-21,2013-07-22,2013-07-25,Thu ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,30,2013,2013-07-21,2013-07-27,N,Wk.30 - 13,2013-07-21 00:00:00,2013-07-27 00:00:00,2013W30 ,2013W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2013,N,2012-07-25,2011-07-25,2013-04-25,2013-01-25,2013-06-25,2013-05-25,2013-07-18,2013-07-11,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-13,2013-01-01,2013-07-01,2013-09-01,2013-09-08,0,-1,-2,-11,-75,0,-1,-3,-11,-11,41529,256,75,13,6,37,5932,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-14,13-Sep-2013,Sep 13th 2013,Fri 09-13-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-08,2013-09-09,2013-09-13,Fri ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,37,2013,2013-09-08,2013-09-14,N,Wk.37 - 13,2013-09-08 00:00:00,2013-09-14 00:00:00,2013W37 ,2013W37 ,09/08/13 - 09/14/13,09/08 - 09/14,2013,N,2012-09-13,2011-09-13,2013-06-13,2013-03-13,2013-08-13,2013-07-13,2013-09-06,2013-08-30,0,0,0,0,0,0,0,0,9,3,37,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-23,2013-01-01,2013-07-01,2013-09-01,2013-09-22,0,-1,-2,-9,-65,0,-1,-3,-9,-9,41539,266,85,23,2,39,5934,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-28,23-Sep-2013,Sep 23rd 2013,Mon 09-23-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-22,2013-09-23,2013-09-23,Mon ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,39,2013,2013-09-22,2013-09-28,N,Wk.39 - 13,2013-09-22 00:00:00,2013-09-28 00:00:00,2013W39 ,2013W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2013,N,2012-09-23,2011-09-23,2013-06-23,2013-03-23,2013-08-23,2013-07-23,2013-09-16,2013-09-09,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-24,2013-01-01,2013-01-01,2013-03-01,2013-03-24,0,-3,-8,-35,-248,0,-3,-9,-35,-36,41356,83,83,24,1,13,5908,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-30,24-Mar-2013,Mar 24th 2013,Sun 03-24-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-24,2013-03-18,2013-03-24,Sun ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,13,2013,2013-03-24,2013-03-30,Y,Wk.13 - 13,2013-03-24 00:00:00,2013-03-30 00:00:00,2013W13 ,2013W13 ,03/24/13 - 03/30/13,03/24 - 03/30,2013,N,2012-03-24,2011-03-24,2012-12-24,2012-09-24,2013-02-24,2013-01-24,2013-03-17,2013-03-10,0,0,0,0,0,0,0,0,3,1,13,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-15,2013-01-01,2013-01-01,2013-01-01,2013-01-13,0,-3,-10,-45,-316,0,-3,-11,-45,-45,41288,15,15,15,3,3,5898,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-19,15-Jan-2013,Jan 15th 2013,Tue 01-15-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-13,2013-01-14,2013-01-15,Tue ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,3,2013,2013-01-13,2013-01-19,N,Wk.03 - 13,2013-01-13 00:00:00,2013-01-19 00:00:00,2013W03 ,2013W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2013,N,2012-01-15,2011-01-15,2012-10-15,2012-07-15,2012-12-15,2012-11-15,2013-01-08,2013-01-01,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-07,2013-01-01,2013-10-01,2013-11-01,2013-11-03,0,0,0,-3,-20,0,0,-1,-3,-3,41584,311,38,7,5,45,5940,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-09,07-Nov-2013,Nov 7th 2013,Thu 11-07-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-03,2013-11-04,2013-11-07,Thu ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,45,2013,2013-11-03,2013-11-09,N,Wk.45 - 13,2013-11-03 00:00:00,2013-11-09 00:00:00,2013W45 ,2013W45 ,11/03/13 - 11/09/13,11/03 - 11/09,2013,N,2012-11-07,2011-11-07,2013-08-07,2013-05-07,2013-10-07,2013-09-07,2013-10-31,2013-10-24,0,0,0,0,0,0,0,0,11,4,45,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-31,2013-01-01,2013-07-01,2013-08-01,2013-08-25,0,-1,-3,-13,-88,0,-1,-3,-13,-13,41516,243,62,31,7,35,5930,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-31,31-Aug-2013,Aug 31st 2013,Sat 08-31-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-08-25,2013-08-25,2013-08-26,2013-08-31,Sat ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,35,2013,2013-08-25,2013-08-31,N,Wk.35 - 13,2013-08-25 00:00:00,2013-08-31 00:00:00,2013W35 ,2013W35 ,08/25/13 - 08/31/13,08/25 - 08/31,2013,N,2012-08-31,2011-08-31,2013-05-31,2013-02-28,2013-07-31,2013-06-30,2013-08-24,2013-08-17,0,0,0,0,0,0,0,0,9,3,35,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-20,2013-01-01,2013-10-01,2013-12-01,2013-12-15,0,0,1,3,23,0,0,0,3,3,41627,354,81,20,6,51,5946,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-21,20-Dec-2013,Dec 20th 2013,Fri 12-20-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-15,2013-12-16,2013-12-20,Fri ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,51,2013,2013-12-15,2013-12-21,N,Wk.51 - 13,2013-12-15 00:00:00,2013-12-21 00:00:00,2013W51 ,2013W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2013,N,2012-12-20,2011-12-20,2013-09-20,2013-06-20,2013-11-20,2013-10-20,2013-12-13,2013-12-06,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-11,2013-01-01,2013-04-01,2013-06-01,2013-06-09,0,-2,-5,-24,-169,0,-2,-6,-24,-24,41435,162,72,11,3,24,5919,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-15,11-Jun-2013,Jun 11th 2013,Tue 06-11-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-09,2013-06-10,2013-06-11,Tue ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,24,2013,2013-06-09,2013-06-15,N,Wk.24 - 13,2013-06-09 00:00:00,2013-06-15 00:00:00,2013W24 ,2013W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2013,N,2012-06-11,2011-06-11,2013-03-11,2012-12-11,2013-05-11,2013-04-11,2013-06-04,2013-05-28,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-01,2013-01-01,2013-07-01,2013-08-01,2013-07-28,0,-1,-3,-17,-118,0,-1,-4,-17,-17,41486,213,32,1,5,31,5926,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-03,01-Aug-2013,Aug 1st 2013,Thu 08-01-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-07-28,2013-07-29,2013-08-01,Thu ,2013M08,Aug-2013,Y,2013M08 ,Y,Year 2013 - Quarter 03,2013Q03 ,N,31,2013,2013-07-28,2013-08-03,N,Wk.31 - 13,2013-07-28 00:00:00,2013-08-03 00:00:00,2013W31 ,2013W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2013,N,2012-08-01,2011-08-01,2013-05-01,2013-02-01,2013-07-01,2013-06-01,2013-07-25,2013-07-18,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-26,2013-01-01,2013-07-01,2013-09-01,2013-09-22,0,-1,-2,-9,-62,0,-1,-3,-9,-9,41542,269,88,26,5,39,5934,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-28,26-Sep-2013,Sep 26th 2013,Thu 09-26-13,1,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-22,2013-09-23,2013-09-26,Thu ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,39,2013,2013-09-22,2013-09-28,N,Wk.39 - 13,2013-09-22 00:00:00,2013-09-28 00:00:00,2013W39 ,2013W39 ,09/22/13 - 09/28/13,09/22 - 09/28,2013,N,2012-09-26,2011-09-26,2013-06-26,2013-03-26,2013-08-26,2013-07-26,2013-09-19,2013-09-12,0,0,0,0,0,0,0,0,9,3,39,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-16,2013-01-01,2013-01-01,2013-02-01,2013-02-10,0,-3,-9,-41,-284,0,-3,-10,-41,-41,41320,47,47,16,7,7,5902,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-16,16-Feb-2013,Feb 16th 2013,Sat 02-16-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-10,2013-02-11,2013-02-16,Sat ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,7,2013,2013-02-10,2013-02-16,N,Wk.07 - 13,2013-02-10 00:00:00,2013-02-16 00:00:00,2013W07 ,2013W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2013,N,2012-02-16,2011-02-16,2012-11-16,2012-08-16,2013-01-16,2012-12-16,2013-02-09,2013-02-02,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-13,2013-01-01,2013-01-01,2013-01-01,2013-01-13,0,-3,-10,-45,-318,0,-3,-11,-45,-46,41286,13,13,13,1,3,5898,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-19,13-Jan-2013,Jan 13th 2013,Sun 01-13-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-13,2013-01-07,2013-01-13,Sun ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,3,2013,2013-01-13,2013-01-19,Y,Wk.03 - 13,2013-01-13 00:00:00,2013-01-19 00:00:00,2013W03 ,2013W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2013,N,2012-01-13,2011-01-13,2012-10-13,2012-07-13,2012-12-13,2012-11-13,2013-01-06,2012-12-30,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-08,2013-01-01,2013-04-01,2013-06-01,2013-06-02,0,-2,-5,-25,-172,0,-2,-6,-25,-25,41432,159,69,8,7,23,5918,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-08,08-Jun-2013,Jun 8th 2013,Sat 06-08-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-02,2013-06-03,2013-06-08,Sat ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,23,2013,2013-06-02,2013-06-08,N,Wk.23 - 13,2013-06-02 00:00:00,2013-06-08 00:00:00,2013W23 ,2013W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2013,N,2012-06-08,2011-06-08,2013-03-08,2012-12-08,2013-05-08,2013-04-08,2013-06-01,2013-05-25,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-30,2013-01-01,2013-01-01,2013-01-01,2013-01-27,0,-3,-10,-43,-301,0,-3,-10,-43,-43,41303,30,30,30,4,5,5900,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-02-02,30-Jan-2013,Jan 30th 2013,Wed 01-30-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-01-27,2013-01-27,2013-01-28,2013-01-30,Wed ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,5,2013,2013-01-27,2013-02-02,N,Wk.05 - 13,2013-01-27 00:00:00,2013-02-02 00:00:00,2013W05 ,2013W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2013,N,2012-01-30,2011-01-30,2012-10-30,2012-07-30,2012-12-30,2012-11-30,2013-01-23,2013-01-16,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-13,2013-01-01,2013-04-01,2013-06-01,2013-06-09,0,-2,-5,-24,-167,0,-2,-6,-24,-24,41437,164,74,13,5,24,5919,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-15,13-Jun-2013,Jun 13th 2013,Thu 06-13-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-09,2013-06-10,2013-06-13,Thu ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,24,2013,2013-06-09,2013-06-15,N,Wk.24 - 13,2013-06-09 00:00:00,2013-06-15 00:00:00,2013W24 ,2013W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2013,N,2012-06-13,2011-06-13,2013-03-13,2012-12-13,2013-05-13,2013-04-13,2013-06-06,2013-05-30,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-06,2013-01-01,2013-01-01,2013-03-01,2013-03-03,0,-3,-8,-38,-266,0,-3,-9,-38,-38,41338,65,65,6,4,10,5905,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-09,06-Mar-2013,Mar 6th 2013,Wed 03-06-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-03,2013-03-04,2013-03-06,Wed ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,10,2013,2013-03-03,2013-03-09,N,Wk.10 - 13,2013-03-03 00:00:00,2013-03-09 00:00:00,2013W10 ,2013W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2013,N,2012-03-06,2011-03-06,2012-12-06,2012-09-06,2013-02-06,2013-01-06,2013-02-27,2013-02-20,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-15,2013-01-01,2013-01-01,2013-03-01,2013-03-10,0,-3,-8,-37,-257,0,-3,-9,-37,-37,41347,74,74,15,6,11,5906,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-16,15-Mar-2013,Mar 15th 2013,Fri 03-15-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-10,2013-03-11,2013-03-15,Fri ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,11,2013,2013-03-10,2013-03-16,N,Wk.11 - 13,2013-03-10 00:00:00,2013-03-16 00:00:00,2013W11 ,2013W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2013,N,2012-03-15,2011-03-15,2012-12-15,2012-09-15,2013-02-15,2013-01-15,2013-03-08,2013-03-01,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-15,2013-01-01,2013-10-01,2013-12-01,2013-12-15,0,0,1,3,18,0,0,0,3,2,41622,349,76,15,1,51,5946,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-21,15-Dec-2013,Dec 15th 2013,Sun 12-15-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-15,2013-12-09,2013-12-15,Sun ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,51,2013,2013-12-15,2013-12-21,Y,Wk.51 - 13,2013-12-15 00:00:00,2013-12-21 00:00:00,2013W51 ,2013W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2013,N,2012-12-15,2011-12-15,2013-09-15,2013-06-15,2013-11-15,2013-10-15,2013-12-08,2013-12-01,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-19,2013-01-01,2013-04-01,2013-04-01,2013-04-14,0,-2,-7,-32,-222,0,-2,-8,-32,-32,41382,109,19,19,6,16,5911,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-20,19-Apr-2013,Apr 19th 2013,Fri 04-19-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-14,2013-04-15,2013-04-19,Fri ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,16,2013,2013-04-14,2013-04-20,N,Wk.16 - 13,2013-04-14 00:00:00,2013-04-20 00:00:00,2013W16 ,2013W16 ,04/14/13 - 04/20/13,04/14 - 04/20,2013,N,2012-04-19,2011-04-19,2013-01-19,2012-10-19,2013-03-19,2013-02-19,2013-04-12,2013-04-05,0,0,0,0,0,0,0,0,4,2,16,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-14,2013-01-01,2013-10-01,2013-12-01,2013-12-08,0,0,1,2,17,0,0,0,2,2,41621,348,75,14,7,50,5945,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-14,14-Dec-2013,Dec 14th 2013,Sat 12-14-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-08,2013-12-09,2013-12-14,Sat ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,50,2013,2013-12-08,2013-12-14,N,Wk.50 - 13,2013-12-08 00:00:00,2013-12-14 00:00:00,2013W50 ,2013W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2013,N,2012-12-14,2011-12-14,2013-09-14,2013-06-14,2013-11-14,2013-10-14,2013-12-07,2013-11-30,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-28,2013-01-01,2013-01-01,2013-02-01,2013-02-24,0,-3,-9,-39,-272,0,-3,-9,-39,-39,41332,59,59,28,5,9,5904,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-03-02,28-Feb-2013,Feb 28th 2013,Thu 02-28-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-02-24,2013-02-24,2013-02-25,2013-02-28,Thu ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,9,2013,2013-02-24,2013-03-02,N,Wk.09 - 13,2013-02-24 00:00:00,2013-03-02 00:00:00,2013W09 ,2013W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2013,N,2012-02-28,2011-02-28,2012-11-28,2012-08-28,2013-01-28,2012-12-28,2013-02-21,2013-02-14,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-26,2013-01-01,2013-01-01,2013-02-01,2013-02-24,0,-3,-9,-39,-274,0,-3,-9,-39,-39,41330,57,57,26,3,9,5904,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-03-02,26-Feb-2013,Feb 26th 2013,Tue 02-26-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-02-24,2013-02-24,2013-02-25,2013-02-26,Tue ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,9,2013,2013-02-24,2013-03-02,N,Wk.09 - 13,2013-02-24 00:00:00,2013-03-02 00:00:00,2013W09 ,2013W09 ,02/24/13 - 03/02/13,02/24 - 03/02,2013,N,2012-02-26,2011-02-26,2012-11-26,2012-08-26,2013-01-26,2012-12-26,2013-02-19,2013-02-12,0,0,0,0,0,0,0,0,3,1,9,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-14,2013-01-01,2013-07-01,2013-08-01,2013-08-11,0,-1,-3,-15,-105,0,-1,-4,-15,-15,41499,226,45,14,4,33,5928,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-17,14-Aug-2013,Aug 14th 2013,Wed 08-14-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-11,2013-08-12,2013-08-14,Wed ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,33,2013,2013-08-11,2013-08-17,N,Wk.33 - 13,2013-08-11 00:00:00,2013-08-17 00:00:00,2013W33 ,2013W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2013,N,2012-08-14,2011-08-14,2013-05-14,2013-02-14,2013-07-14,2013-06-14,2013-08-07,2013-07-31,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-23,2013-01-01,2013-04-01,2013-06-01,2013-06-23,0,-2,-5,-22,-157,0,-2,-6,-22,-23,41447,174,84,23,1,26,5921,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-29,23-Jun-2013,Jun 23rd 2013,Sun 06-23-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-23,2013-06-17,2013-06-23,Sun ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,26,2013,2013-06-23,2013-06-29,Y,Wk.26 - 13,2013-06-23 00:00:00,2013-06-29 00:00:00,2013W26 ,2013W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2013,N,2012-06-23,2011-06-23,2013-03-23,2012-12-23,2013-05-23,2013-04-23,2013-06-16,2013-06-09,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-07,2013-01-01,2013-04-01,2013-06-01,2013-06-02,0,-2,-5,-25,-173,0,-2,-6,-25,-25,41431,158,68,7,6,23,5918,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-08,07-Jun-2013,Jun 7th 2013,Fri 06-07-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-02,2013-06-03,2013-06-07,Fri ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,23,2013,2013-06-02,2013-06-08,N,Wk.23 - 13,2013-06-02 00:00:00,2013-06-08 00:00:00,2013W23 ,2013W23 ,06/02/13 - 06/08/13,06/02 - 06/08,2013,N,2012-06-07,2011-06-07,2013-03-07,2012-12-07,2013-05-07,2013-04-07,2013-05-31,2013-05-24,0,0,0,0,0,0,0,0,6,2,23,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-08,2013-01-01,2013-10-01,2013-10-01,2013-10-06,0,0,-1,-7,-50,0,0,-2,-7,-7,41554,281,8,8,3,41,5936,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-12,08-Oct-2013,Oct 8th 2013,Tue 10-08-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-06,2013-10-07,2013-10-08,Tue ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,41,2013,2013-10-06,2013-10-12,N,Wk.41 - 13,2013-10-06 00:00:00,2013-10-12 00:00:00,2013W41 ,2013W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2013,N,2012-10-08,2011-10-08,2013-07-08,2013-04-08,2013-09-08,2013-08-08,2013-10-01,2013-09-24,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-12,2013-01-01,2013-10-01,2013-11-01,2013-11-10,0,0,0,-2,-15,0,0,-1,-2,-2,41589,316,43,12,3,46,5941,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-16,12-Nov-2013,Nov 12th 2013,Tue 11-12-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-10,2013-11-11,2013-11-12,Tue ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,46,2013,2013-11-10,2013-11-16,N,Wk.46 - 13,2013-11-10 00:00:00,2013-11-16 00:00:00,2013W46 ,2013W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2013,N,2012-11-12,2011-11-12,2013-08-12,2013-05-12,2013-10-12,2013-09-12,2013-11-05,2013-10-29,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-22,2013-01-01,2013-04-01,2013-04-01,2013-04-21,0,-2,-7,-31,-219,0,-2,-8,-31,-31,41385,112,22,22,2,17,5912,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-27,22-Apr-2013,Apr 22nd 2013,Mon 04-22-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-21,2013-04-22,2013-04-22,Mon ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,17,2013,2013-04-21,2013-04-27,N,Wk.17 - 13,2013-04-21 00:00:00,2013-04-27 00:00:00,2013W17 ,2013W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2013,N,2012-04-22,2011-04-22,2013-01-22,2012-10-22,2013-03-22,2013-02-22,2013-04-15,2013-04-08,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-31,2013-01-01,2013-10-01,2013-10-01,2013-10-27,0,0,-1,-4,-27,0,0,-1,-4,-4,41577,304,31,31,5,44,5939,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-11-02,31-Oct-2013,Oct 31st 2013,Thu 10-31-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-10-27,2013-10-27,2013-10-28,2013-10-31,Thu ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,44,2013,2013-10-27,2013-11-02,N,Wk.44 - 13,2013-10-27 00:00:00,2013-11-02 00:00:00,2013W44 ,2013W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2013,N,2012-10-31,2011-10-31,2013-07-31,2013-04-30,2013-09-30,2013-08-31,2013-10-24,2013-10-17,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-07,2013-01-01,2013-01-01,2013-01-01,2013-01-06,0,-3,-10,-46,-324,0,-3,-11,-46,-46,41280,7,7,7,2,2,5897,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-12,07-Jan-2013,Jan 7th 2013,Mon 01-07-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-06,2013-01-07,2013-01-07,Mon ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,2,2013,2013-01-06,2013-01-12,N,Wk.02 - 13,2013-01-06 00:00:00,2013-01-12 00:00:00,2013W02 ,2013W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2013,N,2012-01-07,2011-01-07,2012-10-07,2012-07-07,2012-12-07,2012-11-07,2012-12-31,2012-12-24,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-25,2013-01-01,2013-10-01,2013-12-01,2013-12-22,0,0,1,4,28,0,0,0,4,4,41632,359,86,25,4,52,5947,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-28,25-Dec-2013,Dec 25th 2013,Wed 12-25-13,0,0,0,0,2013-12-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-22,2013-12-23,2013-12-25,Wed ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,52,2013,2013-12-22,2013-12-28,N,Wk.52 - 13,2013-12-22 00:00:00,2013-12-28 00:00:00,2013W52 ,2013W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2013,N,2012-12-25,2011-12-25,2013-09-25,2013-06-25,2013-11-25,2013-10-25,2013-12-18,2013-12-11,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-10,2013-01-01,2013-10-01,2013-12-01,2013-12-08,0,0,1,2,13,0,0,0,2,2,41617,344,71,10,3,50,5945,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-14,10-Dec-2013,Dec 10th 2013,Tue 12-10-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-08,2013-12-09,2013-12-10,Tue ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,50,2013,2013-12-08,2013-12-14,N,Wk.50 - 13,2013-12-08 00:00:00,2013-12-14 00:00:00,2013W50 ,2013W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2013,N,2012-12-10,2011-12-10,2013-09-10,2013-06-10,2013-11-10,2013-10-10,2013-12-03,2013-11-26,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-29,2013-01-01,2013-04-01,2013-06-01,2013-06-23,0,-2,-5,-22,-151,0,-2,-6,-22,-22,41453,180,90,29,7,26,5921,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-29,29-Jun-2013,Jun 29th 2013,Sat 06-29-13,1,0,0,0,2013-06-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-23,2013-06-24,2013-06-29,Sat ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,26,2013,2013-06-23,2013-06-29,N,Wk.26 - 13,2013-06-23 00:00:00,2013-06-29 00:00:00,2013W26 ,2013W26 ,06/23/13 - 06/29/13,06/23 - 06/29,2013,N,2012-06-29,2011-06-29,2013-03-29,2012-12-29,2013-05-29,2013-04-29,2013-06-22,2013-06-15,0,0,0,0,0,0,0,0,6,2,26,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-01,2013-01-01,2013-01-01,2013-02-01,2013-01-27,0,-3,-9,-43,-299,0,-3,-10,-43,-43,41305,32,32,1,6,5,5900,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-02,01-Feb-2013,Feb 1st 2013,Fri 02-01-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-01-27,2013-01-28,2013-02-01,Fri ,2013M02,Feb-2013,Y,2013M02 ,Y,Year 2013 - Quarter 01,2013Q01 ,N,5,2013,2013-01-27,2013-02-02,N,Wk.05 - 13,2013-01-27 00:00:00,2013-02-02 00:00:00,2013W05 ,2013W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2013,N,2012-02-01,2011-02-01,2012-11-01,2012-08-01,2013-01-01,2012-12-01,2013-01-25,2013-01-18,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-30,2013-01-01,2013-10-01,2013-12-01,2013-12-29,0,0,1,5,33,1,1,1,5,5,41637,364,91,30,2,53,5948,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-31,30-Dec-2013,Dec 30th 2013,Mon 12-30-13,0,0,0,0,2013-12-21,365,92,31,3,2013-12-29,2013-12-29,2013-12-29,2013-12-29,2013-12-30,2013-12-30,Mon ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,1,2014,2013-12-29,2014-01-04,N,Wk.53 - 13,2013-12-29 00:00:00,2013-12-31 00:00:00,2013W53 ,2013W53 ,12/29/13 - 12/31/13,12/29 - 12/31,2013,N,2012-12-30,2011-12-30,2013-09-30,2013-06-30,2013-11-30,2013-10-30,2013-12-23,2013-12-16,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-13,2013-01-01,2013-01-01,2013-02-01,2013-02-10,0,-3,-9,-41,-287,0,-3,-10,-41,-41,41317,44,44,13,4,7,5902,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-16,13-Feb-2013,Feb 13th 2013,Wed 02-13-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-10,2013-02-11,2013-02-13,Wed ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,7,2013,2013-02-10,2013-02-16,N,Wk.07 - 13,2013-02-10 00:00:00,2013-02-16 00:00:00,2013W07 ,2013W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2013,N,2012-02-13,2011-02-13,2012-11-13,2012-08-13,2013-01-13,2012-12-13,2013-02-06,2013-01-30,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-29,2013-01-01,2013-10-01,2013-11-01,2013-11-24,0,0,0,0,2,0,0,0,0,0,41606,333,60,29,6,48,5943,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-30,29-Nov-2013,Nov 29th 2013,Fri 11-29-13,0,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-11-24,2013-11-24,2013-11-25,2013-11-29,Fri ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,48,2013,2013-11-24,2013-11-30,N,Wk.48 - 13,2013-11-24 00:00:00,2013-11-30 00:00:00,2013W48 ,2013W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2013,N,2012-11-29,2011-11-29,2013-08-29,2013-05-29,2013-10-29,2013-09-29,2013-11-22,2013-11-15,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-09,2013-01-01,2013-10-01,2013-10-01,2013-10-06,0,0,-1,-7,-49,0,0,-2,-7,-7,41555,282,9,9,4,41,5936,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-12,09-Oct-2013,Oct 9th 2013,Wed 10-09-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-06,2013-10-07,2013-10-09,Wed ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,41,2013,2013-10-06,2013-10-12,N,Wk.41 - 13,2013-10-06 00:00:00,2013-10-12 00:00:00,2013W41 ,2013W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2013,N,2012-10-09,2011-10-09,2013-07-09,2013-04-09,2013-09-09,2013-08-09,2013-10-02,2013-09-25,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-09,2013-01-01,2013-04-01,2013-06-01,2013-06-09,0,-2,-5,-24,-171,0,-2,-6,-24,-25,41433,160,70,9,1,24,5919,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-15,09-Jun-2013,Jun 9th 2013,Sun 06-09-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-09,2013-06-03,2013-06-09,Sun ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,24,2013,2013-06-09,2013-06-15,Y,Wk.24 - 13,2013-06-09 00:00:00,2013-06-15 00:00:00,2013W24 ,2013W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2013,N,2012-06-09,2011-06-09,2013-03-09,2012-12-09,2013-05-09,2013-04-09,2013-06-02,2013-05-26,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-10,2013-01-01,2013-10-01,2013-10-01,2013-10-06,0,0,-1,-7,-48,0,0,-2,-7,-7,41556,283,10,10,5,41,5936,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-12,10-Oct-2013,Oct 10th 2013,Thu 10-10-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-06,2013-10-07,2013-10-10,Thu ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,41,2013,2013-10-06,2013-10-12,N,Wk.41 - 13,2013-10-06 00:00:00,2013-10-12 00:00:00,2013W41 ,2013W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2013,N,2012-10-10,2011-10-10,2013-07-10,2013-04-10,2013-09-10,2013-08-10,2013-10-03,2013-09-26,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-28,2013-01-01,2013-10-01,2013-11-01,2013-11-24,0,0,0,0,1,0,0,0,0,0,41605,332,59,28,5,48,5943,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-30,28-Nov-2013,Nov 28th 2013,Thu 11-28-13,0,0,0,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-11-24,2013-11-24,2013-11-25,2013-11-28,Thu ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,48,2013,2013-11-24,2013-11-30,N,Wk.48 - 13,2013-11-24 00:00:00,2013-11-30 00:00:00,2013W48 ,2013W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2013,N,2012-11-28,2011-11-28,2013-08-28,2013-05-28,2013-10-28,2013-09-28,2013-11-21,2013-11-14,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-31,2013-01-01,2013-04-01,2013-05-01,2013-05-26,0,-2,-6,-26,-180,0,-2,-6,-26,-26,41424,151,61,31,6,22,5917,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-06-01,31-May-2013,May 31st 2013,Fri 05-31-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-05-26,2013-05-26,2013-05-27,2013-05-31,Fri ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,22,2013,2013-05-26,2013-06-01,N,Wk.22 - 13,2013-05-26 00:00:00,2013-06-01 00:00:00,2013W22 ,2013W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2013,N,2012-05-31,2011-05-31,2013-02-28,2012-11-30,2013-04-30,2013-03-31,2013-05-24,2013-05-17,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-09-15,2013-01-01,2013-07-01,2013-09-01,2013-09-15,0,-1,-2,-10,-73,0,-1,-3,-10,-11,41531,258,77,15,1,38,5933,3,9,1365,3,455,114,2013-12-31,2013-09-30,2013-09-30,2013-09-21,15-Sep-2013,Sep 15th 2013,Sun 09-15-13,1,0,0,0,2013-06-21,365,92,30,7,2012-12-30,2013-06-30,2013-08-25,2013-09-15,2013-09-09,2013-09-15,Sun ,2013M09,Sep-2013,N,2013M09 ,N,Year 2013 - Quarter 03,2013Q03 ,N,38,2013,2013-09-15,2013-09-21,Y,Wk.38 - 13,2013-09-15 00:00:00,2013-09-21 00:00:00,2013W38 ,2013W38 ,09/15/13 - 09/21/13,09/15 - 09/21,2013,N,2012-09-15,2011-09-15,2013-06-15,2013-03-15,2013-08-15,2013-07-15,2013-09-08,2013-09-01,0,0,0,0,0,0,0,0,9,3,38,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-31,2013-01-01,2013-07-01,2013-07-01,2013-07-28,0,-1,-4,-17,-119,0,-1,-4,-17,-17,41485,212,31,31,4,31,5926,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-08-03,31-Jul-2013,Jul 31st 2013,Wed 07-31-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-07-28,2013-07-29,2013-07-31,Wed ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,31,2013,2013-07-28,2013-08-03,N,Wk.31 - 13,2013-07-28 00:00:00,2013-08-03 00:00:00,2013W31 ,2013W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2013,N,2012-07-31,2011-07-31,2013-04-30,2013-01-31,2013-06-30,2013-05-31,2013-07-24,2013-07-17,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-17,2013-01-01,2013-10-01,2013-11-01,2013-11-17,0,0,0,-1,-10,0,0,-1,-1,-2,41594,321,48,17,1,47,5942,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-23,17-Nov-2013,Nov 17th 2013,Sun 11-17-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-17,2013-11-11,2013-11-17,Sun ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,47,2013,2013-11-17,2013-11-23,Y,Wk.47 - 13,2013-11-17 00:00:00,2013-11-23 00:00:00,2013W47 ,2013W47 ,11/17/13 - 11/23/13,11/17 - 11/23,2013,N,2012-11-17,2011-11-17,2013-08-17,2013-05-17,2013-10-17,2013-09-17,2013-11-10,2013-11-03,0,0,0,0,0,0,0,0,11,4,47,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-18,2013-01-01,2013-01-01,2013-01-01,2013-01-13,0,-3,-10,-45,-313,0,-3,-11,-45,-45,41291,18,18,18,6,3,5898,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-19,18-Jan-2013,Jan 18th 2013,Fri 01-18-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-13,2013-01-14,2013-01-18,Fri ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,3,2013,2013-01-13,2013-01-19,N,Wk.03 - 13,2013-01-13 00:00:00,2013-01-19 00:00:00,2013W03 ,2013W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2013,N,2012-01-18,2011-01-18,2012-10-18,2012-07-18,2012-12-18,2012-11-18,2013-01-11,2013-01-04,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-26,2013-01-01,2013-04-01,2013-05-01,2013-05-26,0,-2,-6,-26,-185,0,-2,-6,-26,-27,41419,146,56,26,1,22,5917,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-06-01,26-May-2013,May 26th 2013,Sun 05-26-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-05-26,2013-05-26,2013-05-20,2013-05-26,Sun ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,22,2013,2013-05-26,2013-06-01,Y,Wk.22 - 13,2013-05-26 00:00:00,2013-06-01 00:00:00,2013W22 ,2013W22 ,05/26/13 - 06/01/13,05/26 - 06/01,2013,N,2012-05-26,2011-05-26,2013-02-26,2012-11-26,2013-04-26,2013-03-26,2013-05-19,2013-05-12,0,0,0,0,0,0,0,0,6,2,22,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-06,2013-01-01,2013-04-01,2013-04-01,2013-03-31,0,-2,-7,-34,-235,0,-2,-8,-34,-34,41369,96,6,6,7,14,5909,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-06,06-Apr-2013,Apr 6th 2013,Sat 04-06-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-03-31,2013-04-01,2013-04-06,Sat ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,14,2013,2013-03-31,2013-04-06,N,Wk.14 - 13,2013-03-31 00:00:00,2013-04-06 00:00:00,2013W14 ,2013W14 ,03/31/13 - 04/06/13,03/31 - 04/06,2013,N,2012-04-06,2011-04-06,2013-01-06,2012-10-06,2013-03-06,2013-02-06,2013-03-30,2013-03-23,0,0,0,0,0,0,0,0,4,2,14,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-27,2013-01-01,2013-10-01,2013-11-01,2013-11-24,0,0,0,0,0,0,0,0,0,0,41604,331,58,27,4,48,5943,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-30,27-Nov-2013,Nov 27th 2013,Wed 11-27-13,1,1,1,1,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-11-24,2013-11-24,2013-11-25,2013-11-27,Wed ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,48,2013,2013-11-24,2013-11-30,N,Wk.48 - 13,2013-11-24 00:00:00,2013-11-30 00:00:00,2013W48 ,2013W48 ,11/24/13 - 11/30/13,11/24 - 11/30,2013,N,2012-11-27,2011-11-27,2013-08-27,2013-05-27,2013-10-27,2013-09-27,2013-11-20,2013-11-13,0,0,0,0,0,0,0,0,12,4,48,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-10,2013-01-01,2013-07-01,2013-08-01,2013-08-04,0,-1,-3,-16,-109,0,-1,-4,-16,-16,41495,222,41,10,7,32,5927,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-10,10-Aug-2013,Aug 10th 2013,Sat 08-10-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-04,2013-08-05,2013-08-10,Sat ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,32,2013,2013-08-04,2013-08-10,N,Wk.32 - 13,2013-08-04 00:00:00,2013-08-10 00:00:00,2013W32 ,2013W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2013,N,2012-08-10,2011-08-10,2013-05-10,2013-02-10,2013-07-10,2013-06-10,2013-08-03,2013-07-27,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-24,2013-01-01,2013-04-01,2013-04-01,2013-04-21,0,-2,-7,-31,-217,0,-2,-8,-31,-31,41387,114,24,24,4,17,5912,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-04-27,24-Apr-2013,Apr 24th 2013,Wed 04-24-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-03-31,2013-04-21,2013-04-22,2013-04-24,Wed ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,17,2013,2013-04-21,2013-04-27,N,Wk.17 - 13,2013-04-21 00:00:00,2013-04-27 00:00:00,2013W17 ,2013W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2013,N,2012-04-24,2011-04-24,2013-01-24,2012-10-24,2013-03-24,2013-02-24,2013-04-17,2013-04-10,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-29,2013-01-01,2013-07-01,2013-07-01,2013-07-28,0,-1,-4,-17,-121,0,-1,-4,-17,-17,41483,210,29,29,2,31,5926,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-08-03,29-Jul-2013,Jul 29th 2013,Mon 07-29-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-07-28,2013-07-29,2013-07-29,Mon ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,31,2013,2013-07-28,2013-08-03,N,Wk.31 - 13,2013-07-28 00:00:00,2013-08-03 00:00:00,2013W31 ,2013W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2013,N,2012-07-29,2011-07-29,2013-04-29,2013-01-29,2013-06-29,2013-05-29,2013-07-22,2013-07-15,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-29,2013-01-01,2013-10-01,2013-10-01,2013-10-27,0,0,-1,-4,-29,0,0,-1,-4,-4,41575,302,29,29,3,44,5939,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-11-02,29-Oct-2013,Oct 29th 2013,Tue 10-29-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-10-27,2013-10-27,2013-10-28,2013-10-29,Tue ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,44,2013,2013-10-27,2013-11-02,N,Wk.44 - 13,2013-10-27 00:00:00,2013-11-02 00:00:00,2013W44 ,2013W44 ,10/27/13 - 11/02/13,10/27 - 11/02,2013,N,2012-10-29,2011-10-29,2013-07-29,2013-04-29,2013-09-29,2013-08-29,2013-10-22,2013-10-15,0,0,0,0,0,0,0,0,11,4,44,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-17,2013-01-01,2013-07-01,2013-07-01,2013-07-14,0,-1,-4,-19,-133,0,-1,-5,-19,-19,41471,198,17,17,4,29,5924,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-20,17-Jul-2013,Jul 17th 2013,Wed 07-17-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-14,2013-07-15,2013-07-17,Wed ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,29,2013,2013-07-14,2013-07-20,N,Wk.29 - 13,2013-07-14 00:00:00,2013-07-20 00:00:00,2013W29 ,2013W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2013,N,2012-07-17,2011-07-17,2013-04-17,2013-01-17,2013-06-17,2013-05-17,2013-07-10,2013-07-03,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-22,2013-01-01,2013-10-01,2013-12-01,2013-12-22,0,0,1,4,25,0,0,0,4,3,41629,356,83,22,1,52,5947,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-28,22-Dec-2013,Dec 22nd 2013,Sun 12-22-13,0,0,0,0,2013-12-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-22,2013-12-16,2013-12-22,Sun ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,52,2013,2013-12-22,2013-12-28,Y,Wk.52 - 13,2013-12-22 00:00:00,2013-12-28 00:00:00,2013W52 ,2013W52 ,12/22/13 - 12/28/13,12/22 - 12/28,2013,N,2012-12-22,2011-12-22,2013-09-22,2013-06-22,2013-11-22,2013-10-22,2013-12-15,2013-12-08,0,0,0,0,0,0,0,0,12,4,52,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-23,2013-01-01,2013-01-01,2013-03-01,2013-03-17,0,-3,-8,-36,-249,0,-3,-9,-36,-36,41355,82,82,23,7,12,5907,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-23,23-Mar-2013,Mar 23rd 2013,Sat 03-23-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-17,2013-03-18,2013-03-23,Sat ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,12,2013,2013-03-17,2013-03-23,N,Wk.12 - 13,2013-03-17 00:00:00,2013-03-23 00:00:00,2013W12 ,2013W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2013,N,2012-03-23,2011-03-23,2012-12-23,2012-09-23,2013-02-23,2013-01-23,2013-03-16,2013-03-09,0,0,0,0,0,0,0,0,3,1,12,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-11,2013-01-01,2013-10-01,2013-11-01,2013-11-10,0,0,0,-2,-16,0,0,-1,-2,-2,41588,315,42,11,2,46,5941,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-16,11-Nov-2013,Nov 11th 2013,Mon 11-11-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-10,2013-11-11,2013-11-11,Mon ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,46,2013,2013-11-10,2013-11-16,N,Wk.46 - 13,2013-11-10 00:00:00,2013-11-16 00:00:00,2013W46 ,2013W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2013,N,2012-11-11,2011-11-11,2013-08-11,2013-05-11,2013-10-11,2013-09-11,2013-11-04,2013-10-28,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-06,2013-01-01,2013-07-01,2013-08-01,2013-08-04,0,-1,-3,-16,-113,0,-1,-4,-16,-16,41491,218,37,6,3,32,5927,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-10,06-Aug-2013,Aug 6th 2013,Tue 08-06-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-04,2013-08-05,2013-08-06,Tue ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,32,2013,2013-08-04,2013-08-10,N,Wk.32 - 13,2013-08-04 00:00:00,2013-08-10 00:00:00,2013W32 ,2013W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2013,N,2012-08-06,2011-08-06,2013-05-06,2013-02-06,2013-07-06,2013-06-06,2013-07-30,2013-07-23,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-02,2013-01-01,2013-01-01,2013-02-01,2013-01-27,0,-3,-9,-43,-298,0,-3,-10,-43,-43,41306,33,33,2,7,5,5900,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-02,02-Feb-2013,Feb 2nd 2013,Sat 02-02-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-01-27,2013-01-28,2013-02-02,Sat ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,5,2013,2013-01-27,2013-02-02,N,Wk.05 - 13,2013-01-27 00:00:00,2013-02-02 00:00:00,2013W05 ,2013W05 ,01/27/13 - 02/02/13,01/27 - 02/02,2013,N,2012-02-02,2011-02-02,2012-11-02,2012-08-02,2013-01-02,2012-12-02,2013-01-26,2013-01-19,0,0,0,0,0,0,0,0,2,1,5,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-22,2013-01-01,2013-01-01,2013-03-01,2013-03-17,0,-3,-8,-36,-250,0,-3,-9,-36,-36,41354,81,81,22,6,12,5907,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-23,22-Mar-2013,Mar 22nd 2013,Fri 03-22-13,1,0,0,0,2013-03-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-17,2013-03-18,2013-03-22,Fri ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,12,2013,2013-03-17,2013-03-23,N,Wk.12 - 13,2013-03-17 00:00:00,2013-03-23 00:00:00,2013W12 ,2013W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2013,N,2012-03-22,2011-03-22,2012-12-22,2012-09-22,2013-02-22,2013-01-22,2013-03-15,2013-03-08,0,0,0,0,0,0,0,0,3,1,12,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-04-28,2013-01-01,2013-04-01,2013-04-01,2013-04-28,0,-2,-7,-30,-213,0,-2,-7,-30,-31,41391,118,28,28,1,18,5913,1,4,1360,2,454,114,2013-12-31,2013-06-30,2013-04-30,2013-05-04,28-Apr-2013,Apr 28th 2013,Sun 04-28-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-04-28,2013-04-28,2013-04-22,2013-04-28,Sun ,2013M04,Apr-2013,N,2013M04 ,N,Year 2013 - Quarter 02,2013Q02 ,N,18,2013,2013-04-28,2013-05-04,Y,Wk.18 - 13,2013-04-28 00:00:00,2013-05-04 00:00:00,2013W18 ,2013W18 ,04/28/13 - 05/04/13,04/28 - 05/04,2013,N,2012-04-28,2011-04-28,2013-01-28,2012-10-28,2013-03-28,2013-02-28,2013-04-21,2013-04-14,0,0,0,0,0,0,0,0,5,2,18,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-04,2013-01-01,2013-01-01,2013-03-01,2013-03-03,0,-3,-8,-38,-268,0,-3,-9,-38,-38,41336,63,63,4,2,10,5905,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-09,04-Mar-2013,Mar 4th 2013,Mon 03-04-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-03,2013-03-04,2013-03-04,Mon ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,10,2013,2013-03-03,2013-03-09,N,Wk.10 - 13,2013-03-03 00:00:00,2013-03-09 00:00:00,2013W10 ,2013W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2013,N,2012-03-04,2011-03-04,2012-12-04,2012-09-04,2013-02-04,2013-01-04,2013-02-25,2013-02-18,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-12,2013-01-01,2013-07-01,2013-07-01,2013-07-07,0,-1,-4,-20,-138,0,-1,-5,-20,-20,41466,193,12,12,6,28,5923,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-13,12-Jul-2013,Jul 12th 2013,Fri 07-12-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-07,2013-07-08,2013-07-12,Fri ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,28,2013,2013-07-07,2013-07-13,N,Wk.28 - 13,2013-07-07 00:00:00,2013-07-13 00:00:00,2013W28 ,2013W28 ,07/07/13 - 07/13/13,07/07 - 07/13,2013,N,2012-07-12,2011-07-12,2013-04-12,2013-01-12,2013-06-12,2013-05-12,2013-07-05,2013-06-28,0,0,0,0,0,0,0,0,7,3,28,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-05,2013-01-01,2013-01-01,2013-01-01,2013-01-01,0,-3,-10,-47,-326,0,-3,-11,-47,-47,41278,5,5,5,7,1,5896,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-05,05-Jan-2013,Jan 5th 2013,Sat 01-05-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2013-01-05,Sat ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,1,2013,2012-12-30,2013-01-05,N,Wk.01 - 13,2013-01-01 00:00:00,2013-01-05 00:00:00,2013W01 ,2013W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2013,N,2012-01-05,2011-01-05,2012-10-05,2012-07-05,2012-12-05,2012-11-05,2012-12-29,2012-12-22,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-12,2013-01-01,2013-07-01,2013-08-01,2013-08-11,0,-1,-3,-15,-107,0,-1,-4,-15,-15,41497,224,43,12,2,33,5928,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-17,12-Aug-2013,Aug 12th 2013,Mon 08-12-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-11,2013-08-12,2013-08-12,Mon ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,33,2013,2013-08-11,2013-08-17,N,Wk.33 - 13,2013-08-11 00:00:00,2013-08-17 00:00:00,2013W33 ,2013W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2013,N,2012-08-12,2011-08-12,2013-05-12,2013-02-12,2013-07-12,2013-06-12,2013-08-05,2013-07-29,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-04,2013-01-01,2013-07-01,2013-08-01,2013-08-04,0,-1,-3,-16,-115,0,-1,-4,-16,-17,41489,216,35,4,1,32,5927,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-10,04-Aug-2013,Aug 4th 2013,Sun 08-04-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-04,2013-07-29,2013-08-04,Sun ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,32,2013,2013-08-04,2013-08-10,Y,Wk.32 - 13,2013-08-04 00:00:00,2013-08-10 00:00:00,2013W32 ,2013W32 ,08/04/13 - 08/10/13,08/04 - 08/10,2013,N,2012-08-04,2011-08-04,2013-05-04,2013-02-04,2013-07-04,2013-06-04,2013-07-28,2013-07-21,0,0,0,0,0,0,0,0,8,3,32,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-17,2013-01-01,2013-01-01,2013-03-01,2013-03-17,0,-3,-8,-36,-255,0,-3,-9,-36,-37,41349,76,76,17,1,12,5907,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-23,17-Mar-2013,Mar 17th 2013,Sun 03-17-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-17,2013-03-11,2013-03-17,Sun ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,12,2013,2013-03-17,2013-03-23,Y,Wk.12 - 13,2013-03-17 00:00:00,2013-03-23 00:00:00,2013W12 ,2013W12 ,03/17/13 - 03/23/13,03/17 - 03/23,2013,N,2012-03-17,2011-03-17,2012-12-17,2012-09-17,2013-02-17,2013-01-17,2013-03-10,2013-03-03,0,0,0,0,0,0,0,0,3,1,12,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-18,2013-01-01,2013-07-01,2013-07-01,2013-07-14,0,-1,-4,-19,-132,0,-1,-5,-19,-19,41472,199,18,18,5,29,5924,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-20,18-Jul-2013,Jul 18th 2013,Thu 07-18-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-14,2013-07-15,2013-07-18,Thu ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,29,2013,2013-07-14,2013-07-20,N,Wk.29 - 13,2013-07-14 00:00:00,2013-07-20 00:00:00,2013W29 ,2013W29 ,07/14/13 - 07/20/13,07/14 - 07/20,2013,N,2012-07-18,2011-07-18,2013-04-18,2013-01-18,2013-06-18,2013-05-18,2013-07-11,2013-07-04,0,0,0,0,0,0,0,0,7,3,29,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-01,2013-01-01,2013-10-01,2013-12-01,2013-12-01,0,0,1,1,4,0,0,0,1,0,41608,335,62,1,1,49,5944,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-07,01-Dec-2013,Dec 1st 2013,Sun 12-01-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-01,2013-11-25,2013-12-01,Sun ,2013M12,Dec-2013,Y,2013M12 ,Y,Year 2013 - Quarter 04,2013Q04 ,N,49,2013,2013-12-01,2013-12-07,Y,Wk.49 - 13,2013-12-01 00:00:00,2013-12-07 00:00:00,2013W49 ,2013W49 ,12/01/13 - 12/07/13,12/01 - 12/07,2013,N,2012-12-01,2011-12-01,2013-09-01,2013-06-01,2013-11-01,2013-10-01,2013-11-24,2013-11-17,0,0,0,0,0,0,0,0,12,4,49,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-16,2013-01-01,2013-10-01,2013-12-01,2013-12-15,0,0,1,3,19,0,0,0,3,3,41623,350,77,16,2,51,5946,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-21,16-Dec-2013,Dec 16th 2013,Mon 12-16-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-15,2013-12-16,2013-12-16,Mon ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,51,2013,2013-12-15,2013-12-21,N,Wk.51 - 13,2013-12-15 00:00:00,2013-12-21 00:00:00,2013W51 ,2013W51 ,12/15/13 - 12/21/13,12/15 - 12/21,2013,N,2012-12-16,2011-12-16,2013-09-16,2013-06-16,2013-11-16,2013-10-16,2013-12-09,2013-12-02,0,0,0,0,0,0,0,0,12,4,51,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-21,2013-01-01,2013-07-01,2013-07-01,2013-07-21,0,-1,-4,-18,-129,0,-1,-5,-18,-19,41475,202,21,21,1,30,5925,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-07-27,21-Jul-2013,Jul 21st 2013,Sun 07-21-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-06-30,2013-07-21,2013-07-15,2013-07-21,Sun ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,30,2013,2013-07-21,2013-07-27,Y,Wk.30 - 13,2013-07-21 00:00:00,2013-07-27 00:00:00,2013W30 ,2013W30 ,07/21/13 - 07/27/13,07/21 - 07/27,2013,N,2012-07-21,2011-07-21,2013-04-21,2013-01-21,2013-06-21,2013-05-21,2013-07-14,2013-07-07,0,0,0,0,0,0,0,0,7,3,30,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-30,2013-01-01,2013-07-01,2013-07-01,2013-07-28,0,-1,-4,-17,-120,0,-1,-4,-17,-17,41484,211,30,30,3,31,5926,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-08-03,30-Jul-2013,Jul 30th 2013,Tue 07-30-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-07-28,2013-07-29,2013-07-30,Tue ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,31,2013,2013-07-28,2013-08-03,N,Wk.31 - 13,2013-07-28 00:00:00,2013-08-03 00:00:00,2013W31 ,2013W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2013,N,2012-07-30,2011-07-30,2013-04-30,2013-01-30,2013-06-30,2013-05-30,2013-07-23,2013-07-16,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-18,2013-01-01,2013-10-01,2013-10-01,2013-10-13,0,0,-1,-6,-40,0,0,-2,-6,-6,41564,291,18,18,6,42,5937,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-19,18-Oct-2013,Oct 18th 2013,Fri 10-18-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-13,2013-10-14,2013-10-18,Fri ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,42,2013,2013-10-13,2013-10-19,N,Wk.42 - 13,2013-10-13 00:00:00,2013-10-19 00:00:00,2013W42 ,2013W42 ,10/13/13 - 10/19/13,10/13 - 10/19,2013,N,2012-10-18,2011-10-18,2013-07-18,2013-04-18,2013-09-18,2013-08-18,2013-10-11,2013-10-04,0,0,0,0,0,0,0,0,10,4,42,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-10,2013-01-01,2013-04-01,2013-06-01,2013-06-09,0,-2,-5,-24,-170,0,-2,-6,-24,-24,41434,161,71,10,2,24,5919,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-15,10-Jun-2013,Jun 10th 2013,Mon 06-10-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-09,2013-06-10,2013-06-10,Mon ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,24,2013,2013-06-09,2013-06-15,N,Wk.24 - 13,2013-06-09 00:00:00,2013-06-15 00:00:00,2013W24 ,2013W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2013,N,2012-06-10,2011-06-10,2013-03-10,2012-12-10,2013-05-10,2013-04-10,2013-06-03,2013-05-27,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-09,2013-01-01,2013-04-01,2013-05-01,2013-05-05,0,-2,-6,-29,-202,0,-2,-7,-29,-29,41402,129,39,9,5,19,5914,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-11,09-May-2013,May 9th 2013,Thu 05-09-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-05,2013-05-06,2013-05-09,Thu ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,19,2013,2013-05-05,2013-05-11,N,Wk.19 - 13,2013-05-05 00:00:00,2013-05-11 00:00:00,2013W19 ,2013W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2013,N,2012-05-09,2011-05-09,2013-02-09,2012-11-09,2013-04-09,2013-03-09,2013-05-02,2013-04-25,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-06,2013-01-01,2013-01-01,2013-02-01,2013-02-03,0,-3,-9,-42,-294,0,-3,-10,-42,-42,41310,37,37,6,4,6,5901,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-09,06-Feb-2013,Feb 6th 2013,Wed 02-06-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-03,2013-02-04,2013-02-06,Wed ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,6,2013,2013-02-03,2013-02-09,N,Wk.06 - 13,2013-02-03 00:00:00,2013-02-09 00:00:00,2013W06 ,2013W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2013,N,2012-02-06,2011-02-06,2012-11-06,2012-08-06,2013-01-06,2012-12-06,2013-01-30,2013-01-23,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-23,2013-01-01,2013-01-01,2013-02-01,2013-02-17,0,-3,-9,-40,-277,0,-3,-10,-40,-40,41327,54,54,23,7,8,5903,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-23,23-Feb-2013,Feb 23rd 2013,Sat 02-23-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-17,2013-02-18,2013-02-23,Sat ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,8,2013,2013-02-17,2013-02-23,N,Wk.08 - 13,2013-02-17 00:00:00,2013-02-23 00:00:00,2013W08 ,2013W08 ,02/17/13 - 02/23/13,02/17 - 02/23,2013,N,2012-02-23,2011-02-23,2012-11-23,2012-08-23,2013-01-23,2012-12-23,2013-02-16,2013-02-09,0,0,0,0,0,0,0,0,2,1,8,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-18,2013-01-01,2013-07-01,2013-08-01,2013-08-18,0,-1,-3,-14,-101,0,-1,-4,-14,-15,41503,230,49,18,1,34,5929,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-24,18-Aug-2013,Aug 18th 2013,Sun 08-18-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-08-18,2013-08-12,2013-08-18,Sun ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,34,2013,2013-08-18,2013-08-24,Y,Wk.34 - 13,2013-08-18 00:00:00,2013-08-24 00:00:00,2013W34 ,2013W34 ,08/18/13 - 08/24/13,08/18 - 08/24,2013,N,2012-08-18,2011-08-18,2013-05-18,2013-02-18,2013-07-18,2013-06-18,2013-08-11,2013-08-04,0,0,0,0,0,0,0,0,8,3,34,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-09,2013-01-01,2013-01-01,2013-01-01,2013-01-06,0,-3,-10,-46,-322,0,-3,-11,-46,-46,41282,9,9,9,4,2,5897,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-12,09-Jan-2013,Jan 9th 2013,Wed 01-09-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-06,2013-01-07,2013-01-09,Wed ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,2,2013,2013-01-06,2013-01-12,N,Wk.02 - 13,2013-01-06 00:00:00,2013-01-12 00:00:00,2013W02 ,2013W02 ,01/06/13 - 01/12/13,01/06 - 01/12,2013,N,2012-01-09,2011-01-09,2012-10-09,2012-07-09,2012-12-09,2012-11-09,2013-01-02,2012-12-26,0,0,0,0,0,0,0,0,1,1,2,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-11,2013-01-01,2013-01-01,2013-03-01,2013-03-10,0,-3,-8,-37,-261,0,-3,-9,-37,-37,41343,70,70,11,2,11,5906,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-16,11-Mar-2013,Mar 11th 2013,Mon 03-11-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-10,2013-03-11,2013-03-11,Mon ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,11,2013,2013-03-10,2013-03-16,N,Wk.11 - 13,2013-03-10 00:00:00,2013-03-16 00:00:00,2013W11 ,2013W11 ,03/10/13 - 03/16/13,03/10 - 03/16,2013,N,2012-03-11,2011-03-11,2012-12-11,2012-09-11,2013-02-11,2013-01-11,2013-03-04,2013-02-25,0,0,0,0,0,0,0,0,3,1,11,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-10-06,2013-01-01,2013-10-01,2013-10-01,2013-10-06,0,0,-1,-7,-52,0,0,-2,-7,-8,41552,279,6,6,1,41,5936,1,10,1366,4,456,114,2013-12-31,2013-12-31,2013-10-31,2013-10-12,06-Oct-2013,Oct 6th 2013,Sun 10-06-13,1,1,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-09-29,2013-10-06,2013-09-30,2013-10-06,Sun ,2013M10,Oct-2013,N,2013M10 ,N,Year 2013 - Quarter 04,2013Q04 ,N,41,2013,2013-10-06,2013-10-12,Y,Wk.41 - 13,2013-10-06 00:00:00,2013-10-12 00:00:00,2013W41 ,2013W41 ,10/06/13 - 10/12/13,10/06 - 10/12,2013,N,2012-10-06,2011-10-06,2013-07-06,2013-04-06,2013-09-06,2013-08-06,2013-09-29,2013-09-22,0,0,0,0,0,0,0,0,10,4,41,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-08-02,2013-01-01,2013-07-01,2013-08-01,2013-07-28,0,-1,-3,-17,-117,0,-1,-4,-17,-17,41487,214,33,2,6,31,5926,2,8,1364,3,455,114,2013-12-31,2013-09-30,2013-08-31,2013-08-03,02-Aug-2013,Aug 2nd 2013,Fri 08-02-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-07-28,2013-07-29,2013-08-02,Fri ,2013M08,Aug-2013,N,2013M08 ,N,Year 2013 - Quarter 03,2013Q03 ,N,31,2013,2013-07-28,2013-08-03,N,Wk.31 - 13,2013-07-28 00:00:00,2013-08-03 00:00:00,2013W31 ,2013W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2013,N,2012-08-02,2011-08-02,2013-05-02,2013-02-02,2013-07-02,2013-06-02,2013-07-26,2013-07-19,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-08,2013-01-01,2013-10-01,2013-12-01,2013-12-08,0,0,1,2,11,0,0,0,2,1,41615,342,69,8,1,50,5945,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-14,08-Dec-2013,Dec 8th 2013,Sun 12-08-13,0,0,0,0,2013-09-21,365,92,31,7,2012-12-30,2013-09-29,2013-11-24,2013-12-08,2013-12-02,2013-12-08,Sun ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,50,2013,2013-12-08,2013-12-14,Y,Wk.50 - 13,2013-12-08 00:00:00,2013-12-14 00:00:00,2013W50 ,2013W50 ,12/08/13 - 12/14/13,12/08 - 12/14,2013,N,2012-12-08,2011-12-08,2013-09-08,2013-06-08,2013-11-08,2013-10-08,2013-12-01,2013-11-24,0,0,0,0,0,0,0,0,12,4,50,4,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-12-29,2013-01-01,2013-10-01,2013-12-01,2013-12-29,0,0,1,5,32,1,1,1,5,4,41636,363,90,29,1,53,5948,3,12,1368,4,456,114,2013-12-31,2013-12-31,2013-12-31,2013-12-31,29-Dec-2013,Dec 29th 2013,Sun 12-29-13,0,0,0,0,2013-12-21,365,92,31,3,2013-12-29,2013-12-29,2013-12-29,2013-12-29,2013-12-23,2013-12-29,Sun ,2013M12,Dec-2013,N,2013M12 ,N,Year 2013 - Quarter 04,2013Q04 ,N,1,2014,2013-12-29,2014-01-04,Y,Wk.53 - 13,2013-12-29 00:00:00,2013-12-31 00:00:00,2013W53 ,2013W53 ,12/29/13 - 12/31/13,12/29 - 12/31,2013,N,2012-12-29,2011-12-29,2013-09-29,2013-06-29,2013-11-29,2013-10-29,2013-12-22,2013-12-15,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-15,2013-01-01,2013-04-01,2013-06-01,2013-06-09,0,-2,-5,-24,-165,0,-2,-6,-24,-24,41439,166,76,15,7,24,5919,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-15,15-Jun-2013,Jun 15th 2013,Sat 06-15-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-09,2013-06-10,2013-06-15,Sat ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,24,2013,2013-06-09,2013-06-15,N,Wk.24 - 13,2013-06-09 00:00:00,2013-06-15 00:00:00,2013W24 ,2013W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2013,N,2012-06-15,2011-06-15,2013-03-15,2012-12-15,2013-05-15,2013-04-15,2013-06-08,2013-06-01,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-07,2013-01-01,2013-01-01,2013-02-01,2013-02-03,0,-3,-9,-42,-293,0,-3,-10,-42,-42,41311,38,38,7,5,6,5901,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-09,07-Feb-2013,Feb 7th 2013,Thu 02-07-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-03,2013-02-04,2013-02-07,Thu ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,6,2013,2013-02-03,2013-02-09,N,Wk.06 - 13,2013-02-03 00:00:00,2013-02-09 00:00:00,2013W06 ,2013W06 ,02/03/13 - 02/09/13,02/03 - 02/09,2013,N,2012-02-07,2011-02-07,2012-11-07,2012-08-07,2013-01-07,2012-12-07,2013-01-31,2013-01-24,0,0,0,0,0,0,0,0,2,1,6,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-11-15,2013-01-01,2013-10-01,2013-11-01,2013-11-10,0,0,0,-2,-12,0,0,-1,-2,-2,41592,319,46,15,6,46,5941,2,11,1367,4,456,114,2013-12-31,2013-12-31,2013-11-30,2013-11-16,15-Nov-2013,Nov 15th 2013,Fri 11-15-13,1,1,1,0,2013-09-21,365,92,30,7,2012-12-30,2013-09-29,2013-10-27,2013-11-10,2013-11-11,2013-11-15,Fri ,2013M11,Nov-2013,N,2013M11 ,N,Year 2013 - Quarter 04,2013Q04 ,N,46,2013,2013-11-10,2013-11-16,N,Wk.46 - 13,2013-11-10 00:00:00,2013-11-16 00:00:00,2013W46 ,2013W46 ,11/10/13 - 11/16/13,11/10 - 11/16,2013,N,2012-11-15,2011-11-15,2013-08-15,2013-05-15,2013-10-15,2013-09-15,2013-11-08,2013-11-01,0,0,0,0,0,0,0,0,11,4,46,4,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-02-11,2013-01-01,2013-01-01,2013-02-01,2013-02-10,0,-3,-9,-41,-289,0,-3,-10,-41,-41,41315,42,42,11,2,7,5902,2,2,1358,1,453,114,2013-12-31,2013-03-31,2013-02-28,2013-02-16,11-Feb-2013,Feb 11th 2013,Mon 02-11-13,1,0,0,0,2012-12-21,365,90,28,7,2012-12-30,2012-12-30,2013-01-27,2013-02-10,2013-02-11,2013-02-11,Mon ,2013M02,Feb-2013,N,2013M02 ,N,Year 2013 - Quarter 01,2013Q01 ,N,7,2013,2013-02-10,2013-02-16,N,Wk.07 - 13,2013-02-10 00:00:00,2013-02-16 00:00:00,2013W07 ,2013W07 ,02/10/13 - 02/16/13,02/10 - 02/16,2013,N,2012-02-11,2011-02-11,2012-11-11,2012-08-11,2013-01-11,2012-12-11,2013-02-04,2013-01-28,0,0,0,0,0,0,0,0,2,1,7,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-19,2013-01-01,2013-04-01,2013-06-01,2013-06-16,0,-2,-5,-23,-161,0,-2,-6,-23,-23,41443,170,80,19,4,25,5920,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-22,19-Jun-2013,Jun 19th 2013,Wed 06-19-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-16,2013-06-17,2013-06-19,Wed ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,25,2013,2013-06-16,2013-06-22,N,Wk.25 - 13,2013-06-16 00:00:00,2013-06-22 00:00:00,2013W25 ,2013W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2013,N,2012-06-19,2011-06-19,2013-03-19,2012-12-19,2013-05-19,2013-04-19,2013-06-12,2013-06-05,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-17,2013-01-01,2013-04-01,2013-06-01,2013-06-16,0,-2,-5,-23,-163,0,-2,-6,-23,-23,41441,168,78,17,2,25,5920,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-22,17-Jun-2013,Jun 17th 2013,Mon 06-17-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-16,2013-06-17,2013-06-17,Mon ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,25,2013,2013-06-16,2013-06-22,N,Wk.25 - 13,2013-06-16 00:00:00,2013-06-22 00:00:00,2013W25 ,2013W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2013,N,2012-06-17,2011-06-17,2013-03-17,2012-12-17,2013-05-17,2013-04-17,2013-06-10,2013-06-03,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-05-10,2013-01-01,2013-04-01,2013-05-01,2013-05-05,0,-2,-6,-29,-201,0,-2,-7,-29,-29,41403,130,40,10,6,19,5914,2,5,1361,2,454,114,2013-12-31,2013-06-30,2013-05-31,2013-05-11,10-May-2013,May 10th 2013,Fri 05-10-13,1,0,0,0,2013-03-21,365,91,31,7,2012-12-30,2013-03-31,2013-04-28,2013-05-05,2013-05-06,2013-05-10,Fri ,2013M05,May-2013,N,2013M05 ,N,Year 2013 - Quarter 02,2013Q02 ,N,19,2013,2013-05-05,2013-05-11,N,Wk.19 - 13,2013-05-05 00:00:00,2013-05-11 00:00:00,2013W19 ,2013W19 ,05/05/13 - 05/11/13,05/05 - 05/11,2013,N,2012-05-10,2011-05-10,2013-02-10,2012-11-10,2013-04-10,2013-03-10,2013-05-03,2013-04-26,0,0,0,0,0,0,0,0,5,2,19,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-06-16,2013-01-01,2013-04-01,2013-06-01,2013-06-16,0,-2,-5,-23,-164,0,-2,-6,-23,-24,41440,167,77,16,1,25,5920,3,6,1362,2,454,114,2013-12-31,2013-06-30,2013-06-30,2013-06-22,16-Jun-2013,Jun 16th 2013,Sun 06-16-13,1,0,0,0,2013-03-21,365,91,30,7,2012-12-30,2013-03-31,2013-05-26,2013-06-16,2013-06-10,2013-06-16,Sun ,2013M06,Jun-2013,N,2013M06 ,N,Year 2013 - Quarter 02,2013Q02 ,N,25,2013,2013-06-16,2013-06-22,Y,Wk.25 - 13,2013-06-16 00:00:00,2013-06-22 00:00:00,2013W25 ,2013W25 ,06/16/13 - 06/22/13,06/16 - 06/22,2013,N,2012-06-16,2011-06-16,2013-03-16,2012-12-16,2013-05-16,2013-04-16,2013-06-09,2013-06-02,0,0,0,0,0,0,0,0,6,2,25,2,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-07-28,2013-01-01,2013-07-01,2013-07-01,2013-07-28,0,-1,-4,-17,-122,0,-1,-4,-17,-18,41482,209,28,28,1,31,5926,1,7,1363,3,455,114,2013-12-31,2013-09-30,2013-07-31,2013-08-03,28-Jul-2013,Jul 28th 2013,Sun 07-28-13,1,0,0,0,2013-06-21,365,92,31,7,2012-12-30,2013-06-30,2013-07-28,2013-07-28,2013-07-22,2013-07-28,Sun ,2013M07,Jul-2013,N,2013M07 ,N,Year 2013 - Quarter 03,2013Q03 ,N,31,2013,2013-07-28,2013-08-03,Y,Wk.31 - 13,2013-07-28 00:00:00,2013-08-03 00:00:00,2013W31 ,2013W31 ,07/28/13 - 08/03/13,07/28 - 08/03,2013,N,2012-07-28,2011-07-28,2013-04-28,2013-01-28,2013-06-28,2013-05-28,2013-07-21,2013-07-14,0,0,0,0,0,0,0,0,8,3,31,3,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-03-03,2013-01-01,2013-01-01,2013-03-01,2013-03-03,0,-3,-8,-38,-269,0,-3,-9,-38,-39,41335,62,62,3,1,10,5905,3,3,1359,1,453,114,2013-12-31,2013-03-31,2013-03-31,2013-03-09,03-Mar-2013,Mar 3rd 2013,Sun 03-03-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2013-02-24,2013-03-03,2013-02-25,2013-03-03,Sun ,2013M03,Mar-2013,N,2013M03 ,N,Year 2013 - Quarter 01,2013Q01 ,N,10,2013,2013-03-03,2013-03-09,Y,Wk.10 - 13,2013-03-03 00:00:00,2013-03-09 00:00:00,2013W10 ,2013W10 ,03/03/13 - 03/09/13,03/03 - 03/09,2013,N,2012-03-03,2011-03-03,2012-12-03,2012-09-03,2013-02-03,2013-01-03,2013-02-24,2013-02-17,0,0,0,0,0,0,0,0,3,1,10,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X -2013-01-19,2013-01-01,2013-01-01,2013-01-01,2013-01-13,0,-3,-10,-45,-312,0,-3,-11,-45,-45,41292,19,19,19,7,3,5898,1,1,1357,1,453,114,2013-12-31,2013-03-31,2013-01-31,2013-01-19,19-Jan-2013,Jan 19th 2013,Sat 01-19-13,1,0,0,0,2012-12-21,365,90,31,7,2012-12-30,2012-12-30,2012-12-30,2013-01-13,2013-01-14,2013-01-19,Sat ,2013M01,Jan-2013,N,2013M01 ,N,Year 2013 - Quarter 01,2013Q01 ,N,3,2013,2013-01-13,2013-01-19,N,Wk.03 - 13,2013-01-13 00:00:00,2013-01-19 00:00:00,2013W03 ,2013W03 ,01/13/13 - 01/19/13,01/13 - 01/19,2013,N,2012-01-19,2011-01-19,2012-10-19,2012-07-19,2012-12-19,2012-11-19,2013-01-12,2013-01-05,0,0,0,0,0,0,0,0,1,1,3,1,1,1,1,2005-09-07,USER_X ,2013-11-27 00:16:56,USER_X diff --git a/examples/test_case_data/localmeta/data/TEST_CATEGORY_GROUPINGS.csv b/examples/test_case_data/localmeta/data/TEST_CATEGORY_GROUPINGS.csv deleted file mode 100644 index 441bf62..0000000 --- a/examples/test_case_data/localmeta/data/TEST_CATEGORY_GROUPINGS.csv +++ /dev/null @@ -1,144 +0,0 @@ -48027,Coins & Paper Money:Paper Money: World:Asia:Japan,0,,,,10,Coins,2008-06-03,2013-07-16 08:23:09,USER_X,USER_Y,11116,Coins & Paper Money,3411,8008,48027,48027,48027,48027,Paper Money: World,Asia,Japan,Japan,Japan,Japan,262144,N,-999,Coins,5837,3069,48027,10,1,Collectibles -164261,Jewelry & Watches:Fashion Jewelry:Earrings:Dangle & Chandelier:Sterling Silver (w/o Stone),0,,,,17,JewelrGemWatches,2008-08-12,2012-09-11 20:26:04,USER_X,USER_Y,281,Jewelry & Watches,10968,50647,50647,50647,50647,50647,Fashion Jewelry,Earrings,Earrings,Earrings,Earrings,Earrings,262144,N,-999,JewelrGemWatches,2928,1873,50647,17,1,Fashion -82494,BookComics & Mags:Comic Books:Modern (1980-now):Superhero:Sandman,15,,,,3,Books,2008-06-03,2010-09-13 07:05:54,USER_X,USER_Y,267,BookMagazines,63,63,63,63,63,63,NULL,Comic Books,Comic Books,Comic Books,Comic Books,Comic Books,262144,N,-999,Books,-999,-999,63,3,1,Media -66767,Home & Lifestyle:Pet Supplies:Dog Supplies:Dog Apparel:Dresses,15,,,,16,Home & Garden,2008-06-03,2011-06-14 07:48:40,USER_X,USER_Y,11700,Home & Garden,1281,20742,1283,1283,1283,1283,NULL,Dogs,Other Supplies,Other Supplies,Other Supplies,Other Supplies,262144,N,-999,Home Improvement,-999,-999,1283,16,1,Home & Garden -152801,Jewelry & Watches:Earrings:Studs:DiamonEnhanced Natural:PrincesSquare,0,,,,17,JewelrGemWatches,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,281,Jewelry & Watches,10968,50647,50647,50647,50647,50647,NULL,Earrings,Earrings,Earrings,Earrings,Earrings,262144,N,-999,JewelrGemWatches,2928,1873,50647,17,1,Fashion -43398,Home & Garden:Food & Beverages:Cheese & Crackers,0,,,,36,Home & Living,2008-06-03,2013-02-20 23:11:43,USER_X,USER_Y,11700,Home & Garden,14308,43398,43398,43398,43398,43398,NULL,Cheese & Crackers,Cheese & Crackers,Cheese & Crackers,Cheese & Crackers,Cheese & Crackers,262144,N,-999,Home Furnishing,-999,-999,43398,36,1,Home & Garden -95173,Health & Beauty:Bath & Body:Bath SetKits:Avon,0,,,,37,Health & Beauty,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,26395,Health & Beauty,11838,67391,67391,67391,67391,67391,Bath & Body,Bath Sets & Kits,Bath Sets & Kits,Bath Sets & Kits,Bath Sets & Kits,Bath Sets & Kits,262144,N,-999,Health & Beauty,2919,1868,67391,37,1,Fashion -158666,ToyHobbies:Action Figures:Anime & Manga,15,,,,28,Toys,2012-09-11,2012-09-11 20:27:22,USER_X,USER_Y,220,ToyHobbies,246,158666,158666,158666,158666,158666,Action Figures,Anime & Manga,Anime & Manga,Anime & Manga,Anime & Manga,Anime & Manga,262144,N,-999,Toys,-999,-999,158666,28,1,Collectibles -12688,eBay Premier:Books & Manuscripts:Books: Other:Icollector,0,,2038,,57,Sothebys,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,2038,eBay Premier,1680,1681,12688,12688,12688,12688,Books & Manuscripts,Books: Other,Icollector,Icollector,Icollector,Icollector,60,N,,Sothebys,-999,-999,0,57,1,Lifestyle -103324,Clothing & Accessories:Women:Shoes:Casual SneakerSkate:Sizes 10+,15,,,,9,Clothing & Accessories,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,11450,ClothinShoeAccessories,3034,63889,63889,63889,63889,63889,Women's Shoes,Mixed Items,Mixed Items,Mixed Items,Mixed Items,Mixed Items,262144,N,-999,Clothing & Accessories,2441,1634,-99,9,1,Fashion -108782,Vehicle Parts & Accessories:CaTruck Parts:Car Care & Cleaning:Air Fresheners,15,,,,8,Auto Parts,2012-09-11,2013-09-10 16:52:46,USER_X,USER_Y,131090,Vehicle Parts & Accessories,6030,72200,108782,108782,108782,108782,CaTruck Parts,Car Care & Cleaning,Air Fresheners,Air Fresheners,Air Fresheners,Air Fresheners,262144,N,-999,Auto - Parts,-999,-999,108782,8,1,Parts & Accessories -80287,Computers & Networking:Software:Business & Productivity:Voice Recognition,0,,,,12,Computers,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,58058,Computers/Tablets & Networking,18793,3768,3768,3768,3768,3768,Software,Office & Business,Office & Business,Office & Business,Office & Business,Office & Business,262144,N,-999,Computers,5893,3093,3768,12,1,Electronics -140746,eBay Motors:Parts & Accessories:Vintage Car & Truck Parts:WheelTire& Hub Caps:Tires,100,,,,8,Auto - Parts,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,6000,eBay Motors,6028,10073,140744,140746,140746,140746,Parts & Accessories,Vintage Car & Truck Parts,WheelTire& Hub Caps,Tires,Tires,Tires,262144,N,-999,Auto - Parts,3517,1794,140746,8,1,Parts & Accessories -87118,Sporting Goods:Paintball:Barrels:Intimidator,0,,,,24,Sporting Goods,2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,888,Sporting Goods,159043,16045,16046,16046,16046,16046,Outdoor Sports,Paintball,Barrels,Barrels,Barrels,Barrels,0,N,-999,Sporting Goods,2919,1868,16046,24,1,Lifestyle -25147,Sports MeCards & Fan Shop:Fan Apparel & Souvenirs:Baseball-MLB:Philadelphia Phillies:Other Items,0,,888,,25,Sports Memorabilia,2008-06-03,2010-02-08 10:51:44,USER_X,USER_Y,64482,Sports MeCards & Fan Shop,24409,24410,24410,24410,24410,24410,Fan Apparel & Souvenirs,Baseball-MLB,Baseball-MLB,Baseball-MLB,Baseball-MLB,Baseball-MLB,262144,N,-999,Sports Memorabilia,2884,1845,24410,25,1,Collectibles -170302,Crafts:Embroidery:Design CDs:Other Design Themes,15,,,,15,Crafts,2009-09-21,2010-09-13 07:13:34,USER_X,USER_Y,14339,Crafts,28141,41383,41383,41383,41383,41383,Embroidery,Design CDs,Design CDs,Design CDs,Design CDs,Design CDs,262144,N,-999,Hobbies & Crafts,-999,-999,41383,15,1,Home & Garden -53064,Business & Industrial:Agriculture & Forestry:Antique Tractors & Equipment:Tractors:Massey HarriFerguson,0,,,,4,Business (Office & Industrial),2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,12576,Business & Industrial,177641,177642,177642,177642,177642,177642,Heavy Equipment,Antique & Vintage Farm Equip,Antique & Vintage Farm Equip,Antique & Vintage Farm Equip,Antique & Vintage Farm Equip,Antique & Vintage Farm Equip,262144,N,-999,Business (Office & Industrial),-999,-999,177642,4,1,Business & Industrial -132939,Jewelry & Watches:Designer Brands:John Atencio,0,,,,17,JewelrGemWatches,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,281,Jewelry & Watches,10968,499,499,499,499,499,Fashion Jewelry,Other,Other,Other,Other,Other,262144,N,-999,JewelrGemWatches,2928,1873,499,17,1,Fashion -113593,Mobiles & Phones:Mobile Phones:Samsung:Samsung D500,15,,,,40,Cell Phones & Portable Electro,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,15032,Phones,9355,9355,9355,9355,9355,9355,Mobile Phones,Mobile Phones,Mobile Phones,Mobile Phones,Mobile Phones,Mobile Phones,262144,N,-999,Cell Phones & Accessories,2246,1609,9355,40,1,Electronics -34273,eBay Motors:Parts & Accessories:Motorcycle:Frame & Suspension:Frames,100,,,,8,Auto - Parts,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,6000,eBay Motors,6028,10063,34272,34273,34273,34273,Parts & Accessories,Motorcycle,Frame & Suspension,Frames,Frames,Frames,0,N,-999,Auto - Parts,-999,-999,0,8,1,Parts & Accessories -106340,Home & Lifestyle:Tools & Building Materials:Hand Tools:Socket Sets,15,,,,16,Home & Garden,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11700,Home & Garden,2032,29515,29515,29515,29515,29515,Gardening,Hand Tools,Hand Tools,Hand Tools,Hand Tools,Hand Tools,262144,N,-999,Home Improvement,-999,-999,29515,16,1,Home & Garden -150265,Baby & Maternity:Baby Clothing & Shoes:Boys:Size 00:Outfits & Sets:Bonds,15,,,,2,Baby,2008-06-03,2011-04-05 08:25:25,USER_X,USER_Y,2984,Baby,3082,147317,147333,147333,147333,147333,Baby Clothing,Boys,OutfitSets,OutfitSets,OutfitSets,OutfitSets,0,N,-999,Baby,3090,1947,147333,2,1,Home & Garden -24760,Sports MeCards & Fan Shop:Fan Apparel & Souvenirs:Hockey-NHL:San Jose Sharks:CapHats,0,,888,,25,Sports Memorabilia,2008-06-03,2010-02-08 10:51:44,USER_X,USER_Y,64482,Sports MeCards & Fan Shop,24409,24510,24510,24510,24510,24510,Fan Apparel & Souvenirs,Hockey-NHL,Hockey-NHL,Hockey-NHL,Hockey-NHL,Hockey-NHL,262144,N,-999,Sports Memorabilia,2884,1845,24510,25,1,Collectibles -37831,Collectibles:Advertising:Merchandise & Memorabilia:Advertising-Print:1910-19,0,,,,11,Collectibles,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,1,Collectibles,34,13623,37828,37831,37831,37831,Advertising,Merchandise & Memorabilia,Advertising-Print,1910-19,1910-19,1910-19,262144,N,-999,Collectibles,-999,-999,37831,11,1,Collectibles -1120,Books:First Editions:Other,3,,267,Other,3,BookComics & Magazines,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,267,Books,2231,1120,1120,1120,1120,1120,First Editions,Other,Other,Other,Other,Other,0,N,-999,Books,,,0,3,1,Media -43972,eBay Motors:Parts & Accessories:ATV Parts:Other,100,,,,8,Auto - Parts,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,6000,eBay Motors,6028,43962,43972,43972,43972,43972,Parts & Accessories,ATV Parts,Other,Other,Other,Other,262144,N,-999,Auto - Parts,5411,2941,43972,8,1,Parts & Accessories -166013,Computers:Apple AccessorieParts:TV Tuners,15,,,,12,Computers,2008-09-09,2012-05-01 08:54:26,USER_X,USER_Y,58058,Computers,175673,3761,3761,3761,3761,3761,Computer Components & Parts,Video Capture & TV Tuner Cards,Video Capture & TV Tuner Cards,Video Capture & TV Tuner Cards,Video Capture & TV Tuner Cards,Video Capture & TV Tuner Cards,262144,N,-999,Computers,-999,-999,3761,12,1,Electronics -15568,Baby:Baby Clothing:Unisex:Sleepwear,15,,,,2,Baby,2008-06-03,2011-04-05 08:25:25,USER_X,USER_Y,2984,Baby,3082,163397,163400,163400,163400,163400,Baby Clothing,Unisex,Sleepwear,Sleepwear,Sleepwear,Sleepwear,0,N,-999,Baby,3090,1947,163400,2,1,Home & Garden -103178,Clothing & Accessories:Women:HandbagBags:Evening Bags,15,,,,9,Clothing & Accessories,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,11450,ClothinShoeAccessories,169291,169291,169291,169291,169291,169291,Women's Bags,Women's Bags,Women's Bags,Women's Bags,Women's Bags,Women's Bags,262144,N,-999,Clothing & Accessories,2487,1098,-99,9,1,Fashion -2023,Sporting Goods:Team Sports:Basketball:Other,0,,888,Sporting Goods,24,Sporting Goods,2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,888,Sporting Goods,159049,21194,2023,2023,2023,2023,Team Sports,Basketball,Other,Other,Other,Other,262144,N,-999,Sporting Goods,-999,-999,2023,24,1,Lifestyle -94847,Consumer Electronics:Car Electronics:Car Video:Car Video Monitors Only:Headrest Monitors:6-6.9 inches,0,,,,13,Consumer Electronics - Other,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,293,Consumer Electronics,3270,48604,48606,48606,48606,48606,Vehicle Electronics & GPS,Car Video,Car Monitors w/o Player,Car Monitors w/o Player,Car Monitors w/o Player,Car Monitors w/o Player,262144,N,-999,Consumer Electronics - Other,2920,1869,48606,13,1,Electronics -15868,Real Estate:Land:Central U.S.:Illinois,0,,10542,,23,Real Estate,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,10542,Real Estate,15841,15841,15841,15841,15841,15841,Land,Land,Land,Land,Land,Land,0,N,-999,Real Estate,-999,-999,15841,23,1,Real Estate -32876,Home & Garden:Home Improvement:Plumbing & Fixtures:Toilet Paper Holders-Mounted,0,,,,36,Home & Living,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11700,Home & Garden,159907,20601,32876,32876,32876,32876,Home Improvement,Plumbing & Fixtures,Toilet Paper Holders-Mounted,Toilet Paper Holders-Mounted,Toilet Paper Holders-Mounted,Toilet Paper Holders-Mounted,262144,N,-999,Home Furnishing,-999,-999,32876,36,1,Home & Garden -62179,Sporting Goods:Skiing & Snowboarding:Apparel:Ski Suits:Women,0,,,,9,Apparel,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,11450,ClothinShoes & Accessories,15724,137085,137085,137085,137085,137085,Women's Clothing,Athletic Apparel,Athletic Apparel,Athletic Apparel,Athletic Apparel,Athletic Apparel,0,N,-999,Clothing & Accessories,2919,1868,137085,9,1,Fashion -45333,ClothinShoes & Accessories:Women's Shoes:Flats & Oxfords,0,,,,9,Apparel,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11450,ClothinShoes & Accessories,3034,45333,45333,45333,45333,45333,Women's Shoes,Flats & Oxfords,Flats & Oxfords,Flats & Oxfords,Flats & Oxfords,Flats & Oxfords,262144,N,-999,Clothing & Accessories,-999,-999,45333,9,1,Fashion -50677,Jewelry & Watches:Fashion Jewelry:Pins & Brooches,0,,,,17,JewelrGemWatches,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,281,Jewelry & Watches,10968,50677,50677,50677,50677,50677,Fashion Jewelry,Pins & Brooches,Pins & Brooches,Pins & Brooches,Pins & Brooches,Pins & Brooches,262144,N,-999,JewelrGemWatches,-999,-999,50677,17,1,Fashion -33038,Musical Instruments:Guitars:Electric:ESP,15,,,,30,Musical Instruments,2008-06-03,2010-06-14 07:48:40,USER_X,USER_Y,619,Musical Instruments,166070,33034,33034,33034,33034,33034,Instruments,Guitars (Electric),Guitars (Electric),Guitars (Electric),Guitars (Electric),Guitars (Electric),262144,N,-999,Musical Instruments,-999,-999,33034,30,1,Lifestyle -156614,Toys & Hobbies:Diecast Toy Vehicles:CarTrucks-Diecast:NASCAR:Revell:Dale Jarrett,0,,,,28,Toys,2008-06-03,2010-03-22 10:34:30,USER_X,USER_Y,220,Toys & Hobbies,222,171127,762,762,762,762,Diecast & Toy Vehicles,Cars: RacinNASCAR,NASCAR,NASCAR,NASCAR,NASCAR,262144,N,-999,Toys,1740,1380,762,28,1,Collectibles -106246,Health & Beauty:Hair Care:Conditioner:Biolage,0,,,,37,Health & Beauty,2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,26395,Health & Beauty,11854,177661,177661,177661,177661,177661,Hair Care & Styling,Shampoo & Conditioning,Shampoo & Conditioning,Shampoo & Conditioning,Shampoo & Conditioning,Shampoo & Conditioning,262144,N,-999,Health & Beauty,2919,1868,177661,37,1,Fashion -20865,Sporting Goods:Soccer:Apparel & Footwear:Jerseys:Other,0,,888,,9,Apparel,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,11450,ClothinShoes & Accessories,1059,137084,137084,137084,137084,137084,Men's Clothing,Athletic Apparel,Athletic Apparel,Athletic Apparel,Athletic Apparel,Athletic Apparel,0,N,-999,Clothing & Accessories,2919,1868,137084,9,1,Fashion -15115,Entertainment:Video Games:Games:Sega Dreamcast:Sports,0,,293,,32,Video Games,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,1249,Video Games & Consoles,139973,139973,139973,139973,139973,139973,Video Games,Video Games,Video Games,Video Games,Video Games,Video Games,0,N,-999,Video Games,-999,-999,139973,32,1,Electronics -3838,JewelrGemstones:Jewelry:Charms:Plated,0,,281,Other,17,JewelrGemWatches,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,281,Jewelry & Watches,10968,140944,140944,140944,140944,140944,Fashion Jewelry,Charms & Charm Bracelets,Charms & Charm Bracelets,Charms & Charm Bracelets,Charms & Charm Bracelets,Charms & Charm Bracelets,0,N,-999,JewelrGemWatches,-999,-999,140944,17,1,Fashion -759,Toys & Hobbies:Diecast Toy Vehicles:CarTrucks-Diecast:Franklin Mint:Modern (1970-Now),0,,220,Other,28,Toys,2008-06-03,2010-03-22 10:34:30,USER_X,USER_Y,220,Toys & Hobbies,222,19036,223,223,223,223,Diecast & Toy Vehicles,CarTrucks & Vans,Diecast-Modern Manufacture,Diecast-Modern Manufacture,Diecast-Modern Manufacture,Diecast-Modern Manufacture,262144,N,-999,Toys,1740,1380,223,28,1,Collectibles -61323,Consumer Electronics:A/V Accessories & Cables:Remote Controls:Universal Remotes,0,,,,13,Consumer Electronics - Other,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,293,Consumer Electronics,32852,14961,61312,61312,61312,61312,TVideo & Home Audio,TVideo & Audio Accessories,Remote Controls,Remote Controls,Remote Controls,Remote Controls,262144,N,-999,Consumer Electronics - Other,5344,2248,61312,13,1,Electronics -121153,Baby:Nursery Decor:Night Lights,0,,,,2,Baby,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,2984,Baby,66697,121153,121153,121153,121153,121153,Nursery Decor,Night Lights,Night Lights,Night Lights,Night Lights,Night Lights,262144,N,-999,Baby,-999,-999,121153,2,1,Home & Garden -88750,Consumer Electronics:Car Electronics:RadaLaser Detectors:Whistler:17174 Series,0,,,,13,Consumer Electronics - Other,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,293,Consumer Electronics,3270,14935,14935,14935,14935,14935,Vehicle Electronics & GPS,Radar & Laser Detectors,Radar & Laser Detectors,Radar & Laser Detectors,Radar & Laser Detectors,Radar & Laser Detectors,262144,N,-999,Consumer Electronics - Other,2920,1869,14935,13,1,Electronics -161567,Computers:Laptop Accessories:Batteries:Hewlett Packard,15,,,,12,Computers,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,58058,Computers,31530,14295,14295,14295,14295,14295,Laptop & Desktop Accessories,Laptop Batteries,Laptop Batteries,Laptop Batteries,Laptop Batteries,Laptop Batteries,262144,N,-999,Computers,3699,2194,14295,12,1,Electronics -113802,Lots More...:Metaphysical:Herbs,15,,,,99,Everything Else,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,99,Lots More...,19266,113802,113802,113802,113802,113802,Metaphysical,Herbs,Herbs,Herbs,Herbs,Herbs,262144,N,-999,Everything Else,-999,-999,113802,99,1,Lifestyle -15808,Clothing & Accessories:Women:Plus Sizes:Tops:Other Tops,15,,,,9,Clothing & Accessories,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11450,ClothinShoeAccessories,15724,53159,53159,53159,53159,53159,Women's Clothing,Tops & Blouses,Tops & Blouses,Tops & Blouses,Tops & Blouses,Tops & Blouses,262144,N,-999,Clothing & Accessories,2264,1551,53159,9,1,Fashion -174053,Vehicle Parts & Accessories:Car Parts:External & Body Parts:SunrooConvertible & Hardtop,3,,,,8,Auto - Parts,2011-08-23,2013-04-28 20:37:19,USER_X,USER_Y,131090,Vehicle Parts & Accessories,9884,14768,174053,174053,174053,174053,Car Parts,External & Body Parts,SunrooConvertible & Hardtop,SunrooConvertible & Hardtop,SunrooConvertible & Hardtop,SunrooConvertible & Hardtop,262144,N,-999,Auto - Parts,4075,2390,174053,8,1,Parts & Accessories -2635,Toys & Hobbies:Toy Soldiers:1970-Now:Plastic,0,,220,Other,28,Toys,2008-06-03,2010-03-22 10:34:30,USER_X,USER_Y,220,Toys & Hobbies,2631,2638,2638,2638,2638,2638,Toy Soldiers,1970-Now,1970-Now,1970-Now,1970-Now,1970-Now,262144,N,-999,Toys,2919,1868,2638,28,1,Collectibles -1161,DVFilm & TV:Other Formats:Videos: NTSC (US):ActioAdventure,3,,267,Other,18,DVDFilm & TV,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,11232,DVFilm & TV,380,1151,1161,1161,1161,1161,Other Formats,Videos: NTSC (US),ActioAdventure,ActioAdventure,ActioAdventure,ActioAdventure,0,N,-999,DVDs & Movies,-999,-999,0,18,1,Media -64076,Computers & Networking:Networking:Switches:3Com:SuperStack,0,,,,12,Computers,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,58058,Computers/Tablets & Networking,175698,175706,51268,51268,51268,51268,Enterprise NetworkinServers,Switches & Hubs,Network Switches,Network Switches,Network Switches,Network Switches,262144,N,-999,Computers,2919,1868,51268,12,1,Electronics -33977,Crafts:Scrapbooking:Albums:12x12 Albums,15,,,,15,Crafts,2008-06-03,2010-06-14 07:56:25,USER_X,USER_Y,14339,Crafts,31253,33875,33875,33875,33875,33875,Scrapbooking,Albums,Albums,Albums,Albums,Albums,262144,N,-999,Hobbies & Crafts,-999,-999,33875,15,1,Home & Garden -31673,Sports:Memorabilia:Racing-NASCAR:Plaques,0,,,,25,Sports Memorabilia,2008-06-03,2010-02-08 10:48:39,USER_X,USER_Y,64482,Sports MeCards & Fan Shop,24409,46156,46156,46156,46156,46156,Fan Apparel & Souvenirs,Racing-NASCAR,Racing-NASCAR,Racing-NASCAR,Racing-NASCAR,Racing-NASCAR,0,N,-999,Sports Memorabilia,-999,-999,46156,25,1,Collectibles -174106,Vehicle Parts & Accessories:Car Parts:Transmission & Drivetrain:Sensors,3,,,,8,Auto - Parts,2011-08-23,2013-04-28 20:37:19,USER_X,USER_Y,131090,Vehicle Parts & Accessories,9884,33726,174106,174106,174106,174106,Car Parts,Transmission & Drivetrain,Sensors,Sensors,Sensors,Sensors,262144,N,-999,Auto - Parts,4075,2390,174106,8,1,Parts & Accessories -26249,Business & Industrial:Printing & Graphic Arts:Commercial Printing Presses:Sheet-fed Offset Presses,0,,9428,,4,Business (Office & Industrial),2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,12576,Business & Industrial,26238,26247,26249,26249,26249,26249,Printing & Graphic Arts,Commercial Printing Presses,Sheet-fed Offset Presses,Sheet-fed Offset Presses,Sheet-fed Offset Presses,Sheet-fed Offset Presses,262144,N,-999,Business (Office & Industrial),-999,-999,26249,4,1,Business & Industrial -159184,Sporting Goods:Winter Sports:Snowboarding:Stomp Pads,0,,,,24,Sporting Goods,2008-06-03,2013-09-10 16:52:46,USER_X,USER_Y,888,Sporting Goods,36259,21247,159184,159184,159184,159184,Winter Sports,Snowboarding,Stomp Pads,Stomp Pads,Stomp Pads,Stomp Pads,262144,N,-999,Sporting Goods,-999,-999,159184,24,1,Lifestyle -10058,Tickets & Travel:Tickets:Sporting Events:Wrestling,3,,11730,,27,Tickets,2008-06-03,2013-09-10 16:52:46,USER_X,USER_Y,1305,Events Tickets,1306,1306,1306,1306,1306,1306,Other Tickets,Other Tickets,Other Tickets,Other Tickets,Other Tickets,Other Tickets,262144,N,-999,Tickets,2937,1879,1306,27,1,Lifestyle -48904,ClothinShoes & Accessories:Vintage:Women's Vintage Clothing:1977-89 (PunNew Wav80s):Sweaters,0,,,,9,Apparel,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,11450,ClothinShoes & Accessories,175759,175762,52451,48904,48904,48904,Vintage,Women's Vintage Clothing,1977-89 (PunNew Wav80s),Sweaters,Sweaters,Sweaters,262144,N,-999,Clothing & Accessories,-999,-999,48904,9,1,Fashion -145970,Toys & Hobbies:ModelKits:Automotive:Vintage:Plymouth,0,,,,28,Toys,2008-06-03,2008-10-08 07:18:40,USER_X,USER_Y,220,Toys & Hobbies,1188,2580,2585,2585,2585,2585,Models & Kits,Automotive,Vintage,Vintage,Vintage,Vintage,262144,N,-999,Toys,2974,1905,2585,28,1,Collectibles -963,ClothinShoes & Accessories:Vintage:Clothing (Pre-1980):Women:ClothinShoes & Accessories:Shoes,0,,1,Other,9,Apparel,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,11450,ClothinShoes & Accessories,175759,74976,48561,48561,48561,48561,Vintage,Women's Vintage Shoes,Other,Other,Other,Other,0,N,-999,Clothing & Accessories,-999,-999,48561,9,1,Fashion -118687,Health & Beauty:Fragrances:Women's Fragrances:Benetton,3,,,,37,Health & Beauty,2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,26395,Health & Beauty,26396,11848,11848,11848,11848,11848,Fragrances,Women's Fragrances,Women's Fragrances,Women's Fragrances,Women's Fragrances,Women's Fragrances,262144,N,-999,Health & Beauty,6778,3189,11848,37,1,Fashion -20886,Toys & Hobbies:Diecast Toy Vehicles:CarTrucks-Diecast:NASCAR:Action/ Motorsports Authentic:Darrell Waltrip,0,,220,,28,Toys,2008-06-03,2010-03-22 10:34:30,USER_X,USER_Y,220,Toys & Hobbies,222,171127,762,762,762,762,Diecast & Toy Vehicles,Cars: RacinNASCAR,NASCAR,NASCAR,NASCAR,NASCAR,262144,N,-999,Toys,1740,1380,762,28,1,Collectibles -148324,Mobiles & Phones:Mobile Accessories:Covers / Faceplates:Sony Ericsson:W900i,15,,,,31,Phones,2008-06-03,2012-09-18 00:08:03,USER_X,USER_XIANZHU,15032,Phones,9394,20349,20349,20349,20349,20349,Mobile Accessories,CaseCoverSkins,CaseCoverSkins,CaseCoverSkins,CaseCoverSkins,CaseCoverSkins,262144,N,-999,Telecomm,-999,-999,20349,31,1,Electronics -139255,JewellerGemWatches:Fine Jewellery:Earrings:Gemstone - Created:Lapis,15,,,,17,JewelrGemWatches,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,281,Jewellery & Watches,4196,10985,10985,10985,10985,10985,Fine Jewellery,Earrings,Earrings,Earrings,Earrings,Earrings,262144,N,-999,JewelrGemWatches,-999,-999,-99,17,1,Fashion -20213,Collectibles:Postcards:US StateCities & Towns:Maine,0,,1,,11,Collectibles,2008-06-03,2008-09-09 22:08:47,USER_X,USER_Y,1,Collectibles,914,20193,20213,20213,20213,20213,Postcards,US StateCities & Towns,Maine,Maine,Maine,Maine,262144,N,-999,Collectibles,-999,-999,20213,11,1,Collectibles -32996,Movies:Television Memorabilia:Clippings,15,,,,42,Entertainment Memorabilia,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11232,Movies,1424,32996,32996,32996,32996,32996,Television Memorabilia,Clippings,Clippings,Clippings,Clippings,Clippings,262144,N,-999,Entertainment Memorabilia,-999,-999,32996,42,1,Collectibles -99985,Collectibles:Trading Cards:Sci-FFantasy:Star Wars:Sets:Other,0,,,,11,Collectibles,2008-06-03,2008-09-09 22:08:47,USER_X,USER_Y,1,Collectibles,868,37897,100899,99980,99985,99985,Trading Cards,Sci-FFantasy,Star Wars,Sets,Other,Other,262144,N,-999,Collectibles,-999,-999,99985,11,1,Collectibles -67703,Jewellery & Watches:Jewellery Boxes & Supplies:Jewellery Display,3,,,,17,Jewellery & Watches,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,281,Jewellery & Watches,10321,67703,67703,67703,67703,67703,Jewellery Boxes & Supplies,Jewellery Display,Jewellery Display,Jewellery Display,Jewellery Display,Jewellery Display,262144,N,-999,JewelrGemWatches,4435,2261,67703,17,1,Fashion -164,Computers/Tablets & Networking:Computer Components & Parts:CPUProcessors,0,,160,Computer Hardware,12,Computers,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,58058,Computers/Tablets & Networking,175673,164,164,164,164,164,Computer Components & Parts,CPUProcessors,CPUProcessors,CPUProcessors,CPUProcessors,CPUProcessors,262144,N,-999,Computers,5730,2011,164,12,1,Electronics -279,BookMagazines:Children's Books,15,,267,Other,3,Books,2008-06-03,2013-09-10 16:52:46,USER_X,USER_Y,267,BookMagazines,1093,1093,1093,1093,1093,1093,Children's Books,Children's Books,Children's Books,Children's Books,Children's Books,Children's Books,262144,N,-999,Books,1415,1128,1093,3,1,Media -65,Collectibles:Comics:Platinum Age (1897-1937),0,,1,Other,11,Collectibles,2008-06-03,2013-02-20 23:11:43,USER_X,USER_Y,1,Collectibles,63,65,65,65,65,65,Comics,Platinum Age (1897-1937),Platinum Age (1897-1937),Platinum Age (1897-1937),Platinum Age (1897-1937),Platinum Age (1897-1937),262144,N,-999,Collectibles,6014,2967,65,11,1,Collectibles -24541,Sports MeCards & Fan Shop:Fan Apparel & Souvenirs:College-NCAA,0,,,,25,Sports Memorabilia,2010-02-08,2013-07-16 08:23:09,USER_X,USER_Y,64482,Sports MeCards & Fan Shop,24409,24541,24541,24541,24541,24541,Fan Apparel & Souvenirs,College-NCAA,College-NCAA,College-NCAA,College-NCAA,College-NCAA,262144,N,-999,Sports Memorabilia,7721,2482,24541,25,1,Collectibles -23446,Mode & Accessoires:Chaussures de femme:Sandales & Sandalettes:Taille 37-38,23,,,,9,Vtements et Accessoires,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,11450,Mode & Accessoires,35107,23418,23446,23446,23446,23446,Chaussures de femme,Sandales & Sandalettes,Taille 37-38,Taille 37-38,Taille 37-38,Taille 37-38,262144,N,-999,Clothing & Accessories,2438,1634,23446,9,1,Fashion -130,Collectibles:Transportation:Railroadiana & Trains:Other,0,,1,Other,11,Collectibles,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,1,Collectibles,417,1444,130,130,130,130,Transportation,Railroadiana & Trains,Other,Other,Other,Other,262144,N,-999,Collectibles,-999,-999,130,11,1,Collectibles -216,Sports MeCards & Fan Shop:Cards:Hockey,0,,11800,Other,25,Sports Memorabilia,2008-06-03,2013-02-20 23:11:43,USER_X,USER_Y,64482,Sports MeCards & Fan Shop,212,216,216,216,216,216,Cards,Hockey,Hockey,Hockey,Hockey,Hockey,262144,N,-999,Sports Memorabilia,3636,2152,216,25,1,Collectibles -10866,Collectibles:Animals:Farm & Countryside:Pigs,0,,1,,11,Collectibles,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,1,Collectibles,1335,45602,10866,10866,10866,10866,Animals,Farm & Countryside,Pigs,Pigs,Pigs,Pigs,262144,N,-999,Collectibles,-999,-999,10866,11,1,Collectibles -57013,Business & Industrial:MRO & Industrial Supply:Pumps & Plumbing:Pumps:Pump Accessories & Parts,0,,,,4,Business (Office & Industrial),2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,12576,Business & Industrial,1266,109619,42928,57013,57013,57013,MRO & Industrial Supply,Pumps & Plumbing,Pumps,Pump Accessories & Parts,Pump Accessories & Parts,Pump Accessories & Parts,262144,N,-999,Business (Office & Industrial),-999,-999,57013,4,1,Business & Industrial -15687,ClothinShoes & Accessories:Men's Clothing:T-Shirts,0,,11450,,9,Apparel,2008-06-03,2013-07-16 08:23:09,USER_X,USER_Y,11450,ClothinShoes & Accessories,1059,15687,15687,15687,15687,15687,Men's Clothing,T-Shirts,T-Shirts,T-Shirts,T-Shirts,T-Shirts,262144,N,2515,Clothing & Accessories,7692,1115,15687,9,1,Fashion -80135,Computers/Tablets & Networking:DriveStorage & Blank Media:Blank Media & Accessories:CDVD & Blu-ray Discs,0,,,,12,Computers,2008-06-03,2013-07-16 08:23:09,USER_X,USER_Y,58058,Computers/Tablets & Networking,165,80133,80135,80135,80135,80135,DriveStorage & Blank Media,Blank Media & Accessories,CDVD & Blu-ray Discs,CDVD & Blu-ray Discs,CDVD & Blu-ray Discs,CDVD & Blu-ray Discs,262144,N,-999,Computers,3374,2018,80135,12,1,Electronics -31519,Computers/Tablets & Networking:Laptop & Desktop Accessories:Laptop Cases & Bags,0,,,,12,Computers,2012-05-01,2012-06-19 21:15:09,USER_X,USER_Y,58058,Computers/Tablets & Networking,31530,31519,31519,31519,31519,31519,Laptop & Desktop Accessories,Laptop Cases & Bags,Laptop Cases & Bags,Laptop Cases & Bags,Laptop Cases & Bags,Laptop Cases & Bags,262144,N,-999,Computers,6404,3189,31519,12,1,Electronics -175750,Home & Garden:Bedding:Blankets & Throws,0,,,,36,Home & Living,2012-05-01,2012-05-01 08:57:38,USER_X,USER_Y,11700,Home & Garden,20444,175750,175750,175750,175750,175750,Bedding,Blankets & Throws,Blankets & Throws,Blankets & Throws,Blankets & Throws,Blankets & Throws,262144,N,-999,Home Furnishing,-999,-999,175750,36,1,Home & Garden -63864,ClotheShoes & Accessories:Women's Clothing:Skirts,3,,,,9,Clothing & Accessories,2009-06-15,2012-06-19 21:15:09,USER_X,USER_Y,11450,ClotheShoes & Accessories,15724,63864,63864,63864,63864,63864,Women's Clothing,Skirts,Skirts,Skirts,Skirts,Skirts,262144,N,-999,Clothing & Accessories,6334,1551,63864,9,1,Fashion -13836,Collectibles:Decorative Collectibles:Spoons,0,,1,,11,Collectibles,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,1,Collectibles,13777,13836,13836,13836,13836,13836,Decorative Collectibles,Spoons,Spoons,Spoons,Spoons,Spoons,262144,N,-999,Collectibles,-999,-999,13836,11,1,Collectibles -63861,ClothinShoes & Accessories:Women's Clothing:Dresses,0,,,,9,Apparel,2008-06-03,2013-07-16 08:23:09,USER_X,USER_Y,11450,ClothinShoes & Accessories,15724,63861,63861,63861,63861,63861,Women's Clothing,Dresses,Dresses,Dresses,Dresses,Dresses,262144,N,-999,Clothing & Accessories,1263,1112,63861,9,1,Fashion -150047,Crafts:Jewellery Making:Findings:Bails,3,,,,15,Hobbies & Crafts,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,14339,Crafts,150045,150046,150047,150047,150047,150047,Jewellery Making,Findings,Bails,Bails,Bails,Bails,262144,N,-999,Hobbies & Crafts,4618,2740,150047,15,1,Home & Garden -95672,ClotheShoes & Accessories:Women's Shoes:Trainers,3,,,,9,Clothing & Accessories,2011-04-05,2013-07-16 08:23:09,USER_X,USER_Y,11450,ClotheShoes & Accessories,3034,95672,95672,95672,95672,95672,Women's Shoes,Trainers,Trainers,Trainers,Trainers,Trainers,262144,N,-999,Clothing & Accessories,2314,1634,95672,9,1,Fashion -57990,ClotheShoes & Accessories:Men's Clothing:Casual Shirts & Tops,3,,,,9,Clothing & Accessories,2009-06-15,2012-06-19 21:15:09,USER_X,USER_Y,11450,ClotheShoes & Accessories,1059,57990,57990,57990,57990,57990,Men's Clothing,Casual Shirts & Tops,Casual Shirts & Tops,Casual Shirts & Tops,Casual Shirts & Tops,Casual Shirts & Tops,262144,N,-999,Clothing & Accessories,6331,1623,57990,9,1,Fashion -75708,Toys & Games:Action Figures:TMovies & Video Games,3,,,,28,Toys & Games,2012-05-01,2012-05-01 08:57:38,USER_X,USER_Y,220,Toys & Games,246,75708,75708,75708,75708,75708,Action Figures,TMovies & Video Games,TMovies & Video Games,TMovies & Video Games,TMovies & Video Games,TMovies & Video Games,262144,N,-999,Toys,-999,-999,75708,28,1,Collectibles -4943,Toys & Hobbies:Diecast & Toy Vehicles:CarTrucks & Vans:Plastic:Vintage Manufacture (Pre-1970),0,,220,Other,28,Toys,2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,220,Toys & Hobbies,222,19036,19060,4943,4943,4943,Diecast & Toy Vehicles,CarTrucks & Vans,Plastic,Vintage Manufacture (Pre-1970),Vintage Manufacture (Pre-1970),Vintage Manufacture (Pre-1970),262144,N,-999,Toys,1740,1380,4943,28,1,Collectibles -40059,Mobile Phones & Communication:Radio Communication Equipment:Parts & Accessories:Other Parts & Accessories,3,,,,33,Consumer Electronics - Audio,2012-05-01,2012-05-01 08:57:38,USER_X,USER_Y,15032,Mobile Phones & Communication,1500,175734,40059,40059,40059,40059,Radio Communication Equipment,Parts & Accessories,Other Parts & Accessories,Other Parts & Accessories,Other Parts & Accessories,Other Parts & Accessories,262144,N,-999,Consumer Electronics - Audio,-999,-999,40059,33,1,Electronics -43479,Cameras & Photo:Film Photography:Other,0,,,,21,Photo,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,625,Cameras & Photo,69323,43479,43479,43479,43479,43479,Film Photography,Other,Other,Other,Other,Other,262144,N,-999,Photo,-999,-999,43479,21,1,Electronics -11848,Health & Beauty:Fragrances:Women,0,,,,37,Health & Beauty,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,26395,Health & Beauty,26396,11848,11848,11848,11848,11848,Fragrances,Women,Women,Women,Women,Women,262144,N,-999,Health & Beauty,5884,3087,11848,37,1,Fashion -165888,Jewelry & Watches:Vintage & Antique Jewelry:Costume:RetrVintage 1930s-1980s:PinBrooches,0,,,,17,JewelrGemWatches,2008-09-09,2009-01-12 07:05:17,USER_X,USER_Y,281,Jewelry & Watches,48579,500,58559,165888,165888,165888,Vintage & Antique Jewelry,Costume,RetrVintage 1930s-1980s,PinBrooches,PinBrooches,PinBrooches,262144,N,-999,JewelrGemWatches,-999,-999,165888,17,1,Fashion -26262,Collectibles:Advertising:Food & Beverage:Distillery:Bacardi,0,,1,,11,Collectibles,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,1,Collectibles,34,13587,820,26262,26262,26262,Advertising,Food & Beverage,Distillery,Bacardi,Bacardi,Bacardi,262144,N,-999,Collectibles,-999,-999,26262,11,1,Collectibles -67698,Business & Industrial:Retail & Services:Jewellery Packaging & Display:Cases & Displays:Bracelet,2,,,,4,Business (Office & Industrial),2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,12576,Business & Industrial,11890,67694,67697,67698,67698,67698,Retail & Services,Jewellery Packaging & Display,Cases & Displays,Bracelet,Bracelet,Bracelet,262144,N,-999,Business (Office & Industrial),-999,-999,67698,4,1,Business & Industrial -57990,ClothinShoes & Accessories:Men's Clothing:Casual Shirts,0,,,,9,Apparel,2008-06-03,2013-09-10 16:52:46,USER_X,USER_Y,11450,ClothinShoes & Accessories,1059,57990,57990,57990,57990,57990,Men's Clothing,Casual Shirts,Casual Shirts,Casual Shirts,Casual Shirts,Casual Shirts,262144,N,-999,Clothing & Accessories,-999,-999,57990,9,1,Fashion -67698,Business & Industrial:Retail & Services:Jewelry Packaging & Display:Cases & Displays:Bracelet,0,,,,4,Business (Office & Industrial),2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,12576,Business & Industrial,11890,67694,67697,67698,67698,67698,Retail & Services,Jewelry Packaging & Display,Cases & Displays,Bracelet,Bracelet,Bracelet,262144,N,-999,Business (Office & Industrial),-999,-999,67698,4,1,Business & Industrial -46575,Business & Industrial:Light Equipment & Tools:Air Tools:Air Tool Accessories,0,,,,4,Business (Office & Industrial),2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,12576,Business & Industrial,61573,46573,46575,46575,46575,46575,Light Equipment & Tools,Air Tools,Air Tool Accessories,Air Tool Accessories,Air Tool Accessories,Air Tool Accessories,262144,N,-999,Business (Office & Industrial),-999,-999,46575,4,1,Business & Industrial -41940,Business & Industrial:Manufacturing & Metalworking:Metalworking Tooling:Toolholding:Indexable Inserts,0,,,,4,Business (Office & Industrial),2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,12576,Business & Industrial,11804,92084,45017,41940,41940,41940,Manufacturing & Metalworking,Metalworking Tooling,Toolholding,Indexable Inserts,Indexable Inserts,Indexable Inserts,262144,N,-999,Business (Office & Industrial),-999,-999,41940,4,1,Business & Industrial -51582,ClothinShoes & Accessories:Kids' ClothinShoes & Accs:Girls' Clothing (Sizes 4 & Up):Sweaters,0,,,,9,Apparel,2012-05-01,2012-09-11 20:26:04,USER_X,USER_Y,11450,ClothinShoes & Accessories,171146,11462,51582,51582,51582,51582,Kids' ClothinShoes & Accs,Girls' Clothing (Sizes 4 & Up),Sweaters,Sweaters,Sweaters,Sweaters,262144,N,-999,Clothing & Accessories,-999,-999,51582,9,1,Fashion -80053,Computers/Tablets & Networking:MonitorProjectors & Accs:Monitors,0,,,,12,Computers,2009-09-21,2012-06-19 21:15:09,USER_X,USER_Y,58058,Computers/Tablets & Networking,162497,80053,80053,80053,80053,80053,MonitorProjectors & Accs,Monitors,Monitors,Monitors,Monitors,Monitors,262144,N,-999,Computers,2982,1911,80053,12,1,Electronics -31387,Jewellery & Watches:Watches:Wristwatches,3,,,,17,Jewellery & Watches,2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,281,Jewellery & Watches,14324,31387,31387,31387,31387,31387,Watches,Wristwatches,Wristwatches,Wristwatches,Wristwatches,Wristwatches,262144,N,-999,JewelrGemWatches,7489,32,31387,17,1,Fashion -20485,Home & Garden:Inside the Home:Furniture:Dining Room:Other,0,,11700,,36,Home & Living,2008-06-03,2012-05-01 08:54:26,USER_X,USER_Y,11700,Home & Garden,3197,175752,175752,175752,175752,175752,Furniture,Other,Other,Other,Other,Other,262144,N,-999,Home Furnishing,2919,1868,175752,36,1,Home & Garden -44079,Sporting Goods:Exercise & Fitness:GyWorkout & Yoga:Fitness Equipment:Exercise Mats,0,,,,24,Sporting Goods,2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,888,Sporting Goods,15273,158932,28064,44079,44079,44079,Exercise & Fitness,GyWorkout & Yoga,Fitness Equipment,Exercise Mats,Exercise Mats,Exercise Mats,262144,N,-999,Sporting Goods,-999,-999,44079,24,1,Lifestyle -175750,HomFurniture & DIY:Bedding:Blankets,3,,,,16,Home,2012-05-01,2012-09-11 20:26:04,USER_X,USER_Y,11700,HomFurniture & DIY,20444,175750,175750,175750,175750,175750,Bedding,Blankets,Blankets,Blankets,Blankets,Blankets,262144,N,-999,Home Improvement,-999,-999,175750,16,1,Home & Garden -16509,Toys & Hobbies:Model Railroads & Trains:S Scale:Other,0,,220,,28,Toys,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,220,Toys & Hobbies,479,19143,16509,16509,16509,16509,Model Railroads & Trains,S Scale,Other,Other,Other,Other,262144,N,-999,Toys,-999,-999,16509,28,1,Collectibles -139973,Video Games & Consoles:Games,3,,,,32,PC & Video Gaming,2011-04-05,2012-09-11 20:26:04,USER_X,USER_Y,1249,Video Games & Consoles,139973,139973,139973,139973,139973,139973,Games,Games,Games,Games,Games,Games,262144,N,-999,Video Games,1655,1135,139973,32,1,Electronics -170083,Computers/Tablets & Networking:Computer Components & Parts:Memory (RAM),3,,,,12,Computers,2012-05-01,2012-06-19 21:15:09,USER_X,USER_Y,58058,Computers/Tablets & Networking,175673,170083,170083,170083,170083,170083,Computer Components & Parts,Memory (RAM),Memory (RAM),Memory (RAM),Memory (RAM),Memory (RAM),262144,N,-999,Computers,3369,2042,170083,12,1,Electronics -16145,Computers/Tablets & Networking:Computer Components & Parts:Other Components & Parts,3,,160,,12,Computers,2008-06-03,2013-02-20 23:11:43,USER_X,USER_Y,58058,Computers/Tablets & Networking,175673,16145,16145,16145,16145,16145,Computer Components & Parts,Other Components & Parts,Other Components & Parts,Other Components & Parts,Other Components & Parts,Other Components & Parts,262144,N,-999,Computers,6976,3189,16145,12,1,Electronics -158798,Toys & Hobbies:Vintage & Antique Toys:Spinning Tops,0,,,,28,Toys,2008-06-03,2008-09-09 22:08:47,USER_X,USER_Y,220,Toys & Hobbies,717,158798,158798,158798,158798,158798,Vintage & Antique Toys,Spinning Tops,Spinning Tops,Spinning Tops,Spinning Tops,Spinning Tops,262144,N,-999,Toys,-999,-999,158798,28,1,Collectibles -20485,CasArredamento e Bricolage:Cucina:Altro per cucina,101,,,,36,Mobili per la casa,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,11700,CasArredamento e Bricolage,20625,20485,20485,20485,20485,20485,Cucina,Altro per cucina,Altro per cucina,Altro per cucina,Altro per cucina,Altro per cucina,0,N,-999,Home Furnishing,-999,-999,20485,36,1,Home & Garden -100847,Half Books,0,,,,3,Books,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,100847,Half Books,100847,100847,100847,100847,100847,100847,Half Books,Half Books,Half Books,Half Books,Half Books,Half Books,0,N,-999,Books,-999,-999,100847,3,2,Media -156356,Collectibles:Postcards:BuildingArchitecture,0,,,,11,Collectibles,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,1,Collectibles,914,156356,156356,156356,156356,156356,Postcards,BuildingArchitecture,BuildingArchitecture,BuildingArchitecture,BuildingArchitecture,BuildingArchitecture,262144,N,-999,Collectibles,-999,-999,156356,11,1,Collectibles -60606,Collectables:Badges/ Patches:Golly Badges:Robertsons:Modern (Post-1990),3,,,,11,Collectables,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,1,Collectables,32615,98793,106160,60606,60606,60606,Badges/ Patches,Golly Badges,Robertsons,Modern (Post-1990),Modern (Post-1990),Modern (Post-1990),262144,N,-999,Collectibles,4390,2640,60606,11,1,Collectibles -36250,Sporting Goods:Outdoor Sports:Hunting:Decoys:Duck,0,,,,24,Sporting Goods,2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,888,Sporting Goods,7301,36249,36249,36249,36249,36249,Hunting,Decoys,Decoys,Decoys,Decoys,Decoys,262144,N,-999,Sporting Goods,-999,-999,36249,24,1,Lifestyle -50508,Cameras & Photo:Camera & Photo Accessories:LCD Hoods,0,,,,21,Photo,2008-06-03,2013-02-20 23:11:43,USER_X,USER_Y,625,Cameras & Photo,15200,50508,50508,50508,50508,50508,Camera & Photo Accessories,LCD Hoods,LCD Hoods,LCD Hoods,LCD Hoods,LCD Hoods,262144,N,-999,Photo,6256,3170,50508,21,1,Electronics -9426,Mobile Phones & Communication:Home Phones & Accessories:Phone Accessories:Other Phone Accessories,3,,,,31,Mobile & Home Phones,2011-04-05,2012-05-01 08:54:26,USER_X,USER_Y,15032,Mobile Phones & Communication,3286,9422,9426,9426,9426,9426,Home Phones & Accessories,Phone Accessories,Other Phone Accessories,Other Phone Accessories,Other Phone Accessories,Other Phone Accessories,262144,N,-999,Telecomm,-999,-999,9426,31,1,Electronics -45238,Abbigliamento e accessori:Donna: Accessori:SciarpFoulard e Scialli,101,,,,9,Vestiti ed Accessori,2012-09-11,2012-09-11 20:27:22,USER_X,USER_Y,11450,Abbigliamento e accessori,4251,45238,45238,45238,45238,45238,Donna: Accessori,SciarpFoulard e Scialli,SciarpFoulard e Scialli,SciarpFoulard e Scialli,SciarpFoulard e Scialli,SciarpFoulard e Scialli,0,N,-999,Clothing & Accessories,-999,-999,45238,9,1,Fashion -75665,Home & Garden:YarGarden & Outdoor Living:Gardening Supplies:Garden Tools & Equipment:Composting,0,,,,16,Home Improvement,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11700,Home & Garden,159912,2032,29515,75665,75665,75665,YarGarden & Outdoor Living,Gardening Supplies,Garden Tools & Equipment,Composting,Composting,Composting,262144,N,-999,Home Improvement,-999,-999,75665,16,1,Home & Garden -57784,ClothinShoes & Accessories:Baby & Toddler Clothing:Boys' Clothing (Newborn-5T):One-Pieces,0,,,,9,Apparel,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11450,ClothinShoes & Accessories,3082,147317,57784,57784,57784,57784,Baby & Toddler Clothing,Boys' Clothing (Newborn-5T),One-Pieces,One-Pieces,One-Pieces,One-Pieces,262144,N,-999,Clothing & Accessories,-999,-999,57784,9,1,Fashion -6762,eBay Motors:Parts & Accessories:Manuals:Manuals:Other Makes,0,,6001,Other,-999,Unknown,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,-999,Unknown,-999,-999,-999,-999,-999,-999,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,0,N,-999,Unknown,-999,-999,-999,-999,1,Unknown -60340,Entertainment Memorabilia:Movie Memorabilia:Pressbooks:1970-79,0,,,,42,Entertainment Memorabilia,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,45100,Entertainment Memorabilia,196,18830,60340,60340,60340,60340,Movie Memorabilia,Pressbooks,1970-79,1970-79,1970-79,1970-79,262144,N,-999,Entertainment Memorabilia,-999,-999,60340,42,1,Collectibles -35570,eBay Motors:Parts & Accessories:Motorcycle Parts:DecalEmblems,100,,,,8,Auto - Parts,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,6000,eBay Motors,6028,10063,35570,35570,35570,35570,Parts & Accessories,Motorcycle Parts,DecalEmblems,DecalEmblems,DecalEmblems,DecalEmblems,262144,N,-999,Auto - Parts,5407,2940,35570,8,1,Parts & Accessories -11554,ClothinShoes & Accessories:Women's Clothing:Jeans,0,,11450,,9,Apparel,2008-06-03,2013-07-16 08:23:09,USER_X,USER_Y,11450,ClothinShoes & Accessories,15724,11554,11554,11554,11554,11554,Women's Clothing,Jeans,Jeans,Jeans,Jeans,Jeans,262144,N,-999,Clothing & Accessories,7720,1113,11554,9,1,Fashion -1357,Collectibles:Decorative Collectibles:Decorative Collectible Brands:Hamilton Collector Plates,0,,1,Other,11,Collectibles,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,1,Collectibles,13777,156286,1357,1357,1357,1357,Decorative Collectibles,Decorative Collectible Brands,Hamilton Collector Plates,Hamilton Collector Plates,Hamilton Collector Plates,Hamilton Collector Plates,262144,N,-999,Collectibles,-999,-999,1357,11,1,Collectibles -13987,Collectibles:Paper:Booklets:1920-39,0,,1,,11,Collectibles,2008-06-03,2008-06-03 13:36:00,USER_X,USER_Y,1,Collectibles,124,13985,13987,13987,13987,13987,Paper,Booklets,1920-39,1920-39,1920-39,1920-39,262144,N,-999,Collectibles,-999,-999,13987,11,1,Collectibles -63861,ClotheShoes & Accessories:Women's Clothing:Dresses,3,,,,9,Clothing & Accessories,2009-06-15,2013-07-16 08:23:09,USER_X,USER_Y,11450,ClotheShoes & Accessories,15724,63861,63861,63861,63861,63861,Women's Clothing,Dresses,Dresses,Dresses,Dresses,Dresses,262144,N,-999,Clothing & Accessories,-999,-999,63861,9,1,Fashion -314,ClothinShoes & Accessories:Womens' Clothing:Other,211,,,,9,ClothinShoes & Accessories,2008-06-03,2013-02-20 23:11:43,USER_X,USER_Y,11450,ClothinShoes & Accessories,15724,314,314,314,314,314,Womens' Clothing,Other,Other,Other,Other,Other,0,N,-999,Clothing & Accessories,-999,-999,314,9,1,Fashion -139973,Video Games & Consoles:Video Games,0,,,,32,Video Games,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,1249,Video Games & Consoles,139973,139973,139973,139973,139973,139973,Video Games,Video Games,Video Games,Video Games,Video Games,Video Games,262144,N,-999,Video Games,1453,1135,139973,32,1,Electronics -30059,Cameras & Photography:Lenses & Filters:Lens AdapterMounts & Tubes,3,,,,21,Photography,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,625,Cameras & Photography,78997,30059,30059,30059,30059,30059,Lenses & Filters,Lens AdapterMounts & Tubes,Lens AdapterMounts & Tubes,Lens AdapterMounts & Tubes,Lens AdapterMounts & Tubes,Lens AdapterMounts & Tubes,262144,N,-999,Photo,4379,2630,30059,21,1,Electronics -16145,Computers/Tablets & Networking:Computer Components & Parts:Other,0,,,,12,Computers,2008-06-03,2013-02-20 23:11:43,USER_X,USER_Y,58058,Computers/Tablets & Networking,175673,16145,16145,16145,16145,16145,Computer Components & Parts,Other,Other,Other,Other,Other,262144,N,-999,Computers,7312,3189,16145,12,1,Electronics -95672,ClothinShoes & Accessories:Women's Shoes:Athletic,0,,,,9,Apparel,2011-04-05,2013-02-20 23:11:43,USER_X,USER_Y,11450,ClothinShoes & Accessories,3034,95672,95672,95672,95672,95672,Women's Shoes,Athletic,Athletic,Athletic,Athletic,Athletic,262144,N,-999,Clothing & Accessories,1251,1100,95672,9,1,Fashion -1349,Collectibles:Decorative Collectibles:Decorative Collectible Brands:Avon:Bottles,0,,1,Other,11,Collectibles,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,1,Collectibles,13777,156286,13779,1349,1349,1349,Decorative Collectibles,Decorative Collectible Brands,Avon,Bottles,Bottles,Bottles,262144,N,-999,Collectibles,-999,-999,1349,11,1,Collectibles -1504,Business & Industrial:Electrical & Test Equipment:Test Equipment:Other,0,,9428,Other,4,Business (Office & Industrial),2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,12576,Business & Industrial,92074,4676,1504,1504,1504,1504,Electrical & Test Equipment,Test Equipment,Other,Other,Other,Other,262144,N,-999,Business (Office & Industrial),-999,-999,1504,4,1,Business & Industrial -73506,Collectibles:Decorative Collectibles:Tea PotSets,0,,,,11,Collectibles,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,1,Collectibles,13777,73506,73506,73506,73506,73506,Decorative Collectibles,Tea PotSets,Tea PotSets,Tea PotSets,Tea PotSets,Tea PotSets,262144,N,-999,Collectibles,-999,-999,73506,11,1,Collectibles -38238,Home & Garden:Home Decor & Accents:Wall Decor:Other,0,,,,36,Home & Living,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11700,Home & Garden,10033,10034,10034,10034,10034,10034,Home Decor,Other,Other,Other,Other,Other,262144,N,-999,Home Furnishing,2919,1868,10034,36,1,Home & Garden -533,Coins & Paper Money:Coins: World:Africa:Other,0,,11116,Other,10,Coins,2008-06-03,2012-06-19 21:15:09,USER_X,USER_Y,11116,Coins & Paper Money,256,127144,533,533,533,533,Coins: World,Africa,Other,Other,Other,Other,262144,N,2431,Coins,6213,1620,533,10,1,Collectibles -223,Toys & Hobbies:Diecast & Toy Vehicles:CarTrucks & Vans:Diecast-Modern Manufacture,0,,220,Other,28,Toys,2008-06-03,2013-04-28 20:37:19,USER_X,USER_Y,220,Toys & Hobbies,222,19036,223,223,223,223,Diecast & Toy Vehicles,CarTrucks & Vans,Diecast-Modern Manufacture,Diecast-Modern Manufacture,Diecast-Modern Manufacture,Diecast-Modern Manufacture,262144,N,-999,Toys,1740,1380,223,28,1,Collectibles -31519,Computers/Tablets & Networking:Laptop & Desktop Accessories:Laptop Cases & Bags,3,,,,12,Computers,2012-05-01,2012-06-19 21:15:09,USER_X,USER_Y,58058,Computers/Tablets & Networking,31530,31519,31519,31519,31519,31519,Laptop & Desktop Accessories,Laptop Cases & Bags,Laptop Cases & Bags,Laptop Cases & Bags,Laptop Cases & Bags,Laptop Cases & Bags,262144,N,-999,Computers,6592,3189,31519,12,1,Electronics -155226,ClothinShoes & Accessories:Women's Clothing:Sweats & Hoodies,0,,,,9,Apparel,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11450,ClothinShoes & Accessories,15724,155226,155226,155226,155226,155226,Women's Clothing,Sweats & Hoodies,Sweats & Hoodies,Sweats & Hoodies,Sweats & Hoodies,Sweats & Hoodies,262144,N,-999,Clothing & Accessories,-999,-999,155226,9,1,Fashion -63889,ClothinShoes & Accessories:Women's Shoes:Mixed Items & Lots,0,,,,9,Apparel,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11450,ClothinShoes & Accessories,3034,63889,63889,63889,63889,63889,Women's Shoes,Mixed Items & Lots,Mixed Items & Lots,Mixed Items & Lots,Mixed Items & Lots,Mixed Items & Lots,262144,N,-999,Clothing & Accessories,-999,-999,63889,9,1,Fashion -314,ClothinShoes & Accessories:Women's Clothing:Other,0,,11450,Other,9,Apparel,2008-06-03,2012-09-11 20:26:04,USER_X,USER_Y,11450,ClothinShoes & Accessories,15724,314,314,314,314,314,Women's Clothing,Other,Other,Other,Other,Other,262144,N,-999,Clothing & Accessories,-999,-999,314,9,1,Fashion diff --git a/examples/test_case_data/localmeta/data/TEST_KYLIN_FACT.csv b/examples/test_case_data/localmeta/data/TEST_KYLIN_FACT.csv deleted file mode 100644 index e03d72c..0000000 --- a/examples/test_case_data/localmeta/data/TEST_KYLIN_FACT.csv +++ /dev/null @@ -1,402 +0,0 @@ -10000000157,2013-03-31,Auction,48028,0,12,184.21,1,10000001 -10000000158,2013-11-12,Others,164262,0,5,172.03,1,10000002 -10000000161,2013-04-06,Auction,82494,15,14,66.6,1,10000003 -10000000137,2013-05-17,Auction,66767,15,12,92.98,1,10000004 -10000000147,2013-05-20,FP-GTC,152801,0,5,132.33,1,10000005 -10000000155,2013-06-16,FP-GTC,43398,0,13,7.12,1,10000006 -10000000170,2013-06-14,Auction,95173,0,14,204.28,1,10000007 -10000000173,2013-03-22,Auction,158666,15,13,35.72,1,10000008 -10000000178,2013-03-10,Auction,12688,0,12,4.13,1,10000009 -10000000163,2013-11-01,FP-GTC,103324,15,5,27.48,1,10000010 -10000000166,2013-06-16,FP-GTC,108782,15,14,9.26,1,10000011 -10000000167,2013-09-12,Auction,80287,0,12,3.18,1,10000012 -10000000086,2013-09-28,Others,140746,100,13,3.18,1,10000013 -10000000110,2013-06-15,ABIN,87118,0,14,377.94,1,10000014 -10000000113,2013-03-14,Auction,25147,0,12,146.33,1,10000015 -10000000069,2013-09-01,FP-GTC,170302,15,5,51.23,1,10000016 -10000000079,2013-05-29,FP-non GTC,53064,0,13,72.65,1,10000017 -10000000080,2013-05-31,Auction,132939,0,13,66.6,1,10000018 -10000000130,2013-03-18,Auction,113593,15,12,9.26,1,10000019 -10000000268,2013-07-19,Auction,34273,100,14,583.44,1,10000020 -10000000132,2013-06-23,FP-GTC,106340,15,14,638.72,1,10000021 -10000000115,2013-05-20,FP-GTC,150265,15,14,4.54,1,10000022 -10000000117,2013-05-17,FP-GTC,24760,0,12,319.79,1,10000023 -10000000118,2013-03-11,Auction,37831,0,12,20.35,1,10000024 -10000000223,2013-01-30,FP-non GTC,1120,3,5,223.63,1,10000025 -10000000224,2013-01-26,FP-GTC,43972,100,13,204.28,1,10000026 -10000000243,2013-03-22,Auction,166013,15,14,5.48,1,10000027 -10000000217,2013-07-23,Auction,15568,15,14,27.48,1,10000028 -10000000218,2013-07-27,FP-GTC,103178,15,5,21.72,1,10000029 -10000000221,2013-10-29,ABIN,2023,0,12,3.18,1,10000030 -10000000256,2013-10-08,FP-GTC,94847,0,11,491.32,1,10000031 -10000000257,2013-04-26,Auction,15868,0,14,448.8,1,10000032 -10000000263,2013-01-01,Auction,32876,0,13,415.73,1,10000033 -10000000245,2013-01-15,Auction,62179,0,13,377.94,1,10000034 -10000000248,2013-05-27,FP-GTC,33038,15,14,146.33,1,10000035 -10000000254,2013-11-11,FP-GTC,156614,0,5,7.12,1,10000036 -10000000192,2013-03-08,Auction,106246,0,13,42.99,1,10000037 -10000000196,2013-03-25,Auction,20865,0,13,12.85,1,10000038 -10000000203,2013-08-20,FP-GTC,15115,0,13,55.89,1,10000039 -10000000179,2013-05-17,FP-GTC,3838,0,14,73.26,1,10000040 -10000000183,2013-06-05,Auction,759,0,11,112.56,1,10000041 -10000000185,2013-10-08,FP-non GTC,61323,0,11,3.49,1,10000042 -10000000211,2013-08-14,Auction,121153,0,13,184.21,1,10000043 -10000000213,2013-08-14,Auction,88750,0,13,157.14,1,10000044 -10000000214,2013-05-17,FP-GTC,161567,15,14,72.65,1,10000045 -10000000204,2013-08-09,FP-GTC,113802,15,14,51.23,1,10000046 -10000000208,2013-06-30,FP-non GTC,15808,15,14,15.85,1,10000047 -10000000209,2013-06-03,FP-GTC,174053,3,13,7.12,1,10000048 -10000000042,2013-12-31,Auction,2635,0,14,12.04,1,10000049 -10000000044,2013-12-25,Auction,1161,3,13,73.26,1,10000050 -10000000022,2013-03-28,FP-non GTC,64076,0,5,184.21,1,10000051 -10000000023,2013-01-30,FP-GTC,33977,15,13,172.03,1,10000052 -10000000047,2013-12-05,FP-GTC,31673,0,14,122.78,1,10000053 -10000000056,2013-10-08,Auction,174106,3,14,92.98,1,10000054 -10000000062,2013-12-27,Auction,26249,0,13,12.19,1,10000055 -10000000053,2013-12-16,FP-GTC,159184,0,5,15.65,1,10000056 -10000000055,2013-10-17,FP-GTC,10058,3,11,101.79,1,10000057 -10000000020,2013-11-17,ABIN,48904,0,12,7.12,1,10000058 -10000000007,2013-09-18,FP-non GTC,145970,0,14,12.85,1,10000059 -10000000008,2013-06-30,FP-GTC,963,0,13,12.19,1,10000060 -10000000002,2013-10-12,FP-GTC,118687,3,13,92.98,1,10000061 -10000000003,2013-08-20,FP-GTC,20886,0,14,42.99,1,10000062 -10000000010,2013-08-29,Auction,148324,15,13,1.88,1,10000063 -10000000016,2013-07-17,Auction,139255,15,14,21.14,1,10000064 -10000000017,2013-07-23,FP-GTC,20213,0,5,21.14,1,10000065 -10000000012,2013-01-06,Auction,32996,15,13,132.33,1,10000066 -10000000013,2013-08-14,FP-GTC,99985,0,14,120.87,1,10000067 -10000000067,2013-08-10,Auction,67703,3,14,120.87,1,10000068 -10000000085,2013-09-28,FP-non GTC,65,0,11,9.26,1,10000069 -10000000141,2013-08-21,FP-non GTC,130,0,14,16.26,1,10000070 -10000000078,2013-03-11,FP-GTC,164,0,14,157.14,1,10000071 -10000000109,2013-05-06,FP-GTC,216,0,11,1.88,1,10000072 -10000000096,2013-05-17,FP-non GTC,223,0,5,12.04,1,10000073 -10000000095,2013-01-10,FP-non GTC,223,0,14,189.23,1,10000074 -10000000098,2013-05-05,FP-non GTC,223,0,5,73.26,1,10000075 -10000000097,2013-02-03,FP-non GTC,223,0,5,4.13,1,10000076 -10000000099,2013-11-26,FP-non GTC,223,0,5,290.72,1,10000077 -10000000100,2013-08-30,FP-non GTC,223,0,5,265.56,1,10000078 -10000000126,2013-04-26,FP-GTC,279,15,5,5.91,1,10000079 -10000000252,2013-06-30,Auction,314,0,5,319.79,1,10000080 -10000000052,2013-06-30,Auction,314,211,5,246,1,10000081 -10000000253,2013-12-16,Auction,314,211,5,20.35,1,10000082 -10000000051,2013-12-15,Auction,314,0,5,36.7,1,10000083 -10000000190,2013-08-17,Auction,533,0,13,101.79,1,10000084 -10000000251,2013-12-15,ABIN,1349,0,5,47.71,1,10000085 -10000000050,2013-02-04,ABIN,1349,0,5,3.49,1,10000086 -10000000049,2013-01-11,ABIN,1349,0,13,46.44,1,10000087 -10000000250,2013-02-04,ABIN,1349,0,13,4.54,1,10000088 -10000000131,2013-05-17,ABIN,1357,0,14,3.18,1,10000089 -10000000172,2013-11-12,FP-GTC,1504,0,14,86.58,1,10000090 -10000000142,2013-08-21,FP-GTC,4943,0,13,12.85,1,10000091 -10000000195,2013-05-09,ABIN,6762,0,13,16.26,1,10000092 -10000000070,2013-09-19,Auction,9426,3,13,21.14,1,10000093 -10000000165,2013-02-06,FP-non GTC,10866,0,14,20.6,1,10000094 -10000000187,2013-02-02,Auction,11554,0,13,246,1,10000095 -10000000189,2013-08-23,FP-GTC,11848,0,14,109,1,10000096 -10000000139,2013-08-03,Auction,13836,0,13,39.41,1,10000097 -10000000140,2013-05-17,Auction,13836,0,14,16.26,1,10000098 -10000000102,2013-06-06,FP-GTC,13987,0,13,112.56,1,10000099 -10000000076,2013-07-02,Auction,15687,0,14,184.21,1,10000100 -10000000082,2013-10-25,Auction,15687,0,11,27.48,1,10000001 -10000000129,2013-04-20,FP-non GTC,16145,3,12,26.45,1,10000002 -10000000128,2013-03-12,FP-non GTC,16145,0,13,415.73,1,10000003 -10000000222,2013-03-28,ABIN,16509,0,5,56.36,1,10000004 -10000000021,2013-10-29,ABIN,16509,0,5,2.44,1,10000005 -10000000134,2013-05-22,FP-GTC,20485,0,14,269.76,1,10000006 -10000000135,2013-01-25,FP-GTC,20485,101,12,109,1,10000007 -10000000136,2013-06-12,FP-GTC,20485,101,12,101.79,1,10000008 -10000000241,2013-12-26,Auction,23446,23,14,246,1,10000009 -10000000041,2013-12-26,Auction,23446,23,14,189.23,1,10000010 -10000000242,2013-12-31,Auction,23446,23,14,15.65,1,10000011 -10000000040,2013-10-04,Auction,23446,23,14,28.23,1,10000012 -10000000194,2013-03-16,FP-GTC,24541,0,5,16.26,1,10000013 -10000000101,2013-05-21,FP-GTC,26262,0,5,122.78,1,10000014 -10000000077,2013-01-28,FP-GTC,30059,3,14,172.03,1,10000015 -10000000057,2013-04-26,Auction,31387,3,14,42.99,1,10000016 -10000000258,2013-10-06,Auction,31387,3,14,207.5,1,10000017 -10000000261,2013-11-06,FP-GTC,31519,0,14,5.91,1,10000018 -10000000058,2013-10-06,FP-GTC,31519,3,14,39.41,1,10000019 -10000000059,2013-12-28,FP-GTC,31519,0,14,16.26,1,10000020 -10000000060,2013-11-06,FP-GTC,31519,0,14,16.26,1,10000021 -10000000260,2013-11-06,FP-GTC,31519,0,14,78.48,1,10000022 -10000000259,2013-12-28,FP-GTC,31519,3,14,190.22,1,10000023 -10000000156,2013-06-11,FP-GTC,35570,100,12,2.44,1,10000024 -10000000119,2013-01-10,Auction,36250,0,5,7.12,1,10000025 -10000000186,2013-09-17,FP-non GTC,38238,0,14,36.7,1,10000026 -10000000038,2013-08-14,FP-GTC,40059,3,14,35.72,1,10000027 -10000000239,2013-08-09,FP-GTC,40059,3,14,3.49,1,10000028 -10000000034,2013-12-02,FP-GTC,41940,0,13,223.63,1,10000029 -10000000235,2013-02-01,FP-GTC,41940,0,13,265.56,1,10000030 -10000000127,2013-07-28,FP-non GTC,43479,0,13,62.02,1,10000031 -10000000103,2013-06-16,FP-GTC,44079,0,12,46.44,1,10000032 -10000000201,2013-08-23,Auction,45238,101,14,132.33,1,10000033 -10000000122,2013-06-15,Auction,45333,0,13,448.8,1,10000034 -10000000123,2013-06-15,FP-non GTC,45333,0,14,207.5,1,10000035 -10000000124,2013-06-01,FP-non GTC,45333,0,14,190.22,1,10000036 -10000000072,2013-08-10,FP-GTC,46575,0,14,16.71,1,10000037 -10000000043,2013-03-22,FP-non GTC,50508,0,13,4.13,1,10000038 -10000000244,2013-12-25,FP-non GTC,50508,0,13,1.88,1,10000039 -10000000121,2013-07-22,FP-GTC,50677,0,13,491.32,1,10000040 -10000000120,2013-04-13,FP-GTC,50677,0,5,2.44,1,10000041 -10000000168,2013-04-16,Auction,51582,0,14,56.36,1,10000042 -10000000073,2013-08-21,FP-GTC,57013,0,13,15.85,1,10000043 -10000000075,2013-04-22,FP-non GTC,57013,0,14,2.44,1,10000044 -10000000074,2013-08-29,FP-GTC,57013,0,14,7.12,1,10000045 -10000000093,2013-05-16,Auction,57784,0,14,35.72,1,10000046 -10000000265,2013-08-23,Auction,57990,3,11,9.26,1,10000047 -10000000266,2013-07-10,Auction,57990,3,14,3.18,1,10000048 -10000000267,2013-08-10,Auction,57990,3,14,638.72,1,10000049 -10000000065,2013-08-23,Auction,57990,3,14,141.7,1,10000050 -10000000143,2013-04-18,ABIN,57990,0,13,12.19,1,10000051 -10000000066,2013-07-10,Auction,57990,3,14,132.33,1,10000052 -10000000144,2013-06-16,ABIN,57990,3,5,5.48,1,10000053 -10000000064,2013-07-15,Auction,57990,3,11,1.88,1,10000054 -10000000061,2013-11-06,FP-GTC,60340,0,14,12.85,1,10000055 -10000000262,2013-12-27,FP-GTC,60340,0,14,62.02,1,10000056 -10000000019,2013-07-29,FP-GTC,60606,3,12,15.85,1,10000057 -10000000220,2013-11-17,FP-GTC,60606,3,12,9.26,1,10000058 -10000000018,2013-07-27,FP-GTC,60606,3,12,16.71,1,10000059 -10000000219,2013-07-29,FP-GTC,60606,3,12,20.6,1,10000060 -10000000145,2013-01-09,Auction,63861,3,5,1.88,1,10000061 -10000000200,2013-06-11,ABIN,63861,0,5,141.7,1,10000062 -10000000199,2013-01-10,ABIN,63861,0,5,1.88,1,10000063 -10000000237,2013-09-16,Others,63861,0,11,112.56,1,10000064 -10000000036,2013-01-14,Others,63861,0,11,94.45,1,10000065 -10000000125,2013-05-17,Auction,63861,0,14,78.48,1,10000066 -10000000198,2013-06-05,ABIN,63861,0,13,5.48,1,10000067 -10000000094,2013-05-24,Auction,63864,3,14,28.23,1,10000068 -10000000104,2013-05-15,Others,63889,0,13,3.49,1,10000069 -10000000107,2013-03-25,FP-GTC,67698,2,11,15.65,1,10000070 -10000000108,2013-03-09,FP-GTC,67698,0,11,5.48,1,10000071 -10000000106,2013-12-05,FP-GTC,67698,0,11,246,1,10000072 -10000000182,2013-04-18,FP-non GTC,73506,0,13,122.78,1,10000073 -10000000169,2013-11-01,FP-GTC,75665,0,14,223.63,1,10000074 -10000000146,2013-05-03,ABIN,75708,3,5,141.7,1,10000075 -10000000151,2013-04-21,FP-non GTC,80053,0,11,21.14,1,10000076 -10000000149,2013-03-12,FP-non GTC,80053,0,11,55.89,1,10000077 -10000000150,2013-05-19,FP-non GTC,80053,0,11,51.23,1,10000078 -10000000083,2013-11-23,Auction,80135,0,14,21.72,1,10000079 -10000000089,2013-10-19,Auction,95672,3,14,204.28,1,10000080 -10000000152,2013-05-18,Others,95672,0,11,21.14,1,10000081 -10000000035,2013-02-01,Others,100847,0,5,204.28,1,10000082 -10000000236,2013-01-14,Others,100847,0,5,122.78,1,10000083 -10000000090,2013-08-05,ABIN,139973,3,14,94.45,1,10000084 -10000000091,2013-05-19,ABIN,139973,0,11,86.58,1,10000085 -10000000033,2013-12-01,Auction,150047,3,14,56.36,1,10000086 -10000000234,2013-12-02,Auction,150047,3,14,290.72,1,10000087 -10000000249,2013-01-11,FP-GTC,155226,0,13,60.37,1,10000088 -10000000048,2013-05-27,FP-GTC,155226,0,13,112.56,1,10000089 -10000000181,2013-09-01,FP-GTC,156356,0,13,265.56,1,10000090 -10000000092,2013-04-11,FP-GTC,158798,0,11,35.72,1,10000091 -10000000191,2013-05-05,FP-non GTC,165888,0,13,92.98,1,10000092 -10000000229,2013-11-21,Auction,170083,3,11,28.23,1,10000093 -10000000028,2013-10-07,Auction,170083,3,11,27.48,1,10000094 -10000000031,2013-07-12,Auction,175750,3,14,9.26,1,10000095 -10000000032,2013-06-07,Auction,175750,3,14,3.18,1,10000096 -10000000177,2013-05-22,FP-GTC,175750,0,14,12.04,1,10000097 -10000000030,2013-11-28,Auction,175750,3,13,20.6,1,10000098 -10000000231,2013-07-12,Auction,175750,3,13,12.04,1,10000099 -10000000232,2013-06-07,Auction,175750,3,14,4.13,1,10000100 -10000000233,2013-12-01,Auction,175750,3,14,73.26,1,10000201 -10000000002,2012-10-12,Auction,48027,0,12,184.21,1,10000001 -10000000003,2012-08-20,Others,164261,0,5,172.03,1,10000002 -10000000007,2012-09-18,Auction,82494,15,14,66.6,1,10000003 -10000000008,2012-06-30,Auction,66767,15,12,92.98,1,10000004 -10000000010,2012-08-29,FP-GTC,152801,0,5,132.33,1,10000005 -10000000012,2012-01-06,FP-GTC,43398,0,13,7.12,1,10000006 -10000000013,2012-08-14,Auction,95173,0,14,204.28,1,10000007 -10000000016,2012-07-17,Auction,158666,15,13,35.72,1,10000008 -10000000017,2012-07-23,Auction,12688,0,12,4.13,1,10000009 -10000000018,2012-07-27,FP-GTC,103324,15,5,27.48,1,10000010 -10000000019,2012-07-29,FP-GTC,108782,15,14,9.26,1,10000011 -10000000020,2012-11-17,Auction,80287,0,12,3.18,1,10000012 -10000000021,2012-10-29,Others,140746,100,13,3.18,1,10000013 -10000000022,2012-03-28,ABIN,87118,0,14,377.94,1,10000014 -10000000023,2012-01-30,Auction,25147,0,12,146.33,1,10000015 -10000000028,2012-10-07,FP-GTC,170302,15,5,51.23,1,10000016 -10000000030,2012-11-28,FP-non GTC,53064,0,13,72.65,1,10000017 -10000000031,2012-07-12,Auction,132939,0,13,66.6,1,10000018 -10000000032,2012-06-07,Auction,113593,15,12,9.26,1,10000019 -10000000033,2012-12-01,Auction,34273,100,14,583.44,1,10000020 -10000000034,2012-12-02,FP-GTC,106340,15,14,638.72,1,10000021 -10000000035,2012-02-01,FP-GTC,150265,15,14,4.54,1,10000022 -10000000036,2012-01-14,FP-GTC,24760,0,12,319.79,1,10000023 -10000000038,2012-08-14,Auction,37831,0,12,20.35,1,10000024 -10000000040,2012-10-04,FP-non GTC,1120,3,5,223.63,1,10000025 -10000000041,2012-12-26,FP-GTC,43972,100,13,204.28,1,10000026 -10000000042,2012-12-31,Auction,166013,15,14,5.48,1,10000027 -10000000043,2012-03-22,Auction,15568,15,14,27.48,1,10000028 -10000000044,2012-12-25,FP-GTC,103178,15,5,21.72,1,10000029 -10000000047,2012-12-05,ABIN,2023,0,12,3.18,1,10000030 -10000000048,2012-05-27,FP-GTC,94847,0,11,491.32,1,10000031 -10000000049,2012-01-11,Auction,15868,0,14,448.8,1,10000032 -10000000050,2012-02-04,Auction,32876,0,13,415.73,1,10000033 -10000000051,2012-12-15,Auction,62179,0,13,377.94,1,10000034 -10000000052,2012-06-30,FP-GTC,33038,15,14,146.33,1,10000035 -10000000053,2012-12-16,FP-GTC,156614,0,5,7.12,1,10000036 -10000000055,2012-10-17,Auction,106246,0,13,42.99,1,10000037 -10000000056,2012-10-08,Auction,20865,0,13,12.85,1,10000038 -10000000057,2012-04-26,FP-GTC,15115,0,13,55.89,1,10000039 -10000000058,2012-10-06,FP-GTC,3838,0,14,73.26,1,10000040 -10000000059,2012-12-28,Auction,759,0,11,112.56,1,10000041 -10000000060,2012-11-06,FP-non GTC,61323,0,11,3.49,1,10000042 -10000000061,2012-11-06,Auction,121153,0,13,184.21,1,10000043 -10000000062,2012-12-27,Auction,88750,0,13,157.14,1,10000044 -10000000064,2012-07-15,FP-GTC,161567,15,14,72.65,1,10000045 -10000000065,2012-08-23,FP-GTC,113802,15,14,51.23,1,10000046 -10000000066,2012-07-10,FP-non GTC,15808,15,14,15.85,1,10000047 -10000000067,2012-08-10,FP-GTC,174053,3,13,7.12,1,10000048 -10000000069,2012-09-01,Auction,2635,0,14,12.04,1,10000049 -10000000070,2012-09-19,Auction,1161,3,13,73.26,1,10000050 -10000000072,2012-08-10,FP-non GTC,64076,0,5,184.21,1,10000051 -10000000073,2012-08-21,FP-GTC,33977,15,13,172.03,1,10000052 -10000000074,2012-08-29,FP-GTC,31673,0,14,122.78,1,10000053 -10000000075,2012-04-22,Auction,174106,3,14,92.98,1,10000054 -10000000076,2012-07-02,Auction,26249,0,13,12.19,1,10000055 -10000000077,2012-01-28,FP-GTC,159184,0,5,15.65,1,10000056 -10000000078,2012-03-11,FP-GTC,10058,3,11,101.79,1,10000057 -10000000079,2012-05-29,ABIN,48904,0,12,7.12,1,10000058 -10000000080,2012-05-31,FP-non GTC,145970,0,14,12.85,1,10000059 -10000000082,2012-10-25,FP-GTC,963,0,13,12.19,1,10000060 -10000000083,2012-11-23,FP-GTC,118687,3,13,92.98,1,10000061 -10000000085,2012-09-28,FP-GTC,20886,0,14,42.99,1,10000062 -10000000086,2012-09-28,Auction,148324,15,13,1.88,1,10000063 -10000000089,2012-10-19,Auction,139255,15,14,21.14,1,10000064 -10000000090,2012-08-05,FP-GTC,20213,0,5,21.14,1,10000065 -10000000091,2012-05-19,Auction,32996,15,13,132.33,1,10000066 -10000000092,2012-04-11,FP-GTC,99985,0,14,120.87,1,10000067 -10000000093,2012-05-16,Auction,67703,3,14,120.87,1,10000068 -10000000094,2012-05-24,FP-non GTC,65,0,11,9.26,1,10000069 -10000000095,2012-01-10,FP-non GTC,130,0,14,16.26,1,10000070 -10000000096,2012-05-17,FP-GTC,164,0,14,157.14,1,10000071 -10000000097,2012-02-03,FP-GTC,216,0,11,1.88,1,10000072 -10000000098,2012-05-05,FP-non GTC,223,0,5,12.04,1,10000073 -10000000099,2012-11-26,FP-non GTC,223,0,14,189.23,1,10000074 -10000000100,2012-08-30,FP-non GTC,223,0,5,73.26,1,10000075 -10000000101,2012-05-21,FP-non GTC,223,0,5,4.13,1,10000076 -10000000102,2012-06-06,FP-non GTC,223,0,5,290.72,1,10000077 -10000000103,2012-06-16,FP-non GTC,223,0,5,265.56,1,10000078 -10000000104,2012-05-15,FP-GTC,279,15,5,5.91,1,10000079 -10000000106,2012-12-05,Auction,314,0,5,319.79,1,10000080 -10000000107,2012-03-25,Auction,314,211,5,246,1,10000081 -10000000108,2012-03-09,Auction,314,211,5,20.35,1,10000082 -10000000109,2012-05-06,Auction,314,0,5,36.7,1,10000083 -10000000110,2012-06-15,Auction,533,0,13,101.79,1,10000084 -10000000113,2012-03-14,ABIN,1349,0,5,47.71,1,10000085 -10000000115,2012-05-20,ABIN,1349,0,5,3.49,1,10000086 -10000000117,2012-05-17,ABIN,1349,0,13,46.44,1,10000087 -10000000118,2012-03-11,ABIN,1349,0,13,4.54,1,10000088 -10000000119,2012-01-10,ABIN,1357,0,14,3.18,1,10000089 -10000000120,2012-04-13,FP-GTC,1504,0,14,86.58,1,10000090 -10000000121,2012-07-22,FP-GTC,4943,0,13,12.85,1,10000091 -10000000122,2012-06-15,ABIN,6762,0,13,16.26,1,10000092 -10000000123,2012-06-15,Auction,9426,3,13,21.14,1,10000093 -10000000124,2012-06-01,FP-non GTC,10866,0,14,20.6,1,10000094 -10000000125,2012-05-17,Auction,11554,0,13,246,1,10000095 -10000000126,2012-04-26,FP-GTC,11848,0,14,109,1,10000096 -10000000127,2012-07-28,Auction,13836,0,13,39.41,1,10000097 -10000000128,2012-03-12,Auction,13836,0,14,16.26,1,10000098 -10000000129,2012-04-20,FP-GTC,13987,0,13,112.56,1,10000099 -10000000130,2012-03-18,Auction,15687,0,14,184.21,1,10000100 -10000000131,2012-05-17,Auction,15687,0,11,27.48,1,10000001 -10000000132,2012-06-23,FP-non GTC,16145,3,12,26.45,1,10000002 -10000000134,2012-05-22,FP-non GTC,16145,0,13,415.73,1,10000003 -10000000135,2012-01-25,ABIN,16509,0,5,56.36,1,10000004 -10000000136,2012-06-12,ABIN,16509,0,5,2.44,1,10000005 -10000000137,2012-05-17,FP-GTC,20485,0,14,269.76,1,10000006 -10000000139,2012-08-03,FP-GTC,20485,101,12,109,1,10000007 -10000000140,2012-05-17,FP-GTC,20485,101,12,101.79,1,10000008 -10000000141,2012-08-21,Auction,23446,23,14,246,1,10000009 -10000000142,2012-08-21,Auction,23446,23,14,189.23,1,10000010 -10000000143,2012-04-18,Auction,23446,23,14,15.65,1,10000011 -10000000144,2012-06-16,Auction,23446,23,14,28.23,1,10000012 -10000000145,2012-01-09,FP-GTC,24541,0,5,16.26,1,10000013 -10000000146,2012-05-03,FP-GTC,26262,0,5,122.78,1,10000014 -10000000147,2012-05-20,FP-GTC,30059,3,14,172.03,1,10000015 -10000000149,2012-03-12,Auction,31387,3,14,42.99,1,10000016 -10000000150,2012-05-19,Auction,31387,3,14,207.5,1,10000017 -10000000151,2012-04-21,FP-GTC,31519,0,14,5.91,1,10000018 -10000000152,2012-05-18,FP-GTC,31519,3,14,39.41,1,10000019 -10000000155,2012-06-16,FP-GTC,31519,0,14,16.26,1,10000020 -10000000156,2012-06-11,FP-GTC,31519,0,14,16.26,1,10000021 -10000000157,2012-03-31,FP-GTC,31519,0,14,78.48,1,10000022 -10000000158,2012-11-12,FP-GTC,31519,3,14,190.22,1,10000023 -10000000161,2012-04-06,FP-GTC,35570,100,12,2.44,1,10000024 -10000000163,2012-11-01,Auction,36250,0,5,7.12,1,10000025 -10000000165,2012-02-06,FP-non GTC,38238,0,14,36.7,1,10000026 -10000000166,2012-06-16,FP-GTC,40059,3,14,35.72,1,10000027 -10000000167,2012-09-12,FP-GTC,40059,3,14,3.49,1,10000028 -10000000168,2012-04-16,FP-GTC,41940,0,13,223.63,1,10000029 -10000000169,2012-11-01,FP-GTC,41940,0,13,265.56,1,10000030 -10000000170,2012-06-14,FP-non GTC,43479,0,13,62.02,1,10000031 -10000000172,2012-11-12,FP-GTC,44079,0,12,46.44,1,10000032 -10000000173,2012-03-22,Auction,45238,101,14,132.33,1,10000033 -10000000177,2012-05-22,Auction,45333,0,13,448.8,1,10000034 -10000000178,2012-03-10,FP-non GTC,45333,0,14,207.5,1,10000035 -10000000179,2012-05-17,FP-non GTC,45333,0,14,190.22,1,10000036 -10000000181,2012-09-01,FP-GTC,46575,0,14,16.71,1,10000037 -10000000182,2012-04-18,FP-non GTC,50508,0,13,4.13,1,10000038 -10000000183,2012-06-05,FP-non GTC,50508,0,13,1.88,1,10000039 -10000000185,2012-10-08,FP-GTC,50677,0,13,491.32,1,10000040 -10000000186,2012-09-17,FP-GTC,50677,0,5,2.44,1,10000041 -10000000187,2012-02-02,Auction,51582,0,14,56.36,1,10000042 -10000000189,2012-08-23,FP-GTC,57013,0,13,15.85,1,10000043 -10000000190,2012-08-17,FP-non GTC,57013,0,14,2.44,1,10000044 -10000000191,2012-05-05,FP-GTC,57013,0,14,7.12,1,10000045 -10000000192,2012-03-08,Auction,57784,0,14,35.72,1,10000046 -10000000194,2012-03-16,Auction,57990,3,11,9.26,1,10000047 -10000000195,2012-05-09,Auction,57990,3,14,3.18,1,10000048 -10000000196,2012-03-25,Auction,57990,3,14,638.72,1,10000049 -10000000198,2012-06-05,Auction,57990,3,14,141.7,1,10000050 -10000000199,2012-01-10,ABIN,57990,0,13,12.19,1,10000051 -10000000200,2012-06-11,Auction,57990,3,14,132.33,1,10000052 -10000000201,2012-08-23,ABIN,57990,3,5,5.48,1,10000053 -10000000203,2012-08-20,Auction,57990,3,11,1.88,1,10000054 -10000000204,2012-08-09,FP-GTC,60340,0,14,12.85,1,10000055 -10000000208,2012-06-30,FP-GTC,60340,0,14,62.02,1,10000056 -10000000209,2012-06-03,FP-GTC,60606,3,12,15.85,1,10000057 -10000000211,2012-08-14,FP-GTC,60606,3,12,9.26,1,10000058 -10000000213,2012-08-14,FP-GTC,60606,3,12,16.71,1,10000059 -10000000214,2012-05-17,FP-GTC,60606,3,12,20.6,1,10000060 -10000000217,2012-07-23,Auction,63861,3,5,1.88,1,10000061 -10000000218,2012-07-27,ABIN,63861,0,5,141.7,1,10000062 -10000000219,2012-07-29,ABIN,63861,0,5,1.88,1,10000063 -10000000220,2012-11-17,Others,63861,0,11,112.56,1,10000064 -10000000221,2012-10-29,Others,63861,0,11,94.45,1,10000065 -10000000222,2012-03-28,Auction,63861,0,14,78.48,1,10000066 -10000000223,2012-01-30,ABIN,63861,0,13,5.48,1,10000067 -10000000224,2012-01-26,Auction,63864,3,14,28.23,1,10000068 -10000000229,2012-11-21,Others,63889,0,13,3.49,1,10000069 -10000000231,2012-07-12,FP-GTC,67698,2,11,15.65,1,10000070 -10000000232,2012-06-07,FP-GTC,67698,0,11,5.48,1,10000071 -10000000233,2012-12-01,FP-GTC,67698,0,11,246,1,10000072 -10000000234,2012-12-02,FP-non GTC,73506,0,13,122.78,1,10000073 -10000000235,2012-02-01,FP-GTC,75665,0,14,223.63,1,10000074 -10000000236,2012-01-14,ABIN,75708,3,5,141.7,1,10000075 -10000000237,2012-09-16,FP-non GTC,80053,0,11,21.14,1,10000076 -10000000239,2012-08-09,FP-non GTC,80053,0,11,55.89,1,10000077 -10000000241,2012-12-26,FP-non GTC,80053,0,11,51.23,1,10000078 -10000000242,2012-12-31,Auction,80135,0,14,21.72,1,10000079 -10000000243,2012-03-22,Auction,95672,3,14,204.28,1,10000080 -10000000244,2012-12-25,Others,95672,0,11,21.14,1,10000081 -10000000245,2012-01-15,Others,100847,0,5,204.28,1,10000082 -10000000248,2012-05-27,Others,100847,0,5,122.78,1,10000083 -10000000249,2012-01-11,ABIN,139973,3,14,94.45,1,10000084 -10000000250,2012-02-04,ABIN,139973,0,11,86.58,1,10000085 -10000000251,2012-12-15,Auction,150047,3,14,56.36,1,10000086 -10000000252,2012-06-30,Auction,150047,3,14,290.72,1,10000087 -10000000253,2012-12-16,FP-GTC,155226,0,13,60.37,1,10000088 -10000000254,2012-11-11,FP-GTC,155226,0,13,112.56,1,10000089 -10000000256,2012-10-08,FP-GTC,156356,0,13,265.56,1,10000090 -10000000257,2012-04-26,FP-GTC,158798,0,11,35.72,1,10000091 -10000000258,2012-10-06,FP-non GTC,165888,0,13,92.98,1,10000092 -10000000259,2012-12-28,Auction,170083,3,11,28.23,1,10000093 -10000000260,2012-11-06,Auction,170083,3,11,27.48,1,10000094 -10000000261,2012-11-06,Auction,175750,3,14,9.26,1,10000095 -10000000262,2012-12-27,Auction,175750,3,14,3.18,1,10000096 -10000000263,2012-01-01,FP-GTC,175750,0,14,12.04,1,10000097 -10000000265,2012-08-23,Auction,175750,3,13,20.6,1,10000098 -10000000266,2012-07-10,Auction,175750,3,13,12.04,1,10000099 -10000000267,2012-08-10,Auction,175750,3,14,4.13,1,10000100 -10000000268,2012-07-19,Auction,175750,3,14,73.26,1,10000201 diff --git a/examples/test_case_data/localmeta/data/TEST_SELLER_TYPE_DIM.csv b/examples/test_case_data/localmeta/data/TEST_SELLER_TYPE_DIM.csv deleted file mode 100644 index 73abe26..0000000 --- a/examples/test_case_data/localmeta/data/TEST_SELLER_TYPE_DIM.csv +++ /dev/null @@ -1,8 +0,0 @@ -16,Consumer-Other,16,102,Consumer,2012-08-09,USER_P,,USER_A -5,Occasional,5,102,Consumer,2010-05-11,USER_H,2011-03-01 11:30:52,USER_A -15,Professional-Other,15,101,Professional,2012-08-09,USER_P,,USER_A --99,Not Applicable,-99,-99,Not Applicable,2010-05-11,USER_H,,USER_A -14,Regular,14,102,Consumer,2011-03-01,USER_H,,USER_A -12,Merchant,12,101,Professional,2011-03-01,USER_H,,USER_A -11,Large Merchant,11,101,Professional,2011-03-01,USER_H,,USER_A -13,Entrepreneur,13,101,Professional,2011-03-01,USER_H,,USER_A diff --git a/examples/test_case_data/localmeta/data/TEST_SITES.csv b/examples/test_case_data/localmeta/data/TEST_SITES.csv deleted file mode 100644 index a9d79c6..0000000 --- a/examples/test_case_data/localmeta/data/TEST_SITES.csv +++ /dev/null @@ -1,262 +0,0 @@ -248,Uruguay,S,1,0,211,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -166,Qatar,S,1,0,166,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -84,Guam,S,1,0,84,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -225,Peru,S,45,0,161,2005-04-27,2013-11-27 00:14:36,USER_X,USER_X -103,Jan Mayen,S,1,0,103,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -63,El Salvador,S,1,0,63,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -124,Macedonia,S,1,0,124,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -147,Netherlands Antilles,S,1,0,147,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -21,Barbados,S,1,0,21,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -82,Grenada,S,1,0,82,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -980,CoBrand,D,1,0,-999,2000-06-29,,USER_G,USER_X -2,Canada,S,2,1,2,2000-06-09,2013-11-27 00:14:36,USER_S,USER_X -204,Indonesia,S,24,0,96,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -246,Tuvalu,S,1,0,207,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -25,Benin,S,1,0,25,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X --6,StubHub US,S,1,1,1,2012-11-04,,USER_C4,USER_X -86,Guernsey,S,1,0,86,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -187,Sri Lanka,S,1,0,187,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -6,Algeria,S,1,0,6,2000-07-26,2013-11-27 00:14:36,USER_G,USER_X -984,Digit City Cobrand,D,1,0,-999,2000-06-29,,USER_G,USER_X -145,Nepal,S,1,0,145,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -4,Afghanistan,S,1,0,4,2000-07-26,2013-11-27 00:14:36,USER_G,USER_X -227,Iceland,S,1,0,94,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -229,Serbia,S,1,0,229,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -65,Eritrea,S,1,0,65,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -44,Chile,S,1,0,44,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X -170,Saint Helena,S,1,0,170,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -88,Guinea-Bissau,S,1,0,88,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -46,Colombia,S,1,0,46,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X --4,Gmarket,S,48,0,111,2010-05-23,,USER_X,USER_X -69,Fiji,S,1,0,69,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -48,"Congo Democratic Republic Of The",S,1,0,48,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -231,Turkey,S,1,0,204,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X -126,Malawi,S,1,0,126,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X --888,Invalid,S,-999,0,-999,2004-12-03,,USER_X,USER_X -107,Kazakhstan,S,1,0,107,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -982,Netscape Cobrand,D,1,0,-999,2000-06-29,,USER_G,USER_X -900,Gbh,S,1,0,1,2012-10-25,2013-11-27 00:14:36,USER_X,USER_X -208,New Zealand,S,33,0,149,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -71,France,S,7,1,71,2000-09-06,2013-11-27 00:14:36,USER_S,USER_X -10,Anguilla,S,1,0,10,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -172,Saint Lucia,S,1,0,172,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -153,Niue,S,1,0,153,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -67,Ethiopia,S,1,0,67,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -128,Maldives,S,1,0,128,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -233,United Arab Emirates,S,1,0,210,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X -143,Namibia,S,1,0,143,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -115,Latvia,S,1,0,115,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -206,Israel,S,26,0,100,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -216,Singapore,S,39,0,180,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -105,Jersey,S,1,0,105,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -159,Papua New Guinea,S,1,0,159,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -220,Vietnam,S,47,0,216,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -241,Tonga,S,1,0,201,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -201,Hong Kong,S,22,0,92,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -117,Lesotho,S,1,0,117,2013-02-22,2013-11-27 00:14:36,USER_X,USER_X -258,Zambia,S,1,0,223,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -237,Reunion,S,1,0,227,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -239,Tanzania,S,1,0,198,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -971,Butterfields,D,1,0,-999,2000-08-30,,USER_G,USER_X -136,Mexico,S,1,0,136,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X -50,Cook Islands,S,1,0,50,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -193,Switzerland,S,13,0,193,2002-08-30,2013-11-27 00:14:36,USER_S,USER_X -989,AutoTrader,D,1,0,-999,2000-06-29,,USER_G,USER_X -16,Austria,S,7,0,16,2002-06-11,2013-11-27 00:14:36,USER_S,USER_X -30,Botswana,S,1,0,30,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -178,Seychelles,S,1,0,178,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -152,Nigeria,S,1,0,152,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -9,Angola,S,1,0,9,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -23,Belgium (French),S,7,1,23,2001-12-27,2013-11-27 00:14:36,USER_S,USER_X -987,Card,D,1,0,-999,2000-06-29,,USER_G,USER_X -91,Honduras,S,1,0,91,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -232,Ukraine,S,1,0,209,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X -89,Guyana,S,1,0,89,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -129,Mali,S,1,0,129,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -234,Bangladesh,S,1,0,20,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X --5,Gitti gidiyor,S,49,0,204,2012-11-07,,USER_C4,USER_X -26,Bermuda,S,1,0,26,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -49,"Congo Republic Of The",S,1,0,49,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -148,New Caledonia,S,1,0,148,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -66,Estonia,S,1,0,66,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -5,Albania,S,1,0,5,2000-07-26,2013-11-27 00:14:36,USER_G,USER_X -108,Kenya,S,1,0,108,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -983,ICQ,D,1,0,-999,2000-07-07,,USER_PFI,USER_X -167,Romania,S,1,0,167,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X -169,Rwanda,S,1,0,169,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -228,Montenegro,S,1,0,228,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -106,Jordan,S,1,0,106,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -213,Purtugal,S,7,0,164,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -207,Malaysia,S,46,0,127,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -68,Falkland Islands (Islas Makvinas),S,1,0,68,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -247,Uganda,S,1,0,208,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -125,Madagascar,S,1,0,125,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -43,Chad,S,1,0,43,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -219,Thailand,S,40,0,199,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -123,Belgium (Dutch),S,7,1,23,2001-12-27,2013-11-27 00:14:36,USER_S,USER_X -15,Australia,S,5,1,15,2000-06-09,2013-11-27 00:14:36,USER_S,USER_X -144,Nauru,S,1,0,144,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -81,Greenland,S,1,0,81,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -142,Mozambique,S,1,0,142,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -104,Japan,S,6,0,104,2000-06-09,2013-11-27 00:14:36,USER_S,USER_X -102,Jamaica,S,1,0,102,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -186,Spain,S,7,0,186,2001-10-20,2013-11-27 00:14:36,USER_S,USER_X -100,Ebaymotors,S,1,0,1,2000-06-09,2013-11-27 00:14:36,USER_S,USER_X -116,"Lebanon South",S,1,0,116,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -76,Georgia,S,1,0,76,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -137,Moldova,S,1,0,137,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -79,Gibraltar,S,1,0,79,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -87,Guinea,S,1,0,87,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -996,Stamps,D,1,0,-999,2000-06-29,,USER_G,USER_X -160,Paraguay,S,1,0,160,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -240,Togo,S,1,0,200,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -203,India,S,44,0,95,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -3,英国,S,3,1,3,2000-06-09,2013-11-27 00:14:36,USER_S,USER_X -198,Denmark,S,17,0,57,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -37,Burundi,S,1,0,37,2001-09-07,2013-11-27 00:14:36,USER_DNEL,USER_X -20,Ebay Half Integration,S,1,0,1,2002-03-21,2013-11-27 00:14:36,USER_S,USER_X -55,Cyprus,S,1,0,55,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -259,Zimbabwe,S,1,0,224,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -120,Liechtenstein,S,1,0,120,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -156,Pakistan,S,1,0,156,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -205,Ireland,S,7,0,99,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -998,Computers,D,1,0,-999,2000-06-29,,USER_G,USER_X -157,Palau,S,1,0,157,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -182,Slovenia,S,1,0,182,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -35,Burkina Faso,S,1,0,35,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -199,Finland,S,7,0,70,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -197,Czech Republic,S,16,0,56,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -138,Monaco,S,1,0,138,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -985,AOL Cobrand,D,1,0,-999,2000-06-29,,USER_G,USER_X -75,Gambia,S,1,0,75,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -14,Aruba,S,1,0,14,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -218,Sweden,S,38,0,192,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -24,Belize,S,1,0,24,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -217,South Africa,S,43,0,185,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -970,Butterfields Kiss,D,1,0,-999,2000-08-30,,USER_G,USER_X -17,Azerbaijan Republic,S,1,0,17,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -993,Percelain,D,1,0,-999,2000-06-12,,USER_G,USER_X -211,Philippines,S,34,0,162,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -155,Oman,S,1,0,155,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -73,French Polynesia,S,1,0,73,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -53,"Croatia Democratic Republic Of The",S,1,0,53,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -134,Mauritius,S,1,0,134,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -113,Kyrgyzstan,S,1,0,113,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -131,Marshall Islands,S,1,0,131,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -992,Jewelry,D,1,0,-999,2000-06-29,,USER_G,USER_X -174,Saint Vincent And The Grenadines,S,1,0,174,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -22,Belarus,S,1,0,22,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -256,Western Samoa,S,1,0,220,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -52,Cote D Ivoire (Ivory Coast),S,1,0,52,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -175,San Marino,S,1,0,175,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X --3,Tradera,S,7,0,192,2009-02-11,,USER_OFF,USER_X -200,Greece,S,7,0,80,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -32,British Virgin Islands,S,1,0,32,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -171,Saint Kitts-Nevis,S,1,0,171,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -176,Saudi Arabia,S,1,0,176,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X -19,Bahrain,S,1,0,19,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -101,Italy,S,7,1,101,2000-11-03,2013-11-27 00:14:36,USER_S,USER_X -236,Micronesia,S,1,0,226,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -64,Equatorial Guinea,S,1,0,64,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -209,Norway,S,32,0,154,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -195,Tahiti,S,1,0,195,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -221,Us1,S,1,0,1,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -146,Netherlands,S,7,1,146,2001-07-12,2013-11-27 00:14:36,USER_S,USER_X -214,Puerto Rico,S,1,0,165,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -29,Bosnia And Herzegovina,S,1,0,29,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -215,Russia,S,84,0,168,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -90,Haiti,S,1,0,90,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -12,Argentina,S,1,0,12,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X -158,Panama,S,1,0,158,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -139,Mongolia,S,1,0,139,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -41,Cayman Islands,S,1,0,41,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -151,Niger,S,1,0,151,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -11,Antigua And Barbuda,S,1,0,11,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X --1,Korea Auction.co.kr,S,48,0,111,2009-02-11,,USER_OFF,USER_X -112,Kuwait,S,1,0,112,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -59,Dominica,S,1,0,59,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -179,Sierra Leone,S,1,0,179,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -132,Martinique,S,1,0,132,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -972,Hoianhoard,D,1,0,-999,2000-07-26,,USER_G,USER_X -257,Yemen,S,1,0,221,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -235,Macau,S,1,0,123,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -8,Andorra,S,1,0,8,2000-07-26,2013-11-27 00:14:36,USER_G,USER_X -191,Swaziland,S,1,0,191,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -141,Morocco,S,1,0,141,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -177,Senegal,S,1,0,177,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -184,Somalia,S,1,0,184,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -47,Comoros,S,1,0,47,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -212,Poland,S,35,0,163,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -994,Sports,D,1,0,-999,2000-07-07,,USER_PFI,USER_X -34,Bulgaria,S,1,0,34,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X --2,Bazee,S,44,0,95,2009-02-11,,USER_OFF,USER_X -224,Japan Row,S,6,0,104,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X --999,Unknown,S,-999,0,-999,2000-06-29,,USER_G,USER_X -986,GO Cobrand,D,1,0,-999,2000-06-29,,USER_G,USER_X -133,Mauritania,S,1,0,133,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -196,Taiwan,S,41,0,196,2002-03-08,2013-11-27 00:14:36,USER_S,USER_X -33,Brunei Darussalam,S,1,0,33,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X --7,StubHub UK,S,3,1,3,2012-11-08,,USER_C4,USER_X -140,Montserrat,S,1,0,140,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -990,Toys,D,1,0,-999,2000-06-29,,USER_G,USER_X -150,Nicaragua,S,1,0,150,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -244,Turkmenistan,S,1,0,205,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -78,Ghana,S,1,0,78,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -973,Developer.ebay.com,D,1,0,-999,2000-10-06,2000-10-06 00:00:00,USER_G,USER_G -202,Hungary,S,23,0,93,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -242,Trinidad And Tobago,S,1,0,202,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -981,Compuserve Cobrand,D,1,0,-999,2000-06-29,,USER_G,USER_X -60,Dominican Republic,S,1,0,60,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -13,Armenia,S,1,0,13,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -991,Dolls,D,1,0,-999,2000-06-29,,USER_G,USER_X -118,Liberia,S,1,0,118,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -77,Germany,S,7,1,77,2000-06-09,2013-11-27 00:14:36,USER_S,USER_X -51,Costa Rica,S,1,0,51,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -1,Usa,S,1,1,1,2000-06-09,2013-11-27 00:14:36,USER_S,USER_X -39,Cameroon,S,1,0,39,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -997,Great Collections,D,1,0,-999,2000-06-29,,USER_G,USER_X -181,Slovak Republic,S,1,0,181,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X -189,Suriname,S,1,0,189,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -74,Gabon Republic,S,1,0,74,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -31,Brazil,S,1,0,31,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X -38,Cambodia,S,1,0,38,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -245,Turks And Caicos Islands,S,1,0,206,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -28,Bolivia,S,1,0,28,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -210,Canada (French),S,2,0,2,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -238,Tajikistan,S,1,0,197,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -58,Djibouti,S,1,0,58,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -135,Mayotte,S,1,0,135,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -995,Coins,D,1,0,-999,2000-06-29,,USER_G,USER_X -114,Laos,S,1,0,114,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -173,Saint Pierre And Miquelon,S,1,0,173,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -83,Guadeloupe,S,1,0,83,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -62,Egypt,S,1,0,62,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -122,Luxembourg,S,1,0,122,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -72,French Guiana,S,1,0,72,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -223,China,S,14,0,45,2003-10-04,2013-11-27 00:14:36,USER_X,USER_X -163,Unknown: Added by DW(0),S,-999,0,-999,2001-09-07,,USER_DNEL,USER_X -40,Cape Verde Islands,S,1,0,40,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -222,Yugoslavia,S,1,0,222,2013-03-12,2013-11-27 00:14:36,USER_X,USER_X -61,Ecuador,S,1,0,61,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -243,Tunisia,S,1,0,203,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -183,Solomon Islands,S,1,0,183,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -226,South Korea,S,1,0,111,2012-04-27,2013-11-27 00:14:36,USER_X,USER_X -7,American Samoa,S,1,0,7,2000-07-26,2013-11-27 00:14:36,USER_G,USER_X -121,Lithuania,S,1,0,121,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -18,Bahamas,S,1,0,18,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -0,Ebay,S,1,0,1,2000-06-09,2013-11-27 00:14:36,USER_S,USER_X --8,Wholesale Deals -- US,S,1,1,1,2013-02-19,,USER_YAJ,USER_X -250,Vanuatu,S,1,0,213,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -42,Central African Republic,S,1,0,42,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -252,Venezuela,S,1,0,215,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -109,Kiribati,S,1,0,109,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -130,Malta,S,1,0,130,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -251,Vatican City State,S,1,0,214,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -253,Virgin Islands (U.S.),S,1,0,217,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -500,Unknown: Added by DW(1),S,-999,0,-999,2000-07-26,,USER_G,USER_X -255,Western Sahara,S,1,0,219,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -190,Svalbard,S,1,0,190,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -85,Guatemala,S,1,0,85,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -254,Wallis And Futuna,S,1,0,218,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X -27,Bhutan,S,1,0,27,2013-01-29,2013-11-27 00:14:36,USER_X,USER_X -249,Uzbekistan,S,1,0,212,2013-01-30,2013-11-27 00:14:36,USER_X,USER_X diff --git a/job/src/test/java/com/kylinolap/job/DeployUtil.java b/job/src/test/java/com/kylinolap/job/DeployUtil.java index 8463d9e..65a4d9a 100644 --- a/job/src/test/java/com/kylinolap/job/DeployUtil.java +++ b/job/src/test/java/com/kylinolap/job/DeployUtil.java @@ -194,8 +194,8 @@ private static String generateLoadDataHql(String tableName) { private static String generateCreateTableHql(TableDesc tableDesc) { StringBuilder ddl = new StringBuilder(); - ddl.append("DROP TABLE IF EXISTS " + tableDesc.getName() + ";\n"); - ddl.append("CREATE TABLE " + tableDesc.getName() + "\n"); + ddl.append("DROP TABLE IF EXISTS " + tableDesc.getIdentity() + ";\n"); + ddl.append("CREATE TABLE " + tableDesc.getIdentity() + "\n"); ddl.append("(" + "\n"); for (int i = 0; i < tableDesc.getColumns().length; i++) { diff --git a/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java b/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java index 53702ac..2e67069 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java +++ b/metadata/src/main/java/com/kylinolap/metadata/MetadataManager.java @@ -167,12 +167,12 @@ public TableDesc getTableDesc(String tableName) { } public void createSourceTable(TableDesc srcTable) throws IOException { - if (srcTable.getUuid() == null || srcTable.getName() == null) { + if (srcTable.getUuid() == null || srcTable.getIdentity() == null) { throw new IllegalArgumentException(); } String tableIdentity = TableDesc.getTableIdentity(srcTable); if (srcTableMap.containsKey(tableIdentity)) { - throw new IllegalArgumentException("SourceTable '" + srcTable.getName() + "' already exists"); + throw new IllegalArgumentException("SourceTable '" + srcTable.getIdentity() + "' already exists"); } String path = srcTable.getResourcePath(); diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/ColumnDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/ColumnDesc.java index 76393d3..9f72e2f 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/ColumnDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/ColumnDesc.java @@ -119,7 +119,7 @@ public void init(TableDesc table) { @Override public String toString() { - return "ColumnDesc [name=" + name + ",table=" + table.getName() + "]"; + return "ColumnDesc [name=" + name + ",table=" + table.getIdentity() + "]"; } } diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java index af4909d..2342620 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/DataModelDesc.java @@ -108,7 +108,7 @@ private void initJoinColumns(Map tables) { for (int i = 0; i < pks.length; i++) { ColumnDesc col = dimTable.findColumnByName(pks[i]); if (col == null) { - addError("Can't find column " + pks[i] + " in table " + dimTable.getName()); + addError("Can't find column " + pks[i] + " in table " + dimTable.getIdentity()); } TblColRef colRef = new TblColRef(col); pks[i] = colRef.getName(); diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java index f1145bf..45bb2b2 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java @@ -60,6 +60,10 @@ public String getResourcePath() { return ResourceStore.TABLE_RESOURCE_ROOT + "/" + getTableIdentity(this) + ".json"; } + public String getIdentity() { + return TableDesc.getTableIdentity(this); + } + // ============================================================================ public String getName() { diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/realization/TblColRef.java b/metadata/src/main/java/com/kylinolap/metadata/model/realization/TblColRef.java index feb0ce9..27dac98 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/realization/TblColRef.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/realization/TblColRef.java @@ -84,7 +84,7 @@ public String getTable() { if (column.getTable() == null) { return null; } - return column.getTable().getName(); + return column.getTable().getIdentity(); } public String getDatatype() { @@ -113,7 +113,7 @@ public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + column.getTable().getName().hashCode(); + result = prime * result + column.getTable().getIdentity().hashCode(); result = prime * result + column.getName().hashCode(); return result; } @@ -127,7 +127,7 @@ public boolean equals(Object obj) { if (getClass() != obj.getClass()) return false; TblColRef other = (TblColRef) obj; - if (!StringUtils.equals(column.getTable().getName(), other.column.getTable().getName())) + if (!StringUtils.equals(TableDesc.getTableIdentity(column.getTable()), TableDesc.getTableIdentity(other.column.getTable()))) return false; if (!StringUtils.equals(column.getName(), other.column.getName())) return false; @@ -136,6 +136,6 @@ public boolean equals(Object obj) { @Override public String toString() { - return (column.getTable() == null ? null : column.getTable().getName()) + "." + column.getName(); + return (column.getTable() == null ? null : column.getTable().getIdentity()) + "." + column.getName(); } } diff --git a/metadata/src/main/java/com/kylinolap/metadata/tool/HiveSourceTableLoader.java b/metadata/src/main/java/com/kylinolap/metadata/tool/HiveSourceTableLoader.java index 641f30c..d135729 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/tool/HiveSourceTableLoader.java +++ b/metadata/src/main/java/com/kylinolap/metadata/tool/HiveSourceTableLoader.java @@ -128,9 +128,9 @@ List loadedTables = Lists.newArrayList(); for (TableDesc table : tableDescList) { - File file = new File(tableDescDir, table.getName().toUpperCase() + "." + OUTPUT_SURFIX); + File file = new File(tableDescDir, table.getIdentity().toUpperCase() + "." + OUTPUT_SURFIX); JsonUtil.writeValueIndent(new FileOutputStream(file), table); - loadedTables.add(table.getDatabase() + "." + table.getName()); + loadedTables.add(table.getIdentity()); } for (Map tableAttrs : tableAttrsList) { diff --git a/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java b/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java index 149a618..63be707 100644 --- a/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java +++ b/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java @@ -52,7 +52,7 @@ public void testListAllTables() throws Exception { public void testFindTableByName() throws Exception { TableDesc table = MetadataManager.getInstance(this.getTestConfig()).getTableDesc("TEST_CAL_DT"); Assert.assertNotNull(table); - Assert.assertEquals("TEST_CAL_DT", table.getName()); + Assert.assertEquals("TEST_CAL_DT", table.getIdentity()); } @Test diff --git a/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java b/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java index f8fb90e..8ccc4dc 100644 --- a/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java +++ b/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java @@ -68,7 +68,7 @@ public OLAPSchema(String project, String schemaName) { List projectTables = getProjectManager().listExposedTables(projectName); for (TableDesc tableDesc : projectTables) { - final String tableName = tableDesc.getName(); + final String tableName = tableDesc.getIdentity(); final OLAPTable table = new OLAPTable(this, tableDesc); olapTables.put(tableName, table); // logger.debug("Project " + projectName + " exposes table " + tableName); diff --git a/query/src/main/java/com/kylinolap/query/schema/OLAPTable.java b/query/src/main/java/com/kylinolap/query/schema/OLAPTable.java index 83a709f..d01bb9a 100644 --- a/query/src/main/java/com/kylinolap/query/schema/OLAPTable.java +++ b/query/src/main/java/com/kylinolap/query/schema/OLAPTable.java @@ -106,7 +106,7 @@ public TableDesc getSourceTable() { } public String getTableName() { - return this.sourceTable.getName(); + return this.sourceTable.getIdentity(); } public List getExposedColumns() { @@ -162,9 +162,9 @@ else if (precision >= 0) private List listSourceColumns() { ProjectManager projectMgr = olapSchema.getProjectManager(); - List exposedColumns = projectMgr.listExposedColumns(olapSchema.getProjectName(), sourceTable.getName()); + List exposedColumns = projectMgr.listExposedColumns(olapSchema.getProjectName(), sourceTable.getIdentity()); - List countMeasures = projectMgr.listEffectiveRewriteMeasures(olapSchema.getProjectName(), sourceTable.getName()); + List countMeasures = projectMgr.listEffectiveRewriteMeasures(olapSchema.getProjectName(), sourceTable.getIdentity()); HashSet metFields = new HashSet(); for (MeasureDesc m : countMeasures) { FunctionDesc func = m.getFunction(); diff --git a/query/src/test/java/com/kylinolap/query/test/H2Database.java b/query/src/test/java/com/kylinolap/query/test/H2Database.java index ec37b70..c429d08 100644 --- a/query/src/test/java/com/kylinolap/query/test/H2Database.java +++ b/query/src/test/java/com/kylinolap/query/test/H2Database.java @@ -71,7 +71,7 @@ private void loadH2Table(String tableName, String joinType) throws SQLException try { tempFile = File.createTempFile("tmp_h2", ".csv"); FileOutputStream tempFileStream = new FileOutputStream(tempFile); - String normalPath = "/data/" + tableDesc.getName() + ".csv"; + String normalPath = "/data/" + tableDesc.getIdentity() + ".csv"; // If it's the fact table, there will be a facttable.csv.inner or // facttable.csv.left in hbase @@ -80,7 +80,7 @@ private void loadH2Table(String tableName, String joinType) throws SQLException if (csvStream == null) { csvStream = metaMgr.getStore().getResource(normalPath); } else { - logger.info("H2 decides to load " + (normalPath + fileNameSuffix) + " for table " + tableDesc.getName()); + logger.info("H2 decides to load " + (normalPath + fileNameSuffix) + " for table " + tableDesc.getIdentity()); } org.apache.commons.io.IOUtils.copy(csvStream, tempFileStream); @@ -105,7 +105,7 @@ private String generateCreateH2TableSql(TableDesc tableDesc, String csvFilePath) StringBuilder ddl = new StringBuilder(); StringBuilder csvColumns = new StringBuilder(); - ddl.append("CREATE TABLE " + tableDesc.getName() + "\n"); + ddl.append("CREATE TABLE " + tableDesc.getIdentity() + "\n"); ddl.append("(" + "\n"); for (int i = 0; i < tableDesc.getColumns().length; i++) { diff --git a/server/src/main/java/com/kylinolap/rest/controller/TableController.java b/server/src/main/java/com/kylinolap/rest/controller/TableController.java index 03c8ca4..69e0848 100644 --- a/server/src/main/java/com/kylinolap/rest/controller/TableController.java +++ b/server/src/main/java/com/kylinolap/rest/controller/TableController.java @@ -156,7 +156,7 @@ public CardinalityRequest generateCardinality(@PathVariable String tableNames, @ Iterator it = tables.iterator(); while (it.hasNext()) { TableDesc table = it.next(); - Map exd = cubeMgmtService.getMetadataManager().getTableDescExd(table.getName()); + Map exd = cubeMgmtService.getMetadataManager().getTableDescExd(table.getIdentity()); if (exd == null) { descs.add(table); } else { From 6587fbbd64c64474485713e91caf71c12dde73ec Mon Sep 17 00:00:00 2001 From: shaofengshi Date: Thu, 4 Dec 2014 11:21:38 +0800 Subject: [PATCH 44/65] Add parse for dbname in DimensionDesc --- .../java/com/kylinolap/cube/model/CubeDesc.java | 29 ++++-- .../com/kylinolap/cube/model/DimensionDesc.java | 101 +++++++++++++++------ .../cube_desc/test_kylin_cube_with_slr_desc.json | 2 +- 3 files changed, 97 insertions(+), 35 deletions(-) diff --git a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java index 688c605..511fa51 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java @@ -25,6 +25,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -467,23 +468,39 @@ public void init(KylinConfig config, Map tables) { this.addError("No data model found with name '" + modelName + "'."); } - Map> columnTableMap = new HashMap>(); + //key: column name; value: list of tables; + Map> columnTableMap = new HashMap>(); String colName; for(TableDesc table : tables.values()) { for(ColumnDesc col : table.getColumns()) { colName = col.getName(); - List tableNames = columnTableMap.get(colName); + List tableNames = columnTableMap.get(colName); if(tableNames == null) { - tableNames = new ArrayList(3); + tableNames = new LinkedList(); columnTableMap.put(colName, tableNames); } - tableNames.add(table.getName()); + tableNames.add(table); } } + + + // key: table name; value: list of databases; + Map> tableDatabaseMap = new HashMap>(); + + String tableName; + for(TableDesc table : tables.values()) { + tableName = table.getName(); + List dbNames = tableDatabaseMap.get(tableName); + if(dbNames == null) { + dbNames = new LinkedList(); + tableDatabaseMap.put(tableName, dbNames); + } + dbNames.add(table.getDatabase()); + } for (DimensionDesc dim : dimensions) { - dim.init(this, tables, columnTableMap); + dim.init(this, tables, columnTableMap, tableDatabaseMap); } sortDimAndMeasure(); @@ -511,7 +528,7 @@ public void init(KylinConfig config, Map tables) { private void initDimensionColumns(Map tables) { // fill back ColRefDesc for (DimensionDesc dim : dimensions) { - TableDesc dimTable = tables.get(dim.getTable()); + TableDesc dimTable = dim.getTableDesc(); JoinDesc join = dim.getJoin(); ArrayList dimColList = new ArrayList(); diff --git a/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java b/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java index 47d8361..1f24617 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java @@ -53,6 +53,8 @@ @JsonProperty("derived") private String[] derived; + private TableDesc tableDesc; + // computed private TblColRef[] columnRefs; private TblColRef[] derivedColRefs; @@ -68,6 +70,10 @@ public boolean isHierarchyColumn(TblColRef col) { return false; } + /** + * @deprecated use getTableDesc() to get accurate table info + * @return + */ public String getTable() { return table.toUpperCase(); } @@ -132,6 +138,10 @@ public void setDerivedColRefs(TblColRef[] derivedColRefs) { this.derivedColRefs = derivedColRefs; } + public TableDesc getTableDesc() { + return this.tableDesc; + } + @Override public boolean equals(Object o) { if (this == o) @@ -161,7 +171,54 @@ public String toString() { return "DimensionDesc [name=" + name + ", join=" + join + ", hierarchy=" + Arrays.toString(hierarchy) + ", table=" + table + ", column=" + Arrays.toString(column) + ", derived=" + Arrays.toString(derived) + "]"; } - public void init(CubeDesc cubeDesc, Map tables, Map> columnTableMap) { + /** + * parse column to get db name and table name + * @return an array carries db name + table name + * @throws IllegalStateException if the column name or name is incorrect or inaccurate + */ + private String[] parseTableDBName(String thisColumn, Map> columnTableMap, Map> tableDatabaseMap) { + String tableName = null, dbName = null; + String[] splits = StringSplitter.split(thisColumn, "."); + int length = splits.length; + if (length > 3 || length == 0) { + throw new IllegalStateException("The column name should be {db-name}.{table-name}.{column-name} (the {db-name} and {table-name} is optional); The given column value is: " + thisColumn); + } else if (length == 3) { + dbName = splits[0]; + tableName = splits[1]; + } else if (length == 2) { + tableName = splits[0]; + } + + if (tableName == null) { + List tables = columnTableMap.get(thisColumn); + if (tables == null) { + throw new IllegalStateException("The column '" + thisColumn + "' isn't appeared on any table."); + } else if (tables.size() > 1) { + throw new IllegalStateException("The column '" + thisColumn + "' is ambiguous; it appeared in more than one tables, please specify table name together with the column name."); + } else { + tableName = tables.get(0).getName(); + dbName = tables.get(0).getDatabase(); + } + } else if (dbName == null) { + List dbs = tableDatabaseMap.get(tableName); + if (dbs == null) { + throw new IllegalStateException("The table '" + tableName + "' isn't appeared on any database."); + } else if (dbs.size() > 1) { + throw new IllegalStateException("The table '" + tableName + "' is ambiguous; it appeared in more than one databases, please specify db name together with the table name."); + } else { + dbName = dbs.get(0); + } + } else { + List dbs = tableDatabaseMap.get(tableName); + if (!dbs.contains(dbName)) { + throw new IllegalStateException("The database '" + dbName + "' isn't appeared."); + } + } + + return new String[] { dbName, tableName }; + } + + public void init(CubeDesc cubeDesc, Map tables, Map> columnTableMap, Map> tableDatabaseMap) { if (name != null) name = name.toUpperCase(); @@ -170,36 +227,24 @@ public void init(CubeDesc cubeDesc, Map tables, Map 1) { - String thisTable = splits[splits.length - 2].toUpperCase(); - if (table == null) { - table = thisTable; - } else if (thisTable != null && !table.equalsIgnoreCase(thisTable)) { - throw new IllegalStateException("One dimension can only refer to the columns on the same table: '" + table + "' and '" + thisTable + "'."); - } - - if (database == null && splits.length > 2) { - database = splits[splits.length - 3].toUpperCase(); - } - - //this.column[i] = splits[splits.length - 1].toUpperCase(); - } else { - // if no table specified, seek the table among all tables - List tableNames = columnTableMap.get(thisColumn); - if (tableNames != null && tableNames.size() == 1) { - table = tableNames.get(0); - } else { - if (tableNames == null) - throw new IllegalStateException("The column '" + thisColumn + "' doesn't belong to any table."); - if (tableNames.size() > 1) - throw new IllegalStateException("The column '" + thisColumn + "' is ambiguous; the name appeared in more than one tables, please specify table name together with the column name."); - } + String thisColumn = this.column[i].toUpperCase(); + String[] dbTableNames = parseTableDBName(thisColumn, columnTableMap, tableDatabaseMap); + + if (database == null) { + database = dbTableNames[0]; + } else if (!database.equals(dbTableNames[0])) { + throw new IllegalStateException("One dimension can only refer to the tables in the same db: '" + database + "' and '" + dbTableNames[0] + "'."); + } + + if (table == null) { + table = dbTableNames[1]; + } else if (!table.equalsIgnoreCase(dbTableNames[1])) { + throw new IllegalStateException("One dimension can only refer to the columns on the same table: '" + table + "' and '" + dbTableNames[1] + "'."); } + } - TableDesc tableDesc = tables.get(table); + tableDesc = tables.get(database + "." + table); if (tableDesc == null) throw new IllegalStateException("Can't find table " + table + " on dimension " + name); diff --git a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json index 148c315..3d6a6b2 100644 --- a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json +++ b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json @@ -31,7 +31,7 @@ }, { "name": "seller_type_cd", - "column": ["test_seller_type_dim.slr_segment_cd"], + "column": ["test_seller_type_dim.seller_type_cd"], "derived": ["seller_type_desc"] }, { From 0346b6cdde04233d81a6ec190c3fb6a8eee51d84 Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Thu, 4 Dec 2014 17:06:12 +0800 Subject: [PATCH 45/65] refactor CliCommandExecutor --- .../java/com/kylinolap/common/util/CliCommandExecutor.java | 13 +++++++------ .../src/main/java/com/kylinolap/dict/lookup/HiveTable.java | 5 +++-- .../java/com/kylinolap/job/cmd/JavaHadoopCmdOutput.java | 5 ++--- job/src/main/java/com/kylinolap/job/cmd/ShellCmd.java | 5 ++--- .../com/kylinolap/metadata/tool/HiveSourceTableLoader.java | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/common/src/main/java/com/kylinolap/common/util/CliCommandExecutor.java b/common/src/main/java/com/kylinolap/common/util/CliCommandExecutor.java index 3f4ab7b..31f8d7e 100644 --- a/common/src/main/java/com/kylinolap/common/util/CliCommandExecutor.java +++ b/common/src/main/java/com/kylinolap/common/util/CliCommandExecutor.java @@ -73,17 +73,18 @@ private void copyRemote(String localFile, String destDir) throws IOException { } } - public String execute(String command) throws IOException { + public Pair execute(String command) throws IOException { Pair r; - if (remoteHost == null) + if (remoteHost == null) { r = runNativeCommand(command); - else + } else { r = runRemoteCommand(command); + } - if (r.getFirst() != 0) + if (r.getFirst() != 0) { throw new IOException("OS command error exit with " + r.getFirst() + " -- " + command + "\n" + r.getSecond()); - - return r.getSecond(); + } + return r; } private Pair runRemoteCommand(String command) throws IOException { diff --git a/dictionary/src/main/java/com/kylinolap/dict/lookup/HiveTable.java b/dictionary/src/main/java/com/kylinolap/dict/lookup/HiveTable.java index 25d2a87..986a1d6 100644 --- a/dictionary/src/main/java/com/kylinolap/dict/lookup/HiveTable.java +++ b/dictionary/src/main/java/com/kylinolap/dict/lookup/HiveTable.java @@ -91,12 +91,13 @@ private String computeHDFSLocation(boolean needFilePath) throws IOException { String cmd = "hive -e \"describe extended " + hiveTable + ";\""; CliCommandExecutor exec = KylinConfig.getInstanceFromEnv().getCliCommandExecutor(); - String output = exec.execute(cmd); + String output = exec.execute(cmd).getSecond(); Pattern ptn = Pattern.compile("location:(.*?),"); Matcher m = ptn.matcher(output); - if (m.find() == false) + if (m.find() == false) { throw new IOException("Failed to find HDFS location for hive table " + hiveTable + " from output -- " + output); + } String hdfsDir = m.group(1); diff --git a/job/src/main/java/com/kylinolap/job/cmd/JavaHadoopCmdOutput.java b/job/src/main/java/com/kylinolap/job/cmd/JavaHadoopCmdOutput.java index c3f9236..a27d94b 100644 --- a/job/src/main/java/com/kylinolap/job/cmd/JavaHadoopCmdOutput.java +++ b/job/src/main/java/com/kylinolap/job/cmd/JavaHadoopCmdOutput.java @@ -16,6 +16,7 @@ package com.kylinolap.job.cmd; +import java.io.IOException; import java.util.Map; import org.apache.hadoop.mapreduce.Counters; @@ -124,9 +125,6 @@ private void init() { status = JobStepStatusEnum.NEW; } - /** - * @param jobStatus - */ private void updateHadoopJobInfo() { try { Map jobInfo = job.getInfo(); @@ -185,4 +183,5 @@ private void updateJobCounter() { output.append(e.getLocalizedMessage()); } } + } diff --git a/job/src/main/java/com/kylinolap/job/cmd/ShellCmd.java b/job/src/main/java/com/kylinolap/job/cmd/ShellCmd.java index 811c06f..aab57ee 100644 --- a/job/src/main/java/com/kylinolap/job/cmd/ShellCmd.java +++ b/job/src/main/java/com/kylinolap/job/cmd/ShellCmd.java @@ -90,9 +90,8 @@ public Integer call() throws JobException, IOException { protected int executeCommand(String command) throws JobException, IOException { output.reset(); - cliCommandExecutor.execute(command); - //if cliCommandExecutor doesn't throw IOException, it means command is executed correctly - return 0; + output.setStatus(JobStepStatusEnum.RUNNING); + return cliCommandExecutor.execute(command).getFirst(); } @Override diff --git a/metadata/src/main/java/com/kylinolap/metadata/tool/HiveSourceTableLoader.java b/metadata/src/main/java/com/kylinolap/metadata/tool/HiveSourceTableLoader.java index d135729..adcbee1 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/tool/HiveSourceTableLoader.java +++ b/metadata/src/main/java/com/kylinolap/metadata/tool/HiveSourceTableLoader.java @@ -100,7 +100,7 @@ cmd.append("\""); CliCommandExecutor cmdExec = config.getCliCommandExecutor(); - String output = cmdExec.execute(cmd.toString()); + String output = cmdExec.execute(cmd.toString()).getSecond(); return extractTableDescFromHiveOutput(database, output, metaTmpDir); } From dd91f7a2805bd2831dd914eb3816a20bed0ae862 Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Thu, 4 Dec 2014 17:34:39 +0800 Subject: [PATCH 46/65] fix JavaHadoopCmdOutput cannot parse output issue --- .../kylinolap/common/util/CliCommandExecutor.java | 36 +++++++++++++--------- .../java/com/kylinolap/common/util/Logger.java | 25 +++++++++++++++ .../java/com/kylinolap/common/util/SSHClient.java | 20 +++++------- .../java/com/kylinolap/common/util/SSHLogger.java | 25 --------------- .../com/kylinolap/common/util/SSHClientTest.java | 4 +-- .../com/kylinolap/job/cmd/BaseCommandOutput.java | 12 ++++++++ .../java/com/kylinolap/job/cmd/ICommandOutput.java | 3 +- .../com/kylinolap/job/cmd/JavaHadoopCmdOutput.java | 2 +- .../main/java/com/kylinolap/job/cmd/ShellCmd.java | 2 +- .../java/com/kylinolap/job/cmd/ShellCmdOutput.java | 2 +- 10 files changed, 74 insertions(+), 57 deletions(-) create mode 100644 common/src/main/java/com/kylinolap/common/util/Logger.java delete mode 100644 common/src/main/java/com/kylinolap/common/util/SSHLogger.java create mode 100644 job/src/main/java/com/kylinolap/job/cmd/BaseCommandOutput.java diff --git a/common/src/main/java/com/kylinolap/common/util/CliCommandExecutor.java b/common/src/main/java/com/kylinolap/common/util/CliCommandExecutor.java index 31f8d7e..7b0b2f2 100644 --- a/common/src/main/java/com/kylinolap/common/util/CliCommandExecutor.java +++ b/common/src/main/java/com/kylinolap/common/util/CliCommandExecutor.java @@ -16,9 +16,7 @@ package com.kylinolap.common.util; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; +import java.io.*; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; @@ -63,7 +61,7 @@ private void copyNative(String localFile, String destDir) throws IOException { } private void copyRemote(String localFile, String destDir) throws IOException { - SSHClient ssh = new SSHClient(remoteHost, remoteUser, remotePwd, null); + SSHClient ssh = new SSHClient(remoteHost, remoteUser, remotePwd); try { ssh.scpFileToRemote(localFile, destDir); } catch (IOException e) { @@ -74,11 +72,15 @@ private void copyRemote(String localFile, String destDir) throws IOException { } public Pair execute(String command) throws IOException { + return execute(command, null); + } + + public Pair execute(String command, Logger logAppender) throws IOException { Pair r; if (remoteHost == null) { - r = runNativeCommand(command); + r = runNativeCommand(command, logAppender); } else { - r = runRemoteCommand(command); + r = runRemoteCommand(command, logAppender); } if (r.getFirst() != 0) { @@ -87,12 +89,12 @@ private void copyRemote(String localFile, String destDir) throws IOException { return r; } - private Pair runRemoteCommand(String command) throws IOException { - SSHClient ssh = new SSHClient(remoteHost, remoteUser, remotePwd, null); + private Pair runRemoteCommand(String command, Logger logAppender) throws IOException { + SSHClient ssh = new SSHClient(remoteHost, remoteUser, remotePwd); SSHClientOutput sshOutput; try { - sshOutput = ssh.execCommand(command, remoteTimeoutSeconds); + sshOutput = ssh.execCommand(command, remoteTimeoutSeconds, logAppender); int exitCode = sshOutput.getExitCode(); String output = sshOutput.getText(); return new Pair(exitCode, output); @@ -103,7 +105,7 @@ private void copyRemote(String localFile, String destDir) throws IOException { } } - private Pair runNativeCommand(String command) throws IOException { + private Pair runNativeCommand(String command, Logger logAppender) throws IOException { String[] cmd = new String[3]; String osName = System.getProperty("os.name"); if (osName.startsWith("Windows")) { @@ -119,13 +121,19 @@ private void copyRemote(String localFile, String destDir) throws IOException { builder.redirectErrorStream(true); Process proc = builder.start(); - ByteArrayOutputStream buf = new ByteArrayOutputStream(); - IOUtils.copy(proc.getInputStream(), buf); - String output = buf.toString("UTF-8"); + BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream())); + String line; + StringBuilder result = new StringBuilder(); + while ((line = reader.readLine()) != null) { + result.append("line").append('\n'); + if (logAppender != null) { + logAppender.log(line); + } + } try { int exitCode = proc.waitFor(); - return new Pair(exitCode, output); + return new Pair(exitCode, result.toString()); } catch (InterruptedException e) { throw new IOException(e); } diff --git a/common/src/main/java/com/kylinolap/common/util/Logger.java b/common/src/main/java/com/kylinolap/common/util/Logger.java new file mode 100644 index 0000000..29033cc --- /dev/null +++ b/common/src/main/java/com/kylinolap/common/util/Logger.java @@ -0,0 +1,25 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.common.util; + +/** + * @author ysong1 + * + */ +public interface Logger { + public void log(String message); +} diff --git a/common/src/main/java/com/kylinolap/common/util/SSHClient.java b/common/src/main/java/com/kylinolap/common/util/SSHClient.java index cea09a7..144adff 100644 --- a/common/src/main/java/com/kylinolap/common/util/SSHClient.java +++ b/common/src/main/java/com/kylinolap/common/util/SSHClient.java @@ -25,7 +25,6 @@ import java.io.InputStream; import java.io.OutputStream; -import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.jcraft.jsch.Channel; @@ -35,16 +34,14 @@ import com.jcraft.jsch.Session; public class SSHClient { - protected static final Logger logger = LoggerFactory.getLogger(SSHClient.class); + protected static final org.slf4j.Logger logger = LoggerFactory.getLogger(SSHClient.class); private String hostname; private String username; private String password; private String identityPath; - private SSHLogger sshLogger; - - public SSHClient(String hostname, String username, String password, SSHLogger sshLogger) { + public SSHClient(String hostname, String username, String password) { this.hostname = hostname; this.username = username; if (new File(password).exists()) { @@ -54,7 +51,6 @@ public SSHClient(String hostname, String username, String password, SSHLogger ss this.password = password; this.identityPath = null; } - this.sshLogger = sshLogger; } public void scpFileToRemote(String localFile, String remoteTargetDirectory) throws Exception { @@ -147,10 +143,10 @@ public void scpFileToRemote(String localFile, String remoteTargetDirectory) thro } public SSHClientOutput execCommand(String command) throws Exception { - return execCommand(command, 7200); + return execCommand(command, 7200, null); } - public SSHClientOutput execCommand(String command, int timeoutSeconds) throws Exception { + public SSHClientOutput execCommand(String command, int timeoutSeconds, Logger logAppender) throws Exception { try { System.out.println("[" + username + "@" + hostname + "] Execute command: " + command); @@ -185,8 +181,8 @@ public SSHClientOutput execCommand(String command, int timeoutSeconds) throws Ex String line = new String(tmp, 0, i); text.append(line); - if (this.sshLogger != null) { - this.sshLogger.log(line); + if (logAppender != null) { + logAppender.log(line); } } while (err.available() > 0) { @@ -196,8 +192,8 @@ public SSHClientOutput execCommand(String command, int timeoutSeconds) throws Ex String line = new String(tmp, 0, i); text.append(line); - if (this.sshLogger != null) { - this.sshLogger.log(line); + if (logAppender != null) { + logAppender.log(line); } } if (channel.isClosed()) { diff --git a/common/src/main/java/com/kylinolap/common/util/SSHLogger.java b/common/src/main/java/com/kylinolap/common/util/SSHLogger.java deleted file mode 100644 index ebf025c..0000000 --- a/common/src/main/java/com/kylinolap/common/util/SSHLogger.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.common.util; - -/** - * @author ysong1 - * - */ -public interface SSHLogger { - public void log(String message); -} diff --git a/common/src/test/java/com/kylinolap/common/util/SSHClientTest.java b/common/src/test/java/com/kylinolap/common/util/SSHClientTest.java index 4dd465b..f4ef3df 100644 --- a/common/src/test/java/com/kylinolap/common/util/SSHClientTest.java +++ b/common/src/test/java/com/kylinolap/common/util/SSHClientTest.java @@ -65,7 +65,7 @@ public void testCmd() throws Exception { if (isRemote == false) return; - SSHClient ssh = new SSHClient(this.hostname, this.username, this.password, null); + SSHClient ssh = new SSHClient(this.hostname, this.username, this.password); SSHClientOutput output = ssh.execCommand("echo hello"); assertEquals(0, output.getExitCode()); assertEquals("hello\n", output.getText()); @@ -76,7 +76,7 @@ public void testScp() throws Exception { if (isRemote == false) return; - SSHClient ssh = new SSHClient(this.hostname, this.username, this.password, null); + SSHClient ssh = new SSHClient(this.hostname, this.username, this.password); File tmpFile = FileUtil.createLocalTempFile(new File("/tmp/test_scp"), "temp_", false); ssh.scpFileToRemote(tmpFile.getAbsolutePath(), "/tmp"); } diff --git a/job/src/main/java/com/kylinolap/job/cmd/BaseCommandOutput.java b/job/src/main/java/com/kylinolap/job/cmd/BaseCommandOutput.java new file mode 100644 index 0000000..d68b9d0 --- /dev/null +++ b/job/src/main/java/com/kylinolap/job/cmd/BaseCommandOutput.java @@ -0,0 +1,12 @@ +package com.kylinolap.job.cmd; + +/** + * Created by qianzhou on 12/4/14. + */ +public abstract class BaseCommandOutput implements ICommandOutput { + + @Override + public void log(String message) { + this.appendOutput(message); + } +} diff --git a/job/src/main/java/com/kylinolap/job/cmd/ICommandOutput.java b/job/src/main/java/com/kylinolap/job/cmd/ICommandOutput.java index ca8cc08..65499e1 100644 --- a/job/src/main/java/com/kylinolap/job/cmd/ICommandOutput.java +++ b/job/src/main/java/com/kylinolap/job/cmd/ICommandOutput.java @@ -16,13 +16,14 @@ package com.kylinolap.job.cmd; +import com.kylinolap.common.util.Logger; import com.kylinolap.job.constant.JobStepStatusEnum; /** * @author xjiang * */ -public interface ICommandOutput { +public interface ICommandOutput extends Logger { public void setStatus(JobStepStatusEnum status); diff --git a/job/src/main/java/com/kylinolap/job/cmd/JavaHadoopCmdOutput.java b/job/src/main/java/com/kylinolap/job/cmd/JavaHadoopCmdOutput.java index a27d94b..5c296c7 100644 --- a/job/src/main/java/com/kylinolap/job/cmd/JavaHadoopCmdOutput.java +++ b/job/src/main/java/com/kylinolap/job/cmd/JavaHadoopCmdOutput.java @@ -37,7 +37,7 @@ * @author xduo * */ -public class JavaHadoopCmdOutput implements ICommandOutput { +public class JavaHadoopCmdOutput extends BaseCommandOutput implements ICommandOutput { protected static final Logger log = LoggerFactory.getLogger(JavaHadoopCmdOutput.class); diff --git a/job/src/main/java/com/kylinolap/job/cmd/ShellCmd.java b/job/src/main/java/com/kylinolap/job/cmd/ShellCmd.java index aab57ee..32c1b21 100644 --- a/job/src/main/java/com/kylinolap/job/cmd/ShellCmd.java +++ b/job/src/main/java/com/kylinolap/job/cmd/ShellCmd.java @@ -91,7 +91,7 @@ public Integer call() throws JobException, IOException { protected int executeCommand(String command) throws JobException, IOException { output.reset(); output.setStatus(JobStepStatusEnum.RUNNING); - return cliCommandExecutor.execute(command).getFirst(); + return cliCommandExecutor.execute(command, output).getFirst(); } @Override diff --git a/job/src/main/java/com/kylinolap/job/cmd/ShellCmdOutput.java b/job/src/main/java/com/kylinolap/job/cmd/ShellCmdOutput.java index 7197283..afae59f 100644 --- a/job/src/main/java/com/kylinolap/job/cmd/ShellCmdOutput.java +++ b/job/src/main/java/com/kylinolap/job/cmd/ShellCmdOutput.java @@ -25,7 +25,7 @@ * @author xjiang * */ -public class ShellCmdOutput implements ICommandOutput { +public class ShellCmdOutput extends BaseCommandOutput implements ICommandOutput { protected static final Logger log = LoggerFactory.getLogger(ShellCmdOutput.class); From 5259307fea2d9a5f4022ca6214510cdc5ca52c1e Mon Sep 17 00:00:00 2001 From: shaofengshi Date: Thu, 4 Dec 2014 19:42:42 +0800 Subject: [PATCH 47/65] fix the issues after adding database name to ahead of table name; --- .../java/com/kylinolap/cube/model/CubeDesc.java | 59 ++++++++++++---------- .../kylinolap/cube/model/CubePartitionDesc.java | 11 ++-- .../com/kylinolap/cube/model/DimensionDesc.java | 34 ++++++++----- .../java/com/kylinolap/dict/LookupTableTest.java | 8 +-- .../com/kylinolap/dict/SnapshotManagerTest.java | 2 +- .../localmeta/cube/test_kylin_cube_ii.json | 39 -------------- .../java/com/kylinolap/job/JoinedFlatTable.java | 21 ++++++-- .../job/hadoop/hive/JoinedFlatTableDesc.java | 32 ++++++++++++ .../test/java/com/kylinolap/job/DeployUtil.java | 11 ++-- .../kylinolap/metadata/MetadataManagerTest.java | 4 +- 10 files changed, 120 insertions(+), 101 deletions(-) delete mode 100644 examples/test_case_data/localmeta/cube/test_kylin_cube_ii.json diff --git a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java index dda39d2..d728b2d 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java @@ -94,7 +94,7 @@ public String toString() { private KylinConfig config; private DataModelDesc model; - + @JsonProperty("name") private String name; @JsonProperty("model_name") @@ -237,9 +237,9 @@ public DimensionDesc findDimensionByName(String dimName) { return result; } -// public boolean isFactTable(String factTable) { -// return this.factTable.equalsIgnoreCase(factTable); -// } + // public boolean isFactTable(String factTable) { + // return this.factTable.equalsIgnoreCase(factTable); + // } public boolean isDerived(TblColRef col) { return derivedToHostMap.containsKey(col); @@ -459,45 +459,44 @@ public String calculateSignature() { public void init(KylinConfig config, Map tables) { this.errors.clear(); this.config = config; - if(this.modelName == null || this.modelName.length() ==0) { + if (this.modelName == null || this.modelName.length() == 0) { this.addError("The cubeDesc '" + this.getName() + "' doesn't have data model specified."); } - + this.model = MetadataManager.getInstance(config).getDataModelDesc(this.modelName); - - if(this.model == null) { + + if (this.model == null) { this.addError("No data model found with name '" + modelName + "'."); } - + //key: column name; value: list of tables; Map> columnTableMap = new HashMap>(); - + String colName; - for(TableDesc table : tables.values()) { - for(ColumnDesc col : table.getColumns()) { + for (TableDesc table : tables.values()) { + for (ColumnDesc col : table.getColumns()) { colName = col.getName(); List tableNames = columnTableMap.get(colName); - if(tableNames == null) { + if (tableNames == null) { tableNames = new LinkedList(); columnTableMap.put(colName, tableNames); - } + } tableNames.add(table); } } - // key: table name; value: list of databases; Map> tableDatabaseMap = new HashMap>(); - + String tableName; - for(TableDesc table : tables.values()) { + for (TableDesc table : tables.values()) { tableName = table.getName(); - List dbNames = tableDatabaseMap.get(tableName); - if(dbNames == null) { - dbNames = new LinkedList(); - tableDatabaseMap.put(tableName, dbNames); - } - dbNames.add(table.getDatabase()); + List dbNames = tableDatabaseMap.get(tableName); + if (dbNames == null) { + dbNames = new LinkedList(); + tableDatabaseMap.put(tableName, dbNames); + } + dbNames.add(table.getDatabase()); } for (DimensionDesc dim : dimensions) { @@ -538,26 +537,32 @@ private void initDimensionColumns(Map tables) { // dimension column if (dim.getColumn() != null) { //if ("{FK}".equals(dim.getColumn())) { - if (join != null) { + if (join != null) { + // this dimension is defined on lookup table for (TblColRef ref : join.getForeignKeyColumns()) { TblColRef inited = initDimensionColRef(ref); dimColList.add(inited); hostColList.add(inited); } } else { + // this dimension is defined on fact table for (String aColumn : dim.getColumn()) { TblColRef ref = initDimensionColRef(dimTable, aColumn); - dimColList.add(ref); - hostColList.add(ref); + if (!dimColList.contains(ref)) { + dimColList.add(ref); + //hostColList.add(ref); + } } } } + // hierarchy columns if (dim.getHierarchy() != null) { for (HierarchyDesc hier : dim.getHierarchy()) { TblColRef ref = initDimensionColRef(dimTable, hier.getColumn()); hier.setColumnRef(ref); - dimColList.add(ref); + if (!dimColList.contains(ref)) + dimColList.add(ref); } if (hostColList.isEmpty()) { // the last hierarchy could serve // as host when col is diff --git a/cube/src/main/java/com/kylinolap/cube/model/CubePartitionDesc.java b/cube/src/main/java/com/kylinolap/cube/model/CubePartitionDesc.java index 4f174d2..bc3c680 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/CubePartitionDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/CubePartitionDesc.java @@ -21,6 +21,7 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.common.util.StringSplitter; import com.kylinolap.metadata.model.realization.TblColRef; /** @@ -45,12 +46,14 @@ public void init(Map> columnMap) { if (null != partitionDateColumn) { - String[] columns = partitionDateColumn.split("\\."); + partitionDateColumn = partitionDateColumn.toUpperCase(); + + String[] columns = StringSplitter.split(partitionDateColumn, "."); - if (null != columns && columns.length == 2) { - Map cols = columnMap.get(columns[0].toUpperCase()); + if (null != columns && columns.length == 3) { + Map cols = columnMap.get(columns[0].toUpperCase() + "." + columns[1].toUpperCase()); if (cols != null) - partitionDateColumnRef = cols.get(columns[1].toUpperCase()); + partitionDateColumnRef = cols.get(columns[2].toUpperCase()); } } diff --git a/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java b/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java index c1c3994..39e8fb1 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java @@ -69,9 +69,12 @@ public boolean isHierarchyColumn(TblColRef col) { } return false; } + + public boolean isHierarchy() { + return isHierarchy; + } /** - * @deprecated use getTableDesc() to get accurate table info * @return */ public String getTable() { @@ -196,7 +199,7 @@ public String toString() { if (tableName == null) { List tables = columnTableMap.get(thisColumn); if (tables == null) { - throw new IllegalStateException("The column '" + thisColumn + "' isn't appeared on any table."); + throw new IllegalStateException("The column '" + thisColumn + "' isn't appeared in any table."); } else if (tables.size() > 1) { throw new IllegalStateException("The column '" + thisColumn + "' is ambiguous; it appeared in more than one tables, please specify table name together with the column name."); } else { @@ -232,28 +235,31 @@ public void init(CubeDesc cubeDesc, Map tables, Map 0) { sql.append(","); } - sql.append(col.getTableName() + "." + col.getColumnName() + "\n"); + String tableAlias = intermediateTableDesc.getTableAlias(col.getTableName()); + sql.append(tableAlias + "." + col.getColumnName() + "\n"); } appendJoinStatement(intermediateTableDesc, sql); appendWhereStatement(intermediateTableDesc, sql); @@ -140,7 +141,8 @@ private static void appendJoinStatement(JoinedFlatTableDesc intermediateTableDes CubeDesc cubeDesc = intermediateTableDesc.getCubeDesc(); String factTableName = cubeDesc.getFactTable(); - sql.append("FROM " + factTableName + "\n"); + String factTableAlias = intermediateTableDesc.getTableAlias(factTableName); + sql.append("FROM " + factTableName + " as " + factTableAlias + " \n"); for (DimensionDesc dim : cubeDesc.getDimensions()) { JoinDesc join = dim.getJoin(); @@ -153,13 +155,13 @@ private static void appendJoinStatement(JoinedFlatTableDesc intermediateTableDes if (pk.length != fk.length) { throw new RuntimeException("Invalid join condition of dimension " + dim.getName()); } - sql.append(joinType + " JOIN " + dimTableName + "\n"); + sql.append(joinType + " JOIN " + dimTableName + " as " + intermediateTableDesc.getTableAlias(dimTableName) + "\n"); sql.append("ON "); for (int i = 0; i < pk.length; i++) { if (i > 0) { sql.append(" AND "); } - sql.append(factTableName + "." + fk[i].getName() + " = " + dimTableName + "." + pk[i].getName()); + sql.append(factTableAlias + "." + fk[i].getName() + " = " + intermediateTableDesc.getTableAlias(dimTableName) + "." + pk[i].getName()); } sql.append("\n"); @@ -192,7 +194,16 @@ private static void appendWhereStatement(JoinedFlatTableDesc intermediateTableDe } if (!(dateStart == 0 && dateEnd == 0)) { String partitionColumnName = cubeDesc.getCubePartitionDesc().getPartitionDateColumn(); - + int indexOfDot = partitionColumnName.lastIndexOf("."); + + // convert to use table alias; + if(indexOfDot >0) { + String partitionTableName = partitionColumnName.substring(0, indexOfDot); + String columeOnly = partitionColumnName.substring(indexOfDot); + String partitionTableAlias = intermediateTableDesc.getTableAlias(partitionTableName); + partitionColumnName = partitionTableAlias + columeOnly; + } + whereBuilder.append(hasCondition ? " AND (" : " ("); if (dateStart > 0) { whereBuilder.append(partitionColumnName + " >= '" + formatDateTimeInWhereClause(dateStart) + "' "); diff --git a/job/src/main/java/com/kylinolap/job/hadoop/hive/JoinedFlatTableDesc.java b/job/src/main/java/com/kylinolap/job/hadoop/hive/JoinedFlatTableDesc.java index 7356c70..56770a7 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/hive/JoinedFlatTableDesc.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/hive/JoinedFlatTableDesc.java @@ -23,7 +23,9 @@ import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.cuboid.Cuboid; import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.DimensionDesc; import com.kylinolap.cube.model.MeasureDesc; +import com.kylinolap.metadata.model.JoinDesc; import com.kylinolap.metadata.model.realization.FunctionDesc; import com.kylinolap.metadata.model.realization.TblColRef; @@ -39,6 +41,9 @@ private int[] rowKeyColumnIndexes; // the column index on flat table private int[][] measureColumnIndexes; // [i] is the i.th measure related // column index on flat table + + // Map for table alais; key: table name; value: alias; + private Map tableAliasMap; public JoinedFlatTableDesc(CubeDesc cubeDesc, CubeSegment cubeSegment) { this.cubeDesc = cubeDesc; @@ -112,6 +117,28 @@ private void parseCubeDesc() { } } } + + buileTableAliasMap(); + } + + private void buileTableAliasMap() { + tableAliasMap = new HashMap(); + + tableAliasMap.put(cubeDesc.getFactTable(), "FACT_TABLE"); + + int i=1; + for (DimensionDesc dim : cubeDesc.getDimensions()) { + JoinDesc join = dim.getJoin(); + if(join != null) { + tableAliasMap.put(dim.getTable(), "LOOKUP_" + i); + i++; + } + + } + } + + public String getTableAlias(String tableName) { + return tableAliasMap.get(tableName); } private int contains(List columnList, TblColRef c) { @@ -144,6 +171,7 @@ public String getTableName(String jobUUID) { private String columnName; private String dataType; private String tableName; + private String databaseName; public IntermediateColumnDesc(String id, String columnName, String dataType, String tableName) { this.id = id; @@ -167,5 +195,9 @@ public String getDataType() { public String getTableName() { return tableName; } + + public String getDatabaseName() { + return databaseName; + } } } diff --git a/job/src/test/java/com/kylinolap/job/DeployUtil.java b/job/src/test/java/com/kylinolap/job/DeployUtil.java index 65a4d9a..6fd59af 100644 --- a/job/src/test/java/com/kylinolap/job/DeployUtil.java +++ b/job/src/test/java/com/kylinolap/job/DeployUtil.java @@ -120,11 +120,11 @@ private static KylinConfig config() { // ============================================================================ - static final String TABLE_CAL_DT = "test_cal_dt"; - static final String TABLE_CATEGORY_GROUPINGS = "test_category_groupings"; - static final String TABLE_KYLIN_FACT = "test_kylin_fact"; - static final String TABLE_SELLER_TYPE_DIM = "test_seller_type_dim"; - static final String TABLE_SITES = "test_sites"; + static final String TABLE_CAL_DT = "edw.test_cal_dt"; + static final String TABLE_CATEGORY_GROUPINGS = "default.test_category_groupings"; + static final String TABLE_KYLIN_FACT = "default.test_kylin_fact"; + static final String TABLE_SELLER_TYPE_DIM = "edw.test_seller_type_dim"; + static final String TABLE_SITES = "edw.test_sites"; static final String[] TABLE_NAMES = new String[] { TABLE_CAL_DT, TABLE_CATEGORY_GROUPINGS, TABLE_KYLIN_FACT, TABLE_SELLER_TYPE_DIM, TABLE_SITES }; @@ -167,6 +167,7 @@ private static void deployHiveTables() throws Exception { temp.delete(); // create hive tables + execHiveCommand("CREATE DATABASE IF NOT EXISTS EDW;"); execHiveCommand(generateCreateTableHql(metaMgr.getTableDesc(TABLE_CAL_DT.toUpperCase()))); execHiveCommand(generateCreateTableHql(metaMgr.getTableDesc(TABLE_CATEGORY_GROUPINGS.toUpperCase()))); execHiveCommand(generateCreateTableHql(metaMgr.getTableDesc(TABLE_KYLIN_FACT.toUpperCase()))); diff --git a/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java b/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java index 63be707..ce273b5 100644 --- a/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java +++ b/metadata/src/test/java/com/kylinolap/metadata/MetadataManagerTest.java @@ -50,9 +50,9 @@ public void testListAllTables() throws Exception { @Test public void testFindTableByName() throws Exception { - TableDesc table = MetadataManager.getInstance(this.getTestConfig()).getTableDesc("TEST_CAL_DT"); + TableDesc table = MetadataManager.getInstance(this.getTestConfig()).getTableDesc("EDW.TEST_CAL_DT"); Assert.assertNotNull(table); - Assert.assertEquals("TEST_CAL_DT", table.getIdentity()); + Assert.assertEquals("EDW.TEST_CAL_DT", table.getIdentity()); } @Test From 91882b8dcefcb3c8339aa3971ce12467c54a9595 Mon Sep 17 00:00:00 2001 From: shaofengshi Date: Fri, 5 Dec 2014 10:04:10 +0800 Subject: [PATCH 48/65] =?UTF-8?q?Extract=20=E2=80=9Ctable=E2=80=9D=20from?= =?UTF-8?q?=20=E2=80=9Ccolumn=E2=80=9D=20in=20Dimension=20description.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kylinolap/cube/dataGen/FactTableGenerator.java | 5 --- .../com/kylinolap/cube/model/DimensionDesc.java | 38 ++++------------------ .../cube_desc/test_kylin_cube_with_slr_desc.json | 18 ++++++---- .../test_kylin_cube_with_slr_left_join_desc.json | 21 ++++++++---- .../test_kylin_cube_without_slr_desc.json | 15 ++++++--- ...test_kylin_cube_without_slr_left_join_desc.json | 15 ++++++--- .../com/kylinolap/metadata/model/TableDesc.java | 2 +- 7 files changed, 53 insertions(+), 61 deletions(-) diff --git a/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java b/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java index 15d435d..7781e61 100644 --- a/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java +++ b/cube/src/main/java/com/kylinolap/cube/dataGen/FactTableGenerator.java @@ -305,11 +305,6 @@ private String generate() throws Exception { if (jDesc == null) { // column on fact table used directly as a dimension for (String aColumn : dim.getColumn()) { - int lastIndexOfDot = aColumn.lastIndexOf("."); - if (lastIndexOfDot >= 0) { - aColumn = aColumn.substring(lastIndexOfDot + 1); - } - if (!factTableCol2LookupCol.containsKey(aColumn)) usedCols.add(aColumn); } diff --git a/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java b/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java index 39e8fb1..348b24a 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java @@ -47,7 +47,6 @@ private boolean isHierarchy; @JsonProperty("table") private String table; - private String database; @JsonProperty("column") private String[] column; @JsonProperty("derived") @@ -78,11 +77,7 @@ public boolean isHierarchy() { * @return */ public String getTable() { - if (database == null) { - return ("DEFAULT." + table).toUpperCase(); - } else { - return (database + "." + table).toUpperCase(); - } + return table; } public int getId() { @@ -182,6 +177,7 @@ public String toString() { * parse column to get db name and table name * @return an array carries db name + table name * @throws IllegalStateException if the column name or name is incorrect or inaccurate + * @deprecated */ private String[] parseTableDBName(String thisColumn, Map> columnTableMap, Map> tableDatabaseMap) { String tableName = null, dbName = null; @@ -228,35 +224,13 @@ public String toString() { public void init(CubeDesc cubeDesc, Map tables, Map> columnTableMap, Map> tableDatabaseMap) { if (name != null) name = name.toUpperCase(); - - this.table = null; - this.database = null; - this.join = null; - - for (int i = 0, n = this.column.length; i < n; i++) { - String thisColumn = this.column[i].toUpperCase(); - - if (this.table == null || this.database == null) { - String[] dbTableNames = parseTableDBName(thisColumn, columnTableMap, tableDatabaseMap); - - if (database == null) { - database = dbTableNames[0]; - } else if (!database.equals(dbTableNames[0])) { - throw new IllegalStateException("One dimension can only refer to the tables in the same db: '" + database + "' and '" + dbTableNames[0] + "'."); - } - - if (table == null) { - table = dbTableNames[1]; - } else if (!table.equalsIgnoreCase(dbTableNames[1])) { - throw new IllegalStateException("One dimension can only refer to the columns on the same table: '" + table + "' and '" + dbTableNames[1] + "'."); - } - } - - } + + if (table != null) + table = table.toUpperCase(); tableDesc = tables.get(this.getTable()); if (tableDesc == null) - throw new IllegalStateException("Can't find table " + table + " on dimension " + name); + throw new IllegalStateException("Can't find table " + table + " for dimension " + name); for (LookupDesc lookup : cubeDesc.getModel().getLookups()) { if (lookup.getTable().equalsIgnoreCase(this.getTable())) { diff --git a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json index 4189067..d152df3 100644 --- a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json +++ b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_desc.json @@ -11,32 +11,38 @@ "dimensions": [ { "name": "cal_dt", - "column": ["edw.test_cal_dt.cal_dt"], + "table": "edw.test_cal_dt", + "column": ["cal_dt"], "derived": ["week_beg_dt"] }, { "name": "category", - "column": ["default.test_category_groupings.meta_categ_name", "default.test_category_groupings.categ_lvl2_name", "default.test_category_groupings.categ_lvl3_name"], + "table": "default.test_category_groupings", + "column": ["meta_categ_name", "categ_lvl2_name", "categ_lvl3_name"], "derived": ["USER_DEFINED_FIELD1", "USER_DEFINED_FIELD3", "UPD_DATE", "UPD_USER"], "hierarchy": true }, { "name": "lstg_format_name", - "column": ["default.test_kylin_fact.lstg_format_name"] + "table": "default.test_kylin_fact", + "column": ["lstg_format_name"] }, { "name": "site_id", - "column": ["edw.test_sites.site_id"], + "table": "edw.test_sites", + "column": ["site_id"], "derived": ["site_name", "cre_user"] }, { "name": "seller_type_cd", - "column": ["edw.test_seller_type_dim.seller_type_cd"], + "table": "edw.test_seller_type_dim", + "column": ["seller_type_cd"], "derived": ["seller_type_desc"] }, { "name": "seller_id", - "column": ["default.test_kylin_fact.seller_id"] + "table": "default.test_kylin_fact", + "column": ["seller_id"] } ], "measures": [ diff --git a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_left_join_desc.json b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_left_join_desc.json index 59a0f3e..b67ab38 100644 --- a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_left_join_desc.json +++ b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_with_slr_left_join_desc.json @@ -11,36 +11,43 @@ "dimensions": [ { "name": "cal_dt", - "column": ["edw.test_cal_dt.cal_dt"], + "table": "edw.test_cal_dt", + "column": ["cal_dt"], "derived": ["week_beg_dt"] }, { "name": "category", - "column": ["default.test_category_groupings.meta_categ_name", "default.test_category_groupings.categ_lvl2_name", "default.test_category_groupings.categ_lvl3_name"], + "table": "default.test_category_groupings", + "column": ["meta_categ_name", "categ_lvl2_name", "categ_lvl3_name"], "hierarchy": true }, { "name": "category_derived", - "column": ["default.test_category_groupings.leaf_categ_id", "default.test_category_groupings.site_id"], + "table": "default.test_category_groupings", + "column": ["leaf_categ_id", "site_id"], "derived": ["USER_DEFINED_FIELD1", "USER_DEFINED_FIELD3", "UPD_DATE", "UPD_USER"] }, { "name": "lstg_format_name", - "column": ["default.test_kylin_fact.lstg_format_name"] + "table": "default.test_kylin_fact", + "column": ["lstg_format_name"] }, { "name": "site_id", - "column": ["edw.test_sites.site_id"], + "table": "edw.test_sites", + "column": ["site_id"], "derived": ["site_name", "cre_user"] }, { "name": "seller_type_cd", - "column": ["edw.test_seller_type_dim.seller_type_cd"], + "table": "edw.test_seller_type_dim", + "column": ["seller_type_cd"], "derived": ["seller_type_desc"] }, { "name": "seller_id", - "column": ["default.test_kylin_fact.seller_id"] + "table": "default.test_kylin_fact", + "column": ["seller_id"] } ], "measures": [ diff --git a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_desc.json b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_desc.json index 362127d..e109fbe 100644 --- a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_desc.json +++ b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_desc.json @@ -12,14 +12,16 @@ "dimensions": [ { "name": "cal_dt", - "column": ["edw.test_cal_dt.cal_dt"], + "table": "edw.test_cal_dt", + "column": ["cal_dt"], "derived": [ "week_beg_dt" ] }, { "name": "category", - "column": ["default.test_category_groupings.meta_categ_name", "default.test_category_groupings.categ_lvl2_name", "default.test_category_groupings.categ_lvl3_name"], + "table": "default.test_category_groupings", + "column": ["meta_categ_name", "categ_lvl2_name", "categ_lvl3_name"], "derived": [ "USER_DEFINED_FIELD1", "USER_DEFINED_FIELD3", @@ -30,11 +32,13 @@ }, { "name": "lstg_format_name", - "column": ["default.test_kylin_fact.lstg_format_name"] + "table": "default.test_kylin_fact", + "column": ["lstg_format_name"] }, { "name": "site_id", - "column": ["edw.test_sites.site_id"], + "table": "edw.test_sites", + "column": ["site_id"], "derived": [ "site_name", "cre_user" @@ -42,7 +46,8 @@ }, { "name": "seller_type_cd", - "column": ["edw.test_seller_type_dim.seller_type_cd"], + "table": "edw.test_seller_type_dim", + "column": ["seller_type_cd"], "derived": [ "seller_type_desc" ] diff --git a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_left_join_desc.json b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_left_join_desc.json index d9e832e..9ab5eed 100644 --- a/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_left_join_desc.json +++ b/examples/test_case_data/localmeta/cube_desc/test_kylin_cube_without_slr_left_join_desc.json @@ -10,14 +10,16 @@ "dimensions": [ { "name": "cal_dt", - "column": ["edw.test_cal_dt.cal_dt"], + "table": "edw.test_cal_dt", + "column": ["cal_dt"], "derived": [ "week_beg_dt" ] }, { "name": "category", - "column": ["default.test_category_groupings.meta_categ_name", "default.test_category_groupings.categ_lvl2_name", "default.test_category_groupings.categ_lvl3_name"], + "table": "default.test_category_groupings", + "column": ["meta_categ_name", "categ_lvl2_name", "categ_lvl3_name"], "derived": [ "USER_DEFINED_FIELD1", "USER_DEFINED_FIELD3", @@ -28,11 +30,13 @@ }, { "name": "lstg_format_name", - "column": ["default.test_kylin_fact.lstg_format_name"] + "table": "default.test_kylin_fact", + "column": ["lstg_format_name"] }, { "name": "site_id", - "column": ["edw.test_sites.site_id"], + "table": "edw.test_sites", + "column": ["site_id"], "derived": [ "site_name", "cre_user" @@ -40,7 +44,8 @@ }, { "name": "seller_type_cd", - "column": ["edw.test_seller_type_dim.seller_type_cd"], + "table": "edw.test_seller_type_dim", + "column": ["seller_type_cd"], "derived": [ "seller_type_desc" ] diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java index 45bb2b2..1b15337 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java @@ -41,7 +41,7 @@ private DatabaseDesc database; public ColumnDesc findColumnByName(String name) { - //ignore the db name and table name + //ignore the db name and table name if exists int lastIndexOfDot = name.lastIndexOf("."); if (lastIndexOfDot >= 0) { name = name.substring(lastIndexOfDot + 1); From c2f306228e1343655db0fd419f9e120882d0c429 Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Fri, 5 Dec 2014 10:08:08 +0800 Subject: [PATCH 49/65] fix compile issue --- job/src/test/java/com/kylinolap/job/engine/GenericJobEngineTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/job/src/test/java/com/kylinolap/job/engine/GenericJobEngineTest.java b/job/src/test/java/com/kylinolap/job/engine/GenericJobEngineTest.java index 47974fc..d7d1486 100644 --- a/job/src/test/java/com/kylinolap/job/engine/GenericJobEngineTest.java +++ b/job/src/test/java/com/kylinolap/job/engine/GenericJobEngineTest.java @@ -117,7 +117,7 @@ public static void beforeClass() throws Exception { System.setProperty(KylinConfig.KYLIN_CONF, tempTestMetadataUrl); // deploy files to hdfs - SSHClient hadoopCli = new SSHClient(getHadoopCliHostname(), getHadoopCliUsername(), getHadoopCliPassword(), null); + SSHClient hadoopCli = new SSHClient(getHadoopCliHostname(), getHadoopCliUsername(), getHadoopCliPassword()); scpFilesToHdfs(hadoopCli, new String[] { "src/test/resources/json/dummy_jobinstance.json" }, mrInputDir); // deploy sample java jar hadoopCli.scpFileToRemote("src/test/resources/jarfile/SampleJavaProgram.jarfile", "/tmp"); @@ -156,7 +156,7 @@ public static void afterClass() throws Exception { @Before public void before() throws Exception { - SSHClient hadoopCli = new SSHClient(getHadoopCliHostname(), getHadoopCliUsername(), getHadoopCliPassword(), null); + SSHClient hadoopCli = new SSHClient(getHadoopCliHostname(), getHadoopCliUsername(), getHadoopCliPassword()); removeHdfsDir(hadoopCli, mrOutputDir1); removeHdfsDir(hadoopCli, mrOutputDir2); From deb484eaff5e6dba16ed8741e3cf98eceada2a6c Mon Sep 17 00:00:00 2001 From: shaofengshi Date: Fri, 5 Dec 2014 13:03:09 +0800 Subject: [PATCH 50/65] =?UTF-8?q?Add=20=E2=80=9Ctable=E2=80=9D=20attribute?= =?UTF-8?q?=20on=20=E2=80=9Cdimensions=E2=80=9D=20description,=20and=20rem?= =?UTF-8?q?ove=20the=20table=20from=20=E2=80=9Ccolumn=E2=80=9D.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/kylinolap/cube/model/CubePartitionDesc.java | 13 +++++++++---- job/src/main/java/com/kylinolap/job/JoinedFlatTable.java | 3 ++- .../com/kylinolap/job/hadoop/hive/JoinedFlatTableDesc.java | 7 +++++-- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/cube/src/main/java/com/kylinolap/cube/model/CubePartitionDesc.java b/cube/src/main/java/com/kylinolap/cube/model/CubePartitionDesc.java index bc3c680..4444807 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/CubePartitionDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/CubePartitionDesc.java @@ -47,14 +47,19 @@ public void init(Map> columnMap) { if (null != partitionDateColumn) { partitionDateColumn = partitionDateColumn.toUpperCase(); - + String[] columns = StringSplitter.split(partitionDateColumn, "."); if (null != columns && columns.length == 3) { - Map cols = columnMap.get(columns[0].toUpperCase() + "." + columns[1].toUpperCase()); - if (cols != null) + String tableName = columns[0].toUpperCase() + "." + columns[1].toUpperCase(); + Map cols = columnMap.get(tableName); + if (cols != null) { partitionDateColumnRef = cols.get(columns[2].toUpperCase()); - + } else { + throw new IllegalStateException("The table '" + tableName + "' provided in 'partition_date_column' doesn't exist."); + } + } else { + throw new IllegalStateException("The 'partition_date_column' format is invalid: " + partitionDateColumn + ", it should be {db}.{table}.{column}."); } } } diff --git a/job/src/main/java/com/kylinolap/job/JoinedFlatTable.java b/job/src/main/java/com/kylinolap/job/JoinedFlatTable.java index f13e6d5..ccb218a 100644 --- a/job/src/main/java/com/kylinolap/job/JoinedFlatTable.java +++ b/job/src/main/java/com/kylinolap/job/JoinedFlatTable.java @@ -123,12 +123,13 @@ public static String generateInsertDataStatement(JoinedFlatTableDesc intermediat public static String generateSelectDataStatement(JoinedFlatTableDesc intermediateTableDesc) { StringBuilder sql = new StringBuilder(); sql.append("SELECT" + "\n"); + String tableAlias; for (int i = 0; i < intermediateTableDesc.getColumnList().size(); i++) { IntermediateColumnDesc col = intermediateTableDesc.getColumnList().get(i); if (i > 0) { sql.append(","); } - String tableAlias = intermediateTableDesc.getTableAlias(col.getTableName()); + tableAlias = intermediateTableDesc.getTableAlias(col.getTableName()); sql.append(tableAlias + "." + col.getColumnName() + "\n"); } appendJoinStatement(intermediateTableDesc, sql); diff --git a/job/src/main/java/com/kylinolap/job/hadoop/hive/JoinedFlatTableDesc.java b/job/src/main/java/com/kylinolap/job/hadoop/hive/JoinedFlatTableDesc.java index 56770a7..92cf2a0 100644 --- a/job/src/main/java/com/kylinolap/job/hadoop/hive/JoinedFlatTableDesc.java +++ b/job/src/main/java/com/kylinolap/job/hadoop/hive/JoinedFlatTableDesc.java @@ -44,6 +44,9 @@ // Map for table alais; key: table name; value: alias; private Map tableAliasMap; + + public static final String FACT_TABLE_ALIAS = "FACT_TABLE"; + public static final String LOOKUP_TABLE_ALAIS_PREFIX = "LOOKUP_"; public JoinedFlatTableDesc(CubeDesc cubeDesc, CubeSegment cubeSegment) { this.cubeDesc = cubeDesc; @@ -124,13 +127,13 @@ private void parseCubeDesc() { private void buileTableAliasMap() { tableAliasMap = new HashMap(); - tableAliasMap.put(cubeDesc.getFactTable(), "FACT_TABLE"); + tableAliasMap.put(cubeDesc.getFactTable(), FACT_TABLE_ALIAS); int i=1; for (DimensionDesc dim : cubeDesc.getDimensions()) { JoinDesc join = dim.getJoin(); if(join != null) { - tableAliasMap.put(dim.getTable(), "LOOKUP_" + i); + tableAliasMap.put(dim.getTable(), LOOKUP_TABLE_ALAIS_PREFIX + i); i++; } From 5d91978f8e270a884a14b0f726b99d0e9691045f Mon Sep 17 00:00:00 2001 From: honma Date: Fri, 5 Dec 2014 15:01:33 +0800 Subject: [PATCH 51/65] use table name --- query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java b/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java index 8ccc4dc..f8fb90e 100644 --- a/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java +++ b/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java @@ -68,7 +68,7 @@ public OLAPSchema(String project, String schemaName) { List projectTables = getProjectManager().listExposedTables(projectName); for (TableDesc tableDesc : projectTables) { - final String tableName = tableDesc.getIdentity(); + final String tableName = tableDesc.getName(); final OLAPTable table = new OLAPTable(this, tableDesc); olapTables.put(tableName, table); // logger.debug("Project " + projectName + " exposes table " + tableName); From 03e8f51da01ca8a863f531a1a82f2551fda83f8a Mon Sep 17 00:00:00 2001 From: honma Date: Fri, 5 Dec 2014 15:46:32 +0800 Subject: [PATCH 52/65] fix calcite perceiving tables --- .../main/java/com/kylinolap/cube/project/ProjectTable.java | 2 +- .../main/java/com/kylinolap/query/schema/OLAPSchema.java | 13 ++++++++++--- .../java/com/kylinolap/query/schema/OLAPSchemaFactory.java | 10 +++++++++- .../main/java/com/kylinolap/rest/service/QueryService.java | 4 ++-- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/cube/src/main/java/com/kylinolap/cube/project/ProjectTable.java b/cube/src/main/java/com/kylinolap/cube/project/ProjectTable.java index 0344010..8ffffd7 100644 --- a/cube/src/main/java/com/kylinolap/cube/project/ProjectTable.java +++ b/cube/src/main/java/com/kylinolap/cube/project/ProjectTable.java @@ -80,7 +80,7 @@ public boolean equals(Object obj) { if (name == null) { if (other.name != null) return false; - } else if (!name.equals(other.name)) + } else if (!name.equalsIgnoreCase(other.name)) return false; return true; } diff --git a/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java b/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java index f8fb90e..eda7244 100644 --- a/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java +++ b/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java @@ -58,6 +58,11 @@ public OLAPSchema(String project, String schemaName) { init(); } + /** + * It is intended to skip caching, because underlying project/tables might change. + * + * @return + */ @Override protected Map getTableMap() { return buildTableMap(); @@ -68,10 +73,12 @@ public OLAPSchema(String project, String schemaName) { List projectTables = getProjectManager().listExposedTables(projectName); for (TableDesc tableDesc : projectTables) { - final String tableName = tableDesc.getName(); - final OLAPTable table = new OLAPTable(this, tableDesc); - olapTables.put(tableName, table); + if (tableDesc.getDatabase().equals(schemaName)) { + final String tableName = tableDesc.getName(); + final OLAPTable table = new OLAPTable(this, tableDesc); + olapTables.put(tableName, table); // logger.debug("Project " + projectName + " exposes table " + tableName); + } } return olapTables; diff --git a/query/src/main/java/com/kylinolap/query/schema/OLAPSchemaFactory.java b/query/src/main/java/com/kylinolap/query/schema/OLAPSchemaFactory.java index c074092..18b5d5c 100644 --- a/query/src/main/java/com/kylinolap/query/schema/OLAPSchemaFactory.java +++ b/query/src/main/java/com/kylinolap/query/schema/OLAPSchemaFactory.java @@ -69,12 +69,20 @@ public static File createTempOLAPJson(String project, KylinConfig config) { project = ProjectInstance.getNormalizedProjectName(project); List tables = ProjectManager.getInstance(config).listExposedTables(project); + // "database" in TableDesc correspond to our schema + // the logic to decide which schema to be "default" in calcite: + // if some schema are named "default", use it. + // other wise use the schema with most tables HashMap schemaCounts = DatabaseDesc.extractDatabaseOccurenceCounts(tables); - String majoritySchemaName = ""; int majoritySchemaCount = 0; for (Map.Entry e : schemaCounts.entrySet()) { + if (e.getKey().equalsIgnoreCase("default")) { + majoritySchemaCount = Integer.MAX_VALUE; + majoritySchemaName = e.getKey(); + } + if (e.getValue() >= majoritySchemaCount) { majoritySchemaCount = e.getValue(); majoritySchemaName = e.getKey(); diff --git a/server/src/main/java/com/kylinolap/rest/service/QueryService.java b/server/src/main/java/com/kylinolap/rest/service/QueryService.java index 5e90e85..6000e52 100644 --- a/server/src/main/java/com/kylinolap/rest/service/QueryService.java +++ b/server/src/main/java/com/kylinolap/rest/service/QueryService.java @@ -301,7 +301,7 @@ protected SQLResponse executeQuery(String sql, SQLRequest sqlRequest) throws Exc // PostgreSQL has only 5 TableMeta tblMeta = new TableMeta(catalogName == null ? Constant.FakeCatalogName : catalogName, schemaName == null ? Constant.FakeSchemaName : schemaName, JDBCTableMeta.getString(3), JDBCTableMeta.getString(4), JDBCTableMeta.getString(5), null, null, null, null, null); - if (!cubedOnly || getProjectManager().isExposedTable(project, tblMeta.getTABLE_NAME())) { + if (!cubedOnly || getProjectManager().isExposedTable(project, schemaName + "." + tblMeta.getTABLE_NAME())) { tableMetas.add(tblMeta); tableMap.put(tblMeta.getTABLE_SCHEM() + "#" + tblMeta.getTABLE_NAME(), tblMeta); } @@ -317,7 +317,7 @@ protected SQLResponse executeQuery(String sql, SQLRequest sqlRequest) throws Exc // kylin(optiq) is not strictly following JDBC specification ColumnMeta colmnMeta = new ColumnMeta(catalogName == null ? Constant.FakeCatalogName : catalogName, schemaName == null ? Constant.FakeSchemaName : schemaName, columnMeta.getString(3), columnMeta.getString(4), columnMeta.getInt(5), columnMeta.getString(6), columnMeta.getInt(7), getInt(columnMeta.getString(8)), columnMeta.getInt(9), columnMeta.getInt(10), columnMeta.getInt(11), columnMeta.getString(12), columnMeta.getString(13), getInt(columnMeta.getString(14)), getInt(columnMeta.getString(15)), columnMeta.getInt(16), columnMeta.getInt(17), columnMeta.getString(18), columnMeta.getString(19), columnMeta.getString(20), columnMeta.getString(21), getShort(columnMeta.getString(22)), columnMeta.getString(23)); - if (!cubedOnly || getProjectManager().isExposedColumn(project, colmnMeta.getTABLE_NAME(), colmnMeta.getCOLUMN_NAME())) { + if (!cubedOnly || getProjectManager().isExposedColumn(project, schemaName + "." +colmnMeta.getTABLE_NAME(), colmnMeta.getCOLUMN_NAME())) { tableMap.get(colmnMeta.getTABLE_SCHEM() + "#" + colmnMeta.getTABLE_NAME()).addColumn(colmnMeta); } } From abf3276c0416cfbca3ed2eb5d03b78c3537bb3f0 Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Fri, 5 Dec 2014 17:38:39 +0800 Subject: [PATCH 53/65] add datamodels for project --- .../test_case_data/localmeta/project/default.json | 22 ++++++++++++++++++++++ .../localmeta/project/onlyinner.json | 12 ++++++++++++ .../test_case_data/localmeta/project/onlyleft.json | 12 ++++++++++++ 3 files changed, 46 insertions(+) diff --git a/examples/test_case_data/localmeta/project/default.json b/examples/test_case_data/localmeta/project/default.json index 653fcad..0a878d8 100644 --- a/examples/test_case_data/localmeta/project/default.json +++ b/examples/test_case_data/localmeta/project/default.json @@ -1,6 +1,28 @@ { "uuid" : "1eaca32a-a33e-4b69-83dd-0bb8b1f8c91b", "name": "default", + "datamodels": [ + { + "name": "test_kylin_with_slr_model_desc", + "type": "cube", + "realization": "test_kylin_cube_with_slr_empty" + }, + { + "name": "test_kylin_without_slr_model_desc", + "type": "cube", + "realization": "test_kylin_cube_without_slr_empty" + }, + { + "name": "test_kylin_with_slr_left_join_model_desc", + "type": "cube", + "realization": "test_kylin_cube_with_slr_left_join_empty" + }, + { + "name": "test_kylin_without_slr_left_join_model_desc", + "type": "cube", + "realization": "test_kylin_cube_without_slr_left_join_empty" + } + ], "cubes": [ "test_kylin_cube_with_slr_empty", "test_kylin_cube_without_slr_empty", diff --git a/examples/test_case_data/localmeta/project/onlyinner.json b/examples/test_case_data/localmeta/project/onlyinner.json index 9544895..1037b9e 100644 --- a/examples/test_case_data/localmeta/project/onlyinner.json +++ b/examples/test_case_data/localmeta/project/onlyinner.json @@ -1,6 +1,18 @@ { "uuid" : "1eaca32a-a33e-4b69-83dd-0bb8b1f8c92b", "name": "onlyinner", + "datamodels": [ + { + "name": "test_kylin_with_slr_model_desc", + "type": "cube", + "realization": "test_kylin_cube_with_slr_empty" + }, + { + "name": "test_kylin_without_slr_model_desc", + "type": "cube", + "realization": "test_kylin_cube_without_slr_empty" + } + ], "cubes": [ "test_kylin_cube_with_slr_empty", "test_kylin_cube_without_slr_empty" diff --git a/examples/test_case_data/localmeta/project/onlyleft.json b/examples/test_case_data/localmeta/project/onlyleft.json index 13e57ed..bb3ef50 100644 --- a/examples/test_case_data/localmeta/project/onlyleft.json +++ b/examples/test_case_data/localmeta/project/onlyleft.json @@ -1,6 +1,18 @@ { "uuid" : "1eaca32a-a33e-4b69-83dd-0bb8b1f8c93b", "name": "onlyleft", + "datamodels": [ + { + "name": "test_kylin_with_slr_left_join_model_desc", + "type": "cube", + "realization": "test_kylin_cube_with_slr_left_join_empty" + }, + { + "name": "test_kylin_without_slr_left_join_model_desc", + "type": "cube", + "realization": "test_kylin_cube_without_slr_left_join_empty" + } + ], "cubes": [ "test_kylin_cube_with_slr_left_join_empty", "test_kylin_cube_without_slr_left_join_empty" From 1be405627ae84b200925de3de0c048e25056b647 Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Fri, 5 Dec 2014 17:53:05 +0800 Subject: [PATCH 54/65] add datamodels field for ProjectInstance --- .../kylinolap/cube/project/ProjectInstance.java | 13 ++++++- .../metadata/project/ProjectDataModel.java | 44 ++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 metadata/src/main/java/com/kylinolap/metadata/project/ProjectDataModel.java diff --git a/cube/src/main/java/com/kylinolap/cube/project/ProjectInstance.java b/cube/src/main/java/com/kylinolap/cube/project/ProjectInstance.java index 26d4c90..7f9003d 100644 --- a/cube/src/main/java/com/kylinolap/cube/project/ProjectInstance.java +++ b/cube/src/main/java/com/kylinolap/cube/project/ProjectInstance.java @@ -25,6 +25,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.kylinolap.common.persistence.ResourceStore; import com.kylinolap.common.persistence.RootPersistentEntity; +import com.kylinolap.metadata.project.ProjectDataModel; /** * Project is a concept in Kylin similar to schema in DBMS @@ -59,6 +60,9 @@ @JsonProperty("description") private String description; + @JsonProperty("datamodels") + private List dataModels; + public String getResourcePath() { return concatResourcePath(name); } @@ -211,7 +215,14 @@ public void setLastUpdateTime(String lastUpdateTime) { public void recordUpdateTime(long timeMillis) { this.lastUpdateTime = formatTime(timeMillis); } - + + public List getDataModels() { + return dataModels; + } + + public void setDataModels(List dataModels) { + this.dataModels = dataModels; + } public void init() { if (name == null) diff --git a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectDataModel.java b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectDataModel.java new file mode 100644 index 0000000..e0fd40f --- /dev/null +++ b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectDataModel.java @@ -0,0 +1,44 @@ +package com.kylinolap.metadata.project; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Created by qianzhou on 12/5/14. + */ +@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE) +public class ProjectDataModel { + + @JsonProperty("name") + private String name; + + @JsonProperty("type") + private String type; + + @JsonProperty("realization") + private String realization; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getRealization() { + return realization; + } + + public void setRealization(String realization) { + this.realization = realization; + } +} From 4efcac49ac78ce157adb0192f1d9938c432faf36 Mon Sep 17 00:00:00 2001 From: shaofengshi Date: Fri, 5 Dec 2014 18:02:08 +0800 Subject: [PATCH 55/65] Update the dictionary name for cubes. --- .../java/com/kylinolap/cube/cuboid/CuboidTest.java | 2 +- .../cube/invertedindex/InvertedIndexLocalTest.java | 2 + .../test_kylin_cube_with_slr_1_new_segment.json | 28 +++++------ .../test_kylin_cube_with_slr_left_join_ready.json | 28 +++++------ .../cube/test_kylin_cube_with_slr_ready.json | 28 +++++------ .../test_kylin_cube_with_slr_ready_2_segments.json | 56 +++++++++++----------- ...est_kylin_cube_without_slr_left_join_ready.json | 28 +++++------ ...ube_without_slr_left_join_ready_2_segments.json | 52 ++++++++++---------- .../cube/test_kylin_cube_without_slr_ready.json | 28 +++++------ 9 files changed, 127 insertions(+), 125 deletions(-) diff --git a/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidTest.java b/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidTest.java index edd2a11..f4e777f 100644 --- a/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidTest.java +++ b/cube/src/test/java/com/kylinolap/cube/cuboid/CuboidTest.java @@ -170,7 +170,7 @@ public void testCuboid2() { assertEquals(toLong("111111111"), cuboid.getId()); } - @Test + //@Test public void testII() { CubeDesc cube = getTestKylinCubeII(); assertEquals(toLong("111111111"), Cuboid.getBaseCuboidId(cube)); diff --git a/cube/src/test/java/com/kylinolap/cube/invertedindex/InvertedIndexLocalTest.java b/cube/src/test/java/com/kylinolap/cube/invertedindex/InvertedIndexLocalTest.java index 2c42c5b..8fe415b 100644 --- a/cube/src/test/java/com/kylinolap/cube/invertedindex/InvertedIndexLocalTest.java +++ b/cube/src/test/java/com/kylinolap/cube/invertedindex/InvertedIndexLocalTest.java @@ -15,6 +15,7 @@ import org.apache.hadoop.hbase.util.Pair; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import com.google.common.collect.Lists; @@ -24,6 +25,7 @@ import com.kylinolap.cube.CubeManager; import com.kylinolap.dict.Dictionary; +@Ignore public class InvertedIndexLocalTest extends LocalFileMetadataTestCase { CubeInstance cube; diff --git a/examples/test_case_data/localmeta/cube/test_kylin_cube_with_slr_1_new_segment.json b/examples/test_case_data/localmeta/cube/test_kylin_cube_with_slr_1_new_segment.json index 1f6865c..95c9231 100644 --- a/examples/test_case_data/localmeta/cube/test_kylin_cube_with_slr_1_new_segment.json +++ b/examples/test_case_data/localmeta/cube/test_kylin_cube_with_slr_1_new_segment.json @@ -19,22 +19,22 @@ "last_build_job_id" : null, "binary_signature" : null, "dictionaries" : { - "TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/16d8185c-ee6b-4f8c-a919-756d9809f937.dict", - "TEST_KYLIN_FACT/SLR_SEGMENT_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/c6bf9b51-6e90-4337-8082-4e2fdf78307f.dict", - "TEST_KYLIN_FACT/LSTG_SITE_ID" : "/dict/TEST_SITES/SITE_ID/652bd393-678a-4f16-a504-fd8ce1229355.dict", - "TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/2a44ff38-f64b-42e7-9fcf-66afccac8047.dict", - "TEST_KYLIN_FACT/CAL_DT" : "/dict/PREDEFINED/date(yyyy-mm-dd)/64ac4f82-f2af-476e-85b9-f0805001014e.dict", - "TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/ad09f2d5-054a-4e1b-a776-7cc07399a6c1.dict", - "TEST_CAL_DT/CAL_DT" : "/dict/TEST_CAL_DT/CAL_DT/ed0c3451-593c-494c-9019-64f63fcb0b8e.dict", - "TEST_KYLIN_FACT/LEAF_CATEG_ID" : "/dict/TEST_CATEGORY_GROUPINGS/LEAF_CATEG_ID/4243889f-bc81-4807-a975-7041bbbf35e7.dict", - "TEST_SITES/SITE_ID" : "/dict/TEST_SITES/SITE_ID/ff7e8943-ac0f-4e66-b9ed-510f6a0b875d.dict", - "TEST_CATEGORY_GROUPINGS/META_CATEG_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/aceae914-4246-4251-a0c2-692fe7a300df.dict" + "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/16d8185c-ee6b-4f8c-a919-756d9809f937.dict", + "DEFAULT.TEST_KYLIN_FACT/SLR_SEGMENT_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/c6bf9b51-6e90-4337-8082-4e2fdf78307f.dict", + "DEFAULT.TEST_KYLIN_FACT/LSTG_SITE_ID" : "/dict/TEST_SITES/SITE_ID/652bd393-678a-4f16-a504-fd8ce1229355.dict", + "EDW.TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/2a44ff38-f64b-42e7-9fcf-66afccac8047.dict", + "DEFAULT.TEST_KYLIN_FACT/CAL_DT" : "/dict/PREDEFINED/date(yyyy-mm-dd)/64ac4f82-f2af-476e-85b9-f0805001014e.dict", + "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/ad09f2d5-054a-4e1b-a776-7cc07399a6c1.dict", + "EDW.TEST_CAL_DT/CAL_DT" : "/dict/TEST_CAL_DT/CAL_DT/ed0c3451-593c-494c-9019-64f63fcb0b8e.dict", + "DEFAULT.TEST_KYLIN_FACT/LEAF_CATEG_ID" : "/dict/TEST_CATEGORY_GROUPINGS/LEAF_CATEG_ID/4243889f-bc81-4807-a975-7041bbbf35e7.dict", + "EDW.TEST_SITES/SITE_ID" : "/dict/TEST_SITES/SITE_ID/ff7e8943-ac0f-4e66-b9ed-510f6a0b875d.dict", + "DEFAULT.TEST_CATEGORY_GROUPINGS/META_CATEG_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/aceae914-4246-4251-a0c2-692fe7a300df.dict" }, "snapshots" : { - "TEST_SELLER_TYPE_DIM" : "/table_snapshot/TEST_SELLER_TYPE_DIM.csv/4fe75ccd-9b24-4cdf-ac9d-b4038e947f89.snapshot", - "TEST_CAL_DT" : "/table_snapshot/TEST_CAL_DT.csv/8ff1339e-f804-47f3-b42c-1d4fa4ff0cf7.snapshot", - "TEST_CATEGORY_GROUPINGS" : "/table_snapshot/TEST_CATEGORY_GROUPINGS.csv/e172b442-ae10-447e-9071-c7dbb2bb38cc.snapshot", - "TEST_SITES" : "/table_snapshot/TEST_SITES.csv/28130338-fcf4-429e-91b0-cd8dfd397280.snapshot" + "EDW.TEST_SELLER_TYPE_DIM" : "/table_snapshot/TEST_SELLER_TYPE_DIM.csv/4fe75ccd-9b24-4cdf-ac9d-b4038e947f89.snapshot", + "EDW.TEST_CAL_DT" : "/table_snapshot/TEST_CAL_DT.csv/8ff1339e-f804-47f3-b42c-1d4fa4ff0cf7.snapshot", + "DEFAULT.TEST_CATEGORY_GROUPINGS" : "/table_snapshot/TEST_CATEGORY_GROUPINGS.csv/e172b442-ae10-447e-9071-c7dbb2bb38cc.snapshot", + "EDW.TEST_SITES" : "/table_snapshot/TEST_SITES.csv/28130338-fcf4-429e-91b0-cd8dfd397280.snapshot" } } ], "status" : "DISABLED", diff --git a/examples/test_case_data/localmeta/cube/test_kylin_cube_with_slr_left_join_ready.json b/examples/test_case_data/localmeta/cube/test_kylin_cube_with_slr_left_join_ready.json index 90acf8d..5f15336 100644 --- a/examples/test_case_data/localmeta/cube/test_kylin_cube_with_slr_left_join_ready.json +++ b/examples/test_case_data/localmeta/cube/test_kylin_cube_with_slr_left_join_ready.json @@ -19,22 +19,22 @@ "last_build_job_id" : "bcf2f125-9b0b-40dd-9509-95ec59b31333", "binary_signature" : null, "dictionaries" : { - "TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/c12ae49d-9dbe-4a58-b169-19afac317696.dict", - "TEST_KYLIN_FACT/SLR_SEGMENT_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/14fe66b3-5956-498c-bd93-40182cac5510.dict", - "TEST_KYLIN_FACT/LSTG_SITE_ID" : "/dict/TEST_SITES/SITE_ID/0bec6bb3-1b0d-469c-8289-b8c4ca5d5001.dict", - "TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/2a44ff38-f64b-42e7-9fcf-66afccac8047.dict", - "TEST_KYLIN_FACT/CAL_DT" : "/dict/PREDEFINED/date(yyyy-mm-dd)/64ac4f82-f2af-476e-85b9-f0805001014e.dict", - "TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/eacccee7-d120-4f4d-97d0-c99a5b83ec32.dict", - "TEST_CAL_DT/CAL_DT" : "/dict/TEST_CAL_DT/CAL_DT/ed0c3451-593c-494c-9019-64f63fcb0b8e.dict", - "TEST_KYLIN_FACT/LEAF_CATEG_ID" : "/dict/TEST_CATEGORY_GROUPINGS/LEAF_CATEG_ID/8b4b1c06-fb74-486b-a2ad-74420afebcda.dict", - "TEST_SITES/SITE_ID" : "/dict/TEST_SITES/SITE_ID/ff7e8943-ac0f-4e66-b9ed-510f6a0b875d.dict", - "TEST_CATEGORY_GROUPINGS/META_CATEG_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/c2af25cf-6c79-45e6-a6f6-6d2a8ecc6592.dict" + "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/c12ae49d-9dbe-4a58-b169-19afac317696.dict", + "DEFAULT.TEST_KYLIN_FACT/SLR_SEGMENT_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/14fe66b3-5956-498c-bd93-40182cac5510.dict", + "DEFAULT.TEST_KYLIN_FACT/LSTG_SITE_ID" : "/dict/TEST_SITES/SITE_ID/0bec6bb3-1b0d-469c-8289-b8c4ca5d5001.dict", + "EDW.TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/2a44ff38-f64b-42e7-9fcf-66afccac8047.dict", + "DEFAULT.TEST_KYLIN_FACT/CAL_DT" : "/dict/PREDEFINED/date(yyyy-mm-dd)/64ac4f82-f2af-476e-85b9-f0805001014e.dict", + "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/eacccee7-d120-4f4d-97d0-c99a5b83ec32.dict", + "EDW.TEST_CAL_DT/CAL_DT" : "/dict/TEST_CAL_DT/CAL_DT/ed0c3451-593c-494c-9019-64f63fcb0b8e.dict", + "DEFAULT.TEST_KYLIN_FACT/LEAF_CATEG_ID" : "/dict/TEST_CATEGORY_GROUPINGS/LEAF_CATEG_ID/8b4b1c06-fb74-486b-a2ad-74420afebcda.dict", + "EDW.TEST_SITES/SITE_ID" : "/dict/TEST_SITES/SITE_ID/ff7e8943-ac0f-4e66-b9ed-510f6a0b875d.dict", + "DEFAULT.TEST_CATEGORY_GROUPINGS/META_CATEG_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/c2af25cf-6c79-45e6-a6f6-6d2a8ecc6592.dict" }, "snapshots" : { - "TEST_SELLER_TYPE_DIM" : "/table_snapshot/TEST_SELLER_TYPE_DIM.csv/b43dd3f1-9a34-4721-8abc-df90962e94d8.snapshot", - "TEST_CAL_DT" : "/table_snapshot/TEST_CAL_DT.csv/4af48c94-86de-4e22-a4fd-c49b06cbaa4f.snapshot", - "TEST_CATEGORY_GROUPINGS" : "/table_snapshot/TEST_CATEGORY_GROUPINGS.csv/89715f33-15c9-4745-83f9-f2b9817d9100.snapshot", - "TEST_SITES" : "/table_snapshot/TEST_SITES.csv/7d70b82e-43f6-4999-b012-0e91a9bb8408.snapshot" + "EDW.TEST_SELLER_TYPE_DIM" : "/table_snapshot/TEST_SELLER_TYPE_DIM.csv/b43dd3f1-9a34-4721-8abc-df90962e94d8.snapshot", + "EDW.TEST_CAL_DT" : "/table_snapshot/TEST_CAL_DT.csv/4af48c94-86de-4e22-a4fd-c49b06cbaa4f.snapshot", + "DEFAULT.TEST_CATEGORY_GROUPINGS" : "/table_snapshot/TEST_CATEGORY_GROUPINGS.csv/89715f33-15c9-4745-83f9-f2b9817d9100.snapshot", + "EDW.TEST_SITES" : "/table_snapshot/TEST_SITES.csv/7d70b82e-43f6-4999-b012-0e91a9bb8408.snapshot" } } ], "status" : "READY", diff --git a/examples/test_case_data/localmeta/cube/test_kylin_cube_with_slr_ready.json b/examples/test_case_data/localmeta/cube/test_kylin_cube_with_slr_ready.json index 8b71f9b..2645fab 100644 --- a/examples/test_case_data/localmeta/cube/test_kylin_cube_with_slr_ready.json +++ b/examples/test_case_data/localmeta/cube/test_kylin_cube_with_slr_ready.json @@ -20,22 +20,22 @@ "binary_signature" : null, "dictionaries" : { - "TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/16d8185c-ee6b-4f8c-a919-756d9809f937.dict", - "TEST_KYLIN_FACT/SLR_SEGMENT_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/c6bf9b51-6e90-4337-8082-4e2fdf78307f.dict", - "TEST_KYLIN_FACT/LSTG_SITE_ID" : "/dict/TEST_SITES/SITE_ID/652bd393-678a-4f16-a504-fd8ce1229355.dict", - "TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/2a44ff38-f64b-42e7-9fcf-66afccac8047.dict", - "TEST_KYLIN_FACT/CAL_DT" : "/dict/PREDEFINED/date(yyyy-mm-dd)/64ac4f82-f2af-476e-85b9-f0805001014e.dict", - "TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/ad09f2d5-054a-4e1b-a776-7cc07399a6c1.dict", - "TEST_CAL_DT/CAL_DT" : "/dict/TEST_CAL_DT/CAL_DT/ed0c3451-593c-494c-9019-64f63fcb0b8e.dict", - "TEST_KYLIN_FACT/LEAF_CATEG_ID" : "/dict/TEST_CATEGORY_GROUPINGS/LEAF_CATEG_ID/4243889f-bc81-4807-a975-7041bbbf35e7.dict", - "TEST_SITES/SITE_ID" : "/dict/TEST_SITES/SITE_ID/ff7e8943-ac0f-4e66-b9ed-510f6a0b875d.dict", - "TEST_CATEGORY_GROUPINGS/META_CATEG_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/aceae914-4246-4251-a0c2-692fe7a300df.dict" + "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/16d8185c-ee6b-4f8c-a919-756d9809f937.dict", + "DEFAULT.TEST_KYLIN_FACT/SLR_SEGMENT_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/c6bf9b51-6e90-4337-8082-4e2fdf78307f.dict", + "DEFAULT.TEST_KYLIN_FACT/LSTG_SITE_ID" : "/dict/TEST_SITES/SITE_ID/652bd393-678a-4f16-a504-fd8ce1229355.dict", + "EDW.TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/2a44ff38-f64b-42e7-9fcf-66afccac8047.dict", + "DEFAULT.TEST_KYLIN_FACT/CAL_DT" : "/dict/PREDEFINED/date(yyyy-mm-dd)/64ac4f82-f2af-476e-85b9-f0805001014e.dict", + "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/ad09f2d5-054a-4e1b-a776-7cc07399a6c1.dict", + "EDW.TEST_CAL_DT/CAL_DT" : "/dict/TEST_CAL_DT/CAL_DT/ed0c3451-593c-494c-9019-64f63fcb0b8e.dict", + "DEFAULT.TEST_KYLIN_FACT/LEAF_CATEG_ID" : "/dict/TEST_CATEGORY_GROUPINGS/LEAF_CATEG_ID/4243889f-bc81-4807-a975-7041bbbf35e7.dict", + "EDW.TEST_SITES/SITE_ID" : "/dict/TEST_SITES/SITE_ID/ff7e8943-ac0f-4e66-b9ed-510f6a0b875d.dict", + "DEFAULT.TEST_CATEGORY_GROUPINGS/META_CATEG_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/aceae914-4246-4251-a0c2-692fe7a300df.dict" }, "snapshots" : { - "TEST_SELLER_TYPE_DIM" : "/table_snapshot/TEST_SELLER_TYPE_DIM.csv/4fe75ccd-9b24-4cdf-ac9d-b4038e947f89.snapshot", - "TEST_CAL_DT" : "/table_snapshot/TEST_CAL_DT.csv/8ff1339e-f804-47f3-b42c-1d4fa4ff0cf7.snapshot", - "TEST_CATEGORY_GROUPINGS" : "/table_snapshot/TEST_CATEGORY_GROUPINGS.csv/e172b442-ae10-447e-9071-c7dbb2bb38cc.snapshot", - "TEST_SITES" : "/table_snapshot/TEST_SITES.csv/28130338-fcf4-429e-91b0-cd8dfd397280.snapshot" + "EDW.TEST_SELLER_TYPE_DIM" : "/table_snapshot/TEST_SELLER_TYPE_DIM.csv/4fe75ccd-9b24-4cdf-ac9d-b4038e947f89.snapshot", + "EDW.TEST_CAL_DT" : "/table_snapshot/TEST_CAL_DT.csv/8ff1339e-f804-47f3-b42c-1d4fa4ff0cf7.snapshot", + "DEFAULT.TEST_CATEGORY_GROUPINGS" : "/table_snapshot/TEST_CATEGORY_GROUPINGS.csv/e172b442-ae10-447e-9071-c7dbb2bb38cc.snapshot", + "EDW.TEST_SITES" : "/table_snapshot/TEST_SITES.csv/28130338-fcf4-429e-91b0-cd8dfd397280.snapshot" } } ], diff --git a/examples/test_case_data/localmeta/cube/test_kylin_cube_with_slr_ready_2_segments.json b/examples/test_case_data/localmeta/cube/test_kylin_cube_with_slr_ready_2_segments.json index dba3bb2..0700449 100644 --- a/examples/test_case_data/localmeta/cube/test_kylin_cube_with_slr_ready_2_segments.json +++ b/examples/test_case_data/localmeta/cube/test_kylin_cube_with_slr_ready_2_segments.json @@ -19,22 +19,22 @@ "last_build_job_id" : "f24668f6-dcff-4cb6-a89b-77f1119df8fa", "binary_signature" : null, "dictionaries" : { - "TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/16d8185c-ee6b-4f8c-a919-756d9809f937.dict", - "TEST_KYLIN_FACT/SLR_SEGMENT_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/c6bf9b51-6e90-4337-8082-4e2fdf78307f.dict", - "TEST_KYLIN_FACT/LSTG_SITE_ID" : "/dict/TEST_SITES/SITE_ID/652bd393-678a-4f16-a504-fd8ce1229355.dict", - "TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/2a44ff38-f64b-42e7-9fcf-66afccac8047.dict", - "TEST_KYLIN_FACT/CAL_DT" : "/dict/PREDEFINED/date(yyyy-mm-dd)/64ac4f82-f2af-476e-85b9-f0805001014e.dict", - "TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/ad09f2d5-054a-4e1b-a776-7cc07399a6c1.dict", - "TEST_CAL_DT/CAL_DT" : "/dict/TEST_CAL_DT/CAL_DT/ed0c3451-593c-494c-9019-64f63fcb0b8e.dict", - "TEST_KYLIN_FACT/LEAF_CATEG_ID" : "/dict/TEST_CATEGORY_GROUPINGS/LEAF_CATEG_ID/4243889f-bc81-4807-a975-7041bbbf35e7.dict", - "TEST_SITES/SITE_ID" : "/dict/TEST_SITES/SITE_ID/ff7e8943-ac0f-4e66-b9ed-510f6a0b875d.dict", - "TEST_CATEGORY_GROUPINGS/META_CATEG_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/aceae914-4246-4251-a0c2-692fe7a300df.dict" + "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/16d8185c-ee6b-4f8c-a919-756d9809f937.dict", + "DEFAULT.TEST_KYLIN_FACT/SLR_SEGMENT_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/c6bf9b51-6e90-4337-8082-4e2fdf78307f.dict", + "DEFAULT.TEST_KYLIN_FACT/LSTG_SITE_ID" : "/dict/TEST_SITES/SITE_ID/652bd393-678a-4f16-a504-fd8ce1229355.dict", + "EDW.TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/2a44ff38-f64b-42e7-9fcf-66afccac8047.dict", + "DEFAULT.TEST_KYLIN_FACT/CAL_DT" : "/dict/PREDEFINED/date(yyyy-mm-dd)/64ac4f82-f2af-476e-85b9-f0805001014e.dict", + "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/ad09f2d5-054a-4e1b-a776-7cc07399a6c1.dict", + "EDW.TEST_CAL_DT/CAL_DT" : "/dict/TEST_CAL_DT/CAL_DT/ed0c3451-593c-494c-9019-64f63fcb0b8e.dict", + "DEFAULT.TEST_KYLIN_FACT/LEAF_CATEG_ID" : "/dict/TEST_CATEGORY_GROUPINGS/LEAF_CATEG_ID/4243889f-bc81-4807-a975-7041bbbf35e7.dict", + "EDW.TEST_SITES/SITE_ID" : "/dict/TEST_SITES/SITE_ID/ff7e8943-ac0f-4e66-b9ed-510f6a0b875d.dict", + "DEFAULT.TEST_CATEGORY_GROUPINGS/META_CATEG_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/aceae914-4246-4251-a0c2-692fe7a300df.dict" }, "snapshots" : { - "TEST_SELLER_TYPE_DIM" : "/table_snapshot/TEST_SELLER_TYPE_DIM.csv/4fe75ccd-9b24-4cdf-ac9d-b4038e947f89.snapshot", - "TEST_CAL_DT" : "/table_snapshot/TEST_CAL_DT.csv/8ff1339e-f804-47f3-b42c-1d4fa4ff0cf7.snapshot", - "TEST_CATEGORY_GROUPINGS" : "/table_snapshot/TEST_CATEGORY_GROUPINGS.csv/e172b442-ae10-447e-9071-c7dbb2bb38cc.snapshot", - "TEST_SITES" : "/table_snapshot/TEST_SITES.csv/28130338-fcf4-429e-91b0-cd8dfd397280.snapshot" + "EDW.TEST_SELLER_TYPE_DIM" : "/table_snapshot/TEST_SELLER_TYPE_DIM.csv/4fe75ccd-9b24-4cdf-ac9d-b4038e947f89.snapshot", + "EDW.TEST_CAL_DT" : "/table_snapshot/TEST_CAL_DT.csv/8ff1339e-f804-47f3-b42c-1d4fa4ff0cf7.snapshot", + "DEFAULT.TEST_CATEGORY_GROUPINGS" : "/table_snapshot/TEST_CATEGORY_GROUPINGS.csv/e172b442-ae10-447e-9071-c7dbb2bb38cc.snapshot", + "EDW.TEST_SITES" : "/table_snapshot/TEST_SITES.csv/28130338-fcf4-429e-91b0-cd8dfd397280.snapshot" } }, { "name" : "20131112000000_20131212000000", @@ -49,22 +49,22 @@ "last_build_job_id" : "f24668f6-dcff-4cb6-a89b-77f1119df8fb", "binary_signature" : null, "dictionaries" : { - "TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/16d8185c-ee6b-4f8c-a919-756d9809f937.dict", - "TEST_KYLIN_FACT/SLR_SEGMENT_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/c6bf9b51-6e90-4337-8082-4e2fdf78307f.dict", - "TEST_KYLIN_FACT/LSTG_SITE_ID" : "/dict/TEST_SITES/SITE_ID/652bd393-678a-4f16-a504-fd8ce1229355.dict", - "TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/2a44ff38-f64b-42e7-9fcf-66afccac8047.dict", - "TEST_KYLIN_FACT/CAL_DT" : "/dict/PREDEFINED/date(yyyy-mm-dd)/64ac4f82-f2af-476e-85b9-f0805001014e.dict", - "TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/ad09f2d5-054a-4e1b-a776-7cc07399a6c1.dict", - "TEST_CAL_DT/CAL_DT" : "/dict/TEST_CAL_DT/CAL_DT/ed0c3451-593c-494c-9019-64f63fcb0b8e.dict", - "TEST_KYLIN_FACT/LEAF_CATEG_ID" : "/dict/TEST_CATEGORY_GROUPINGS/LEAF_CATEG_ID/4243889f-bc81-4807-a975-7041bbbf35e7.dict", - "TEST_SITES/SITE_ID" : "/dict/TEST_SITES/SITE_ID/ff7e8943-ac0f-4e66-b9ed-510f6a0b875d.dict", - "TEST_CATEGORY_GROUPINGS/META_CATEG_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/aceae914-4246-4251-a0c2-692fe7a300df.dict" + "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/16d8185c-ee6b-4f8c-a919-756d9809f937.dict", + "DEFAULT.TEST_KYLIN_FACT/SLR_SEGMENT_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/c6bf9b51-6e90-4337-8082-4e2fdf78307f.dict", + "DEFAULT.TEST_KYLIN_FACT/LSTG_SITE_ID" : "/dict/TEST_SITES/SITE_ID/652bd393-678a-4f16-a504-fd8ce1229355.dict", + "EDW.TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/2a44ff38-f64b-42e7-9fcf-66afccac8047.dict", + "DEFAULT.TEST_KYLIN_FACT/CAL_DT" : "/dict/PREDEFINED/date(yyyy-mm-dd)/64ac4f82-f2af-476e-85b9-f0805001014e.dict", + "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/ad09f2d5-054a-4e1b-a776-7cc07399a6c1.dict", + "EDW.TEST_CAL_DT/CAL_DT" : "/dict/TEST_CAL_DT/CAL_DT/ed0c3451-593c-494c-9019-64f63fcb0b8e.dict", + "DEFAULT.TEST_KYLIN_FACT/LEAF_CATEG_ID" : "/dict/TEST_CATEGORY_GROUPINGS/LEAF_CATEG_ID/4243889f-bc81-4807-a975-7041bbbf35e7.dict", + "EDW.TEST_SITES/SITE_ID" : "/dict/TEST_SITES/SITE_ID/ff7e8943-ac0f-4e66-b9ed-510f6a0b875d.dict", + "DEFAULT.TEST_CATEGORY_GROUPINGS/META_CATEG_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/aceae914-4246-4251-a0c2-692fe7a300df.dict" }, "snapshots" : { - "TEST_SELLER_TYPE_DIM" : "/table_snapshot/TEST_SELLER_TYPE_DIM.csv/4fe75ccd-9b24-4cdf-ac9d-b4038e947f89.snapshot", - "TEST_CAL_DT" : "/table_snapshot/TEST_CAL_DT.csv/8ff1339e-f804-47f3-b42c-1d4fa4ff0cf7.snapshot", - "TEST_CATEGORY_GROUPINGS" : "/table_snapshot/TEST_CATEGORY_GROUPINGS.csv/e172b442-ae10-447e-9071-c7dbb2bb38cc.snapshot", - "TEST_SITES" : "/table_snapshot/TEST_SITES.csv/28130338-fcf4-429e-91b0-cd8dfd397280.snapshot" + "EDW.TEST_SELLER_TYPE_DIM" : "/table_snapshot/TEST_SELLER_TYPE_DIM.csv/4fe75ccd-9b24-4cdf-ac9d-b4038e947f89.snapshot", + "EDW.TEST_CAL_DT" : "/table_snapshot/TEST_CAL_DT.csv/8ff1339e-f804-47f3-b42c-1d4fa4ff0cf7.snapshot", + "DEFAULT.TEST_CATEGORY_GROUPINGS" : "/table_snapshot/TEST_CATEGORY_GROUPINGS.csv/e172b442-ae10-447e-9071-c7dbb2bb38cc.snapshot", + "EDW.TEST_SITES" : "/table_snapshot/TEST_SITES.csv/28130338-fcf4-429e-91b0-cd8dfd397280.snapshot" } } ], "status" : "READY", diff --git a/examples/test_case_data/localmeta/cube/test_kylin_cube_without_slr_left_join_ready.json b/examples/test_case_data/localmeta/cube/test_kylin_cube_without_slr_left_join_ready.json index c84a0bd..d142700 100644 --- a/examples/test_case_data/localmeta/cube/test_kylin_cube_without_slr_left_join_ready.json +++ b/examples/test_case_data/localmeta/cube/test_kylin_cube_without_slr_left_join_ready.json @@ -19,22 +19,22 @@ "last_build_job_id" : "1ef30c45-17a4-4350-a032-a33b3b25e5b8", "binary_signature" : null, "dictionaries" : { - "TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/eaed91b0-4182-4ee5-a733-1047a622ee29.dict", - "TEST_KYLIN_FACT/SLR_SEGMENT_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/14fe66b3-5956-498c-bd93-40182cac5510.dict", - "TEST_KYLIN_FACT/LSTG_SITE_ID" : "/dict/TEST_SITES/SITE_ID/0bec6bb3-1b0d-469c-8289-b8c4ca5d5001.dict", - "TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/2a44ff38-f64b-42e7-9fcf-66afccac8047.dict", - "TEST_KYLIN_FACT/CAL_DT" : "/dict/PREDEFINED/date(yyyy-mm-dd)/64ac4f82-f2af-476e-85b9-f0805001014e.dict", - "TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/8f92faa4-7d2d-455c-8623-6e1d1b272afe.dict", - "TEST_CAL_DT/CAL_DT" : "/dict/TEST_CAL_DT/CAL_DT/aa634e3e-22d3-4cc2-9de5-085e9ac35c1f.dict", - "TEST_KYLIN_FACT/LEAF_CATEG_ID" : "/dict/TEST_CATEGORY_GROUPINGS/LEAF_CATEG_ID/2602386c-debb-4968-8d2f-b52b8215e385.dict", - "TEST_SITES/SITE_ID" : "/dict/TEST_SITES/SITE_ID/ff7e8943-ac0f-4e66-b9ed-510f6a0b875d.dict", - "TEST_CATEGORY_GROUPINGS/META_CATEG_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/0410d2c4-4686-40bc-ba14-170042a2de94.dict" + "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/eaed91b0-4182-4ee5-a733-1047a622ee29.dict", + "DEFAULT.TEST_KYLIN_FACT/SLR_SEGMENT_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/14fe66b3-5956-498c-bd93-40182cac5510.dict", + "DEFAULT.TEST_KYLIN_FACT/LSTG_SITE_ID" : "/dict/TEST_SITES/SITE_ID/0bec6bb3-1b0d-469c-8289-b8c4ca5d5001.dict", + "EDW.TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/2a44ff38-f64b-42e7-9fcf-66afccac8047.dict", + "DEFAULT.TEST_KYLIN_FACT/CAL_DT" : "/dict/PREDEFINED/date(yyyy-mm-dd)/64ac4f82-f2af-476e-85b9-f0805001014e.dict", + "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/8f92faa4-7d2d-455c-8623-6e1d1b272afe.dict", + "EDW.TEST_CAL_DT/CAL_DT" : "/dict/TEST_CAL_DT/CAL_DT/aa634e3e-22d3-4cc2-9de5-085e9ac35c1f.dict", + "DEFAULT.TEST_KYLIN_FACT/LEAF_CATEG_ID" : "/dict/TEST_CATEGORY_GROUPINGS/LEAF_CATEG_ID/2602386c-debb-4968-8d2f-b52b8215e385.dict", + "EDW.TEST_SITES/SITE_ID" : "/dict/TEST_SITES/SITE_ID/ff7e8943-ac0f-4e66-b9ed-510f6a0b875d.dict", + "DEFAULT.TEST_CATEGORY_GROUPINGS/META_CATEG_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/0410d2c4-4686-40bc-ba14-170042a2de94.dict" }, "snapshots" : { - "TEST_SELLER_TYPE_DIM" : "/table_snapshot/TEST_SELLER_TYPE_DIM.csv/b43dd3f1-9a34-4721-8abc-df90962e94d8.snapshot", - "TEST_CAL_DT" : "/table_snapshot/TEST_CAL_DT.csv/e5f004b5-0be1-4ccf-8950-20f8f86c1999.snapshot", - "TEST_CATEGORY_GROUPINGS" : "/table_snapshot/TEST_CATEGORY_GROUPINGS.csv/89715f33-15c9-4745-83f9-f2b9817d9100.snapshot", - "TEST_SITES" : "/table_snapshot/TEST_SITES.csv/7d70b82e-43f6-4999-b012-0e91a9bb8408.snapshot" + "EDW.TEST_SELLER_TYPE_DIM" : "/table_snapshot/TEST_SELLER_TYPE_DIM.csv/b43dd3f1-9a34-4721-8abc-df90962e94d8.snapshot", + "EDW.TEST_CAL_DT" : "/table_snapshot/TEST_CAL_DT.csv/e5f004b5-0be1-4ccf-8950-20f8f86c1999.snapshot", + "DEFAULT.TEST_CATEGORY_GROUPINGS" : "/table_snapshot/TEST_CATEGORY_GROUPINGS.csv/89715f33-15c9-4745-83f9-f2b9817d9100.snapshot", + "EDW.TEST_SITES" : "/table_snapshot/TEST_SITES.csv/7d70b82e-43f6-4999-b012-0e91a9bb8408.snapshot" } } ], "status" : "READY", diff --git a/examples/test_case_data/localmeta/cube/test_kylin_cube_without_slr_left_join_ready_2_segments.json b/examples/test_case_data/localmeta/cube/test_kylin_cube_without_slr_left_join_ready_2_segments.json index 39a2dab..fdaf229 100644 --- a/examples/test_case_data/localmeta/cube/test_kylin_cube_without_slr_left_join_ready_2_segments.json +++ b/examples/test_case_data/localmeta/cube/test_kylin_cube_without_slr_left_join_ready_2_segments.json @@ -19,22 +19,22 @@ "last_build_job_id" : "f24668f6-dcff-4cb6-a89b-77f1119df8fa", "binary_signature" : null, "dictionaries" : { - "TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/16d8185c-ee6b-4f8c-a919-756d9809f937.dict", - "TEST_KYLIN_FACT/SLR_SEGMENT_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/c6bf9b51-6e90-4337-8082-4e2fdf78307f.dict", - "TEST_KYLIN_FACT/LSTG_SITE_ID" : "/dict/TEST_SITES/SITE_ID/652bd393-678a-4f16-a504-fd8ce1229355.dict", - "TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/2a44ff38-f64b-42e7-9fcf-66afccac8047.dict", - "TEST_KYLIN_FACT/CAL_DT" : "/dict/PREDEFINED/date(yyyy-mm-dd)/64ac4f82-f2af-476e-85b9-f0805001014e.dict", - "TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/ad09f2d5-054a-4e1b-a776-7cc07399a6c1.dict", - "TEST_CAL_DT/CAL_DT" : "/dict/TEST_CAL_DT/CAL_DT/ed0c3451-593c-494c-9019-64f63fcb0b8e.dict", - "TEST_KYLIN_FACT/LEAF_CATEG_ID" : "/dict/TEST_CATEGORY_GROUPINGS/LEAF_CATEG_ID/4243889f-bc81-4807-a975-7041bbbf35e7.dict", - "TEST_SITES/SITE_ID" : "/dict/TEST_SITES/SITE_ID/ff7e8943-ac0f-4e66-b9ed-510f6a0b875d.dict", - "TEST_CATEGORY_GROUPINGS/META_CATEG_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/aceae914-4246-4251-a0c2-692fe7a300df.dict" + "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/16d8185c-ee6b-4f8c-a919-756d9809f937.dict", + "DEFAULT.TEST_KYLIN_FACT/SLR_SEGMENT_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/c6bf9b51-6e90-4337-8082-4e2fdf78307f.dict", + "DEFAULT.TEST_KYLIN_FACT/LSTG_SITE_ID" : "/dict/TEST_SITES/SITE_ID/652bd393-678a-4f16-a504-fd8ce1229355.dict", + "EDW.TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/2a44ff38-f64b-42e7-9fcf-66afccac8047.dict", + "DEFAULT.TEST_KYLIN_FACT/CAL_DT" : "/dict/PREDEFINED/date(yyyy-mm-dd)/64ac4f82-f2af-476e-85b9-f0805001014e.dict", + "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/ad09f2d5-054a-4e1b-a776-7cc07399a6c1.dict", + "EDW.TEST_CAL_DT/CAL_DT" : "/dict/TEST_CAL_DT/CAL_DT/ed0c3451-593c-494c-9019-64f63fcb0b8e.dict", + "DEFAULT.TEST_KYLIN_FACT/LEAF_CATEG_ID" : "/dict/TEST_CATEGORY_GROUPINGS/LEAF_CATEG_ID/4243889f-bc81-4807-a975-7041bbbf35e7.dict", + "EDW.TEST_SITES/SITE_ID" : "/dict/TEST_SITES/SITE_ID/ff7e8943-ac0f-4e66-b9ed-510f6a0b875d.dict", + "DEFAULT.TEST_CATEGORY_GROUPINGS/META_CATEG_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/aceae914-4246-4251-a0c2-692fe7a300df.dict" }, "snapshots" : { - "TEST_SELLER_TYPE_DIM" : "/table_snapshot/TEST_SELLER_TYPE_DIM.csv/4fe75ccd-9b24-4cdf-ac9d-b4038e947f89.snapshot", - "TEST_CAL_DT" : "/table_snapshot/TEST_CAL_DT.csv/8ff1339e-f804-47f3-b42c-1d4fa4ff0cf7.snapshot", - "TEST_CATEGORY_GROUPINGS" : "/table_snapshot/TEST_CATEGORY_GROUPINGS.csv/e172b442-ae10-447e-9071-c7dbb2bb38cc.snapshot", - "TEST_SITES" : "/table_snapshot/TEST_SITES.csv/28130338-fcf4-429e-91b0-cd8dfd397280.snapshot" + "EDW.TEST_SELLER_TYPE_DIM" : "/table_snapshot/TEST_SELLER_TYPE_DIM.csv/4fe75ccd-9b24-4cdf-ac9d-b4038e947f89.snapshot", + "EDW.TEST_CAL_DT" : "/table_snapshot/TEST_CAL_DT.csv/8ff1339e-f804-47f3-b42c-1d4fa4ff0cf7.snapshot", + "DEFAULT.TEST_CATEGORY_GROUPINGS" : "/table_snapshot/TEST_CATEGORY_GROUPINGS.csv/e172b442-ae10-447e-9071-c7dbb2bb38cc.snapshot", + "EDW.TEST_SITES" : "/table_snapshot/TEST_SITES.csv/28130338-fcf4-429e-91b0-cd8dfd397280.snapshot" } }, { "name" : "20131112000000_20131212000000", @@ -49,21 +49,21 @@ "last_build_job_id" : "f24668f6-dcff-4cb6-a89b-77f1119df8fb", "binary_signature" : null, "dictionaries" : { - "TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/16d8185c-ee6b-4f8c-a919-756d9809f937.dict", - "TEST_KYLIN_FACT/SLR_SEGMENT_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/c6bf9b51-6e90-4337-8082-4e2fdf78307f.dict", - "TEST_KYLIN_FACT/LSTG_SITE_ID" : "/dict/TEST_SITES/SITE_ID/652bd393-678a-4f16-a504-fd8ce1229355.dict", - "TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/2a44ff38-f64b-42e7-9fcf-66afccac8047.dict", - "TEST_KYLIN_FACT/CAL_DT" : "/dict/PREDEFINED/date(yyyy-mm-dd)/64ac4f82-f2af-476e-85b9-f0805001014e.dict", - "TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/ad09f2d5-054a-4e1b-a776-7cc07399a6c1.dict", - "TEST_CAL_DT/CAL_DT" : "/dict/TEST_CAL_DT/CAL_DT/ed0c3451-593c-494c-9019-64f63fcb0b8e.dict", - "TEST_KYLIN_FACT/LEAF_CATEG_ID" : "/dict/TEST_CATEGORY_GROUPINGS/LEAF_CATEG_ID/4243889f-bc81-4807-a975-7041bbbf35e7.dict", + "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/16d8185c-ee6b-4f8c-a919-756d9809f937.dict", + "DEFAULT.TEST_KYLIN_FACT/SLR_SEGMENT_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/c6bf9b51-6e90-4337-8082-4e2fdf78307f.dict", + "DEFAULT.TEST_KYLIN_FACT/LSTG_SITE_ID" : "/dict/TEST_SITES/SITE_ID/652bd393-678a-4f16-a504-fd8ce1229355.dict", + "EDW.TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/2a44ff38-f64b-42e7-9fcf-66afccac8047.dict", + "DEFAULT.TEST_KYLIN_FACT/CAL_DT" : "/dict/PREDEFINED/date(yyyy-mm-dd)/64ac4f82-f2af-476e-85b9-f0805001014e.dict", + "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/ad09f2d5-054a-4e1b-a776-7cc07399a6c1.dict", + "EDW.TEST_CAL_DT/CAL_DT" : "/dict/TEST_CAL_DT/CAL_DT/ed0c3451-593c-494c-9019-64f63fcb0b8e.dict", + "DEFAULT.TEST_KYLIN_FACT/LEAF_CATEG_ID" : "/dict/TEST_CATEGORY_GROUPINGS/LEAF_CATEG_ID/4243889f-bc81-4807-a975-7041bbbf35e7.dict", "TEST_SITES/SITE_ID" : "/dict/TEST_SITES/SITE_ID/ff7e8943-ac0f-4e66-b9ed-510f6a0b875d.dict", - "TEST_CATEGORY_GROUPINGS/META_CATEG_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/aceae914-4246-4251-a0c2-692fe7a300df.dict" + "DEFAULT.TEST_CATEGORY_GROUPINGS/META_CATEG_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/aceae914-4246-4251-a0c2-692fe7a300df.dict" }, "snapshots" : { - "TEST_SELLER_TYPE_DIM" : "/table_snapshot/TEST_SELLER_TYPE_DIM.csv/4fe75ccd-9b24-4cdf-ac9d-b4038e947f89.snapshot", - "TEST_CAL_DT" : "/table_snapshot/TEST_CAL_DT.csv/8ff1339e-f804-47f3-b42c-1d4fa4ff0cf7.snapshot", - "TEST_CATEGORY_GROUPINGS" : "/table_snapshot/TEST_CATEGORY_GROUPINGS.csv/e172b442-ae10-447e-9071-c7dbb2bb38cc.snapshot", + "EDW.TEST_SELLER_TYPE_DIM" : "/table_snapshot/TEST_SELLER_TYPE_DIM.csv/4fe75ccd-9b24-4cdf-ac9d-b4038e947f89.snapshot", + "EDW.TEST_CAL_DT" : "/table_snapshot/TEST_CAL_DT.csv/8ff1339e-f804-47f3-b42c-1d4fa4ff0cf7.snapshot", + "DEFAULT.TEST_CATEGORY_GROUPINGS" : "/table_snapshot/TEST_CATEGORY_GROUPINGS.csv/e172b442-ae10-447e-9071-c7dbb2bb38cc.snapshot", "TEST_SITES" : "/table_snapshot/TEST_SITES.csv/28130338-fcf4-429e-91b0-cd8dfd397280.snapshot" } } ], diff --git a/examples/test_case_data/localmeta/cube/test_kylin_cube_without_slr_ready.json b/examples/test_case_data/localmeta/cube/test_kylin_cube_without_slr_ready.json index ec88d1a..1995585 100644 --- a/examples/test_case_data/localmeta/cube/test_kylin_cube_without_slr_ready.json +++ b/examples/test_case_data/localmeta/cube/test_kylin_cube_without_slr_ready.json @@ -19,22 +19,22 @@ "last_build_job_id" : "619d9b4a-da56-48ca-9c58-29dc8323b200", "binary_signature" : null, "dictionaries" : { - "TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/16d8185c-ee6b-4f8c-a919-756d9809f937.dict", - "TEST_KYLIN_FACT/SLR_SEGMENT_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/c6bf9b51-6e90-4337-8082-4e2fdf78307f.dict", - "TEST_KYLIN_FACT/LSTG_SITE_ID" : "/dict/TEST_SITES/SITE_ID/652bd393-678a-4f16-a504-fd8ce1229355.dict", - "TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/2a44ff38-f64b-42e7-9fcf-66afccac8047.dict", - "TEST_KYLIN_FACT/CAL_DT" : "/dict/PREDEFINED/date(yyyy-mm-dd)/64ac4f82-f2af-476e-85b9-f0805001014e.dict", - "TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/ad09f2d5-054a-4e1b-a776-7cc07399a6c1.dict", - "TEST_CAL_DT/CAL_DT" : "/dict/TEST_CAL_DT/CAL_DT/aa634e3e-22d3-4cc2-9de5-085e9ac35c1f.dict", - "TEST_KYLIN_FACT/LEAF_CATEG_ID" : "/dict/TEST_CATEGORY_GROUPINGS/LEAF_CATEG_ID/494683c1-52d1-4d9a-a3f7-8c53b30fd898.dict", - "TEST_SITES/SITE_ID" : "/dict/TEST_SITES/SITE_ID/ff7e8943-ac0f-4e66-b9ed-510f6a0b875d.dict", - "TEST_CATEGORY_GROUPINGS/META_CATEG_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/b298089f-9656-4693-b9b2-8fea46f06dd5.dict" + "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL2_NAME/16d8185c-ee6b-4f8c-a919-756d9809f937.dict", + "DEFAULT.TEST_KYLIN_FACT/SLR_SEGMENT_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/c6bf9b51-6e90-4337-8082-4e2fdf78307f.dict", + "DEFAULT.TEST_KYLIN_FACT/LSTG_SITE_ID" : "/dict/TEST_SITES/SITE_ID/652bd393-678a-4f16-a504-fd8ce1229355.dict", + "EDW.TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD" : "/dict/TEST_SELLER_TYPE_DIM/SELLER_TYPE_CD/2a44ff38-f64b-42e7-9fcf-66afccac8047.dict", + "DEFAULT.TEST_KYLIN_FACT/CAL_DT" : "/dict/PREDEFINED/date(yyyy-mm-dd)/64ac4f82-f2af-476e-85b9-f0805001014e.dict", + "DEFAULT.TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/CATEG_LVL3_NAME/ad09f2d5-054a-4e1b-a776-7cc07399a6c1.dict", + "EDW.TEST_CAL_DT/CAL_DT" : "/dict/TEST_CAL_DT/CAL_DT/aa634e3e-22d3-4cc2-9de5-085e9ac35c1f.dict", + "DEFAULT.TEST_KYLIN_FACT/LEAF_CATEG_ID" : "/dict/TEST_CATEGORY_GROUPINGS/LEAF_CATEG_ID/494683c1-52d1-4d9a-a3f7-8c53b30fd898.dict", + "EDW.TEST_SITES/SITE_ID" : "/dict/TEST_SITES/SITE_ID/ff7e8943-ac0f-4e66-b9ed-510f6a0b875d.dict", + "DEFAULT.TEST_CATEGORY_GROUPINGS/META_CATEG_NAME" : "/dict/TEST_CATEGORY_GROUPINGS/META_CATEG_NAME/b298089f-9656-4693-b9b2-8fea46f06dd5.dict" }, "snapshots" : { - "TEST_SELLER_TYPE_DIM" : "/table_snapshot/TEST_SELLER_TYPE_DIM.csv/4fe75ccd-9b24-4cdf-ac9d-b4038e947f89.snapshot", - "TEST_CAL_DT" : "/table_snapshot/TEST_CAL_DT.csv/9a1fbc0d-8790-4f32-99e1-7c60a9d124d4.snapshot", - "TEST_CATEGORY_GROUPINGS" : "/table_snapshot/TEST_CATEGORY_GROUPINGS.csv/e172b442-ae10-447e-9071-c7dbb2bb38cc.snapshot", - "TEST_SITES" : "/table_snapshot/TEST_SITES.csv/28130338-fcf4-429e-91b0-cd8dfd397280.snapshot" + "EDW.TEST_SELLER_TYPE_DIM" : "/table_snapshot/TEST_SELLER_TYPE_DIM.csv/4fe75ccd-9b24-4cdf-ac9d-b4038e947f89.snapshot", + "EDW.TEST_CAL_DT" : "/table_snapshot/TEST_CAL_DT.csv/9a1fbc0d-8790-4f32-99e1-7c60a9d124d4.snapshot", + "DEFAULT.TEST_CATEGORY_GROUPINGS" : "/table_snapshot/TEST_CATEGORY_GROUPINGS.csv/e172b442-ae10-447e-9071-c7dbb2bb38cc.snapshot", + "EDW.TEST_SITES" : "/table_snapshot/TEST_SITES.csv/28130338-fcf4-429e-91b0-cd8dfd397280.snapshot" } } ], "status" : "READY", From ed94db4849c196e1b7239fe48d48e27e3ddcae6b Mon Sep 17 00:00:00 2001 From: shaofengshi Date: Mon, 8 Dec 2014 13:09:58 +0800 Subject: [PATCH 56/65] =?UTF-8?q?Update=20test=20cases=20(for=20tables=20t?= =?UTF-8?q?hat=20not=20in=20=E2=80=98default=E2=80=99=20schema).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/kylinolap/cube/project/ProjectManagerTest.java | 10 +++++----- .../main/java/com/kylinolap/metadata/model/TableDesc.java | 13 ++++++++++++- .../src/test/java/com/kylinolap/query/test/H2Database.java | 6 +++++- .../test/java/com/kylinolap/query/test/KylinQueryTest.java | 6 +++--- query/src/test/resources/query/h2/query09.sql | 2 +- query/src/test/resources/query/h2/query10.sql | 2 +- query/src/test/resources/query/sql/query09.sql | 2 +- query/src/test/resources/query/sql/query10.sql | 2 +- query/src/test/resources/query/sql/query11.sql | 2 +- query/src/test/resources/query/sql/query12.sql | 2 +- query/src/test/resources/query/sql/query13.sql | 2 +- query/src/test/resources/query/sql/query14.sql | 2 +- query/src/test/resources/query/sql/query15.sql | 2 +- query/src/test/resources/query/sql/query16.sql | 2 +- query/src/test/resources/query/sql/query17.sql | 2 +- query/src/test/resources/query/sql/query18.sql | 2 +- query/src/test/resources/query/sql/query19.sql | 2 +- query/src/test/resources/query/sql/query20.sql | 2 +- query/src/test/resources/query/sql/query21.sql | 4 ++-- query/src/test/resources/query/sql/query22.sql | 4 ++-- query/src/test/resources/query/sql/query23.sql | 4 ++-- query/src/test/resources/query/sql/query24.sql | 6 +++--- query/src/test/resources/query/sql/query25.sql | 6 +++--- query/src/test/resources/query/sql/query26.sql | 6 +++--- query/src/test/resources/query/sql/query27.sql | 6 +++--- query/src/test/resources/query/sql/query28.sql | 6 +++--- query/src/test/resources/query/sql/query29.sql | 2 +- query/src/test/resources/query/sql/query31.sql | 4 ++-- query/src/test/resources/query/sql/query32.sql | 4 ++-- query/src/test/resources/query/sql/query33.sql | 4 ++-- query/src/test/resources/query/sql/query34.sql | 4 ++-- query/src/test/resources/query/sql/query35.sql | 4 ++-- query/src/test/resources/query/sql/query36.sql | 4 ++-- query/src/test/resources/query/sql/query37.sql | 2 +- query/src/test/resources/query/sql/query42.sql | 2 +- query/src/test/resources/query/sql/query43.sql | 2 +- query/src/test/resources/query/sql/query45.sql | 2 +- query/src/test/resources/query/sql/query47.sql | 2 +- query/src/test/resources/query/sql/query48.sql | 2 +- query/src/test/resources/query/sql/query49.sql | 2 +- query/src/test/resources/query/sql/query50.sql | 2 +- query/src/test/resources/query/sql/query51.sql | 2 +- query/src/test/resources/query/sql/query54.sql | 2 +- query/src/test/resources/query/sql/query55.sql | 2 +- query/src/test/resources/query/sql/query56.sql | 2 +- query/src/test/resources/query/sql/query57.sql | 2 +- query/src/test/resources/query/sql/query58.sql | 2 +- query/src/test/resources/query/sql/query60.sql | 2 +- query/src/test/resources/query/sql/query61.sql | 2 +- query/src/test/resources/query/sql/query66.sql | 2 +- query/src/test/resources/query/sql/query72.sql | 2 +- query/src/test/resources/query/sql_derived/query01.sql | 4 ++-- query/src/test/resources/query/sql_derived/query02.sql | 4 ++-- query/src/test/resources/query/sql_derived/query04.sql | 2 +- query/src/test/resources/query/sql_derived/query05.sql | 2 +- query/src/test/resources/query/sql_derived/query10.sql | 2 +- query/src/test/resources/query/sql_distinct/query03.sql | 2 +- query/src/test/resources/query/sql_distinct/query04.sql | 2 +- query/src/test/resources/query/sql_dynamic/query01.sql | 2 +- query/src/test/resources/query/sql_dynamic/query02.sql | 2 +- query/src/test/resources/query/sql_hive/query10.sql | 2 +- .../resources/query/sql_invalid/query29_invalid_SQL.sql | 2 +- query/src/test/resources/query/sql_lookup/query01.sql | 2 +- query/src/test/resources/query/sql_lookup/query03.sql | 2 +- query/src/test/resources/query/sql_lookup/query04.sql | 2 +- query/src/test/resources/query/sql_orderby/query01.sql | 4 ++-- query/src/test/resources/query/sql_subquery/query00.sql | 4 ++-- query/src/test/resources/query/sql_subquery/query01.sql | 2 +- query/src/test/resources/query/sql_subquery/query03.sql | 4 ++-- query/src/test/resources/query/sql_subquery/query04.sql | 4 ++-- query/src/test/resources/query/sql_subquery/query05.sql | 4 ++-- query/src/test/resources/query/sql_tableau/query00.sql | 2 +- query/src/test/resources/query/sql_tableau/query01.sql | 2 +- query/src/test/resources/query/sql_tableau/query02.sql | 2 +- query/src/test/resources/query/sql_tableau/query03.sql | 2 +- query/src/test/resources/query/sql_tableau/query04.sql | 2 +- query/src/test/resources/query/sql_tableau/query05.sql | 2 +- query/src/test/resources/query/sql_tableau/query06.sql | 2 +- query/src/test/resources/query/sql_tableau/query07.sql | 2 +- query/src/test/resources/query/sql_tableau/query10.sql | 2 +- query/src/test/resources/query/sql_tableau/query11.sql | 2 +- query/src/test/resources/query/sql_tableau/query12.sql | 2 +- query/src/test/resources/query/sql_tableau/query13.sql | 2 +- query/src/test/resources/query/sql_tableau/query14.sql | 2 +- query/src/test/resources/query/sql_tableau/query15.sql | 2 +- query/src/test/resources/query/sql_tableau/query16.sql | 2 +- query/src/test/resources/query/sql_tableau/query17.sql | 2 +- query/src/test/resources/query/sql_tableau/query21.sql | 2 +- query/src/test/resources/query/sql_tableau/query23.sql | 2 +- query/src/test/resources/query/sql_tableau/query24.sql | 2 +- query/src/test/resources/query/sql_tableau/query25.sql | 4 ++-- query/src/test/resources/query/sql_tableau/query27.sql | 4 ++-- .../com/kylinolap/storage/filter/ColumnTupleFilter.java | 11 +++++++---- .../java/com/kylinolap/storage/filter/FilterBaseTest.java | 4 ++-- 94 files changed, 150 insertions(+), 132 deletions(-) diff --git a/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java b/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java index 6f9067a..eb03c56 100644 --- a/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java +++ b/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java @@ -138,27 +138,27 @@ public void testExistingProject() throws Exception { @Test public void testProjectsDrop() throws IOException { CubeInstance cube = CubeManager.getInstance(getTestConfig()).getCube("test_kylin_cube_with_slr_empty"); - assertTrue(ProjectManager.getInstance(this.getTestConfig()).getCubesByTable("default", "test_kylin_fact").contains(cube)); + assertTrue(ProjectManager.getInstance(this.getTestConfig()).getCubesByTable("default", "default.test_kylin_fact").contains(cube)); assertTrue(ProjectManager.getInstance(this.getTestConfig()).listAllCubes("default").contains(cube)); CubeManager.getInstance(getTestConfig()).dropCube(cube.getName(), true); - assertTrue(!ProjectManager.getInstance(this.getTestConfig()).getCubesByTable("default", "test_kylin_fact").contains(cube)); + assertTrue(!ProjectManager.getInstance(this.getTestConfig()).getCubesByTable("default", "default.test_kylin_fact").contains(cube)); assertTrue(!ProjectManager.getInstance(this.getTestConfig()).listAllCubes("default").contains(cube)); } @Test public void testProjectsLoadAfterProjectChange() throws IOException { CubeInstance cube = CubeManager.getInstance(getTestConfig()).getCube("test_kylin_cube_with_slr_empty"); - assertTrue(ProjectManager.getInstance(this.getTestConfig()).getCubesByTable("default", "test_kylin_fact").contains(cube)); + assertTrue(ProjectManager.getInstance(this.getTestConfig()).getCubesByTable("default", "default.test_kylin_fact").contains(cube)); ProjectManager.getInstance(getTestConfig()).removeCubeFromProjects(cube.getName()); - assertTrue(!ProjectManager.getInstance(this.getTestConfig()).getCubesByTable("default", "test_kylin_fact").contains(cube)); + assertTrue(!ProjectManager.getInstance(this.getTestConfig()).getCubesByTable("default", "default.test_kylin_fact").contains(cube)); ProjectManager.getInstance(getTestConfig()).updateCubeToProject(cube.getName(), "default", "tester"); - assertTrue(ProjectManager.getInstance(this.getTestConfig()).getCubesByTable("default", "test_kylin_fact").contains(cube)); + assertTrue(ProjectManager.getInstance(this.getTestConfig()).getCubesByTable("default", "default.test_kylin_fact").contains(cube)); } private MetadataManager getMetadataManager() { diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java index 1b15337..f5eede0 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java @@ -24,6 +24,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.kylinolap.common.persistence.ResourceStore; import com.kylinolap.common.persistence.RootPersistentEntity; +import com.kylinolap.common.util.StringSplitter; /** * Table Metadata from Source. All name should be uppercase. @@ -71,7 +72,17 @@ public String getName() { } public void setName(String name) { - this.name = name; + if (name != null) { + String[] splits = StringSplitter.split(name, "."); + if (splits.length == 2) { + this.setDatabase(splits[0]); + this.name = splits[1]; + } else if (splits.length == 1) { + this.name = splits[0]; + } + } else { + this.name = name; + } } @JsonProperty("database") diff --git a/query/src/test/java/com/kylinolap/query/test/H2Database.java b/query/src/test/java/com/kylinolap/query/test/H2Database.java index c429d08..a0aab0d 100644 --- a/query/src/test/java/com/kylinolap/query/test/H2Database.java +++ b/query/src/test/java/com/kylinolap/query/test/H2Database.java @@ -36,7 +36,7 @@ public class H2Database { private static final Logger logger = LoggerFactory.getLogger(H2Database.class); - private static final String[] ALL_TABLES = new String[] { "test_cal_dt", "test_category_groupings", "test_kylin_fact", "test_seller_type_dim", "test_sites" }; + private static final String[] ALL_TABLES = new String[] { "edw.test_cal_dt", "default.test_category_groupings", "default.test_kylin_fact", "edw.test_seller_type_dim", "edw.test_sites" }; private static final Map javaToH2DataTypeMapping = new HashMap(); static { @@ -94,6 +94,10 @@ private void loadH2Table(String tableName, String joinType) throws SQLException String cvsFilePath = tempFile.getPath(); Statement stmt = h2Connection.createStatement(); + + String createDBSql = "CREATE SCHEMA IF NOT EXISTS DEFAULT;\nCREATE SCHEMA IF NOT EXISTS EDW;\nSET SCHEMA DEFAULT;\n"; + stmt.executeUpdate(createDBSql); + String sql = generateCreateH2TableSql(tableDesc, cvsFilePath); stmt.executeUpdate(sql); diff --git a/query/src/test/java/com/kylinolap/query/test/KylinQueryTest.java b/query/src/test/java/com/kylinolap/query/test/KylinQueryTest.java index 8b127d7..0df1599 100644 --- a/query/src/test/java/com/kylinolap/query/test/KylinQueryTest.java +++ b/query/src/test/java/com/kylinolap/query/test/KylinQueryTest.java @@ -123,13 +123,13 @@ protected static void preferCubeOf(String joinType) { @Ignore @Test public void testTempQuery() throws Exception { - execAndCompQuery("src/test/resources/query/temp", null, true); + execAndCompQuery("src/test/resources/query/temp", null, true); } @Test public void testSingleRunQuery() throws Exception { - String queryFileName = "src/test/resources/query/sql/query02.sql"; + String queryFileName = "src/test/resources/query/sql_orderby/query01.sql"; File sqlFile = new File(queryFileName); runSQL(sqlFile, true, true); @@ -211,7 +211,7 @@ public void testHiveQuery() throws Exception { @Test public void testH2Query() throws Exception { - this.execQueryUsingH2("src/test/resources/query/h2", false); + this.execQueryUsingH2("src/test/resources/query/sql_orderby", false); } @Test diff --git a/query/src/test/resources/query/h2/query09.sql b/query/src/test/resources/query/h2/query09.sql index 08a64d8..afd186b 100644 --- a/query/src/test/resources/query/h2/query09.sql +++ b/query/src/test/resources/query/h2/query09.sql @@ -1,5 +1,5 @@ select count(*) from (select test_cal_dt.week_beg_dt from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt group by test_cal_dt.week_beg_dt) t diff --git a/query/src/test/resources/query/h2/query10.sql b/query/src/test/resources/query/h2/query10.sql index 5036c63..1c642d6 100644 --- a/query/src/test/resources/query/h2/query10.sql +++ b/query/src/test/resources/query/h2/query10.sql @@ -1,6 +1,6 @@ select test_cal_dt.week_beg_dt from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where test_kylin_fact.lstg_format_name='FP-GTC' and test_cal_dt.week_beg_dt between DATE '2013-05-01' and DATE '2013-08-01' diff --git a/query/src/test/resources/query/sql/query09.sql b/query/src/test/resources/query/sql/query09.sql index d3bfa89..e83e5d1 100644 --- a/query/src/test/resources/query/sql/query09.sql +++ b/query/src/test/resources/query/sql/query09.sql @@ -1,5 +1,5 @@ select test_cal_dt.week_beg_dt, count(*) as TRANS_CNT from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt group by test_cal_dt.week_beg_dt diff --git a/query/src/test/resources/query/sql/query10.sql b/query/src/test/resources/query/sql/query10.sql index bd92a71..b3ec288 100644 --- a/query/src/test/resources/query/sql/query10.sql +++ b/query/src/test/resources/query/sql/query10.sql @@ -1,7 +1,7 @@ select test_cal_dt.week_beg_dt,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where test_kylin_fact.lstg_format_name='FP-GTC' and test_cal_dt.week_beg_dt between DATE '2013-05-01' and DATE '2013-08-01' diff --git a/query/src/test/resources/query/sql/query11.sql b/query/src/test/resources/query/sql/query11.sql index f225aa8..548e58d 100644 --- a/query/src/test/resources/query/sql/query11.sql +++ b/query/src/test/resources/query/sql/query11.sql @@ -1,7 +1,7 @@ select test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where test_cal_dt.week_beg_dt between DATE '2013-05-01' and DATE '2013-08-01' group by test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt diff --git a/query/src/test/resources/query/sql/query12.sql b/query/src/test/resources/query/sql/query12.sql index 5289dde..38bafef 100644 --- a/query/src/test/resources/query/sql/query12.sql +++ b/query/src/test/resources/query/sql/query12.sql @@ -1,7 +1,7 @@ select test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where test_cal_dt.week_beg_dt >= DATE '2013-02-10' group by test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt diff --git a/query/src/test/resources/query/sql/query13.sql b/query/src/test/resources/query/sql/query13.sql index 4e8dd76..ce50679 100644 --- a/query/src/test/resources/query/sql/query13.sql +++ b/query/src/test/resources/query/sql/query13.sql @@ -1,6 +1,6 @@ select sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where test_kylin_fact.lstg_format_name='FP-GTC' and test_cal_dt.week_beg_dt between DATE '2013-05-01' and DATE '2013-08-01' diff --git a/query/src/test/resources/query/sql/query14.sql b/query/src/test/resources/query/sql/query14.sql index 9fc8660..4e6f713 100644 --- a/query/src/test/resources/query/sql/query14.sql +++ b/query/src/test/resources/query/sql/query14.sql @@ -6,7 +6,7 @@ SELECT ,sum(test_kylin_fact.price) as GMV , count(*) as trans_cnt FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id diff --git a/query/src/test/resources/query/sql/query15.sql b/query/src/test/resources/query/sql/query15.sql index 57d292b..50233cc 100644 --- a/query/src/test/resources/query/sql/query15.sql +++ b/query/src/test/resources/query/sql/query15.sql @@ -3,7 +3,7 @@ SELECT ,test_category_groupings.meta_categ_name ,sum(price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id diff --git a/query/src/test/resources/query/sql/query16.sql b/query/src/test/resources/query/sql/query16.sql index 9576f38..e124252 100644 --- a/query/src/test/resources/query/sql/query16.sql +++ b/query/src/test/resources/query/sql/query16.sql @@ -5,7 +5,7 @@ SELECT ,test_category_groupings.categ_lvl3_name ,sum(price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id diff --git a/query/src/test/resources/query/sql/query17.sql b/query/src/test/resources/query/sql/query17.sql index a262477..4cf5436 100644 --- a/query/src/test/resources/query/sql/query17.sql +++ b/query/src/test/resources/query/sql/query17.sql @@ -5,7 +5,7 @@ SELECT ,test_category_groupings.categ_lvl3_name ,sum(price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id diff --git a/query/src/test/resources/query/sql/query18.sql b/query/src/test/resources/query/sql/query18.sql index cab2b3b..b570757 100644 --- a/query/src/test/resources/query/sql/query18.sql +++ b/query/src/test/resources/query/sql/query18.sql @@ -3,7 +3,7 @@ SELECT ,test_category_groupings.meta_categ_name ,sum(price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id diff --git a/query/src/test/resources/query/sql/query19.sql b/query/src/test/resources/query/sql/query19.sql index a262477..4cf5436 100644 --- a/query/src/test/resources/query/sql/query19.sql +++ b/query/src/test/resources/query/sql/query19.sql @@ -5,7 +5,7 @@ SELECT ,test_category_groupings.categ_lvl3_name ,sum(price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id diff --git a/query/src/test/resources/query/sql/query20.sql b/query/src/test/resources/query/sql/query20.sql index c0489bf..ac276bb 100644 --- a/query/src/test/resources/query/sql/query20.sql +++ b/query/src/test/resources/query/sql/query20.sql @@ -3,7 +3,7 @@ SELECT ,test_category_groupings.meta_categ_name ,sum(price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id diff --git a/query/src/test/resources/query/sql/query21.sql b/query/src/test/resources/query/sql/query21.sql index bd0ca84..b2e54ba 100644 --- a/query/src/test/resources/query/sql/query21.sql +++ b/query/src/test/resources/query/sql/query21.sql @@ -7,11 +7,11 @@ SELECT ,test_sites.site_name ,sum(test_kylin_fact.price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id - inner JOIN test_sites + inner JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id where test_cal_dt.week_beg_dt between DATE '2013-02-01' and DATE '2013-03-01' group by test_cal_dt.week_beg_dt diff --git a/query/src/test/resources/query/sql/query22.sql b/query/src/test/resources/query/sql/query22.sql index 03af146..024f9e9 100644 --- a/query/src/test/resources/query/sql/query22.sql +++ b/query/src/test/resources/query/sql/query22.sql @@ -8,11 +8,11 @@ SELECT ,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id - inner JOIN test_sites + inner JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id where test_cal_dt.week_beg_dt between DATE '2012-02-01' and DATE '2013-10-01' and site_name='Canada' diff --git a/query/src/test/resources/query/sql/query23.sql b/query/src/test/resources/query/sql/query23.sql index 63de8ac..25e93d9 100644 --- a/query/src/test/resources/query/sql/query23.sql +++ b/query/src/test/resources/query/sql/query23.sql @@ -6,11 +6,11 @@ SELECT ,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id - inner JOIN test_sites + inner JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id where test_cal_dt.week_beg_dt between DATE '2013-02-01' and DATE '2013-10-01' and site_name='Ebay' diff --git a/query/src/test/resources/query/sql/query24.sql b/query/src/test/resources/query/sql/query24.sql index 0ca7bf6..5681557 100644 --- a/query/src/test/resources/query/sql/query24.sql +++ b/query/src/test/resources/query/sql/query24.sql @@ -9,13 +9,13 @@ SELECT ,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id - inner JOIN test_sites + inner JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id - inner JOIN test_seller_type_dim + inner JOIN edw.test_seller_type_dim as test_seller_type_dim ON test_kylin_fact.slr_segment_cd = test_seller_type_dim.seller_type_cd group by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name diff --git a/query/src/test/resources/query/sql/query25.sql b/query/src/test/resources/query/sql/query25.sql index 7df7680..0c07a8e 100644 --- a/query/src/test/resources/query/sql/query25.sql +++ b/query/src/test/resources/query/sql/query25.sql @@ -9,13 +9,13 @@ SELECT ,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id - inner JOIN test_sites + inner JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id - inner JOIN test_seller_type_dim + inner JOIN edw.test_seller_type_dim as test_seller_type_dim ON test_kylin_fact.slr_segment_cd = test_seller_type_dim.seller_type_cd where test_cal_dt.week_beg_dt between DATE '2013-01-01' and DATE '2013-06-01' group by test_cal_dt.week_beg_dt diff --git a/query/src/test/resources/query/sql/query26.sql b/query/src/test/resources/query/sql/query26.sql index 0aecb06..3889e77 100644 --- a/query/src/test/resources/query/sql/query26.sql +++ b/query/src/test/resources/query/sql/query26.sql @@ -9,13 +9,13 @@ SELECT ,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id - inner JOIN test_sites + inner JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id - inner JOIN test_seller_type_dim + inner JOIN edw.test_seller_type_dim as test_seller_type_dim ON test_kylin_fact.slr_segment_cd = test_seller_type_dim.seller_type_cd where test_cal_dt.week_beg_dt between DATE '2013-01-01' and DATE '2013-06-04' and (test_category_groupings.meta_categ_name='Collectibles' or test_category_groupings.meta_categ_name='Clothing, Shoes & Accessories') and diff --git a/query/src/test/resources/query/sql/query27.sql b/query/src/test/resources/query/sql/query27.sql index 515aea1..1c0a505 100644 --- a/query/src/test/resources/query/sql/query27.sql +++ b/query/src/test/resources/query/sql/query27.sql @@ -9,13 +9,13 @@ SELECT ,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id - inner JOIN test_sites + inner JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id - inner JOIN test_seller_type_dim + inner JOIN edw.test_seller_type_dim as test_seller_type_dim ON test_kylin_fact.slr_segment_cd = test_seller_type_dim.seller_type_cd where (test_category_groupings.meta_categ_name='Collectibles' or test_category_groupings.categ_lvl3_name='Dresses') diff --git a/query/src/test/resources/query/sql/query28.sql b/query/src/test/resources/query/sql/query28.sql index a3d3220..4b04d35 100644 --- a/query/src/test/resources/query/sql/query28.sql +++ b/query/src/test/resources/query/sql/query28.sql @@ -2,11 +2,11 @@ SELECT sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id - inner JOIN test_sites + inner JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id - inner JOIN test_seller_type_dim + inner JOIN edw.test_seller_type_dim as test_seller_type_dim ON test_kylin_fact.slr_segment_cd = test_seller_type_dim.seller_type_cd diff --git a/query/src/test/resources/query/sql/query29.sql b/query/src/test/resources/query/sql/query29.sql index 8d0a2f4..c799014 100644 --- a/query/src/test/resources/query/sql/query29.sql +++ b/query/src/test/resources/query/sql/query29.sql @@ -4,7 +4,7 @@ SELECT ,test_category_groupings.categ_lvl2_name ,sum(price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id diff --git a/query/src/test/resources/query/sql/query31.sql b/query/src/test/resources/query/sql/query31.sql index 420de7a..d33f4ba 100644 --- a/query/src/test/resources/query/sql/query31.sql +++ b/query/src/test/resources/query/sql/query31.sql @@ -7,11 +7,11 @@ SELECT ,test_sites.site_name ,sum(test_kylin_fact.price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id - inner JOIN test_sites + inner JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id where test_sites.site_name = '英国' group by test_cal_dt.week_beg_dt diff --git a/query/src/test/resources/query/sql/query32.sql b/query/src/test/resources/query/sql/query32.sql index 33210d1..12fab37 100644 --- a/query/src/test/resources/query/sql/query32.sql +++ b/query/src/test/resources/query/sql/query32.sql @@ -7,11 +7,11 @@ SELECT ,test_sites.site_name ,sum(test_kylin_fact.price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id - inner JOIN test_sites + inner JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id group by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name diff --git a/query/src/test/resources/query/sql/query33.sql b/query/src/test/resources/query/sql/query33.sql index c9116dc..4414533 100644 --- a/query/src/test/resources/query/sql/query33.sql +++ b/query/src/test/resources/query/sql/query33.sql @@ -8,11 +8,11 @@ SELECT ,test_sites.site_name ,sum(test_kylin_fact.price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id - inner JOIN test_sites + inner JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id where test_kylin_fact.seller_id = 10000002 group by diff --git a/query/src/test/resources/query/sql/query34.sql b/query/src/test/resources/query/sql/query34.sql index e9b983a..0db088d 100644 --- a/query/src/test/resources/query/sql/query34.sql +++ b/query/src/test/resources/query/sql/query34.sql @@ -7,11 +7,11 @@ SELECT ,test_sites.site_name ,sum(test_kylin_fact.price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id - inner JOIN test_sites + inner JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id where test_kylin_fact.seller_id = 10000002 group by diff --git a/query/src/test/resources/query/sql/query35.sql b/query/src/test/resources/query/sql/query35.sql index 8989c4c..3f2beee 100644 --- a/query/src/test/resources/query/sql/query35.sql +++ b/query/src/test/resources/query/sql/query35.sql @@ -7,11 +7,11 @@ SELECT ,test_sites.site_name ,sum(test_kylin_fact.price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id - inner JOIN test_sites + inner JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id where test_kylin_fact.seller_id = 10000002 or test_kylin_fact.lstg_format_name = 'FP-non GTC' group by diff --git a/query/src/test/resources/query/sql/query36.sql b/query/src/test/resources/query/sql/query36.sql index 5bf8976..709f00b 100644 --- a/query/src/test/resources/query/sql/query36.sql +++ b/query/src/test/resources/query/sql/query36.sql @@ -5,11 +5,11 @@ SELECT ,min(test_kylin_fact.price) as GMV_MIN ,count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id - inner JOIN test_sites + inner JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id where test_kylin_fact.seller_id = 10000002 or test_kylin_fact.lstg_format_name = 'FP-non GTC' group by diff --git a/query/src/test/resources/query/sql/query37.sql b/query/src/test/resources/query/sql/query37.sql index 69ca6bf..dfc1845 100644 --- a/query/src/test/resources/query/sql/query37.sql +++ b/query/src/test/resources/query/sql/query37.sql @@ -1,7 +1,7 @@ select test_cal_dt.week_beg_dt, sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where (test_kylin_fact.lstg_format_name > '') diff --git a/query/src/test/resources/query/sql/query42.sql b/query/src/test/resources/query/sql/query42.sql index 2777785..be9ceda 100644 --- a/query/src/test/resources/query/sql/query42.sql +++ b/query/src/test/resources/query/sql/query42.sql @@ -1,5 +1,5 @@ select test_cal_dt.cal_dt, count(*) as TRANS_CNT from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt group by test_cal_dt.cal_dt diff --git a/query/src/test/resources/query/sql/query43.sql b/query/src/test/resources/query/sql/query43.sql index 1cdc9d8..5249854 100644 --- a/query/src/test/resources/query/sql/query43.sql +++ b/query/src/test/resources/query/sql/query43.sql @@ -1,6 +1,6 @@ select test_cal_dt.cal_dt, count(*) as CNT from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where test_kylin_fact.lstg_format_name='FP-GTC' and test_cal_dt.week_beg_dt between DATE '2013-05-01' and DATE '2013-08-01' diff --git a/query/src/test/resources/query/sql/query45.sql b/query/src/test/resources/query/sql/query45.sql index fa752d2..5a40e25 100644 --- a/query/src/test/resources/query/sql/query45.sql +++ b/query/src/test/resources/query/sql/query45.sql @@ -1,4 +1,4 @@ -select count(*) as CNT from test_cal_dt +select count(*) as CNT from edw.test_cal_dt diff --git a/query/src/test/resources/query/sql/query47.sql b/query/src/test/resources/query/sql/query47.sql index aa124a3..7e0f882 100644 --- a/query/src/test/resources/query/sql/query47.sql +++ b/query/src/test/resources/query/sql/query47.sql @@ -1 +1 @@ -select count(*) as CNT from test_seller_type_dim \ No newline at end of file +select count(*) as CNT from edw.test_seller_type_dim \ No newline at end of file diff --git a/query/src/test/resources/query/sql/query48.sql b/query/src/test/resources/query/sql/query48.sql index 64e078b..72e8f73 100644 --- a/query/src/test/resources/query/sql/query48.sql +++ b/query/src/test/resources/query/sql/query48.sql @@ -1 +1 @@ -select count(*) as CNT from test_sites \ No newline at end of file +select count(*) as CNT from edw.test_sites \ No newline at end of file diff --git a/query/src/test/resources/query/sql/query49.sql b/query/src/test/resources/query/sql/query49.sql index 04302b3..814bc5c 100644 --- a/query/src/test/resources/query/sql/query49.sql +++ b/query/src/test/resources/query/sql/query49.sql @@ -5,7 +5,7 @@ SELECT ,test_category_groupings.categ_lvl3_name ,sum(price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.lstg_site_id = test_category_groupings.site_id AND test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id diff --git a/query/src/test/resources/query/sql/query50.sql b/query/src/test/resources/query/sql/query50.sql index d678855..9216f43 100644 --- a/query/src/test/resources/query/sql/query50.sql +++ b/query/src/test/resources/query/sql/query50.sql @@ -1,7 +1,7 @@ select test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where 1 < 3 group by test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt diff --git a/query/src/test/resources/query/sql/query51.sql b/query/src/test/resources/query/sql/query51.sql index b7bc5c4..e110358 100644 --- a/query/src/test/resources/query/sql/query51.sql +++ b/query/src/test/resources/query/sql/query51.sql @@ -1,7 +1,7 @@ select test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where DATE '2013-03-24' <= test_cal_dt.week_beg_dt group by test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt diff --git a/query/src/test/resources/query/sql/query54.sql b/query/src/test/resources/query/sql/query54.sql index 8404d06..931b07f 100644 --- a/query/src/test/resources/query/sql/query54.sql +++ b/query/src/test/resources/query/sql/query54.sql @@ -1,7 +1,7 @@ select test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where 1 <> 1 group by test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt diff --git a/query/src/test/resources/query/sql/query55.sql b/query/src/test/resources/query/sql/query55.sql index 05c115b..8f71b62 100644 --- a/query/src/test/resources/query/sql/query55.sql +++ b/query/src/test/resources/query/sql/query55.sql @@ -1 +1 @@ -select count(*) as c from test_cal_dt where extract(YEAR from test_cal_dt.cal_dt) = 2012 \ No newline at end of file +select count(*) as c from edw.test_cal_dt as test_cal_dt where extract(YEAR from test_cal_dt.cal_dt) = 2012 \ No newline at end of file diff --git a/query/src/test/resources/query/sql/query56.sql b/query/src/test/resources/query/sql/query56.sql index 62fb8b3..83dbe33 100644 --- a/query/src/test/resources/query/sql/query56.sql +++ b/query/src/test/resources/query/sql/query56.sql @@ -1,7 +1,7 @@ select test_cal_dt.week_beg_dt, sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where extract(MONTH from test_cal_dt.week_beg_dt) = 12 diff --git a/query/src/test/resources/query/sql/query57.sql b/query/src/test/resources/query/sql/query57.sql index 492a5b2..89ab240 100644 --- a/query/src/test/resources/query/sql/query57.sql +++ b/query/src/test/resources/query/sql/query57.sql @@ -1,7 +1,7 @@ select test_cal_dt.week_beg_dt, sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where (test_kylin_fact.lstg_format_name='FP-GTC') and extract(MONTH from test_cal_dt.week_beg_dt) = 12 diff --git a/query/src/test/resources/query/sql/query58.sql b/query/src/test/resources/query/sql/query58.sql index d25fd23..4cc834b 100644 --- a/query/src/test/resources/query/sql/query58.sql +++ b/query/src/test/resources/query/sql/query58.sql @@ -1,7 +1,7 @@ select sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where (test_kylin_fact.lstg_format_name='FP-GTC') and extract(MONTH from test_cal_dt.week_beg_dt) = 12 diff --git a/query/src/test/resources/query/sql/query60.sql b/query/src/test/resources/query/sql/query60.sql index 73283f0..3e1b0f0 100644 --- a/query/src/test/resources/query/sql/query60.sql +++ b/query/src/test/resources/query/sql/query60.sql @@ -1,6 +1,6 @@ select test_kylin_fact.cal_dt, sum(test_kylin_fact.price) as sum_price, count(1) as cnt_1 from test_kylin_fact -left join test_cal_dt on test_kylin_fact.cal_dt=test_cal_dt.cal_dt +left JOIN edw.test_cal_dt as test_cal_dt on test_kylin_fact.cal_dt=test_cal_dt.cal_dt group by test_kylin_fact.cal_dt order by 2 desc limit 3 \ No newline at end of file diff --git a/query/src/test/resources/query/sql/query61.sql b/query/src/test/resources/query/sql/query61.sql index acc3635..243e61e 100644 --- a/query/src/test/resources/query/sql/query61.sql +++ b/query/src/test/resources/query/sql/query61.sql @@ -1,6 +1,6 @@ select count(1) as cnt_1 from test_kylin_fact -left join test_cal_dt on test_kylin_fact.cal_dt=test_cal_dt.cal_dt +left JOIN edw.test_cal_dt as test_cal_dt on test_kylin_fact.cal_dt=test_cal_dt.cal_dt group by test_kylin_fact.cal_dt order by 1 desc limit 4 \ No newline at end of file diff --git a/query/src/test/resources/query/sql/query66.sql b/query/src/test/resources/query/sql/query66.sql index 5efc8eb..46eb159 100644 --- a/query/src/test/resources/query/sql/query66.sql +++ b/query/src/test/resources/query/sql/query66.sql @@ -1,2 +1,2 @@ -select test_kylin_fact.cal_dt, max(test_kylin_fact.cal_dt) as mmm from test_kylin_fact left join test_cal_dt +select test_kylin_fact.cal_dt, max(test_kylin_fact.cal_dt) as mmm from test_kylin_fact left join edw.test_cal_dt as test_cal_dt on test_kylin_fact.cal_dt=test_cal_dt.cal_dt group by test_kylin_fact.cal_dt order by 2 desc limit 7 \ No newline at end of file diff --git a/query/src/test/resources/query/sql/query72.sql b/query/src/test/resources/query/sql/query72.sql index 14ea2e9..350e7aa 100644 --- a/query/src/test/resources/query/sql/query72.sql +++ b/query/src/test/resources/query/sql/query72.sql @@ -1,6 +1,6 @@ select test_cal_dt.week_beg_dt, test_kylin_fact.lstg_format_name, sum(test_kylin_fact.price) as GMV, count(*) as TRANS_CNT from test_kylin_fact - inner join test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt on test_kylin_fact.cal_dt = test_cal_dt.cal_dt where test_kylin_fact.lstg_format_name='FP-GTC' or extract(MONTH from test_cal_dt.week_beg_dt) = 12 group by test_cal_dt.week_beg_dt, test_kylin_fact.lstg_format_name \ No newline at end of file diff --git a/query/src/test/resources/query/sql_derived/query01.sql b/query/src/test/resources/query/sql_derived/query01.sql index c471835..80d5738 100644 --- a/query/src/test/resources/query/sql_derived/query01.sql +++ b/query/src/test/resources/query/sql_derived/query01.sql @@ -10,11 +10,11 @@ SELECT ,test_sites.cre_user ,sum(test_kylin_fact.price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id - inner JOIN test_sites + inner JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id where test_kylin_fact.seller_id = 10000002 group by diff --git a/query/src/test/resources/query/sql_derived/query02.sql b/query/src/test/resources/query/sql_derived/query02.sql index 6c8b2da..0bf5ad9 100644 --- a/query/src/test/resources/query/sql_derived/query02.sql +++ b/query/src/test/resources/query/sql_derived/query02.sql @@ -10,11 +10,11 @@ SELECT ,test_sites.cre_user ,sum(test_kylin_fact.price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id - inner JOIN test_sites + inner JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id where test_kylin_fact.seller_id = 10000002 and test_sites.site_id=0 group by diff --git a/query/src/test/resources/query/sql_derived/query04.sql b/query/src/test/resources/query/sql_derived/query04.sql index 8ab1f88..cad008a 100644 --- a/query/src/test/resources/query/sql_derived/query04.sql +++ b/query/src/test/resources/query/sql_derived/query04.sql @@ -1,2 +1,2 @@ -SELECT site_id, site_name, cre_user from test_sites +SELECT site_id, site_name, cre_user from edw.test_sites diff --git a/query/src/test/resources/query/sql_derived/query05.sql b/query/src/test/resources/query/sql_derived/query05.sql index 9318e05..6b1caec 100644 --- a/query/src/test/resources/query/sql_derived/query05.sql +++ b/query/src/test/resources/query/sql_derived/query05.sql @@ -1,5 +1,5 @@ SELECT test_sites.site_name, test_kylin_fact.lstg_format_name, sum(test_kylin_fact.price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id + inner JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id GROUP BY test_sites.site_name, test_kylin_fact.lstg_format_name diff --git a/query/src/test/resources/query/sql_derived/query10.sql b/query/src/test/resources/query/sql_derived/query10.sql index 5505b67..f0d62d2 100644 --- a/query/src/test/resources/query/sql_derived/query10.sql +++ b/query/src/test/resources/query/sql_derived/query10.sql @@ -9,7 +9,7 @@ SELECT ,test_category_groupings.site_id ,sum(price) as GMV, count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id diff --git a/query/src/test/resources/query/sql_distinct/query03.sql b/query/src/test/resources/query/sql_distinct/query03.sql index e3c91f1..a1b0e8d 100644 --- a/query/src/test/resources/query/sql_distinct/query03.sql +++ b/query/src/test/resources/query/sql_distinct/query03.sql @@ -1,7 +1,7 @@ select test_cal_dt.week_beg_dt,sum(test_kylin_fact.price) as GMV , count(1) as TRANS_CNT, count(distinct seller_id) as DIST_SELLER from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where test_kylin_fact.lstg_format_name='FP-GTC' and test_cal_dt.week_beg_dt between DATE '2013-05-01' and DATE '2013-08-01' diff --git a/query/src/test/resources/query/sql_distinct/query04.sql b/query/src/test/resources/query/sql_distinct/query04.sql index 3bc7c27..3bd7072 100644 --- a/query/src/test/resources/query/sql_distinct/query04.sql +++ b/query/src/test/resources/query/sql_distinct/query04.sql @@ -1,7 +1,7 @@ select test_cal_dt.week_beg_dt,sum(test_kylin_fact.price) as GMV , count(1) as TRANS_CNT, count(distinct seller_id) as DIST_SELLER from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where test_kylin_fact.lstg_format_name='FP-GTC' and test_cal_dt.week_beg_dt between DATE '2013-05-01' and DATE '2013-08-01' diff --git a/query/src/test/resources/query/sql_dynamic/query01.sql b/query/src/test/resources/query/sql_dynamic/query01.sql index f481edf..55f4e84 100644 --- a/query/src/test/resources/query/sql_dynamic/query01.sql +++ b/query/src/test/resources/query/sql_dynamic/query01.sql @@ -1,6 +1,6 @@ select test_cal_dt.week_beg_dt, test_kylin_fact.lstg_format_name, test_category_groupings.meta_categ_name, sum(test_kylin_fact.price) as gmv, count(*) as trans_cnt from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id diff --git a/query/src/test/resources/query/sql_dynamic/query02.sql b/query/src/test/resources/query/sql_dynamic/query02.sql index 701e6e4..ba4f563 100644 --- a/query/src/test/resources/query/sql_dynamic/query02.sql +++ b/query/src/test/resources/query/sql_dynamic/query02.sql @@ -1,7 +1,7 @@ select sum(1) as "col" from ( select test_cal_dt.week_beg_dt, test_kylin_fact.lstg_format_name, test_category_groupings.meta_categ_name, sum(test_kylin_fact.price) as gmv, count(*) as trans_cnt from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id diff --git a/query/src/test/resources/query/sql_hive/query10.sql b/query/src/test/resources/query/sql_hive/query10.sql index 8379174..6073e25 100644 --- a/query/src/test/resources/query/sql_hive/query10.sql +++ b/query/src/test/resources/query/sql_hive/query10.sql @@ -1,7 +1,7 @@ select test_cal_dt.QTR_BEG_DT,sum(test_kylin_fact.price) as gmv , count(*) as trans_cnt from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where test_kylin_fact.lstg_format_name='FP-GTC' and test_cal_dt.week_beg_dt between '2013-05-01' and '2013-08-01' diff --git a/query/src/test/resources/query/sql_invalid/query29_invalid_SQL.sql b/query/src/test/resources/query/sql_invalid/query29_invalid_SQL.sql index 7672a93..5c050c6 100644 --- a/query/src/test/resources/query/sql_invalid/query29_invalid_SQL.sql +++ b/query/src/test/resources/query/sql_invalid/query29_invalid_SQL.sql @@ -16,7 +16,7 @@ SELECT ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id - inner JOIN test_sites + inner JOIN edw.test_sites as test_sites ON test_kylin_fact.lstg_site_id = test_sites.site_id inner JOIN test_seller_type_dim ON test_kylin_fact.slr_segment_cd = test_seller_type_dim.seller_type_cd diff --git a/query/src/test/resources/query/sql_lookup/query01.sql b/query/src/test/resources/query/sql_lookup/query01.sql index 724c4fe..5ebeb92 100644 --- a/query/src/test/resources/query/sql_lookup/query01.sql +++ b/query/src/test/resources/query/sql_lookup/query01.sql @@ -1,4 +1,4 @@ -select CAL_DT, WEEK_BEG_DT from test_cal_dt +select CAL_DT, WEEK_BEG_DT from edw.test_cal_dt diff --git a/query/src/test/resources/query/sql_lookup/query03.sql b/query/src/test/resources/query/sql_lookup/query03.sql index 3186374..c3ba6b3 100644 --- a/query/src/test/resources/query/sql_lookup/query03.sql +++ b/query/src/test/resources/query/sql_lookup/query03.sql @@ -1 +1 @@ -select SELLER_TYPE_DESC, SELLER_TYPE_CD from test_seller_type_dim +select SELLER_TYPE_DESC, SELLER_TYPE_CD from edw.test_seller_type_dim diff --git a/query/src/test/resources/query/sql_lookup/query04.sql b/query/src/test/resources/query/sql_lookup/query04.sql index 83598c7..1c31efa 100644 --- a/query/src/test/resources/query/sql_lookup/query04.sql +++ b/query/src/test/resources/query/sql_lookup/query04.sql @@ -1 +1 @@ -select SITE_NAME, SITE_ID from test_sites +select SITE_NAME, SITE_ID from edw.test_sites diff --git a/query/src/test/resources/query/sql_orderby/query01.sql b/query/src/test/resources/query/sql_orderby/query01.sql index afbde8e..b3359e0 100644 --- a/query/src/test/resources/query/sql_orderby/query01.sql +++ b/query/src/test/resources/query/sql_orderby/query01.sql @@ -1,6 +1,6 @@ select test_cal_dt.Week_Beg_Dt, sum(price) as c1, count(1) as c2 - from test_kylin_fact - inner JOIN test_cal_dt + from test_kylin_fact + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where test_kylin_fact.lstg_format_name='ABIN' and test_cal_dt.week_beg_dt >= DATE '2013-06-09' diff --git a/query/src/test/resources/query/sql_subquery/query00.sql b/query/src/test/resources/query/sql_subquery/query00.sql index e2737ac..75503f0 100644 --- a/query/src/test/resources/query/sql_subquery/query00.sql +++ b/query/src/test/resources/query/sql_subquery/query00.sql @@ -1,4 +1,4 @@ select test_cal_dt.week_beg_dt, sum(test_kylin_fact.price) as sum_price, count(1) as cnt_1 - from test_kylin_fact - inner join test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt + from test_kylin_fact + inner join edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt group by test_cal_dt.week_beg_dt \ No newline at end of file diff --git a/query/src/test/resources/query/sql_subquery/query01.sql b/query/src/test/resources/query/sql_subquery/query01.sql index b5c93b2..9d7a2a0 100644 --- a/query/src/test/resources/query/sql_subquery/query01.sql +++ b/query/src/test/resources/query/sql_subquery/query01.sql @@ -2,7 +2,7 @@ SELECT sum(sum_price) AS "COL" FROM ( select test_cal_dt.week_beg_dt, sum(test_kylin_fact.price) as sum_price, count(1) as cnt_1 from test_kylin_fact - inner join test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt + inner join edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt group by test_cal_dt.week_beg_dt ) "TableauSQL" HAVING COUNT(1)>0 \ No newline at end of file diff --git a/query/src/test/resources/query/sql_subquery/query03.sql b/query/src/test/resources/query/sql_subquery/query03.sql index e74cc58..2f285ad 100644 --- a/query/src/test/resources/query/sql_subquery/query03.sql +++ b/query/src/test/resources/query/sql_subquery/query03.sql @@ -1,9 +1,9 @@ select fact.cal_dt, sum(fact.price) as sum_price, count(1) as cnt_1 from test_kylin_fact fact -left join test_cal_dt cal on fact.cal_dt=cal.cal_dt +left join edw.test_cal_dt cal on fact.cal_dt=cal.cal_dt inner join ( - select test_kylin_fact.cal_dt, sum(test_kylin_fact.price) from test_kylin_fact left join test_cal_dt + select test_kylin_fact.cal_dt, sum(test_kylin_fact.price) from test_kylin_fact left join edw.test_cal_dt test_cal_dt on test_kylin_fact.cal_dt=test_cal_dt.cal_dt group by test_kylin_fact.cal_dt order by 2 desc limit 7 ) cal_2 on fact.cal_dt = cal_2.cal_dt group by fact.cal_dt \ No newline at end of file diff --git a/query/src/test/resources/query/sql_subquery/query04.sql b/query/src/test/resources/query/sql_subquery/query04.sql index 83d8ca6..52fb10f 100644 --- a/query/src/test/resources/query/sql_subquery/query04.sql +++ b/query/src/test/resources/query/sql_subquery/query04.sql @@ -1,9 +1,9 @@ select fact.cal_dt, sum(fact.price) as sum_price, count(1) as cnt_1 from test_kylin_fact fact -left join test_cal_dt cal on fact.cal_dt=cal.cal_dt +left join edw.test_cal_dt cal on fact.cal_dt=cal.cal_dt inner join ( - select test_kylin_fact.cal_dt, max(test_kylin_fact.cal_dt) as mmm from test_kylin_fact left join test_cal_dt + select test_kylin_fact.cal_dt, max(test_kylin_fact.cal_dt) as mmm from test_kylin_fact left join edw.test_cal_dt test_cal_dt on test_kylin_fact.cal_dt=test_cal_dt.cal_dt group by test_kylin_fact.cal_dt order by 2 desc limit 7 ) cal_2 on fact.cal_dt = cal_2.mmm group by fact.cal_dt \ No newline at end of file diff --git a/query/src/test/resources/query/sql_subquery/query05.sql b/query/src/test/resources/query/sql_subquery/query05.sql index 1ae2005..91b15d9 100644 --- a/query/src/test/resources/query/sql_subquery/query05.sql +++ b/query/src/test/resources/query/sql_subquery/query05.sql @@ -1,10 +1,10 @@ SELECT SUM("TEST_KYLIN_FACT"."PRICE") AS "sum_PRICE_ok" FROM "TEST_KYLIN_FACT" - INNER JOIN "TEST_CAL_DT" ON ("TEST_KYLIN_FACT"."CAL_DT" = "TEST_CAL_DT"."CAL_DT") + INNER JOIN "EDW"."TEST_CAL_DT" AS "TEST_CAL_DT" ON ("TEST_KYLIN_FACT"."CAL_DT" = "TEST_CAL_DT"."CAL_DT") INNER JOIN ( SELECT COUNT(1) AS "XTableau_join_flag", SUM("TEST_KYLIN_FACT"."PRICE") AS "X__alias__A", "TEST_KYLIN_FACT"."CAL_DT" AS "none_CAL_DT_ok" FROM "TEST_KYLIN_FACT" - INNER JOIN "TEST_CAL_DT" ON ("TEST_KYLIN_FACT"."CAL_DT" = "TEST_CAL_DT"."CAL_DT") + INNER JOIN "EDW"."TEST_CAL_DT" AS "TEST_CAL_DT" ON ("TEST_KYLIN_FACT"."CAL_DT" = "TEST_CAL_DT"."CAL_DT") GROUP BY "TEST_KYLIN_FACT"."CAL_DT" ORDER BY 2 DESC LIMIT 10 ) "t0" ON ("TEST_KYLIN_FACT"."CAL_DT" = "t0"."none_CAL_DT_ok") GROUP BY "TEST_KYLIN_FACT"."CAL_DT" \ No newline at end of file diff --git a/query/src/test/resources/query/sql_tableau/query00.sql b/query/src/test/resources/query/sql_tableau/query00.sql index 790e348..a9f4642 100644 --- a/query/src/test/resources/query/sql_tableau/query00.sql +++ b/query/src/test/resources/query/sql_tableau/query00.sql @@ -1,5 +1,5 @@ select test_cal_dt.week_beg_dt, sum(test_kylin_fact.price) from test_kylin_fact - inner join test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt + inner join edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt group by test_cal_dt.week_beg_dt diff --git a/query/src/test/resources/query/sql_tableau/query01.sql b/query/src/test/resources/query/sql_tableau/query01.sql index 44e4c63..0503355 100644 --- a/query/src/test/resources/query/sql_tableau/query01.sql +++ b/query/src/test/resources/query/sql_tableau/query01.sql @@ -4,7 +4,7 @@ SELECT SUM(1) AS "COL", select test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where test_cal_dt.week_beg_dt between DATE '2013-05-01' and DATE '2013-08-01' group by test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt diff --git a/query/src/test/resources/query/sql_tableau/query02.sql b/query/src/test/resources/query/sql_tableau/query02.sql index ca40f11..efe6cef 100644 --- a/query/src/test/resources/query/sql_tableau/query02.sql +++ b/query/src/test/resources/query/sql_tableau/query02.sql @@ -3,7 +3,7 @@ SELECT * select test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where test_cal_dt.week_beg_dt between DATE '2013-05-01' and DATE '2013-08-01' group by test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt diff --git a/query/src/test/resources/query/sql_tableau/query03.sql b/query/src/test/resources/query/sql_tableau/query03.sql index b78a587..02225f0 100644 --- a/query/src/test/resources/query/sql_tableau/query03.sql +++ b/query/src/test/resources/query/sql_tableau/query03.sql @@ -6,7 +6,7 @@ SELECT ,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id diff --git a/query/src/test/resources/query/sql_tableau/query04.sql b/query/src/test/resources/query/sql_tableau/query04.sql index b7c8a99..0cd6f6e 100644 --- a/query/src/test/resources/query/sql_tableau/query04.sql +++ b/query/src/test/resources/query/sql_tableau/query04.sql @@ -8,7 +8,7 @@ SELECT "TableauSQL"."META_CATEG_NAME" AS "none_META_CATEG_NAME_nk" ,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id diff --git a/query/src/test/resources/query/sql_tableau/query05.sql b/query/src/test/resources/query/sql_tableau/query05.sql index 25e8f89..40062f1 100644 --- a/query/src/test/resources/query/sql_tableau/query05.sql +++ b/query/src/test/resources/query/sql_tableau/query05.sql @@ -9,7 +9,7 @@ SELECT SUM("TableauSQL"."GMV") AS "sum_GMV_ok", ,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id diff --git a/query/src/test/resources/query/sql_tableau/query06.sql b/query/src/test/resources/query/sql_tableau/query06.sql index 25e8f89..40062f1 100644 --- a/query/src/test/resources/query/sql_tableau/query06.sql +++ b/query/src/test/resources/query/sql_tableau/query06.sql @@ -9,7 +9,7 @@ SELECT SUM("TableauSQL"."GMV") AS "sum_GMV_ok", ,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id diff --git a/query/src/test/resources/query/sql_tableau/query07.sql b/query/src/test/resources/query/sql_tableau/query07.sql index 5cf3bae..eda5533 100644 --- a/query/src/test/resources/query/sql_tableau/query07.sql +++ b/query/src/test/resources/query/sql_tableau/query07.sql @@ -2,7 +2,7 @@ SELECT SUM("TableauSQL"."GMV") AS "sum_GMV_ok", SUM("TableauSQL"."TRANS_CNT") AS FROM ( SELECT test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT FROM test_kylin_fact - inner JOIN test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt + inner JOIN edw.test_cal_dt as test_cal_dt ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt inner JOIN test_category_groupings ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id group by test_cal_dt.week_beg_dt ,test_category_groupings.meta_categ_name ,test_category_groupings.categ_lvl2_name ,test_category_groupings.categ_lvl3_name ) "TableauSQL" HAVING (COUNT(1) > 0) diff --git a/query/src/test/resources/query/sql_tableau/query10.sql b/query/src/test/resources/query/sql_tableau/query10.sql index 26d29a3..290fd57 100644 --- a/query/src/test/resources/query/sql_tableau/query10.sql +++ b/query/src/test/resources/query/sql_tableau/query10.sql @@ -1,5 +1,5 @@ SELECT "TEST_CAL_DT"."WEEK_BEG_DT" AS "none_WEEK_BEG_DT_nk", SUM("TEST_KYLIN_FACT"."PRICE") AS "sum_PRICE_ok" FROM "TEST_KYLIN_FACT" - inner JOIN "TEST_CAL_DT" ON ("TEST_KYLIN_FACT"."CAL_DT" = "TEST_CAL_DT"."CAL_DT") + inner JOIN "EDW"."TEST_CAL_DT" AS "TEST_CAL_DT" ON ("TEST_KYLIN_FACT"."CAL_DT" = "TEST_CAL_DT"."CAL_DT") GROUP BY "TEST_CAL_DT"."WEEK_BEG_DT" diff --git a/query/src/test/resources/query/sql_tableau/query11.sql b/query/src/test/resources/query/sql_tableau/query11.sql index d7e70c1..3b649c8 100644 --- a/query/src/test/resources/query/sql_tableau/query11.sql +++ b/query/src/test/resources/query/sql_tableau/query11.sql @@ -1,6 +1,6 @@ SELECT COUNT(1) AS cnt_ITEM_COUNT_ok, TEST_CAL_DT.WEEK_BEG_DT AS none_WEEK_BEG_DT_nk FROM "TEST_KYLIN_FACT" - inner JOIN "TEST_CAL_DT" ON ("TEST_KYLIN_FACT"."CAL_DT" = "TEST_CAL_DT"."CAL_DT") + inner JOIN "EDW"."TEST_CAL_DT" AS "TEST_CAL_DT" ON ("TEST_KYLIN_FACT"."CAL_DT" = "TEST_CAL_DT"."CAL_DT") GROUP BY "TEST_CAL_DT"."WEEK_BEG_DT" diff --git a/query/src/test/resources/query/sql_tableau/query12.sql b/query/src/test/resources/query/sql_tableau/query12.sql index 26d29a3..290fd57 100644 --- a/query/src/test/resources/query/sql_tableau/query12.sql +++ b/query/src/test/resources/query/sql_tableau/query12.sql @@ -1,5 +1,5 @@ SELECT "TEST_CAL_DT"."WEEK_BEG_DT" AS "none_WEEK_BEG_DT_nk", SUM("TEST_KYLIN_FACT"."PRICE") AS "sum_PRICE_ok" FROM "TEST_KYLIN_FACT" - inner JOIN "TEST_CAL_DT" ON ("TEST_KYLIN_FACT"."CAL_DT" = "TEST_CAL_DT"."CAL_DT") + inner JOIN "EDW"."TEST_CAL_DT" AS "TEST_CAL_DT" ON ("TEST_KYLIN_FACT"."CAL_DT" = "TEST_CAL_DT"."CAL_DT") GROUP BY "TEST_CAL_DT"."WEEK_BEG_DT" diff --git a/query/src/test/resources/query/sql_tableau/query13.sql b/query/src/test/resources/query/sql_tableau/query13.sql index 28c0e05..7896269 100644 --- a/query/src/test/resources/query/sql_tableau/query13.sql +++ b/query/src/test/resources/query/sql_tableau/query13.sql @@ -1,4 +1,4 @@ SELECT EXTRACT(YEAR FROM TEST_CAL_DT.WEEK_BEG_DT) AS yr_WEEK_BEG_DT_ok FROM TEST_KYLIN_FACT - inner JOIN TEST_CAL_DT ON (TEST_KYLIN_FACT.CAL_DT = TEST_CAL_DT.CAL_DT) + inner JOIN EDW.TEST_CAL_DT AS TEST_CAL_DT ON (TEST_KYLIN_FACT.CAL_DT = TEST_CAL_DT.CAL_DT) GROUP BY EXTRACT(YEAR FROM TEST_CAL_DT.WEEK_BEG_DT) diff --git a/query/src/test/resources/query/sql_tableau/query14.sql b/query/src/test/resources/query/sql_tableau/query14.sql index 0f5d99c..6a2d9d8 100644 --- a/query/src/test/resources/query/sql_tableau/query14.sql +++ b/query/src/test/resources/query/sql_tableau/query14.sql @@ -1 +1 @@ -SELECT QUARTER("TEST_CAL_DT"."WEEK_BEG_DT") AS "qr_WEEK_BEG_DT_ok", EXTRACT(YEAR FROM "TEST_CAL_DT"."WEEK_BEG_DT") AS "yr_WEEK_BEG_DT_ok" FROM "TEST_KYLIN_FACT" inner JOIN "TEST_CAL_DT" ON ("TEST_KYLIN_FACT"."CAL_DT" = "TEST_CAL_DT"."CAL_DT") GROUP BY QUARTER("TEST_CAL_DT"."WEEK_BEG_DT"), EXTRACT(YEAR FROM "TEST_CAL_DT"."WEEK_BEG_DT") +SELECT QUARTER("TEST_CAL_DT"."WEEK_BEG_DT") AS "qr_WEEK_BEG_DT_ok", EXTRACT(YEAR FROM "TEST_CAL_DT"."WEEK_BEG_DT") AS "yr_WEEK_BEG_DT_ok" FROM "TEST_KYLIN_FACT" inner JOIN "EDW"."TEST_CAL_DT" AS "TEST_CAL_DT" ON ("TEST_KYLIN_FACT"."CAL_DT" = "TEST_CAL_DT"."CAL_DT") GROUP BY QUARTER("TEST_CAL_DT"."WEEK_BEG_DT"), EXTRACT(YEAR FROM "TEST_CAL_DT"."WEEK_BEG_DT") diff --git a/query/src/test/resources/query/sql_tableau/query15.sql b/query/src/test/resources/query/sql_tableau/query15.sql index 6bebae6..23c324d 100644 --- a/query/src/test/resources/query/sql_tableau/query15.sql +++ b/query/src/test/resources/query/sql_tableau/query15.sql @@ -1,4 +1,4 @@ SELECT QUARTER(TEST_CAL_DT.WEEK_BEG_DT) AS qr_WEEK_BEG_DT_ok FROM TEST_KYLIN_FACT - inner JOIN TEST_CAL_DT ON (TEST_KYLIN_FACT.CAL_DT = TEST_CAL_DT.CAL_DT) + inner JOIN EDW.TEST_CAL_DT AS TEST_CAL_DT ON (TEST_KYLIN_FACT.CAL_DT = TEST_CAL_DT.CAL_DT) GROUP BY QUARTER(TEST_CAL_DT.WEEK_BEG_DT) diff --git a/query/src/test/resources/query/sql_tableau/query16.sql b/query/src/test/resources/query/sql_tableau/query16.sql index 28d2dbb..75b66ff 100644 --- a/query/src/test/resources/query/sql_tableau/query16.sql +++ b/query/src/test/resources/query/sql_tableau/query16.sql @@ -1,4 +1,4 @@ SELECT EXTRACT(YEAR FROM TEST_CAL_DT.WEEK_BEG_DT) AS yr_WEEK_BEG_DT_ok, QUARTER(TEST_CAL_DT.WEEK_BEG_DT) AS qr_WEEK_BEG_DT_ok FROM TEST_KYLIN_FACT - inner JOIN TEST_CAL_DT ON (TEST_KYLIN_FACT.CAL_DT = TEST_CAL_DT.CAL_DT) + inner JOIN EDW.TEST_CAL_DT AS TEST_CAL_DT ON (TEST_KYLIN_FACT.CAL_DT = TEST_CAL_DT.CAL_DT) GROUP BY EXTRACT(YEAR FROM TEST_CAL_DT.WEEK_BEG_DT), QUARTER(TEST_CAL_DT.WEEK_BEG_DT) diff --git a/query/src/test/resources/query/sql_tableau/query17.sql b/query/src/test/resources/query/sql_tableau/query17.sql index c4dfba3..e1fba40 100644 --- a/query/src/test/resources/query/sql_tableau/query17.sql +++ b/query/src/test/resources/query/sql_tableau/query17.sql @@ -1 +1 @@ -SELECT EXTRACT(MONTH FROM "TEST_CAL_DT"."WEEK_BEG_DT") AS "mn_WEEK_BEG_DT_ok", (( EXTRACT(YEAR FROM "TEST_CAL_DT"."WEEK_BEG_DT") * 100) + EXTRACT(MONTH FROM "TEST_CAL_DT"."WEEK_BEG_DT")) AS "my_WEEK_BEG_DT_ok", QUARTER("TEST_CAL_DT"."WEEK_BEG_DT") AS "qr_WEEK_BEG_DT_ok", EXTRACT(YEAR FROM "TEST_CAL_DT"."WEEK_BEG_DT") AS "yr_WEEK_BEG_DT_ok" FROM "TEST_KYLIN_FACT" inner JOIN "TEST_CAL_DT" ON ("TEST_KYLIN_FACT"."CAL_DT" = "TEST_CAL_DT"."CAL_DT") GROUP BY EXTRACT(YEAR FROM "TEST_CAL_DT"."WEEK_BEG_DT"), QUARTER("TEST_CAL_DT"."WEEK_BEG_DT"), (( EXTRACT(YEAR FROM "TEST_CAL_DT"."WEEK_BEG_DT") * 100) + EXTRACT(MONTH FROM "TEST_CAL_DT"."WEEK_BEG_DT")), EXTRACT(MONTH FROM "TEST_CAL_DT"."WEEK_BEG_DT") +SELECT EXTRACT(MONTH FROM "TEST_CAL_DT"."WEEK_BEG_DT") AS "mn_WEEK_BEG_DT_ok", (( EXTRACT(YEAR FROM "TEST_CAL_DT"."WEEK_BEG_DT") * 100) + EXTRACT(MONTH FROM "TEST_CAL_DT"."WEEK_BEG_DT")) AS "my_WEEK_BEG_DT_ok", QUARTER("TEST_CAL_DT"."WEEK_BEG_DT") AS "qr_WEEK_BEG_DT_ok", EXTRACT(YEAR FROM "TEST_CAL_DT"."WEEK_BEG_DT") AS "yr_WEEK_BEG_DT_ok" FROM "TEST_KYLIN_FACT" inner JOIN EDW.TEST_CAL_DT AS TEST_CAL_DT ON ("TEST_KYLIN_FACT"."CAL_DT" = "TEST_CAL_DT"."CAL_DT") GROUP BY EXTRACT(YEAR FROM "TEST_CAL_DT"."WEEK_BEG_DT"), QUARTER("TEST_CAL_DT"."WEEK_BEG_DT"), (( EXTRACT(YEAR FROM "TEST_CAL_DT"."WEEK_BEG_DT") * 100) + EXTRACT(MONTH FROM "TEST_CAL_DT"."WEEK_BEG_DT")), EXTRACT(MONTH FROM "TEST_CAL_DT"."WEEK_BEG_DT") diff --git a/query/src/test/resources/query/sql_tableau/query21.sql b/query/src/test/resources/query/sql_tableau/query21.sql index a31f1a7..6905df6 100644 --- a/query/src/test/resources/query/sql_tableau/query21.sql +++ b/query/src/test/resources/query/sql_tableau/query21.sql @@ -1,7 +1,7 @@ select test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt,sum(test_kylin_fact.price) as GMV , count(*) as TRANS_CNT from test_kylin_fact - inner JOIN test_cal_dt + inner JOIN EDW.TEST_CAL_DT AS TEST_CAL_DT ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt where test_cal_dt.week_beg_dt between DATE '2013-05-01' and DATE '2013-08-01' group by test_kylin_fact.lstg_format_name, test_cal_dt.week_beg_dt diff --git a/query/src/test/resources/query/sql_tableau/query23.sql b/query/src/test/resources/query/sql_tableau/query23.sql index 50df99e..c53185a 100644 --- a/query/src/test/resources/query/sql_tableau/query23.sql +++ b/query/src/test/resources/query/sql_tableau/query23.sql @@ -1,5 +1,5 @@ select fact.cal_dt, sum(fact.price) from test_kylin_fact fact -left join test_cal_dt cal on fact.cal_dt=cal.cal_dt +left join EDW.TEST_CAL_DT cal on fact.cal_dt=cal.cal_dt where cal.cal_dt = date '2012-05-17' or cal.cal_dt = date '2013-05-17' group by fact.cal_dt \ No newline at end of file diff --git a/query/src/test/resources/query/sql_tableau/query24.sql b/query/src/test/resources/query/sql_tableau/query24.sql index 6a975b1..5593281 100644 --- a/query/src/test/resources/query/sql_tableau/query24.sql +++ b/query/src/test/resources/query/sql_tableau/query24.sql @@ -1,6 +1,6 @@ select test_kylin_fact.cal_dt, count(1) as cnt_1 from test_kylin_fact -left join test_cal_dt on test_kylin_fact.cal_dt=test_cal_dt.cal_dt +left join EDW.TEST_CAL_DT AS TEST_CAL_DT on test_kylin_fact.cal_dt=test_cal_dt.cal_dt group by test_kylin_fact.cal_dt order by 2 desc limit 3 \ No newline at end of file diff --git a/query/src/test/resources/query/sql_tableau/query25.sql b/query/src/test/resources/query/sql_tableau/query25.sql index 4b6fb88..9703ec0 100644 --- a/query/src/test/resources/query/sql_tableau/query25.sql +++ b/query/src/test/resources/query/sql_tableau/query25.sql @@ -1,10 +1,10 @@ SELECT "TEST_KYLIN_FACT"."CAL_DT", SUM("TEST_KYLIN_FACT"."PRICE") AS "sum_PRICE_ok" FROM "TEST_KYLIN_FACT" - INNER JOIN "TEST_CAL_DT" ON ("TEST_KYLIN_FACT"."CAL_DT" = "TEST_CAL_DT"."CAL_DT") + INNER JOIN "EDW"."TEST_CAL_DT" AS "TEST_CAL_DT" ON ("TEST_KYLIN_FACT"."CAL_DT" = "TEST_CAL_DT"."CAL_DT") INNER JOIN ( SELECT COUNT(1) AS "XTableau_join_flag", SUM("TEST_KYLIN_FACT"."PRICE") AS "X__alias__A", "TEST_KYLIN_FACT"."CAL_DT" AS "none_CAL_DT_ok" FROM "TEST_KYLIN_FACT" - INNER JOIN "TEST_CAL_DT" ON ("TEST_KYLIN_FACT"."CAL_DT" = "TEST_CAL_DT"."CAL_DT") + INNER JOIN "EDW"."TEST_CAL_DT" AS "TEST_CAL_DT" ON ("TEST_KYLIN_FACT"."CAL_DT" = "TEST_CAL_DT"."CAL_DT") GROUP BY "TEST_KYLIN_FACT"."CAL_DT" ORDER BY 2 DESC LIMIT 10 ) "t0" ON ("TEST_KYLIN_FACT"."CAL_DT" = "t0"."none_CAL_DT_ok") GROUP BY "TEST_KYLIN_FACT"."CAL_DT" \ No newline at end of file diff --git a/query/src/test/resources/query/sql_tableau/query27.sql b/query/src/test/resources/query/sql_tableau/query27.sql index c118f34..47e92c8 100644 --- a/query/src/test/resources/query/sql_tableau/query27.sql +++ b/query/src/test/resources/query/sql_tableau/query27.sql @@ -1,6 +1,6 @@ -SELECT "TEST_KYLIN_FACT"."CAL_DT", SUM("TEST_KYLIN_FACT"."PRICE") AS "sum_PRICE_ok" FROM "EDW"."TEST_KYLIN_FACT" "TEST_KYLIN_FACT" +SELECT "TEST_KYLIN_FACT"."CAL_DT", SUM("TEST_KYLIN_FACT"."PRICE") AS "sum_PRICE_ok" FROM "TEST_KYLIN_FACT" INNER JOIN ( - SELECT COUNT(1) AS "XTableau_join_flag", SUM("TEST_KYLIN_FACT"."PRICE") AS "X__alias__A", "TEST_KYLIN_FACT"."CAL_DT" AS "none_CAL_DT_ok" FROM "EDW"."TEST_KYLIN_FACT" "TEST_KYLIN_FACT" + SELECT COUNT(1) AS "XTableau_join_flag", SUM("TEST_KYLIN_FACT"."PRICE") AS "X__alias__A", "TEST_KYLIN_FACT"."CAL_DT" AS "none_CAL_DT_ok" FROM "TEST_KYLIN_FACT" GROUP BY "TEST_KYLIN_FACT"."CAL_DT" ORDER BY 2 DESC LIMIT 7 ) "t0" ON ("TEST_KYLIN_FACT"."CAL_DT" = "t0"."none_CAL_DT_ok") GROUP BY "TEST_KYLIN_FACT"."CAL_DT" diff --git a/storage/src/main/java/com/kylinolap/storage/filter/ColumnTupleFilter.java b/storage/src/main/java/com/kylinolap/storage/filter/ColumnTupleFilter.java index 1ad0e5f..c3923c0 100644 --- a/storage/src/main/java/com/kylinolap/storage/filter/ColumnTupleFilter.java +++ b/storage/src/main/java/com/kylinolap/storage/filter/ColumnTupleFilter.java @@ -99,12 +99,15 @@ public boolean isEvaluable() { @Override public void deserialize(byte[] bytes) { + ColumnDesc column = new ColumnDesc(); ByteBuffer buffer = ByteBuffer.wrap(bytes); - TableDesc table = new TableDesc(); - table.setName(BytesUtil.readUTFString(buffer)); + String tableName = BytesUtil.readUTFString(buffer); + if(tableName != null) { + TableDesc table = new TableDesc(); + table.setName(tableName); + column.setTable(table); + } - ColumnDesc column = new ColumnDesc(); - column.setTable(table); column.setName(BytesUtil.readUTFString(buffer)); column.setDatatype(BytesUtil.readUTFString(buffer)); diff --git a/storage/src/test/java/com/kylinolap/storage/filter/FilterBaseTest.java b/storage/src/test/java/com/kylinolap/storage/filter/FilterBaseTest.java index bfae2d3..3f85c79 100644 --- a/storage/src/test/java/com/kylinolap/storage/filter/FilterBaseTest.java +++ b/storage/src/test/java/com/kylinolap/storage/filter/FilterBaseTest.java @@ -39,7 +39,7 @@ TableDesc t1 = new TableDesc(); t1.setName("TEST_KYLIN_FACT"); - t1.setDatabase("EDW"); + t1.setDatabase("DEFAULT"); ColumnDesc c1 = new ColumnDesc(); c1.setName("CAL_DT"); c1.setDatatype("String"); @@ -49,7 +49,7 @@ TableDesc t2 = new TableDesc(); t2.setName("TEST_CATEGORY_GROUPINGS"); - t2.setDatabase("EDW"); + t2.setDatabase("DEFAULT"); ColumnDesc c2 = new ColumnDesc(); c2.setName("META_CATEG_NAME"); c1.setDatatype("String"); From 7aa4cb5d1fbb58dd93cc6785e8cb266257c96339 Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Mon, 8 Dec 2014 15:34:54 +0800 Subject: [PATCH 57/65] refactor --- .../test_case_data/localmeta/project/default.json | 8 +- .../localmeta/project/onlyinner.json | 4 +- .../test_case_data/localmeta/project/onlyleft.json | 4 +- .../model/realization/DataModelRealization.java | 10 + .../metadata/project/ProjectDataModel.java | 7 +- .../metadata/project/ProjectInstance.java | 270 +++++++++++++++++++++ .../kylinolap/metadata/project/ProjectManager.java | 264 ++++++++++++++++++++ .../metadata/project/ProjectStatusEnum.java | 22 ++ 8 files changed, 578 insertions(+), 11 deletions(-) create mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/realization/DataModelRealization.java create mode 100644 metadata/src/main/java/com/kylinolap/metadata/project/ProjectInstance.java create mode 100644 metadata/src/main/java/com/kylinolap/metadata/project/ProjectManager.java create mode 100644 metadata/src/main/java/com/kylinolap/metadata/project/ProjectStatusEnum.java diff --git a/examples/test_case_data/localmeta/project/default.json b/examples/test_case_data/localmeta/project/default.json index 0a878d8..730aa9e 100644 --- a/examples/test_case_data/localmeta/project/default.json +++ b/examples/test_case_data/localmeta/project/default.json @@ -4,22 +4,22 @@ "datamodels": [ { "name": "test_kylin_with_slr_model_desc", - "type": "cube", + "type": "CUBE", "realization": "test_kylin_cube_with_slr_empty" }, { "name": "test_kylin_without_slr_model_desc", - "type": "cube", + "type": "CUBE", "realization": "test_kylin_cube_without_slr_empty" }, { "name": "test_kylin_with_slr_left_join_model_desc", - "type": "cube", + "type": "CUBE", "realization": "test_kylin_cube_with_slr_left_join_empty" }, { "name": "test_kylin_without_slr_left_join_model_desc", - "type": "cube", + "type": "CUBE", "realization": "test_kylin_cube_without_slr_left_join_empty" } ], diff --git a/examples/test_case_data/localmeta/project/onlyinner.json b/examples/test_case_data/localmeta/project/onlyinner.json index 1037b9e..daf138a 100644 --- a/examples/test_case_data/localmeta/project/onlyinner.json +++ b/examples/test_case_data/localmeta/project/onlyinner.json @@ -4,12 +4,12 @@ "datamodels": [ { "name": "test_kylin_with_slr_model_desc", - "type": "cube", + "type": "CUBE", "realization": "test_kylin_cube_with_slr_empty" }, { "name": "test_kylin_without_slr_model_desc", - "type": "cube", + "type": "CUBE", "realization": "test_kylin_cube_without_slr_empty" } ], diff --git a/examples/test_case_data/localmeta/project/onlyleft.json b/examples/test_case_data/localmeta/project/onlyleft.json index bb3ef50..c37b31b 100644 --- a/examples/test_case_data/localmeta/project/onlyleft.json +++ b/examples/test_case_data/localmeta/project/onlyleft.json @@ -4,12 +4,12 @@ "datamodels": [ { "name": "test_kylin_with_slr_left_join_model_desc", - "type": "cube", + "type": "CUBE", "realization": "test_kylin_cube_with_slr_left_join_empty" }, { "name": "test_kylin_without_slr_left_join_model_desc", - "type": "cube", + "type": "CUBE", "realization": "test_kylin_cube_without_slr_left_join_empty" } ], diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/realization/DataModelRealization.java b/metadata/src/main/java/com/kylinolap/metadata/model/realization/DataModelRealization.java new file mode 100644 index 0000000..9b4d62b --- /dev/null +++ b/metadata/src/main/java/com/kylinolap/metadata/model/realization/DataModelRealization.java @@ -0,0 +1,10 @@ +package com.kylinolap.metadata.model.realization; + +/** + * Created by qianzhou on 12/8/14. + */ +public enum DataModelRealization { + + CUBE, + INVERTED_INDEX; +} diff --git a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectDataModel.java b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectDataModel.java index e0fd40f..dce36d5 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectDataModel.java +++ b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectDataModel.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonProperty; +import com.kylinolap.metadata.model.realization.DataModelRealization; /** * Created by qianzhou on 12/5/14. @@ -13,7 +14,7 @@ private String name; @JsonProperty("type") - private String type; + private DataModelRealization type; @JsonProperty("realization") private String realization; @@ -26,11 +27,11 @@ public void setName(String name) { this.name = name; } - public String getType() { + public DataModelRealization getType() { return type; } - public void setType(String type) { + public void setType(DataModelRealization type) { this.type = type; } diff --git a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectInstance.java b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectInstance.java new file mode 100644 index 0000000..a10a38a --- /dev/null +++ b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectInstance.java @@ -0,0 +1,270 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.metadata.project; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import com.kylinolap.common.persistence.ResourceStore; +import com.kylinolap.common.persistence.RootPersistentEntity; +import com.kylinolap.metadata.model.realization.DataModelRealization; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +/** + * Project is a concept in Kylin similar to schema in DBMS + */ +@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) +public class ProjectInstance extends RootPersistentEntity { + + public static final String DEFAULT_PROJECT_NAME = "DEFAULT"; + + @JsonProperty("name") + private String name; + + @JsonProperty("cubes") + private List cubes; + + @JsonProperty("tables") + private Set tables; + + + @JsonProperty("owner") + private String owner; + + @JsonProperty("status") + private ProjectStatusEnum status; + + @JsonProperty("create_time") + private String createTime; + + @JsonProperty("last_update_time") + private String lastUpdateTime; + + @JsonProperty("description") + private String description; + + @JsonProperty("datamodels") + private List dataModels; + + public String getResourcePath() { + return concatResourcePath(name); + } + + public static String concatResourcePath(String projectName) { + return ResourceStore.PROJECT_RESOURCE_ROOT + "/" + projectName + ".json"; + } + + public static String getNormalizedProjectName(String project) { + if (project == null) + throw new IllegalStateException("Trying to normalized a project name which is null"); + + return project.toUpperCase(); + } + + // ============================================================================ + + public static ProjectInstance create(String name, String owner, String description, List cubes) { + ProjectInstance projectInstance = new ProjectInstance(); + + projectInstance.updateRandomUuid(); + projectInstance.setName(name); + projectInstance.setOwner(owner); + projectInstance.setDescription(description); + projectInstance.setStatus(ProjectStatusEnum.ENABLED); + projectInstance.setCreateTime(formatTime(System.currentTimeMillis())); + if (cubes != null) + projectInstance.setCubes(cubes); + else + projectInstance.setCubes(new ArrayList()); + + return projectInstance; + } + + public ProjectInstance() { + + } + + public ProjectInstance(String name, List cubes, String owner) { + this.name = name; + this.cubes = cubes; + this.owner = owner; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public ProjectStatusEnum getStatus() { + return status; + } + + public void setStatus(ProjectStatusEnum status) { + this.status = status; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean containsCube(String cubeName) { + cubeName = cubeName.toUpperCase(); + return cubes.contains(cubeName); + } + + public void removeCube(String cubeName) { + cubeName = cubeName.toUpperCase(); + cubes.remove(cubeName); + } + + public int getCubesCount() { + return cubes.size(); + } + + public void addCube(String cubeName) { + cubeName = cubeName.toUpperCase(); + this.cubes.add(cubeName); + } + + public List getCubes() { + return cubes; + } + + + public void setCubes(List cubes) { + this.cubes = cubes; + } + + public void setTables(Set tables) { + this.tables = tables; + } + + public boolean containsTable(String tableName) { + tableName = tableName.toUpperCase(); + return tables.contains(tableName); + } + + public void removeTable(String tableName) { + tableName = tableName.toUpperCase(); + tables.remove(tableName); + } + + public int getTablesCount() { + return this.getTables().size(); + } + + public void addTable(String tableName) { + tableName = tableName.toUpperCase(); + this.getTables().add(tableName); + } + + //will return new Set for null + public Set getTables() { + tables = tables == null ? new TreeSet() : tables; + return tables; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public String getLastUpdateTime() { + return lastUpdateTime; + } + + public void setLastUpdateTime(String lastUpdateTime) { + this.lastUpdateTime = lastUpdateTime; + } + + public void recordUpdateTime(long timeMillis) { + this.lastUpdateTime = formatTime(timeMillis); + } + + public List getDataModels() { + return dataModels; + } + + public void setDataModels(List dataModels) { + this.dataModels = dataModels; + } + + public void init() { + if (name == null) + name = ProjectInstance.DEFAULT_PROJECT_NAME; + + if (cubes == null) { + cubes = new ArrayList(); + } + + for (int i = 0; i < cubes.size(); ++i) { + if (cubes.get(i) != null) + cubes.set(i, cubes.get(i).toUpperCase()); + } + } + + public boolean containsRealization(DataModelRealization realization, String name) { + if (dataModels == null) { + return false; + } + for (ProjectDataModel dataModel: dataModels) { + if (dataModel.getType() == realization && dataModel.getName().equalsIgnoreCase(name)) { + return true; + } + } + return false; + } + + public List getDataModels(final DataModelRealization dataModelRealization) { + return ImmutableList.copyOf(Iterables.filter(dataModels, new Predicate() { + @Override + public boolean apply(@Nullable ProjectDataModel input) { + return input.getType() == dataModelRealization; + } + })); + } + + @Override + public String toString() { + return "ProjectDesc [name=" + name + "]"; + } +} diff --git a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectManager.java b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectManager.java new file mode 100644 index 0000000..cc16916 --- /dev/null +++ b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectManager.java @@ -0,0 +1,264 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.metadata.project; + +import com.kylinolap.common.KylinConfig; +import com.kylinolap.common.persistence.JsonSerializer; +import com.kylinolap.common.persistence.ResourceStore; +import com.kylinolap.common.persistence.Serializer; +import com.kylinolap.common.restclient.Broadcaster; +import com.kylinolap.common.restclient.SingleValueCache; +import com.kylinolap.metadata.model.realization.DataModelRealization; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author xduo + */ +public class ProjectManager { + private static final Logger logger = LoggerFactory.getLogger(ProjectManager.class); + + // static cached instances + private static final ConcurrentHashMap CACHE = new ConcurrentHashMap(); + private static final Serializer PROJECT_SERIALIZER = new JsonSerializer(ProjectInstance.class); + + private KylinConfig config; + // project name => ProjrectDesc + private SingleValueCache projectMap = new SingleValueCache(Broadcaster.TYPE.PROJECT); + // project name => tables + + public static ProjectManager getInstance(KylinConfig config) { + ProjectManager r = CACHE.get(config); + if (r != null) { + return r; + } + + synchronized (ProjectManager.class) { + r = CACHE.get(config); + if (r != null) { + return r; + } + try { + r = new ProjectManager(config); + CACHE.put(config, r); + if (CACHE.size() > 1) { + logger.warn("More than one singleton exist"); + } + return r; + } catch (IOException e) { + throw new IllegalStateException("Failed to init CubeManager from " + config, e); + } + } + } + + public static synchronized void removeInstance(KylinConfig config) { + CACHE.remove(config); + } + + private ProjectManager(KylinConfig config) throws IOException { + logger.info("Initializing CubeManager with metadata url " + config); + this.config = config; + + loadAllProjects(); + } + + public List listAllProjects() { + return new ArrayList(projectMap.values()); + } + + public List getProjects(String cubeName) { + return this.findProjects(cubeName); + } + + public ProjectInstance dropProject(String projectName) throws IOException { + if (projectName == null) + throw new IllegalArgumentException("Project name not given"); + + ProjectInstance projectInstance = getProject(projectName); + + if (projectInstance == null) { + throw new IllegalStateException("The project named " + projectName + " does not exist"); + } + + if (projectInstance.getCubes().size() != 0) { + throw new IllegalStateException("The project named " + projectName + " can not be deleted because there's still cubes in it. Delete all the cubes first."); + } + + logger.info("Dropping project '" + projectInstance.getName() + "'"); + deleteResource(projectInstance); + + return projectInstance; + } + + public ProjectInstance getProject(String projectName) { + if (projectName == null) + return null; + projectName = ProjectInstance.getNormalizedProjectName(projectName); + return projectMap.get(projectName); + } + + public ProjectInstance createProject(String projectName, String owner, String description) throws IOException { + + logger.info("Creating project '" + projectName); + + ProjectInstance currentProject = getProject(projectName); + if (currentProject == null) { + currentProject = ProjectInstance.create(projectName, owner, description, null); + } else { + throw new IllegalStateException("The project named " + projectName + "already exists"); + } + + saveResource(currentProject); + + return currentProject; + } + + public ProjectInstance updateProject(ProjectInstance project, String newName, String newDesc) throws IOException { + if (!project.getName().equals(newName)) { + ProjectInstance newProject = this.createProject(newName, project.getOwner(), newDesc); + newProject.setCreateTime(project.getCreateTime()); + newProject.recordUpdateTime(System.currentTimeMillis()); + newProject.setCubes(project.getCubes()); + + deleteResource(project); + saveResource(newProject); + + return newProject; + } else { + project.setName(newName); + project.setDescription(newDesc); + + if (project.getUuid() == null) { + project.updateRandomUuid(); + } + + saveResource(project); + + return project; + } + } + + public boolean containsRealization(String projectName, DataModelRealization realization, String name) { + ProjectInstance project = getProject(projectName); + if (project == null) { + return false; + } + return project.containsRealization(realization, name); + } + + public void loadProjectCache(ProjectInstance project, boolean triggerUpdate) throws IOException { + loadProject(project.getResourcePath(), triggerUpdate); + } + + public void removeProjectCache(ProjectInstance project) { + String projectName = ProjectInstance.getNormalizedProjectName(project.getName()); + if (projectMap.containsKey(projectName)) { + projectMap.remove(projectName); + } + } + + private List findProjects(String cubeName) { + List projects = new ArrayList(); + for (ProjectInstance projectInstance : projectMap.values()) { + if (projectInstance.containsCube(cubeName)) { + projects.add(projectInstance); + } + } + + return projects; + } + + private synchronized ProjectInstance loadProject(String path, boolean triggerUpdate) throws IOException { + ResourceStore store = getStore(); + logger.debug("Loading CubeInstance " + store.getReadableResourcePath(path)); + + ProjectInstance projectInstance = store.getResource(path, ProjectInstance.class, PROJECT_SERIALIZER); + projectInstance.init(); + + if (StringUtils.isBlank(projectInstance.getName())) { + throw new IllegalStateException("Project name must not be blank"); + } + + if (triggerUpdate) { + projectMap.put(projectInstance.getName().toUpperCase(), projectInstance); + } else { + projectMap.putLocal(projectInstance.getName().toUpperCase(), projectInstance); + } + + return projectInstance; + } + + private void loadAllProjects() throws IOException { + ResourceStore store = getStore(); + List paths = store.collectResourceRecursively(ResourceStore.PROJECT_RESOURCE_ROOT, ".json"); + + logger.debug("Loading Project from folder " + store.getReadableResourcePath(ResourceStore.PROJECT_RESOURCE_ROOT)); + + for (String path : paths) { + loadProject(path, false); + } + + logger.debug("Loaded " + paths.size() + " Project(s)"); + } + + private ProjectInstance addCubeToProject(String cubeName, String project, String user) throws IOException { + String newProjectName = ProjectInstance.getNormalizedProjectName(project); + ProjectInstance newProject = getProject(newProjectName); + if (newProject == null) { + newProject = this.createProject(newProjectName, user, "This is a project automatically added when adding cube " + cubeName); + } + newProject.addCube(cubeName); + saveResource(newProject); + + return newProject; + } + + private void saveResource(ProjectInstance proj) throws IOException { + ResourceStore store = getStore(); + store.putResource(proj.getResourcePath(), proj, PROJECT_SERIALIZER); + afterProjectUpdated(proj); + } + + private void deleteResource(ProjectInstance proj) throws IOException { + ResourceStore store = getStore(); + store.deleteResource(proj.getResourcePath()); + this.afterProjectDropped(proj); + } + + private void afterProjectUpdated(ProjectInstance updatedProject) { + try { + this.loadProjectCache(updatedProject, true); + } catch (IOException e) { + logger.error(e.getLocalizedMessage(), e); + } + } + + private void afterProjectDropped(ProjectInstance droppedProject) { + this.removeProjectCache(droppedProject); + } + + private ResourceStore getStore() { + return ResourceStore.getStore(this.config); + } + +} diff --git a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectStatusEnum.java b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectStatusEnum.java new file mode 100644 index 0000000..541cbae --- /dev/null +++ b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectStatusEnum.java @@ -0,0 +1,22 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.metadata.project; + +public enum ProjectStatusEnum { + + DISABLED, ENABLED + +} From 5feae69b733ab21f0d87d03e358853f02c900928 Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Mon, 8 Dec 2014 16:29:46 +0800 Subject: [PATCH 58/65] refactor --- .../kylinolap/cube/project/ProjectInstance.java | 245 --------------------- .../com/kylinolap/cube/project/ProjectManager.java | 1 + .../kylinolap/cube/project/ProjectStatusEnum.java | 22 -- .../model/realization/DataModelRealization.java | 10 - .../realization/DataModelRealizationType.java | 10 + .../metadata/project/ProjectDataModel.java | 8 +- .../metadata/project/ProjectInstance.java | 8 +- .../kylinolap/metadata/project/ProjectManager.java | 15 +- .../com/kylinolap/rest/service/ProjectService.java | 2 +- 9 files changed, 33 insertions(+), 288 deletions(-) delete mode 100644 cube/src/main/java/com/kylinolap/cube/project/ProjectInstance.java delete mode 100644 cube/src/main/java/com/kylinolap/cube/project/ProjectStatusEnum.java delete mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/realization/DataModelRealization.java create mode 100644 metadata/src/main/java/com/kylinolap/metadata/model/realization/DataModelRealizationType.java diff --git a/cube/src/main/java/com/kylinolap/cube/project/ProjectInstance.java b/cube/src/main/java/com/kylinolap/cube/project/ProjectInstance.java deleted file mode 100644 index 17b0ed1..0000000 --- a/cube/src/main/java/com/kylinolap/cube/project/ProjectInstance.java +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.cube.project; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.kylinolap.common.persistence.ResourceStore; -import com.kylinolap.common.persistence.RootPersistentEntity; -import com.kylinolap.metadata.project.ProjectDataModel; - -/** - * Project is a concept in Kylin similar to schema in DBMS - */ -@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) -public class ProjectInstance extends RootPersistentEntity { - - public static final String DEFAULT_PROJECT_NAME = "DEFAULT"; - - @JsonProperty("name") - private String name; - - @JsonProperty("cubes") - private List cubes; - - @JsonProperty("tables") - private Set tables; - - - @JsonProperty("owner") - private String owner; - - @JsonProperty("status") - private ProjectStatusEnum status; - - @JsonProperty("create_time") - private String createTime; - - @JsonProperty("last_update_time") - private String lastUpdateTime; - - @JsonProperty("description") - private String description; - - @JsonProperty("datamodels") - private List dataModels; - - public String getResourcePath() { - return concatResourcePath(name); - } - - public static String concatResourcePath(String projectName) { - return ResourceStore.PROJECT_RESOURCE_ROOT + "/" + projectName + ".json"; - } - - public static String getNormalizedProjectName(String project) { - if (project == null) - throw new IllegalStateException("Trying to normalized a project name which is null"); - - return project.toUpperCase(); - } - - // ============================================================================ - - public static ProjectInstance create(String name, String owner, String description, List cubes) { - ProjectInstance projectInstance = new ProjectInstance(); - - projectInstance.updateRandomUuid(); - projectInstance.setName(name); - projectInstance.setOwner(owner); - projectInstance.setDescription(description); - projectInstance.setStatus(ProjectStatusEnum.ENABLED); - projectInstance.setCreateTime(formatTime(System.currentTimeMillis())); - if (cubes != null) - projectInstance.setCubes(cubes); - else - projectInstance.setCubes(new ArrayList()); - - return projectInstance; - } - - public ProjectInstance() { - - } - - public ProjectInstance(String name, List cubes, String owner) { - this.name = name; - this.cubes = cubes; - this.owner = owner; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public ProjectStatusEnum getStatus() { - return status; - } - - public void setStatus(ProjectStatusEnum status) { - this.status = status; - } - - public String getCreateTime() { - return createTime; - } - - public void setCreateTime(String createTime) { - this.createTime = createTime; - } - - public String getName() { - return this.name; - } - - public void setName(String name) { - this.name = name; - } - - public boolean containsCube(String cubeName) { - cubeName = cubeName.toUpperCase(); - return cubes.contains(cubeName); - } - - public void removeCube(String cubeName) { - cubeName = cubeName.toUpperCase(); - cubes.remove(cubeName); - } - - public int getCubesCount() { - return cubes.size(); - } - - public void addCube(String cubeName) { - cubeName = cubeName.toUpperCase(); - this.cubes.add(cubeName); - } - - public List getCubes() { - return cubes; - } - - - public void setCubes(List cubes) { - this.cubes = cubes; - } - - public void setTables(Set tables) { - this.tables = tables; - } - - public boolean containsTable(String tableName) { - tableName = tableName.toUpperCase(); - return tables.contains(tableName); - } - - public void removeTable(String tableName) { - tableName = tableName.toUpperCase(); - tables.remove(tableName); - } - - public int getTablesCount() { - return this.getTables().size(); - } - - public void addTable(String tableName) { - tableName = tableName.toUpperCase(); - this.getTables().add(tableName); - } - - //will return new Set for null - public Set getTables() { - tables = tables == null ? new TreeSet() : tables; - return tables; - } - - public String getOwner() { - return owner; - } - - public void setOwner(String owner) { - this.owner = owner; - } - - public String getLastUpdateTime() { - return lastUpdateTime; - } - - public void setLastUpdateTime(String lastUpdateTime) { - this.lastUpdateTime = lastUpdateTime; - } - - public void recordUpdateTime(long timeMillis) { - this.lastUpdateTime = formatTime(timeMillis); - } - - public List getDataModels() { - return dataModels; - } - - public void setDataModels(List dataModels) { - this.dataModels = dataModels; - } - - public void init() { - if (name == null) - name = ProjectInstance.DEFAULT_PROJECT_NAME; - - if (cubes == null) { - cubes = new ArrayList(); - } - - for (int i = 0; i < cubes.size(); ++i) { - if (cubes.get(i) != null) - cubes.set(i, cubes.get(i).toUpperCase()); - } - } - - @Override - public String toString() { - return "ProjectDesc [name=" + name + "]"; - } -} diff --git a/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java b/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java index 979f773..ccdd31d 100644 --- a/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java +++ b/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java @@ -20,6 +20,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import com.kylinolap.metadata.project.ProjectInstance; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cube/src/main/java/com/kylinolap/cube/project/ProjectStatusEnum.java b/cube/src/main/java/com/kylinolap/cube/project/ProjectStatusEnum.java deleted file mode 100644 index 0c582a7..0000000 --- a/cube/src/main/java/com/kylinolap/cube/project/ProjectStatusEnum.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.cube.project; - -public enum ProjectStatusEnum { - - DISABLED, ENABLED - -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/realization/DataModelRealization.java b/metadata/src/main/java/com/kylinolap/metadata/model/realization/DataModelRealization.java deleted file mode 100644 index 9b4d62b..0000000 --- a/metadata/src/main/java/com/kylinolap/metadata/model/realization/DataModelRealization.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.kylinolap.metadata.model.realization; - -/** - * Created by qianzhou on 12/8/14. - */ -public enum DataModelRealization { - - CUBE, - INVERTED_INDEX; -} diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/realization/DataModelRealizationType.java b/metadata/src/main/java/com/kylinolap/metadata/model/realization/DataModelRealizationType.java new file mode 100644 index 0000000..defa1ce --- /dev/null +++ b/metadata/src/main/java/com/kylinolap/metadata/model/realization/DataModelRealizationType.java @@ -0,0 +1,10 @@ +package com.kylinolap.metadata.model.realization; + +/** + * Created by qianzhou on 12/8/14. + */ +public enum DataModelRealizationType { + + CUBE, + INVERTED_INDEX +} diff --git a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectDataModel.java b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectDataModel.java index dce36d5..d6b0664 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectDataModel.java +++ b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectDataModel.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonProperty; -import com.kylinolap.metadata.model.realization.DataModelRealization; +import com.kylinolap.metadata.model.realization.DataModelRealizationType; /** * Created by qianzhou on 12/5/14. @@ -14,7 +14,7 @@ private String name; @JsonProperty("type") - private DataModelRealization type; + private DataModelRealizationType type; @JsonProperty("realization") private String realization; @@ -27,11 +27,11 @@ public void setName(String name) { this.name = name; } - public DataModelRealization getType() { + public DataModelRealizationType getType() { return type; } - public void setType(DataModelRealization type) { + public void setType(DataModelRealizationType type) { this.type = type; } diff --git a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectInstance.java b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectInstance.java index a10a38a..00c5041 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectInstance.java +++ b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectInstance.java @@ -23,7 +23,7 @@ import com.google.common.collect.Iterables; import com.kylinolap.common.persistence.ResourceStore; import com.kylinolap.common.persistence.RootPersistentEntity; -import com.kylinolap.metadata.model.realization.DataModelRealization; +import com.kylinolap.metadata.model.realization.DataModelRealizationType; import javax.annotation.Nullable; import java.util.ArrayList; @@ -242,7 +242,7 @@ public void init() { } } - public boolean containsRealization(DataModelRealization realization, String name) { + public boolean containsRealization(DataModelRealizationType realization, String name) { if (dataModels == null) { return false; } @@ -254,11 +254,11 @@ public boolean containsRealization(DataModelRealization realization, String name return false; } - public List getDataModels(final DataModelRealization dataModelRealization) { + public List getDataModels(final DataModelRealizationType dataModelRealizationType) { return ImmutableList.copyOf(Iterables.filter(dataModels, new Predicate() { @Override public boolean apply(@Nullable ProjectDataModel input) { - return input.getType() == dataModelRealization; + return input.getType() == dataModelRealizationType; } })); } diff --git a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectManager.java b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectManager.java index cc16916..db4b394 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectManager.java +++ b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectManager.java @@ -16,13 +16,15 @@ package com.kylinolap.metadata.project; +import com.google.common.collect.Maps; import com.kylinolap.common.KylinConfig; import com.kylinolap.common.persistence.JsonSerializer; import com.kylinolap.common.persistence.ResourceStore; import com.kylinolap.common.persistence.Serializer; import com.kylinolap.common.restclient.Broadcaster; import com.kylinolap.common.restclient.SingleValueCache; -import com.kylinolap.metadata.model.realization.DataModelRealization; +import com.kylinolap.metadata.model.realization.DataModelRealizationType; +import com.kylinolap.metadata.model.realization.IDataModelRealization; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,6 +33,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; /** * @author xduo @@ -41,6 +44,7 @@ // static cached instances private static final ConcurrentHashMap CACHE = new ConcurrentHashMap(); private static final Serializer PROJECT_SERIALIZER = new JsonSerializer(ProjectInstance.class); + private ConcurrentMap, Class> realizations = Maps.newConcurrentMap(); private KylinConfig config; // project name => ProjrectDesc @@ -82,6 +86,13 @@ private ProjectManager(KylinConfig config) throws IOException { loadAllProjects(); } + public void registerDataModelRealization(Class realization) { + if (realization == null) { + throw new NullPointerException("realization cannot be null"); + } + realizations.putIfAbsent(realization, realization); + } + public List listAllProjects() { return new ArrayList(projectMap.values()); } @@ -158,7 +169,7 @@ public ProjectInstance updateProject(ProjectInstance project, String newName, St } } - public boolean containsRealization(String projectName, DataModelRealization realization, String name) { + public boolean containsRealization(String projectName, DataModelRealizationType realization, String name) { ProjectInstance project = getProject(projectName); if (project == null) { return false; diff --git a/server/src/main/java/com/kylinolap/rest/service/ProjectService.java b/server/src/main/java/com/kylinolap/rest/service/ProjectService.java index 73c7302..a170167 100644 --- a/server/src/main/java/com/kylinolap/rest/service/ProjectService.java +++ b/server/src/main/java/com/kylinolap/rest/service/ProjectService.java @@ -20,6 +20,7 @@ import java.util.Collections; import java.util.List; +import com.kylinolap.metadata.project.ProjectInstance; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -27,7 +28,6 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; -import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.rest.constant.Constant; import com.kylinolap.rest.exception.InternalErrorException; import com.kylinolap.rest.request.CreateProjectRequest; From 37928259c03920b5fb1abab3ddfa85cdcd439620 Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Mon, 8 Dec 2014 16:43:51 +0800 Subject: [PATCH 59/65] fix compile issue --- .../main/java/com/kylinolap/cube/CubeManager.java | 2 +- .../java/com/kylinolap/cube/CubeManagerTest.java | 2 +- .../com/kylinolap/cube/SegmentManagementTest.java | 2 +- .../kylinolap/cube/project/ProjectManagerTest.java | 1 + .../main/java/com/kylinolap/job/JobManager.java | 30 +++++++++------------- .../com/kylinolap/job/tools/CubeMigrationCLI.java | 3 +-- .../metadata/project/ProjectInstance.java | 1 + .../com/kylinolap/query/schema/OLAPSchema.java | 2 +- .../kylinolap/query/schema/OLAPSchemaFactory.java | 2 +- .../com/kylinolap/query/test/KylinQueryTest.java | 2 +- .../kylinolap/rest/controller/CubeController.java | 2 +- .../rest/controller/ProjectController.java | 2 +- .../kylinolap/rest/security/AclEntityFactory.java | 2 +- .../com/kylinolap/rest/service/BasicService.java | 2 +- .../com/kylinolap/rest/service/CubeService.java | 2 +- .../rest/controller/ProjectControllerTest.java | 2 +- .../rest/controller/QueryControllerTest.java | 2 +- .../kylinolap/rest/service/CubeServiceTest.java | 2 +- .../com/kylinolap/rest/service/JobServiceTest.java | 2 +- .../kylinolap/rest/service/QueryServiceTest.java | 2 +- 20 files changed, 31 insertions(+), 36 deletions(-) diff --git a/cube/src/main/java/com/kylinolap/cube/CubeManager.java b/cube/src/main/java/com/kylinolap/cube/CubeManager.java index 1813e7b..088091f 100644 --- a/cube/src/main/java/com/kylinolap/cube/CubeManager.java +++ b/cube/src/main/java/com/kylinolap/cube/CubeManager.java @@ -27,6 +27,7 @@ import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import com.kylinolap.metadata.project.ProjectInstance; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,7 +41,6 @@ import com.kylinolap.cube.exception.CubeIntegrityException; import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.cube.model.DimensionDesc; -import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.dict.DateStrDictionary; import com.kylinolap.dict.Dictionary; diff --git a/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java b/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java index 990ea37..b9e778c 100644 --- a/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java +++ b/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java @@ -18,6 +18,7 @@ import static org.junit.Assert.*; +import com.kylinolap.metadata.project.ProjectInstance; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -26,7 +27,6 @@ import com.kylinolap.common.util.JsonUtil; import com.kylinolap.common.util.LocalFileMetadataTestCase; import com.kylinolap.cube.model.CubeDesc; -import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.metadata.MetadataManager; diff --git a/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java b/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java index 5d0558e..298e45f 100644 --- a/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java +++ b/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.TimeZone; +import com.kylinolap.metadata.project.ProjectInstance; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -33,7 +34,6 @@ import com.kylinolap.common.util.LocalFileMetadataTestCase; import com.kylinolap.cube.exception.CubeIntegrityException; import com.kylinolap.cube.model.CubeDesc; -import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.metadata.MetadataManager; diff --git a/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java b/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java index eb03c56..b7fadfa 100644 --- a/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java +++ b/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java @@ -20,6 +20,7 @@ import java.io.IOException; +import com.kylinolap.metadata.project.ProjectInstance; import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/job/src/main/java/com/kylinolap/job/JobManager.java b/job/src/main/java/com/kylinolap/job/JobManager.java index ec82f3a..8b94693 100644 --- a/job/src/main/java/com/kylinolap/job/JobManager.java +++ b/job/src/main/java/com/kylinolap/job/JobManager.java @@ -16,26 +16,10 @@ package com.kylinolap.job; -import java.io.IOException; -import java.net.UnknownHostException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.TimeZone; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.kylinolap.common.KylinConfig; -import com.kylinolap.cube.CubeBuildTypeEnum; -import com.kylinolap.cube.CubeInstance; -import com.kylinolap.cube.CubeManager; -import com.kylinolap.cube.CubeSegment; -import com.kylinolap.cube.CubeSegmentStatusEnum; +import com.kylinolap.cube.*; import com.kylinolap.cube.exception.CubeIntegrityException; import com.kylinolap.cube.model.CubeDesc; -import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.job.JobInstance.JobStep; import com.kylinolap.job.constant.JobConstants; @@ -46,6 +30,17 @@ import com.kylinolap.job.exception.InvalidJobInstanceException; import com.kylinolap.job.exception.JobException; import com.kylinolap.job.hadoop.hive.JoinedFlatTableDesc; +import com.kylinolap.metadata.project.ProjectInstance; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.net.UnknownHostException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; /** * @author xjiang, ysong1 @@ -173,7 +168,6 @@ public void discardJob(String uuid) throws IOException, CubeIntegrityException, } /** - * @param uuid * @param jobInstance * @throws IOException * @throws JobException diff --git a/job/src/main/java/com/kylinolap/job/tools/CubeMigrationCLI.java b/job/src/main/java/com/kylinolap/job/tools/CubeMigrationCLI.java index 6323fbb..831f3cd 100644 --- a/job/src/main/java/com/kylinolap/job/tools/CubeMigrationCLI.java +++ b/job/src/main/java/com/kylinolap/job/tools/CubeMigrationCLI.java @@ -6,14 +6,13 @@ import com.kylinolap.common.persistence.Serializer; import com.kylinolap.cube.*; import com.kylinolap.cube.model.CubeDesc; -import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.dict.DictionaryInfo; import com.kylinolap.dict.DictionaryManager; import com.kylinolap.dict.lookup.SnapshotManager; import com.kylinolap.dict.lookup.SnapshotTable; import com.kylinolap.job.JobInstance; import com.kylinolap.metadata.model.TableDesc; - +import com.kylinolap.metadata.project.ProjectInstance; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; diff --git a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectInstance.java b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectInstance.java index 00c5041..bb0ae33 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectInstance.java +++ b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectInstance.java @@ -267,4 +267,5 @@ public boolean apply(@Nullable ProjectDataModel input) { public String toString() { return "ProjectDesc [name=" + name + "]"; } + } diff --git a/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java b/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java index eda7244..da45eb7 100644 --- a/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java +++ b/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java @@ -19,12 +19,12 @@ import java.util.List; import java.util.Map; +import com.kylinolap.metadata.project.ProjectInstance; import net.hydromatic.optiq.Table; import net.hydromatic.optiq.impl.AbstractSchema; import com.kylinolap.common.KylinConfig; import com.kylinolap.cube.CubeManager; -import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.metadata.MetadataManager; import com.kylinolap.metadata.model.TableDesc; diff --git a/query/src/main/java/com/kylinolap/query/schema/OLAPSchemaFactory.java b/query/src/main/java/com/kylinolap/query/schema/OLAPSchemaFactory.java index 18b5d5c..dd5fc7f 100644 --- a/query/src/main/java/com/kylinolap/query/schema/OLAPSchemaFactory.java +++ b/query/src/main/java/com/kylinolap/query/schema/OLAPSchemaFactory.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; +import com.kylinolap.metadata.project.ProjectInstance; import net.hydromatic.optiq.Schema; import net.hydromatic.optiq.SchemaFactory; import net.hydromatic.optiq.SchemaPlus; @@ -29,7 +30,6 @@ import org.eigenbase.util14.ConversionUtil; import com.kylinolap.common.KylinConfig; -import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.metadata.model.DatabaseDesc; import com.kylinolap.metadata.model.TableDesc; diff --git a/query/src/test/java/com/kylinolap/query/test/KylinQueryTest.java b/query/src/test/java/com/kylinolap/query/test/KylinQueryTest.java index 0df1599..30c9403 100644 --- a/query/src/test/java/com/kylinolap/query/test/KylinQueryTest.java +++ b/query/src/test/java/com/kylinolap/query/test/KylinQueryTest.java @@ -35,7 +35,7 @@ import com.kylinolap.common.KylinConfig; import com.kylinolap.common.util.HBaseMetadataTestCase; import com.kylinolap.cube.CubeManager; -import com.kylinolap.cube.project.ProjectInstance; +import com.kylinolap.metadata.project.ProjectInstance; import com.kylinolap.query.enumerator.OLAPQuery; import com.kylinolap.query.relnode.OLAPContext; import com.kylinolap.query.schema.OLAPSchemaFactory; diff --git a/server/src/main/java/com/kylinolap/rest/controller/CubeController.java b/server/src/main/java/com/kylinolap/rest/controller/CubeController.java index c7cb2d4..1e208b0 100644 --- a/server/src/main/java/com/kylinolap/rest/controller/CubeController.java +++ b/server/src/main/java/com/kylinolap/rest/controller/CubeController.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.UUID; +import com.kylinolap.metadata.project.ProjectInstance; import com.kylinolap.storage.hbase.coprocessor.observer.ObserverEnabler; import org.apache.commons.lang.StringUtils; @@ -48,7 +49,6 @@ import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.exception.CubeIntegrityException; import com.kylinolap.cube.model.CubeDesc; -import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.job.JobInstance; import com.kylinolap.job.exception.InvalidJobInstanceException; import com.kylinolap.job.exception.JobException; diff --git a/server/src/main/java/com/kylinolap/rest/controller/ProjectController.java b/server/src/main/java/com/kylinolap/rest/controller/ProjectController.java index 3b15dc9..2fc9950 100644 --- a/server/src/main/java/com/kylinolap/rest/controller/ProjectController.java +++ b/server/src/main/java/com/kylinolap/rest/controller/ProjectController.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.util.List; +import com.kylinolap.metadata.project.ProjectInstance; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,7 +33,6 @@ import org.springframework.web.bind.annotation.ResponseBody; import com.codahale.metrics.annotation.Metered; -import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.rest.exception.InternalErrorException; import com.kylinolap.rest.request.CreateProjectRequest; import com.kylinolap.rest.request.UpdateProjectRequest; diff --git a/server/src/main/java/com/kylinolap/rest/security/AclEntityFactory.java b/server/src/main/java/com/kylinolap/rest/security/AclEntityFactory.java index cb51a0a..587dbcd 100644 --- a/server/src/main/java/com/kylinolap/rest/security/AclEntityFactory.java +++ b/server/src/main/java/com/kylinolap/rest/security/AclEntityFactory.java @@ -18,8 +18,8 @@ import com.kylinolap.common.persistence.RootPersistentEntity; import com.kylinolap.cube.CubeInstance; -import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.job.JobInstance; +import com.kylinolap.metadata.project.ProjectInstance; /** * @author xduo diff --git a/server/src/main/java/com/kylinolap/rest/service/BasicService.java b/server/src/main/java/com/kylinolap/rest/service/BasicService.java index d202313..87f5eae 100644 --- a/server/src/main/java/com/kylinolap/rest/service/BasicService.java +++ b/server/src/main/java/com/kylinolap/rest/service/BasicService.java @@ -31,6 +31,7 @@ import javax.sql.DataSource; +import com.kylinolap.metadata.project.ProjectInstance; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,7 +43,6 @@ import com.kylinolap.common.KylinConfig; import com.kylinolap.cube.CubeDescManager; import com.kylinolap.cube.CubeManager; -import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.job.JobManager; import com.kylinolap.job.engine.JobEngineConfig; diff --git a/server/src/main/java/com/kylinolap/rest/service/CubeService.java b/server/src/main/java/com/kylinolap/rest/service/CubeService.java index 4c3eea9..de58372 100644 --- a/server/src/main/java/com/kylinolap/rest/service/CubeService.java +++ b/server/src/main/java/com/kylinolap/rest/service/CubeService.java @@ -31,6 +31,7 @@ import java.util.Map; import java.util.Set; +import com.kylinolap.metadata.project.ProjectInstance; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; @@ -61,7 +62,6 @@ import com.kylinolap.cube.cuboid.CuboidCLI; import com.kylinolap.cube.exception.CubeIntegrityException; import com.kylinolap.cube.model.CubeDesc; -import com.kylinolap.cube.project.ProjectInstance; import com.kylinolap.job.JobDAO; import com.kylinolap.job.JobInstance; import com.kylinolap.job.JobInstance.JobStep; diff --git a/server/src/test/java/com/kylinolap/rest/controller/ProjectControllerTest.java b/server/src/test/java/com/kylinolap/rest/controller/ProjectControllerTest.java index af52415..de25bc9 100644 --- a/server/src/test/java/com/kylinolap/rest/controller/ProjectControllerTest.java +++ b/server/src/test/java/com/kylinolap/rest/controller/ProjectControllerTest.java @@ -8,7 +8,7 @@ import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; -import com.kylinolap.cube.project.ProjectInstance; +import com.kylinolap.metadata.project.ProjectInstance; import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.rest.exception.InternalErrorException; import com.kylinolap.rest.request.CreateProjectRequest; diff --git a/server/src/test/java/com/kylinolap/rest/controller/QueryControllerTest.java b/server/src/test/java/com/kylinolap/rest/controller/QueryControllerTest.java index 922e4d9..d1c6f32 100644 --- a/server/src/test/java/com/kylinolap/rest/controller/QueryControllerTest.java +++ b/server/src/test/java/com/kylinolap/rest/controller/QueryControllerTest.java @@ -22,7 +22,7 @@ import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; -import com.kylinolap.cube.project.ProjectInstance; +import com.kylinolap.metadata.project.ProjectInstance; import com.kylinolap.rest.request.MetaRequest; import com.kylinolap.rest.request.SQLRequest; import com.kylinolap.rest.service.QueryService; diff --git a/server/src/test/java/com/kylinolap/rest/service/CubeServiceTest.java b/server/src/test/java/com/kylinolap/rest/service/CubeServiceTest.java index 24c86be..c228f17 100644 --- a/server/src/test/java/com/kylinolap/rest/service/CubeServiceTest.java +++ b/server/src/test/java/com/kylinolap/rest/service/CubeServiceTest.java @@ -25,7 +25,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.kylinolap.cube.CubeInstance; -import com.kylinolap.cube.project.ProjectInstance; +import com.kylinolap.metadata.project.ProjectInstance; import com.kylinolap.job.exception.JobException; /** diff --git a/server/src/test/java/com/kylinolap/rest/service/JobServiceTest.java b/server/src/test/java/com/kylinolap/rest/service/JobServiceTest.java index 6d63dd4..d0c615a 100644 --- a/server/src/test/java/com/kylinolap/rest/service/JobServiceTest.java +++ b/server/src/test/java/com/kylinolap/rest/service/JobServiceTest.java @@ -22,7 +22,7 @@ import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; -import com.kylinolap.cube.project.ProjectInstance; +import com.kylinolap.metadata.project.ProjectInstance; import com.kylinolap.job.exception.JobException; /** diff --git a/server/src/test/java/com/kylinolap/rest/service/QueryServiceTest.java b/server/src/test/java/com/kylinolap/rest/service/QueryServiceTest.java index 157cdae..f61ca31 100644 --- a/server/src/test/java/com/kylinolap/rest/service/QueryServiceTest.java +++ b/server/src/test/java/com/kylinolap/rest/service/QueryServiceTest.java @@ -24,7 +24,7 @@ import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; -import com.kylinolap.cube.project.ProjectInstance; +import com.kylinolap.metadata.project.ProjectInstance; import com.kylinolap.job.exception.JobException; import com.kylinolap.rest.request.SQLRequest; import com.kylinolap.rest.response.SQLResponse; From 2a23feb9c6b09a47cf0f3d9e5b3df2e318826885 Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Mon, 8 Dec 2014 17:20:38 +0800 Subject: [PATCH 60/65] rename ProjectManager --- .../main/java/com/kylinolap/cube/CubeManager.java | 2 +- .../cube/project/CubeRealizationManager.java | 584 +++++++++++++++++++++ .../com/kylinolap/cube/project/ProjectManager.java | 584 --------------------- .../main/java/com/kylinolap/job/JobManager.java | 2 +- .../kylinolap/metadata/project/ProjectManager.java | 12 + .../com/kylinolap/query/routing/QueryRouter.java | 14 +- .../com/kylinolap/query/schema/OLAPSchema.java | 7 +- .../kylinolap/query/schema/OLAPSchemaFactory.java | 4 +- .../java/com/kylinolap/query/schema/OLAPTable.java | 4 +- .../kylinolap/rest/controller/TableController.java | 2 +- .../com/kylinolap/rest/service/BasicService.java | 10 +- 11 files changed, 616 insertions(+), 609 deletions(-) create mode 100644 cube/src/main/java/com/kylinolap/cube/project/CubeRealizationManager.java delete mode 100644 cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java diff --git a/cube/src/main/java/com/kylinolap/cube/CubeManager.java b/cube/src/main/java/com/kylinolap/cube/CubeManager.java index 088091f..1302c5d 100644 --- a/cube/src/main/java/com/kylinolap/cube/CubeManager.java +++ b/cube/src/main/java/com/kylinolap/cube/CubeManager.java @@ -41,7 +41,7 @@ import com.kylinolap.cube.exception.CubeIntegrityException; import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.cube.model.DimensionDesc; -import com.kylinolap.cube.project.ProjectManager; +import com.kylinolap.metadata.project.ProjectManager; import com.kylinolap.dict.DateStrDictionary; import com.kylinolap.dict.Dictionary; import com.kylinolap.dict.DictionaryInfo; diff --git a/cube/src/main/java/com/kylinolap/cube/project/CubeRealizationManager.java b/cube/src/main/java/com/kylinolap/cube/project/CubeRealizationManager.java new file mode 100644 index 0000000..956000f --- /dev/null +++ b/cube/src/main/java/com/kylinolap/cube/project/CubeRealizationManager.java @@ -0,0 +1,584 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.project; + +import java.io.IOException; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +import com.kylinolap.metadata.project.ProjectInstance; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Lists; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; +import com.kylinolap.common.KylinConfig; +import com.kylinolap.common.persistence.JsonSerializer; +import com.kylinolap.common.persistence.ResourceStore; +import com.kylinolap.common.persistence.Serializer; +import com.kylinolap.common.restclient.Broadcaster; +import com.kylinolap.common.restclient.SingleValueCache; +import com.kylinolap.cube.CubeInstance; +import com.kylinolap.cube.CubeManager; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.cube.model.DimensionDesc; +import com.kylinolap.cube.model.MeasureDesc; +import com.kylinolap.metadata.MetadataManager; +import com.kylinolap.metadata.model.ColumnDesc; +import com.kylinolap.metadata.model.JoinDesc; +import com.kylinolap.metadata.model.TableDesc; +import com.kylinolap.metadata.model.realization.FunctionDesc; +import com.kylinolap.metadata.model.realization.TblColRef; + +/** + * @author xduo + */ +public class CubeRealizationManager { + private static final Logger logger = LoggerFactory.getLogger(CubeRealizationManager.class); + + // static cached instances + private static final ConcurrentHashMap CACHE = new ConcurrentHashMap(); + private static final Serializer PROJECT_SERIALIZER = new JsonSerializer(ProjectInstance.class); + + private KylinConfig config; + // project name => ProjrectDesc + private SingleValueCache projectMap = new SingleValueCache(Broadcaster.TYPE.PROJECT); + // project name => tables + private Multimap projectTables = Multimaps.synchronizedMultimap(HashMultimap.create()); + + public static CubeRealizationManager getInstance(KylinConfig config) { + CubeRealizationManager r = CACHE.get(config); + if (r != null) { + return r; + } + + synchronized (CubeRealizationManager.class) { + r = CACHE.get(config); + if (r != null) { + return r; + } + try { + r = new CubeRealizationManager(config); + CACHE.put(config, r); + if (CACHE.size() > 1) { + logger.warn("More than one singleton exist"); + } + return r; + } catch (IOException e) { + throw new IllegalStateException("Failed to init CubeManager from " + config, e); + } + } + } + + public static synchronized void removeInstance(KylinConfig config) { + CACHE.remove(config); + } + + private CubeRealizationManager(KylinConfig config) throws IOException { + logger.info("Initializing CubeManager with metadata url " + config); + this.config = config; + + loadAllProjects(); + } + + public static String getDefaultProjectName() { + return ProjectInstance.DEFAULT_PROJECT_NAME; + } + + public List listAllProjects() { + return new ArrayList(projectMap.values()); + } + + public List getProjects(String cubeName) { + return this.findProjects(cubeName); + } + + public ProjectInstance dropProject(String projectName) throws IOException { + if (projectName == null) + throw new IllegalArgumentException("Project name not given"); + + ProjectInstance projectInstance = getProject(projectName); + + if (projectInstance == null) { + throw new IllegalStateException("The project named " + projectName + " does not exist"); + } + + if (projectInstance.getCubes().size() != 0) { + throw new IllegalStateException("The project named " + projectName + " can not be deleted because there's still cubes in it. Delete all the cubes first."); + } + + logger.info("Dropping project '" + projectInstance.getName() + "'"); + deleteResource(projectInstance); + + return projectInstance; + } + + public ProjectInstance getProject(String projectName) { + if (projectName == null) + return null; + projectName = ProjectInstance.getNormalizedProjectName(projectName); + return projectMap.get(projectName); + } + + public ProjectInstance createProject(String projectName, String owner, String description) throws IOException { + + logger.info("Creating project '" + projectName); + + ProjectInstance currentProject = getProject(projectName); + if (currentProject == null) { + currentProject = ProjectInstance.create(projectName, owner, description, null); + } else { + throw new IllegalStateException("The project named " + projectName + "already exists"); + } + + saveResource(currentProject); + + return currentProject; + } + + public ProjectInstance updateProject(ProjectInstance project, String newName, String newDesc) throws IOException { + if (!project.getName().equals(newName)) { + ProjectInstance newProject = this.createProject(newName, project.getOwner(), newDesc); + newProject.setCreateTime(project.getCreateTime()); + newProject.recordUpdateTime(System.currentTimeMillis()); + newProject.setCubes(project.getCubes()); + + deleteResource(project); + saveResource(newProject); + + return newProject; + } else { + project.setName(newName); + project.setDescription(newDesc); + + if (project.getUuid() == null) + project.updateRandomUuid(); + + saveResource(project); + + return project; + } + } + + public boolean isCubeInProject(String projectName, CubeInstance cube) { + return this.listAllCubes(projectName).contains(cube); + } + + public ProjectInstance updateCubeToProject(String cubeName, String newProjectName, String owner) throws IOException { + removeCubeFromProjects(cubeName); + + return addCubeToProject(cubeName, newProjectName, owner); + } + + public ProjectInstance updateTableToProject(String tables, String projectName) throws IOException { + ProjectInstance projectInstance = getProject(projectName); + String[] tokens = StringUtils.split(tables, ","); + for (int i = 0; i < tokens.length; i++) { + String token = tokens[i].trim(); + if (StringUtils.isNotEmpty(token)) { + projectInstance.addTable(token); + } + } + + List exposedTables = listExposedTables(projectName); + for (TableDesc table : exposedTables) { + projectInstance.addTable(table.getIdentity()); + } + + saveResource(projectInstance); + return projectInstance; + } + + + public void removeCubeFromProjects(String cubeName) throws IOException { + for (ProjectInstance projectInstance : findProjects(cubeName)) { + projectInstance.removeCube(cubeName); + + saveResource(projectInstance); + } + } + + public List listExposedTables(String project) { + project = ProjectInstance.getNormalizedProjectName(project); + List tables = Lists.newArrayList(); + + for (ProjectTable table : projectTables.get(project)) { + TableDesc tableDesc = getMetadataManager().getTableDesc(table.getName()); + if (tableDesc != null) { + tables.add(tableDesc); + } + } + + return tables; + } + + + public List listDefinedTablesInProject(String project) throws IOException { + if(null==project){ + return Collections.emptyList(); + } + project = ProjectInstance.getNormalizedProjectName(project); + ProjectInstance projectInstance = getProject(project); + int originTableCount = projectInstance.getTablesCount(); + //sync exposed table to project when list + List exposedTables = listExposedTables(project); + for (TableDesc table : exposedTables) { + projectInstance.addTable(TableDesc.getTableIdentity(table)); + } + //only save project json if new tables are sync in + if (originTableCount < projectInstance.getTablesCount()) { + saveResource(projectInstance); + } + + List tables = Lists.newArrayList(); + for (String table : projectInstance.getTables()) { + TableDesc tableDesc = getMetadataManager().getTableDesc(table); + if (tableDesc != null) { + tables.add(tableDesc); + } + } + + return tables; + } + + public List listExposedColumns(String project, String table) { + project = ProjectInstance.getNormalizedProjectName(project); + + MetadataManager metaMgr = getMetadataManager(); + TableDesc tableDesc = metaMgr.getTableDesc(table); + List columns = Lists.newArrayList(); + + for (String column : this.getProjectTable(project, table).getColumns()) { + columns.add(tableDesc.findColumnByName(column)); + } + + return columns; + } + + public boolean isExposedTable(String project, String table) { + project = ProjectInstance.getNormalizedProjectName(project); + + return projectTables.containsEntry(project, new ProjectTable(table)); + } + + public boolean isExposedColumn(String project, String table, String col) { + project = ProjectInstance.getNormalizedProjectName(project); + + return getProjectTable(project, table).getColumns().contains(col); + } + + public List listAllCubes(String project) { + project = ProjectInstance.getNormalizedProjectName(project); + + HashSet ret = new HashSet(); + + ProjectInstance projectInstance = getProject(project); + if (projectInstance != null) { + for (String cubeName : projectInstance.getCubes()) { + CubeInstance cube = CubeManager.getInstance(config).getCube(cubeName); + if (null != cube) { + ret.add(cube); + } else { + logger.error("Failed to load cube " + cubeName); + } + } + } + + return new ArrayList(ret); + } + + + public List getCubesByTable(String project, String tableName) { + project = ProjectInstance.getNormalizedProjectName(project); + tableName = tableName.toUpperCase(); + List cubes = new ArrayList(); + + ProjectTable projectTable = getProjectTable(project, tableName); + cubes.addAll(projectTable.getCubes()); + + return cubes; + } + + public List getOnlineCubesByFactTable(String project, String factTableName) { + project = ProjectInstance.getNormalizedProjectName(project); + factTableName = factTableName.toUpperCase(); + List cubes = new ArrayList(); + ProjectTable projectTable = this.getProjectTable(project, factTableName); + for (CubeInstance cube : projectTable.getCubes()) { + if (cube.getDescriptor().getModel().isFactTable(factTableName) && cube.isReady()) { + cubes.add(cube); + } + } + + return cubes; + } + + public List listEffectiveRewriteMeasures(String project, String factTable) { + factTable = factTable.toUpperCase(); + + HashSet relatedDesc = new HashSet(); + for (CubeInstance cube : getProjectTable(project, factTable).getCubes()) { + if (cube.isReady() == false) + continue; + if (cube.getDescriptor().getModel().isFactTable(factTable) == false) + continue; + + relatedDesc.add(cube.getDescriptor()); + } + + List result = Lists.newArrayList(); + for (CubeDesc desc : relatedDesc) { + for (MeasureDesc m : desc.getMeasures()) { + FunctionDesc func = m.getFunction(); + if (func.needRewrite()) + result.add(m); + } + } + + return result; + } + + public void loadProjectCache(ProjectInstance project, boolean triggerUpdate) throws IOException { + loadProject(project.getResourcePath(), triggerUpdate); + loadTables(project.getResourcePath()); + } + + public void removeProjectCache(ProjectInstance project) { + String projectName = ProjectInstance.getNormalizedProjectName(project.getName()); + if (projectMap.containsKey(projectName)) { + projectMap.remove(projectName); + projectTables.removeAll(projectName); + } + } + + private void mapTableToCube(ProjectInstance projectInstance, CubeInstance cubeInstance) { + // schema sanity check + CubeDesc cubeDesc = cubeInstance.getDescriptor(); + if (cubeDesc == null) { + logger.warn("No CubeDesc found by name '" + cubeInstance.getDescName() + "'"); + return; + } + + // table ==> cube mapping + String factTable = cubeDesc.getFactTable(); + logger.debug("Fact Table: " + factTable + " -- Cube: " + cubeInstance.getName()); + assert this.getMetadataManager().getTableDesc(factTable) != null; + + String project = ProjectInstance.getNormalizedProjectName(projectInstance.getName()); + ProjectTable factProjTable = this.getProjectTable(project, factTable, true); + if (!factProjTable.getCubes().contains(cubeInstance)) { + factProjTable.getCubes().add(cubeInstance); + } + + for (DimensionDesc d : cubeDesc.getDimensions()) { + String lookupTable = d.getTable(); + logger.debug("Lookup Table: " + lookupTable + " -- Cube: " + cubeInstance.getName()); + assert this.getMetadataManager().getTableDesc(lookupTable) != null; + + ProjectTable dimensionProjTable = this.getProjectTable(project, lookupTable); + if (!dimensionProjTable.getCubes().contains(cubeInstance)) { + dimensionProjTable.getCubes().add(cubeInstance); + } + } + } + + private List findProjects(String cubeName) { + List projects = new ArrayList(); + for (ProjectInstance projectInstance : projectMap.values()) { + if (projectInstance.containsCube(cubeName)) { + projects.add(projectInstance); + } + } + + return projects; + } + + private synchronized ProjectInstance loadProject(String path, boolean triggerUpdate) throws IOException { + ResourceStore store = getStore(); + logger.debug("Loading CubeInstance " + store.getReadableResourcePath(path)); + + ProjectInstance projectInstance = store.getResource(path, ProjectInstance.class, PROJECT_SERIALIZER); + projectInstance.init(); + + if (StringUtils.isBlank(projectInstance.getName())) { + throw new IllegalStateException("Project name must not be blank"); + } + + if (triggerUpdate) { + projectMap.put(projectInstance.getName().toUpperCase(), projectInstance); + } else { + projectMap.putLocal(projectInstance.getName().toUpperCase(), projectInstance); + } + + return projectInstance; + } + + private synchronized void loadTables(String path) throws IOException { + ResourceStore store = getStore(); + logger.debug("Loading CubeInstance " + store.getReadableResourcePath(path)); + + ProjectInstance projectInstance = store.getResource(path, ProjectInstance.class, PROJECT_SERIALIZER); + projectInstance.init(); + + String project = ProjectInstance.getNormalizedProjectName(projectInstance.getName()); + projectTables.removeAll(project); + + for (CubeInstance cubeInstance : this.listAllCubes(projectInstance.getName())) { + markExposedTablesAndColumns(projectInstance.getName(), cubeInstance); + mapTableToCube(projectInstance, cubeInstance); + } + } + + private void loadAllProjects() throws IOException { + ResourceStore store = getStore(); + List paths = store.collectResourceRecursively(ResourceStore.PROJECT_RESOURCE_ROOT, ".json"); + + logger.debug("Loading Project from folder " + store.getReadableResourcePath(ResourceStore.PROJECT_RESOURCE_ROOT)); + + for (String path : paths) { + loadProject(path, false); + loadTables(path); + } + + logger.debug("Loaded " + paths.size() + " Project(s)"); + } + + private ProjectInstance addCubeToProject(String cubeName, String project, String user) throws IOException { + String newProjectName = ProjectInstance.getNormalizedProjectName(project); + ProjectInstance newProject = getProject(newProjectName); + if (newProject == null) { + newProject = this.createProject(newProjectName, user, "This is a project automatically added when adding cube " + cubeName); + } + newProject.addCube(cubeName); + saveResource(newProject); + + return newProject; + } + + private void saveResource(ProjectInstance proj) throws IOException { + ResourceStore store = getStore(); + store.putResource(proj.getResourcePath(), proj, PROJECT_SERIALIZER); + afterProjectUpdated(proj); + } + + private void deleteResource(ProjectInstance proj) throws IOException { + ResourceStore store = getStore(); + store.deleteResource(proj.getResourcePath()); + this.afterProjectDropped(proj); + } + + private void afterProjectUpdated(ProjectInstance updatedProject) { + try { + this.loadProjectCache(updatedProject, true); + } catch (IOException e) { + logger.error(e.getLocalizedMessage(), e); + } + } + + private void afterProjectDropped(ProjectInstance droppedProject) { + this.removeProjectCache(droppedProject); + } + + // sync on update + private void markExposedTablesAndColumns(String projectName, CubeInstance cubeInstance) { + if (!cubeInstance.isReady()) + return; + + CubeDesc cubeDesc = cubeInstance.getDescriptor(); + String factTable = cubeDesc.getFactTable(); + for (DimensionDesc dim : cubeDesc.getDimensions()) { + String lookupTable = dim.getTable(); + JoinDesc join = dim.getJoin(); + if (join == null) + continue; // for dimensions on fact table, there's no join + + if (join.getForeignKeyColumns() == null) { + throw new IllegalStateException("Null FK for " + join); + } + for (TblColRef fkCol : join.getForeignKeyColumns()) { + markExposedTableAndColumn(projectName, factTable, fkCol.getName(), dim); + } + if (join.getPrimaryKeyColumns() == null) { + throw new IllegalStateException("Null PK for " + join); + } + for (TblColRef pkCol : join.getPrimaryKeyColumns()) { + markExposedTableAndColumn(projectName, lookupTable, pkCol.getName(), dim); + } + } + for (TblColRef col : cubeDesc.listAllColumns()) { + markExposedTableAndColumn(projectName, col.getTable(), col.getName(), col); + } + } + + private void markExposedTableAndColumn(String project, String table, String column, Object refObj) { + project = ProjectInstance.getNormalizedProjectName(project); + TableDesc t = this.getMetadataManager().getTableDesc(table); + if (t == null) { + throw new IllegalStateException("No SourceTable found by name '" + table + "', ref by " + refObj); + } + table = t.getIdentity(); // ensures upper case + + ProjectTable projTable = getProjectTable(project, table, true); + + ColumnDesc srcCol = t.findColumnByName(column); + if (srcCol == null) { + throw new IllegalStateException("No SourceColumn found by name '" + table + "/" + column + "', ref by " + refObj); + } + + if (!projTable.getColumns().contains(srcCol.getName())) { + projTable.getColumns().add(srcCol.getName()); + } + } + + private ProjectTable getProjectTable(String project, final String table) { + return getProjectTable(project, table, false); + } + + private ProjectTable getProjectTable(String project, final String table, boolean autoCreate) { + ProjectTable projectTable = null; + project = ProjectInstance.getNormalizedProjectName(project); + + if (this.projectTables.containsEntry(project, new ProjectTable(table))) { + Collection projects = this.projectTables.get(project); + for (ProjectTable pt : projects) { + if (pt.getName().equalsIgnoreCase(table)) { + projectTable = pt; + break; + } + } + } else { + projectTable = new ProjectTable(table); + + if (autoCreate) { + this.projectTables.put(project, projectTable); + } + } + + return projectTable; + } + + private ResourceStore getStore() { + return ResourceStore.getStore(this.config); + } + + private MetadataManager getMetadataManager() { + return MetadataManager.getInstance(config); + } +} diff --git a/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java b/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java deleted file mode 100644 index ccdd31d..0000000 --- a/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java +++ /dev/null @@ -1,584 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.cube.project; - -import java.io.IOException; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - -import com.kylinolap.metadata.project.ProjectInstance; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Lists; -import com.google.common.collect.Multimap; -import com.google.common.collect.Multimaps; -import com.kylinolap.common.KylinConfig; -import com.kylinolap.common.persistence.JsonSerializer; -import com.kylinolap.common.persistence.ResourceStore; -import com.kylinolap.common.persistence.Serializer; -import com.kylinolap.common.restclient.Broadcaster; -import com.kylinolap.common.restclient.SingleValueCache; -import com.kylinolap.cube.CubeInstance; -import com.kylinolap.cube.CubeManager; -import com.kylinolap.cube.model.CubeDesc; -import com.kylinolap.cube.model.DimensionDesc; -import com.kylinolap.cube.model.MeasureDesc; -import com.kylinolap.metadata.MetadataManager; -import com.kylinolap.metadata.model.ColumnDesc; -import com.kylinolap.metadata.model.JoinDesc; -import com.kylinolap.metadata.model.TableDesc; -import com.kylinolap.metadata.model.realization.FunctionDesc; -import com.kylinolap.metadata.model.realization.TblColRef; - -/** - * @author xduo - */ -public class ProjectManager { - private static final Logger logger = LoggerFactory.getLogger(ProjectManager.class); - - // static cached instances - private static final ConcurrentHashMap CACHE = new ConcurrentHashMap(); - private static final Serializer PROJECT_SERIALIZER = new JsonSerializer(ProjectInstance.class); - - private KylinConfig config; - // project name => ProjrectDesc - private SingleValueCache projectMap = new SingleValueCache(Broadcaster.TYPE.PROJECT); - // project name => tables - private Multimap projectTables = Multimaps.synchronizedMultimap(HashMultimap.create()); - - public static ProjectManager getInstance(KylinConfig config) { - ProjectManager r = CACHE.get(config); - if (r != null) { - return r; - } - - synchronized (ProjectManager.class) { - r = CACHE.get(config); - if (r != null) { - return r; - } - try { - r = new ProjectManager(config); - CACHE.put(config, r); - if (CACHE.size() > 1) { - logger.warn("More than one singleton exist"); - } - return r; - } catch (IOException e) { - throw new IllegalStateException("Failed to init CubeManager from " + config, e); - } - } - } - - public static synchronized void removeInstance(KylinConfig config) { - CACHE.remove(config); - } - - private ProjectManager(KylinConfig config) throws IOException { - logger.info("Initializing CubeManager with metadata url " + config); - this.config = config; - - loadAllProjects(); - } - - public static String getDefaultProjectName() { - return ProjectInstance.DEFAULT_PROJECT_NAME; - } - - public List listAllProjects() { - return new ArrayList(projectMap.values()); - } - - public List getProjects(String cubeName) { - return this.findProjects(cubeName); - } - - public ProjectInstance dropProject(String projectName) throws IOException { - if (projectName == null) - throw new IllegalArgumentException("Project name not given"); - - ProjectInstance projectInstance = getProject(projectName); - - if (projectInstance == null) { - throw new IllegalStateException("The project named " + projectName + " does not exist"); - } - - if (projectInstance.getCubes().size() != 0) { - throw new IllegalStateException("The project named " + projectName + " can not be deleted because there's still cubes in it. Delete all the cubes first."); - } - - logger.info("Dropping project '" + projectInstance.getName() + "'"); - deleteResource(projectInstance); - - return projectInstance; - } - - public ProjectInstance getProject(String projectName) { - if (projectName == null) - return null; - projectName = ProjectInstance.getNormalizedProjectName(projectName); - return projectMap.get(projectName); - } - - public ProjectInstance createProject(String projectName, String owner, String description) throws IOException { - - logger.info("Creating project '" + projectName); - - ProjectInstance currentProject = getProject(projectName); - if (currentProject == null) { - currentProject = ProjectInstance.create(projectName, owner, description, null); - } else { - throw new IllegalStateException("The project named " + projectName + "already exists"); - } - - saveResource(currentProject); - - return currentProject; - } - - public ProjectInstance updateProject(ProjectInstance project, String newName, String newDesc) throws IOException { - if (!project.getName().equals(newName)) { - ProjectInstance newProject = this.createProject(newName, project.getOwner(), newDesc); - newProject.setCreateTime(project.getCreateTime()); - newProject.recordUpdateTime(System.currentTimeMillis()); - newProject.setCubes(project.getCubes()); - - deleteResource(project); - saveResource(newProject); - - return newProject; - } else { - project.setName(newName); - project.setDescription(newDesc); - - if (project.getUuid() == null) - project.updateRandomUuid(); - - saveResource(project); - - return project; - } - } - - public boolean isCubeInProject(String projectName, CubeInstance cube) { - return this.listAllCubes(projectName).contains(cube); - } - - public ProjectInstance updateCubeToProject(String cubeName, String newProjectName, String owner) throws IOException { - removeCubeFromProjects(cubeName); - - return addCubeToProject(cubeName, newProjectName, owner); - } - - public ProjectInstance updateTableToProject(String tables, String projectName) throws IOException { - ProjectInstance projectInstance = getProject(projectName); - String[] tokens = StringUtils.split(tables, ","); - for (int i = 0; i < tokens.length; i++) { - String token = tokens[i].trim(); - if (StringUtils.isNotEmpty(token)) { - projectInstance.addTable(token); - } - } - - List exposedTables = listExposedTables(projectName); - for (TableDesc table : exposedTables) { - projectInstance.addTable(table.getIdentity()); - } - - saveResource(projectInstance); - return projectInstance; - } - - - public void removeCubeFromProjects(String cubeName) throws IOException { - for (ProjectInstance projectInstance : findProjects(cubeName)) { - projectInstance.removeCube(cubeName); - - saveResource(projectInstance); - } - } - - public List listExposedTables(String project) { - project = ProjectInstance.getNormalizedProjectName(project); - List tables = Lists.newArrayList(); - - for (ProjectTable table : projectTables.get(project)) { - TableDesc tableDesc = getMetadataManager().getTableDesc(table.getName()); - if (tableDesc != null) { - tables.add(tableDesc); - } - } - - return tables; - } - - - public List listDefinedTablesInProject(String project) throws IOException { - if(null==project){ - return Collections.emptyList(); - } - project = ProjectInstance.getNormalizedProjectName(project); - ProjectInstance projectInstance = getProject(project); - int originTableCount = projectInstance.getTablesCount(); - //sync exposed table to project when list - List exposedTables = listExposedTables(project); - for (TableDesc table : exposedTables) { - projectInstance.addTable(TableDesc.getTableIdentity(table)); - } - //only save project json if new tables are sync in - if (originTableCount < projectInstance.getTablesCount()) { - saveResource(projectInstance); - } - - List tables = Lists.newArrayList(); - for (String table : projectInstance.getTables()) { - TableDesc tableDesc = getMetadataManager().getTableDesc(table); - if (tableDesc != null) { - tables.add(tableDesc); - } - } - - return tables; - } - - public List listExposedColumns(String project, String table) { - project = ProjectInstance.getNormalizedProjectName(project); - - MetadataManager metaMgr = getMetadataManager(); - TableDesc tableDesc = metaMgr.getTableDesc(table); - List columns = Lists.newArrayList(); - - for (String column : this.getProjectTable(project, table).getColumns()) { - columns.add(tableDesc.findColumnByName(column)); - } - - return columns; - } - - public boolean isExposedTable(String project, String table) { - project = ProjectInstance.getNormalizedProjectName(project); - - return projectTables.containsEntry(project, new ProjectTable(table)); - } - - public boolean isExposedColumn(String project, String table, String col) { - project = ProjectInstance.getNormalizedProjectName(project); - - return getProjectTable(project, table).getColumns().contains(col); - } - - public List listAllCubes(String project) { - project = ProjectInstance.getNormalizedProjectName(project); - - HashSet ret = new HashSet(); - - ProjectInstance projectInstance = getProject(project); - if (projectInstance != null) { - for (String cubeName : projectInstance.getCubes()) { - CubeInstance cube = CubeManager.getInstance(config).getCube(cubeName); - if (null != cube) { - ret.add(cube); - } else { - logger.error("Failed to load cube " + cubeName); - } - } - } - - return new ArrayList(ret); - } - - - public List getCubesByTable(String project, String tableName) { - project = ProjectInstance.getNormalizedProjectName(project); - tableName = tableName.toUpperCase(); - List cubes = new ArrayList(); - - ProjectTable projectTable = getProjectTable(project, tableName); - cubes.addAll(projectTable.getCubes()); - - return cubes; - } - - public List getOnlineCubesByFactTable(String project, String factTableName) { - project = ProjectInstance.getNormalizedProjectName(project); - factTableName = factTableName.toUpperCase(); - List cubes = new ArrayList(); - ProjectTable projectTable = this.getProjectTable(project, factTableName); - for (CubeInstance cube : projectTable.getCubes()) { - if (cube.getDescriptor().getModel().isFactTable(factTableName) && cube.isReady()) { - cubes.add(cube); - } - } - - return cubes; - } - - public List listEffectiveRewriteMeasures(String project, String factTable) { - factTable = factTable.toUpperCase(); - - HashSet relatedDesc = new HashSet(); - for (CubeInstance cube : getProjectTable(project, factTable).getCubes()) { - if (cube.isReady() == false) - continue; - if (cube.getDescriptor().getModel().isFactTable(factTable) == false) - continue; - - relatedDesc.add(cube.getDescriptor()); - } - - List result = Lists.newArrayList(); - for (CubeDesc desc : relatedDesc) { - for (MeasureDesc m : desc.getMeasures()) { - FunctionDesc func = m.getFunction(); - if (func.needRewrite()) - result.add(m); - } - } - - return result; - } - - public void loadProjectCache(ProjectInstance project, boolean triggerUpdate) throws IOException { - loadProject(project.getResourcePath(), triggerUpdate); - loadTables(project.getResourcePath()); - } - - public void removeProjectCache(ProjectInstance project) { - String projectName = ProjectInstance.getNormalizedProjectName(project.getName()); - if (projectMap.containsKey(projectName)) { - projectMap.remove(projectName); - projectTables.removeAll(projectName); - } - } - - private void mapTableToCube(ProjectInstance projectInstance, CubeInstance cubeInstance) { - // schema sanity check - CubeDesc cubeDesc = cubeInstance.getDescriptor(); - if (cubeDesc == null) { - logger.warn("No CubeDesc found by name '" + cubeInstance.getDescName() + "'"); - return; - } - - // table ==> cube mapping - String factTable = cubeDesc.getFactTable(); - logger.debug("Fact Table: " + factTable + " -- Cube: " + cubeInstance.getName()); - assert this.getMetadataManager().getTableDesc(factTable) != null; - - String project = ProjectInstance.getNormalizedProjectName(projectInstance.getName()); - ProjectTable factProjTable = this.getProjectTable(project, factTable, true); - if (!factProjTable.getCubes().contains(cubeInstance)) { - factProjTable.getCubes().add(cubeInstance); - } - - for (DimensionDesc d : cubeDesc.getDimensions()) { - String lookupTable = d.getTable(); - logger.debug("Lookup Table: " + lookupTable + " -- Cube: " + cubeInstance.getName()); - assert this.getMetadataManager().getTableDesc(lookupTable) != null; - - ProjectTable dimensionProjTable = this.getProjectTable(project, lookupTable); - if (!dimensionProjTable.getCubes().contains(cubeInstance)) { - dimensionProjTable.getCubes().add(cubeInstance); - } - } - } - - private List findProjects(String cubeName) { - List projects = new ArrayList(); - for (ProjectInstance projectInstance : projectMap.values()) { - if (projectInstance.containsCube(cubeName)) { - projects.add(projectInstance); - } - } - - return projects; - } - - private synchronized ProjectInstance loadProject(String path, boolean triggerUpdate) throws IOException { - ResourceStore store = getStore(); - logger.debug("Loading CubeInstance " + store.getReadableResourcePath(path)); - - ProjectInstance projectInstance = store.getResource(path, ProjectInstance.class, PROJECT_SERIALIZER); - projectInstance.init(); - - if (StringUtils.isBlank(projectInstance.getName())) { - throw new IllegalStateException("Project name must not be blank"); - } - - if (triggerUpdate) { - projectMap.put(projectInstance.getName().toUpperCase(), projectInstance); - } else { - projectMap.putLocal(projectInstance.getName().toUpperCase(), projectInstance); - } - - return projectInstance; - } - - private synchronized void loadTables(String path) throws IOException { - ResourceStore store = getStore(); - logger.debug("Loading CubeInstance " + store.getReadableResourcePath(path)); - - ProjectInstance projectInstance = store.getResource(path, ProjectInstance.class, PROJECT_SERIALIZER); - projectInstance.init(); - - String project = ProjectInstance.getNormalizedProjectName(projectInstance.getName()); - projectTables.removeAll(project); - - for (CubeInstance cubeInstance : this.listAllCubes(projectInstance.getName())) { - markExposedTablesAndColumns(projectInstance.getName(), cubeInstance); - mapTableToCube(projectInstance, cubeInstance); - } - } - - private void loadAllProjects() throws IOException { - ResourceStore store = getStore(); - List paths = store.collectResourceRecursively(ResourceStore.PROJECT_RESOURCE_ROOT, ".json"); - - logger.debug("Loading Project from folder " + store.getReadableResourcePath(ResourceStore.PROJECT_RESOURCE_ROOT)); - - for (String path : paths) { - loadProject(path, false); - loadTables(path); - } - - logger.debug("Loaded " + paths.size() + " Project(s)"); - } - - private ProjectInstance addCubeToProject(String cubeName, String project, String user) throws IOException { - String newProjectName = ProjectInstance.getNormalizedProjectName(project); - ProjectInstance newProject = getProject(newProjectName); - if (newProject == null) { - newProject = this.createProject(newProjectName, user, "This is a project automatically added when adding cube " + cubeName); - } - newProject.addCube(cubeName); - saveResource(newProject); - - return newProject; - } - - private void saveResource(ProjectInstance proj) throws IOException { - ResourceStore store = getStore(); - store.putResource(proj.getResourcePath(), proj, PROJECT_SERIALIZER); - afterProjectUpdated(proj); - } - - private void deleteResource(ProjectInstance proj) throws IOException { - ResourceStore store = getStore(); - store.deleteResource(proj.getResourcePath()); - this.afterProjectDropped(proj); - } - - private void afterProjectUpdated(ProjectInstance updatedProject) { - try { - this.loadProjectCache(updatedProject, true); - } catch (IOException e) { - logger.error(e.getLocalizedMessage(), e); - } - } - - private void afterProjectDropped(ProjectInstance droppedProject) { - this.removeProjectCache(droppedProject); - } - - // sync on update - private void markExposedTablesAndColumns(String projectName, CubeInstance cubeInstance) { - if (!cubeInstance.isReady()) - return; - - CubeDesc cubeDesc = cubeInstance.getDescriptor(); - String factTable = cubeDesc.getFactTable(); - for (DimensionDesc dim : cubeDesc.getDimensions()) { - String lookupTable = dim.getTable(); - JoinDesc join = dim.getJoin(); - if (join == null) - continue; // for dimensions on fact table, there's no join - - if (join.getForeignKeyColumns() == null) { - throw new IllegalStateException("Null FK for " + join); - } - for (TblColRef fkCol : join.getForeignKeyColumns()) { - markExposedTableAndColumn(projectName, factTable, fkCol.getName(), dim); - } - if (join.getPrimaryKeyColumns() == null) { - throw new IllegalStateException("Null PK for " + join); - } - for (TblColRef pkCol : join.getPrimaryKeyColumns()) { - markExposedTableAndColumn(projectName, lookupTable, pkCol.getName(), dim); - } - } - for (TblColRef col : cubeDesc.listAllColumns()) { - markExposedTableAndColumn(projectName, col.getTable(), col.getName(), col); - } - } - - private void markExposedTableAndColumn(String project, String table, String column, Object refObj) { - project = ProjectInstance.getNormalizedProjectName(project); - TableDesc t = this.getMetadataManager().getTableDesc(table); - if (t == null) { - throw new IllegalStateException("No SourceTable found by name '" + table + "', ref by " + refObj); - } - table = t.getIdentity(); // ensures upper case - - ProjectTable projTable = getProjectTable(project, table, true); - - ColumnDesc srcCol = t.findColumnByName(column); - if (srcCol == null) { - throw new IllegalStateException("No SourceColumn found by name '" + table + "/" + column + "', ref by " + refObj); - } - - if (!projTable.getColumns().contains(srcCol.getName())) { - projTable.getColumns().add(srcCol.getName()); - } - } - - private ProjectTable getProjectTable(String project, final String table) { - return getProjectTable(project, table, false); - } - - private ProjectTable getProjectTable(String project, final String table, boolean autoCreate) { - ProjectTable projectTable = null; - project = ProjectInstance.getNormalizedProjectName(project); - - if (this.projectTables.containsEntry(project, new ProjectTable(table))) { - Collection projects = this.projectTables.get(project); - for (ProjectTable pt : projects) { - if (pt.getName().equalsIgnoreCase(table)) { - projectTable = pt; - break; - } - } - } else { - projectTable = new ProjectTable(table); - - if (autoCreate) { - this.projectTables.put(project, projectTable); - } - } - - return projectTable; - } - - private ResourceStore getStore() { - return ResourceStore.getStore(this.config); - } - - private MetadataManager getMetadataManager() { - return MetadataManager.getInstance(config); - } -} diff --git a/job/src/main/java/com/kylinolap/job/JobManager.java b/job/src/main/java/com/kylinolap/job/JobManager.java index 8b94693..eabd9f8 100644 --- a/job/src/main/java/com/kylinolap/job/JobManager.java +++ b/job/src/main/java/com/kylinolap/job/JobManager.java @@ -20,7 +20,6 @@ import com.kylinolap.cube.*; import com.kylinolap.cube.exception.CubeIntegrityException; import com.kylinolap.cube.model.CubeDesc; -import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.job.JobInstance.JobStep; import com.kylinolap.job.constant.JobConstants; import com.kylinolap.job.constant.JobStatusEnum; @@ -31,6 +30,7 @@ import com.kylinolap.job.exception.JobException; import com.kylinolap.job.hadoop.hive.JoinedFlatTableDesc; import com.kylinolap.metadata.project.ProjectInstance; +import com.kylinolap.metadata.project.ProjectManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectManager.java b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectManager.java index db4b394..42bbefa 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectManager.java +++ b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectManager.java @@ -169,6 +169,18 @@ public ProjectInstance updateProject(ProjectInstance project, String newName, St } } + public void removeCubeFromProjects(String cubeName) throws IOException { + for (ProjectInstance projectInstance : findProjects(cubeName)) { + projectInstance.removeCube(cubeName); + saveResource(projectInstance); + } + } + + public ProjectInstance updateCubeToProject(String cubeName, String newProjectName, String owner) throws IOException { + removeCubeFromProjects(cubeName); + return addCubeToProject(cubeName, newProjectName, owner); + } + public boolean containsRealization(String projectName, DataModelRealizationType realization, String name) { ProjectInstance project = getProject(projectName); if (project == null) { diff --git a/query/src/main/java/com/kylinolap/query/routing/QueryRouter.java b/query/src/main/java/com/kylinolap/query/routing/QueryRouter.java index 4e5bbde..d513d67 100644 --- a/query/src/main/java/com/kylinolap/query/routing/QueryRouter.java +++ b/query/src/main/java/com/kylinolap/query/routing/QueryRouter.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; +import com.kylinolap.cube.project.CubeRealizationManager; import org.apache.commons.lang3.StringUtils; import org.eigenbase.reltype.RelDataType; import org.slf4j.Logger; @@ -33,7 +34,6 @@ import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.model.CubeDesc; import com.kylinolap.cube.model.DimensionDesc; -import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.metadata.model.JoinDesc; import com.kylinolap.metadata.model.realization.FunctionDesc; import com.kylinolap.metadata.model.realization.ParameterDesc; @@ -51,18 +51,18 @@ public static CubeInstance findCube(OLAPContext olapContext) throws CubeNotFound CubeInstance bestCube = null; // NOTE: since some query has no groups and projections are the superset of groups, we choose projections. - ProjectManager projectManager = ProjectManager.getInstance(olapContext.olapSchema.getConfig()); + CubeRealizationManager cubeRealizationManager = CubeRealizationManager.getInstance(olapContext.olapSchema.getConfig()); if (olapContext.isSimpleQuery()) { // if simple query like "select X from fact table", just return the cube with most dimensions // Note that this will only succeed to get best cube if the current simple query is on fact table. // Simple query on look up table is handled in OLAPTableScan.genExecFunc // In other words, for simple query on lookup tables, bestCube here will be assigned null in this method - bestCube = findCubeWithMostDimensions(projectManager, olapContext); + bestCube = findCubeWithMostDimensions(cubeRealizationManager, olapContext); } if (bestCube == null) { - bestCube = findBestMatchCube(projectManager, olapContext); + bestCube = findBestMatchCube(cubeRealizationManager, olapContext); } if (bestCube == null) { @@ -75,7 +75,7 @@ public static CubeInstance findCube(OLAPContext olapContext) throws CubeNotFound return bestCube; } - private static CubeInstance findCubeWithMostDimensions(ProjectManager projectManager, OLAPContext olapContext) { + private static CubeInstance findCubeWithMostDimensions(CubeRealizationManager projectManager, OLAPContext olapContext) { List candidates = projectManager.getOnlineCubesByFactTable(olapContext.olapSchema.getProjectName(), olapContext.firstTableScan.getCubeTable()); if (candidates.isEmpty()) { return null; @@ -130,7 +130,7 @@ public int compare(CubeInstance c1, CubeInstance c2) { return null; } - static CubeInstance findBestMatchCube(ProjectManager projectManager, OLAPContext olapContext) throws CubeNotFoundException { + static CubeInstance findBestMatchCube(CubeRealizationManager cubeRealizationManager, OLAPContext olapContext) throws CubeNotFoundException { // retrieve members from olapContext String factTableName = olapContext.firstTableScan.getCubeTable(); @@ -142,7 +142,7 @@ static CubeInstance findBestMatchCube(ProjectManager projectManager, OLAPContext Map rewriteFields = olapContext.rewriteFields; // find cubes by table - List candidates = projectManager.getCubesByTable(projectName, factTableName); + List candidates = cubeRealizationManager.getCubesByTable(projectName, factTableName); logger.info("Find candidates by table " + factTableName + " and project=" + projectName + " : " + StringUtils.join(candidates, ",")); // match dimensions & aggregations & joins diff --git a/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java b/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java index da45eb7..7fccfac 100644 --- a/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java +++ b/query/src/main/java/com/kylinolap/query/schema/OLAPSchema.java @@ -19,13 +19,13 @@ import java.util.List; import java.util.Map; +import com.kylinolap.cube.project.CubeRealizationManager; import com.kylinolap.metadata.project.ProjectInstance; import net.hydromatic.optiq.Table; import net.hydromatic.optiq.impl.AbstractSchema; import com.kylinolap.common.KylinConfig; import com.kylinolap.cube.CubeManager; -import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.metadata.MetadataManager; import com.kylinolap.metadata.model.TableDesc; @@ -70,7 +70,7 @@ public OLAPSchema(String project, String schemaName) { private Map buildTableMap() { Map olapTables = new HashMap(); - List projectTables = getProjectManager().listExposedTables(projectName); + List projectTables = CubeRealizationManager.getInstance(config).listExposedTables(projectName); for (TableDesc tableDesc : projectTables) { if (tableDesc.getDatabase().equals(schemaName)) { @@ -124,7 +124,4 @@ public CubeManager getCubeManager() { return CubeManager.getInstance(config); } - public ProjectManager getProjectManager() { - return ProjectManager.getInstance(config); - } } diff --git a/query/src/main/java/com/kylinolap/query/schema/OLAPSchemaFactory.java b/query/src/main/java/com/kylinolap/query/schema/OLAPSchemaFactory.java index dd5fc7f..879f398 100644 --- a/query/src/main/java/com/kylinolap/query/schema/OLAPSchemaFactory.java +++ b/query/src/main/java/com/kylinolap/query/schema/OLAPSchemaFactory.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; +import com.kylinolap.cube.project.CubeRealizationManager; import com.kylinolap.metadata.project.ProjectInstance; import net.hydromatic.optiq.Schema; import net.hydromatic.optiq.SchemaFactory; @@ -30,7 +31,6 @@ import org.eigenbase.util14.ConversionUtil; import com.kylinolap.common.KylinConfig; -import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.metadata.model.DatabaseDesc; import com.kylinolap.metadata.model.TableDesc; @@ -68,7 +68,7 @@ public Schema create(SchemaPlus parentSchema, String schemaName, Map tables = ProjectManager.getInstance(config).listExposedTables(project); + List tables = CubeRealizationManager.getInstance(config).listExposedTables(project); // "database" in TableDesc correspond to our schema // the logic to decide which schema to be "default" in calcite: diff --git a/query/src/main/java/com/kylinolap/query/schema/OLAPTable.java b/query/src/main/java/com/kylinolap/query/schema/OLAPTable.java index d01bb9a..bc90793 100644 --- a/query/src/main/java/com/kylinolap/query/schema/OLAPTable.java +++ b/query/src/main/java/com/kylinolap/query/schema/OLAPTable.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; +import com.kylinolap.cube.project.CubeRealizationManager; import net.hydromatic.linq4j.Enumerable; import net.hydromatic.linq4j.Enumerator; import net.hydromatic.linq4j.QueryProvider; @@ -43,7 +44,6 @@ import org.eigenbase.sql.type.SqlTypeUtil; import com.kylinolap.cube.model.MeasureDesc; -import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.metadata.model.ColumnDesc; import com.kylinolap.metadata.model.TableDesc; import com.kylinolap.metadata.model.realization.FunctionDesc; @@ -161,7 +161,7 @@ else if (precision >= 0) } private List listSourceColumns() { - ProjectManager projectMgr = olapSchema.getProjectManager(); + CubeRealizationManager projectMgr = CubeRealizationManager.getInstance(olapSchema.getConfig()); List exposedColumns = projectMgr.listExposedColumns(olapSchema.getProjectName(), sourceTable.getIdentity()); List countMeasures = projectMgr.listEffectiveRewriteMeasures(olapSchema.getProjectName(), sourceTable.getIdentity()); diff --git a/server/src/main/java/com/kylinolap/rest/controller/TableController.java b/server/src/main/java/com/kylinolap/rest/controller/TableController.java index 69e0848..9b036aa 100644 --- a/server/src/main/java/com/kylinolap/rest/controller/TableController.java +++ b/server/src/main/java/com/kylinolap/rest/controller/TableController.java @@ -70,7 +70,7 @@ long start = System.currentTimeMillis(); List tables = null; try { - tables = cubeMgmtService.getProjectManager().listDefinedTablesInProject(project); + tables = cubeMgmtService.getProjectManager().listDefinedTablesInProject(project); } catch (Exception e) { logger.error("Failed to deal with the request.", e); throw new InternalErrorException(e.getLocalizedMessage()); diff --git a/server/src/main/java/com/kylinolap/rest/service/BasicService.java b/server/src/main/java/com/kylinolap/rest/service/BasicService.java index 87f5eae..92b6cb7 100644 --- a/server/src/main/java/com/kylinolap/rest/service/BasicService.java +++ b/server/src/main/java/com/kylinolap/rest/service/BasicService.java @@ -31,6 +31,7 @@ import javax.sql.DataSource; +import com.kylinolap.cube.project.CubeRealizationManager; import com.kylinolap.metadata.project.ProjectInstance; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -43,7 +44,6 @@ import com.kylinolap.common.KylinConfig; import com.kylinolap.cube.CubeDescManager; import com.kylinolap.cube.CubeManager; -import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.job.JobManager; import com.kylinolap.job.engine.JobEngineConfig; import com.kylinolap.job.exception.JobException; @@ -118,20 +118,18 @@ public DataSource getOLAPDataSource(String project) { /** * Reload changed cube into cache * - * @param name * @throws IOException */ @Caching(evict = { @CacheEvict(value = QueryController.SUCCESS_QUERY_CACHE, allEntries = true), @CacheEvict(value = QueryController.EXCEPTION_QUERY_CACHE, allEntries = true) }) public void cleanDataCache() { CubeManager.removeInstance(getConfig()); - ProjectManager.removeInstance(getConfig()); + CubeRealizationManager.removeInstance(getConfig()); BasicService.resetOLAPDataSources(); } /** * Reload the cube desc with name {name} into cache * - * @param name */ public void reloadMetadataCache() { MetadataManager.getInstance(getConfig()).reload(); @@ -159,8 +157,8 @@ public CubeDescManager getCubeDescManager() { return CubeDescManager.getInstance(getConfig()); } - public ProjectManager getProjectManager() { - return ProjectManager.getInstance(getConfig()); + public CubeRealizationManager getProjectManager() { + return CubeRealizationManager.getInstance(getConfig()); } public JobManager getJobManager() throws JobException, UnknownHostException { From 54f8a30b24c30e86b0f4c711682e9b7a00f3af09 Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Mon, 8 Dec 2014 17:44:48 +0800 Subject: [PATCH 61/65] fix compile issue --- .../cube/project/CubeRealizationManager.java | 23 ++- .../com/kylinolap/cube/CubeManagerCacheTest.java | 4 +- .../java/com/kylinolap/cube/CubeManagerTest.java | 8 +- .../com/kylinolap/cube/SegmentManagementTest.java | 4 +- .../cube/project/CubeRealizationManagerTest.java | 180 +++++++++++++++++++++ .../kylinolap/cube/project/ProjectManagerTest.java | 176 -------------------- .../kylinolap/job/engine/GenericJobEngineTest.java | 4 +- .../job/engine/JobInstanceBuilderTest.java | 4 +- .../job/hadoop/cube/MergeCuboidMapperTest.java | 4 +- .../kylinolap/rest/controller/TableController.java | 2 +- .../com/kylinolap/rest/service/BasicService.java | 7 +- .../com/kylinolap/rest/service/CubeService.java | 50 +++++- .../com/kylinolap/rest/service/QueryService.java | 10 +- .../rest/controller/ProjectControllerTest.java | 2 +- .../kylinolap/rest/service/ServiceTestBase.java | 4 +- 15 files changed, 263 insertions(+), 219 deletions(-) create mode 100644 cube/src/test/java/com/kylinolap/cube/project/CubeRealizationManagerTest.java delete mode 100644 cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java diff --git a/cube/src/main/java/com/kylinolap/cube/project/CubeRealizationManager.java b/cube/src/main/java/com/kylinolap/cube/project/CubeRealizationManager.java index 956000f..a43ca67 100644 --- a/cube/src/main/java/com/kylinolap/cube/project/CubeRealizationManager.java +++ b/cube/src/main/java/com/kylinolap/cube/project/CubeRealizationManager.java @@ -181,11 +181,10 @@ public boolean isCubeInProject(String projectName, CubeInstance cube) { return this.listAllCubes(projectName).contains(cube); } - public ProjectInstance updateCubeToProject(String cubeName, String newProjectName, String owner) throws IOException { - removeCubeFromProjects(cubeName); - - return addCubeToProject(cubeName, newProjectName, owner); - } +// public ProjectInstance updateCubeToProject(String cubeName, String newProjectName, String owner) throws IOException { +// removeCubeFromProjects(cubeName); +// return addCubeToProject(cubeName, newProjectName, owner); +// } public ProjectInstance updateTableToProject(String tables, String projectName) throws IOException { ProjectInstance projectInstance = getProject(projectName); @@ -207,13 +206,13 @@ public ProjectInstance updateTableToProject(String tables, String projectName) t } - public void removeCubeFromProjects(String cubeName) throws IOException { - for (ProjectInstance projectInstance : findProjects(cubeName)) { - projectInstance.removeCube(cubeName); - - saveResource(projectInstance); - } - } +// public void removeCubeFromProjects(String cubeName) throws IOException { +// for (ProjectInstance projectInstance : findProjects(cubeName)) { +// projectInstance.removeCube(cubeName); +// +// saveResource(projectInstance); +// } +// } public List listExposedTables(String project) { project = ProjectInstance.getNormalizedProjectName(project); diff --git a/cube/src/test/java/com/kylinolap/cube/CubeManagerCacheTest.java b/cube/src/test/java/com/kylinolap/cube/CubeManagerCacheTest.java index c9f9b24..cfed258 100644 --- a/cube/src/test/java/com/kylinolap/cube/CubeManagerCacheTest.java +++ b/cube/src/test/java/com/kylinolap/cube/CubeManagerCacheTest.java @@ -18,6 +18,7 @@ import static org.junit.Assert.*; +import com.kylinolap.cube.project.CubeRealizationManager; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -25,7 +26,6 @@ import com.kylinolap.common.persistence.ResourceStore; import com.kylinolap.common.util.LocalFileMetadataTestCase; import com.kylinolap.cube.model.CubeDesc; -import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.metadata.MetadataManager; /** @@ -41,7 +41,7 @@ public void setUp() throws Exception { this.createTestMetadata(); MetadataManager.removeInstance(this.getTestConfig()); CubeManager.removeInstance(this.getTestConfig()); - ProjectManager.removeInstance(this.getTestConfig()); + CubeRealizationManager.removeInstance(this.getTestConfig()); cubeManager = CubeManager.getInstance(this.getTestConfig()); } diff --git a/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java b/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java index b9e778c..c0e17d0 100644 --- a/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java +++ b/cube/src/test/java/com/kylinolap/cube/CubeManagerTest.java @@ -18,6 +18,7 @@ import static org.junit.Assert.*; +import com.kylinolap.cube.project.CubeRealizationManager; import com.kylinolap.metadata.project.ProjectInstance; import org.junit.After; import org.junit.Before; @@ -27,7 +28,6 @@ import com.kylinolap.common.util.JsonUtil; import com.kylinolap.common.util.LocalFileMetadataTestCase; import com.kylinolap.cube.model.CubeDesc; -import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.metadata.MetadataManager; /** @@ -40,7 +40,7 @@ public void setUp() throws Exception { this.createTestMetadata(); MetadataManager.removeInstance(this.getTestConfig()); CubeManager.removeInstance(this.getTestConfig()); - ProjectManager.removeInstance(this.getTestConfig()); + CubeRealizationManager.removeInstance(this.getTestConfig()); } @After @@ -72,12 +72,12 @@ public void testCreateAndDrop() throws Exception { CubeInstance createdCube = CubeManager.getInstance(this.getTestConfig()).createCube("a_whole_new_cube", ProjectInstance.DEFAULT_PROJECT_NAME, desc, null); assertTrue(createdCube == CubeManager.getInstance(this.getTestConfig()).getCube("a_whole_new_cube")); - assertTrue(ProjectManager.getInstance(getTestConfig()).listAllCubes(ProjectInstance.DEFAULT_PROJECT_NAME).contains(createdCube)); + assertTrue(CubeRealizationManager.getInstance(getTestConfig()).listAllCubes(ProjectInstance.DEFAULT_PROJECT_NAME).contains(createdCube)); CubeInstance droppedCube = CubeManager.getInstance(this.getTestConfig()).dropCube("a_whole_new_cube", true); assertTrue(createdCube == droppedCube); - assertTrue(!ProjectManager.getInstance(getTestConfig()).listAllCubes(ProjectInstance.DEFAULT_PROJECT_NAME).contains(droppedCube)); + assertTrue(!CubeRealizationManager.getInstance(getTestConfig()).listAllCubes(ProjectInstance.DEFAULT_PROJECT_NAME).contains(droppedCube)); assertNull(CubeManager.getInstance(this.getTestConfig()).getCube("a_whole_new_cube")); } diff --git a/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java b/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java index 298e45f..93c72b7 100644 --- a/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java +++ b/cube/src/test/java/com/kylinolap/cube/SegmentManagementTest.java @@ -34,7 +34,7 @@ import com.kylinolap.common.util.LocalFileMetadataTestCase; import com.kylinolap.cube.exception.CubeIntegrityException; import com.kylinolap.cube.model.CubeDesc; -import com.kylinolap.cube.project.ProjectManager; +import com.kylinolap.cube.project.CubeRealizationManager; import com.kylinolap.metadata.MetadataManager; /** @@ -50,7 +50,7 @@ public void setUp() throws Exception { this.createTestMetadata(); MetadataManager.removeInstance(this.getTestConfig()); CubeManager.removeInstance(this.getTestConfig()); - ProjectManager.removeInstance(this.getTestConfig()); + CubeRealizationManager.removeInstance(this.getTestConfig()); cubeMgr = CubeManager.getInstance(this.getTestConfig()); } diff --git a/cube/src/test/java/com/kylinolap/cube/project/CubeRealizationManagerTest.java b/cube/src/test/java/com/kylinolap/cube/project/CubeRealizationManagerTest.java new file mode 100644 index 0000000..90b2efd --- /dev/null +++ b/cube/src/test/java/com/kylinolap/cube/project/CubeRealizationManagerTest.java @@ -0,0 +1,180 @@ +/* + * Copyright 2013-2014 eBay Software Foundation + * + * 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.kylinolap.cube.project; + +import static org.junit.Assert.*; + +import java.io.IOException; + +import com.kylinolap.metadata.project.ProjectInstance; +import com.kylinolap.metadata.project.ProjectManager; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.kylinolap.common.persistence.ResourceStore; +import com.kylinolap.common.util.JsonUtil; +import com.kylinolap.common.util.LocalFileMetadataTestCase; +import com.kylinolap.cube.CubeDescManager; +import com.kylinolap.cube.CubeInstance; +import com.kylinolap.cube.CubeManager; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.metadata.MetadataManager; + +/** + * @author xduo + * + */ +public class CubeRealizationManagerTest extends LocalFileMetadataTestCase { + + @Before + public void setUp() throws Exception { + this.createTestMetadata(); + MetadataManager.removeInstance(this.getTestConfig()); + CubeManager.removeInstance(this.getTestConfig()); + CubeRealizationManager.removeInstance(this.getTestConfig()); + } + + @After + public void after() throws Exception { + this.cleanupTestMetadata(); + } + + @Test(expected = IllegalStateException.class) + public void testDropNonemptyProject1() throws IOException { + ProjectManager.getInstance(this.getTestConfig()).dropProject("DEFAULT"); + } + + @Test(expected = IllegalStateException.class) + public void testDropNonemptyProject2() throws IOException { + ProjectManager.getInstance(this.getTestConfig()).dropProject("DEFAULT???"); + } + + @Test + public void testNewProject() throws Exception { + ProjectManager projectmanager = ProjectManager.getInstance(this.getTestConfig()); + CubeRealizationManager cubeRealizationManager = CubeRealizationManager.getInstance(this.getTestConfig()); + int originalProjectCount = projectmanager.listAllProjects().size(); + int originalCubeCount = CubeManager.getInstance(this.getTestConfig()).listAllCubes().size(); + int originalCubeCountInDefault = cubeRealizationManager.listAllCubes("default").size(); + ResourceStore store = getStore(); + + // clean legacy in case last run failed + store.deleteResource("/cube/cube_in_alien_project.json"); + + CubeDescManager cubeDescMgr = getCubeDescManager(); + CubeDesc desc = cubeDescMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); + CubeInstance createdCube = CubeManager.getInstance(this.getTestConfig()).createCube("cube_in_alien_project", "alien", desc, null); + assertTrue(createdCube == CubeManager.getInstance(this.getTestConfig()).getCube("cube_in_alien_project")); + assertTrue(CubeRealizationManager.getInstance(getTestConfig()).listAllCubes("alien").contains(createdCube)); + + System.out.println(JsonUtil.writeValueAsIndentString(createdCube)); + + assertTrue(projectmanager.listAllProjects().size() == originalProjectCount + 1); + assertTrue(cubeRealizationManager.listAllCubes("ALIEN").get(0).getName().equalsIgnoreCase("CUBE_IN_ALIEN_PROJECT")); + assertTrue(CubeManager.getInstance(this.getTestConfig()).listAllCubes().size() == originalCubeCount + 1); + + projectmanager.updateCubeToProject("cube_in_alien_project", "default", null); + assertTrue(cubeRealizationManager.listAllCubes("ALIEN").size() == 0); + assertTrue(cubeRealizationManager.listAllCubes("default").size() == originalCubeCountInDefault + 1); + assertTrue(cubeRealizationManager.listAllCubes("default").contains(createdCube)); + + projectmanager.updateCubeToProject("cube_in_alien_project", "alien", null); + assertTrue(cubeRealizationManager.listAllCubes("ALIEN").size() == 1); + assertTrue(cubeRealizationManager.listAllCubes("default").size() == originalCubeCountInDefault); + assertTrue(cubeRealizationManager.listAllCubes("alien").contains(createdCube)); + + assertTrue(cubeRealizationManager.isCubeInProject("alien", createdCube)); + + CubeInstance droppedCube = CubeManager.getInstance(this.getTestConfig()).dropCube("cube_in_alien_project", true); + + assertTrue(createdCube == droppedCube); + assertNull(CubeManager.getInstance(this.getTestConfig()).getCube("cube_in_alien_project")); + assertTrue(projectmanager.listAllProjects().size() == originalProjectCount + 1); + assertTrue(CubeManager.getInstance(this.getTestConfig()).listAllCubes().size() == originalCubeCount); + + projectmanager.dropProject("alien"); + assertTrue(projectmanager.listAllProjects().size() == originalProjectCount); + } + + @Test + public void testExistingProject() throws Exception { + int originalProjectCount = ProjectManager.getInstance(this.getTestConfig()).listAllProjects().size(); + int originalCubeCount = CubeManager.getInstance(this.getTestConfig()).listAllCubes().size(); + ResourceStore store = getStore(); + + // clean legacy in case last run failed + store.deleteResource("/cube/new_cube_in_default.json"); + + CubeDescManager cubeDescMgr = getCubeDescManager(); + CubeDesc desc = cubeDescMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); + CubeInstance createdCube = CubeManager.getInstance(this.getTestConfig()).createCube("new_cube_in_default", ProjectInstance.DEFAULT_PROJECT_NAME, desc, null); + assertTrue(createdCube == CubeManager.getInstance(this.getTestConfig()).getCube("new_cube_in_default")); + + System.out.println(JsonUtil.writeValueAsIndentString(createdCube)); + + assertTrue(ProjectManager.getInstance(this.getTestConfig()).listAllProjects().size() == originalProjectCount); + assertTrue(CubeManager.getInstance(this.getTestConfig()).listAllCubes().size() == originalCubeCount + 1); + + CubeInstance droppedCube = CubeManager.getInstance(this.getTestConfig()).dropCube("new_cube_in_default", true); + + assertTrue(createdCube == droppedCube); + assertNull(CubeManager.getInstance(this.getTestConfig()).getCube("new_cube_in_default")); + assertTrue(ProjectManager.getInstance(this.getTestConfig()).listAllProjects().size() == originalProjectCount); + assertTrue(CubeManager.getInstance(this.getTestConfig()).listAllCubes().size() == originalCubeCount); + } + + @Test + public void testProjectsDrop() throws IOException { + CubeRealizationManager cubeRealizationManager = CubeRealizationManager.getInstance(this.getTestConfig()); + CubeInstance cube = CubeManager.getInstance(getTestConfig()).getCube("test_kylin_cube_with_slr_empty"); + assertTrue(cubeRealizationManager.getCubesByTable("default", "default.test_kylin_fact").contains(cube)); + assertTrue(cubeRealizationManager.listAllCubes("default").contains(cube)); + + CubeManager.getInstance(getTestConfig()).dropCube(cube.getName(), true); + + assertTrue(!cubeRealizationManager.getCubesByTable("default", "default.test_kylin_fact").contains(cube)); + assertTrue(!cubeRealizationManager.listAllCubes("default").contains(cube)); + } + + @Test + public void testProjectsLoadAfterProjectChange() throws IOException { + CubeRealizationManager cubeRealizationManager = CubeRealizationManager.getInstance(this.getTestConfig()); + CubeInstance cube = CubeManager.getInstance(getTestConfig()).getCube("test_kylin_cube_with_slr_empty"); + assertTrue(cubeRealizationManager.getCubesByTable("default", "default.test_kylin_fact").contains(cube)); + + ProjectManager.getInstance(getTestConfig()).removeCubeFromProjects(cube.getName()); + + assertTrue(!cubeRealizationManager.getCubesByTable("default", "default.test_kylin_fact").contains(cube)); + + ProjectManager.getInstance(getTestConfig()).updateCubeToProject(cube.getName(), "default", "tester"); + + assertTrue(cubeRealizationManager.getCubesByTable("default", "default.test_kylin_fact").contains(cube)); + } + + private MetadataManager getMetadataManager() { + return MetadataManager.getInstance(getTestConfig()); + } + + private CubeManager getCubeManager() { + return CubeManager.getInstance(getTestConfig()); + } + + public CubeDescManager getCubeDescManager() { + return CubeDescManager.getInstance(getTestConfig()); + } +} diff --git a/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java b/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java deleted file mode 100644 index b7fadfa..0000000 --- a/cube/src/test/java/com/kylinolap/cube/project/ProjectManagerTest.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright 2013-2014 eBay Software Foundation - * - * 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.kylinolap.cube.project; - -import static org.junit.Assert.*; - -import java.io.IOException; - -import com.kylinolap.metadata.project.ProjectInstance; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.kylinolap.common.persistence.ResourceStore; -import com.kylinolap.common.util.JsonUtil; -import com.kylinolap.common.util.LocalFileMetadataTestCase; -import com.kylinolap.cube.CubeDescManager; -import com.kylinolap.cube.CubeInstance; -import com.kylinolap.cube.CubeManager; -import com.kylinolap.cube.model.CubeDesc; -import com.kylinolap.metadata.MetadataManager; - -/** - * @author xduo - * - */ -public class ProjectManagerTest extends LocalFileMetadataTestCase { - - @Before - public void setUp() throws Exception { - this.createTestMetadata(); - MetadataManager.removeInstance(this.getTestConfig()); - CubeManager.removeInstance(this.getTestConfig()); - ProjectManager.removeInstance(this.getTestConfig()); - } - - @After - public void after() throws Exception { - this.cleanupTestMetadata(); - } - - @Test(expected = IllegalStateException.class) - public void testDropNonemptyProject1() throws IOException { - ProjectManager.getInstance(this.getTestConfig()).dropProject("DEFAULT"); - } - - @Test(expected = IllegalStateException.class) - public void testDropNonemptyProject2() throws IOException { - ProjectManager.getInstance(this.getTestConfig()).dropProject("DEFAULT???"); - } - - @Test - public void testNewProject() throws Exception { - ProjectManager projectmanager = ProjectManager.getInstance(this.getTestConfig()); - int originalProjectCount = projectmanager.listAllProjects().size(); - int originalCubeCount = CubeManager.getInstance(this.getTestConfig()).listAllCubes().size(); - int originalCubeCountInDefault = projectmanager.listAllCubes("default").size(); - ResourceStore store = getStore(); - - // clean legacy in case last run failed - store.deleteResource("/cube/cube_in_alien_project.json"); - - CubeDescManager cubeDescMgr = getCubeDescManager(); - CubeDesc desc = cubeDescMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); - CubeInstance createdCube = CubeManager.getInstance(this.getTestConfig()).createCube("cube_in_alien_project", "alien", desc, null); - assertTrue(createdCube == CubeManager.getInstance(this.getTestConfig()).getCube("cube_in_alien_project")); - assertTrue(ProjectManager.getInstance(getTestConfig()).listAllCubes("alien").contains(createdCube)); - - System.out.println(JsonUtil.writeValueAsIndentString(createdCube)); - - assertTrue(projectmanager.listAllProjects().size() == originalProjectCount + 1); - assertTrue(projectmanager.listAllCubes("ALIEN").get(0).getName().equalsIgnoreCase("CUBE_IN_ALIEN_PROJECT")); - assertTrue(CubeManager.getInstance(this.getTestConfig()).listAllCubes().size() == originalCubeCount + 1); - - projectmanager.updateCubeToProject("cube_in_alien_project", "default", null); - assertTrue(projectmanager.listAllCubes("ALIEN").size() == 0); - assertTrue(projectmanager.listAllCubes("default").size() == originalCubeCountInDefault + 1); - assertTrue(ProjectManager.getInstance(getTestConfig()).listAllCubes("default").contains(createdCube)); - - projectmanager.updateCubeToProject("cube_in_alien_project", "alien", null); - assertTrue(projectmanager.listAllCubes("ALIEN").size() == 1); - assertTrue(projectmanager.listAllCubes("default").size() == originalCubeCountInDefault); - assertTrue(ProjectManager.getInstance(getTestConfig()).listAllCubes("alien").contains(createdCube)); - - assertTrue(projectmanager.isCubeInProject("alien", createdCube)); - - CubeInstance droppedCube = CubeManager.getInstance(this.getTestConfig()).dropCube("cube_in_alien_project", true); - - assertTrue(createdCube == droppedCube); - assertNull(CubeManager.getInstance(this.getTestConfig()).getCube("cube_in_alien_project")); - assertTrue(projectmanager.listAllProjects().size() == originalProjectCount + 1); - assertTrue(CubeManager.getInstance(this.getTestConfig()).listAllCubes().size() == originalCubeCount); - - projectmanager.dropProject("alien"); - assertTrue(projectmanager.listAllProjects().size() == originalProjectCount); - } - - @Test - public void testExistingProject() throws Exception { - int originalProjectCount = ProjectManager.getInstance(this.getTestConfig()).listAllProjects().size(); - int originalCubeCount = CubeManager.getInstance(this.getTestConfig()).listAllCubes().size(); - ResourceStore store = getStore(); - - // clean legacy in case last run failed - store.deleteResource("/cube/new_cube_in_default.json"); - - CubeDescManager cubeDescMgr = getCubeDescManager(); - CubeDesc desc = cubeDescMgr.getCubeDesc("test_kylin_cube_with_slr_desc"); - CubeInstance createdCube = CubeManager.getInstance(this.getTestConfig()).createCube("new_cube_in_default", ProjectInstance.DEFAULT_PROJECT_NAME, desc, null); - assertTrue(createdCube == CubeManager.getInstance(this.getTestConfig()).getCube("new_cube_in_default")); - - System.out.println(JsonUtil.writeValueAsIndentString(createdCube)); - - assertTrue(ProjectManager.getInstance(this.getTestConfig()).listAllProjects().size() == originalProjectCount); - assertTrue(CubeManager.getInstance(this.getTestConfig()).listAllCubes().size() == originalCubeCount + 1); - - CubeInstance droppedCube = CubeManager.getInstance(this.getTestConfig()).dropCube("new_cube_in_default", true); - - assertTrue(createdCube == droppedCube); - assertNull(CubeManager.getInstance(this.getTestConfig()).getCube("new_cube_in_default")); - assertTrue(ProjectManager.getInstance(this.getTestConfig()).listAllProjects().size() == originalProjectCount); - assertTrue(CubeManager.getInstance(this.getTestConfig()).listAllCubes().size() == originalCubeCount); - } - - @Test - public void testProjectsDrop() throws IOException { - CubeInstance cube = CubeManager.getInstance(getTestConfig()).getCube("test_kylin_cube_with_slr_empty"); - assertTrue(ProjectManager.getInstance(this.getTestConfig()).getCubesByTable("default", "default.test_kylin_fact").contains(cube)); - assertTrue(ProjectManager.getInstance(this.getTestConfig()).listAllCubes("default").contains(cube)); - - CubeManager.getInstance(getTestConfig()).dropCube(cube.getName(), true); - - assertTrue(!ProjectManager.getInstance(this.getTestConfig()).getCubesByTable("default", "default.test_kylin_fact").contains(cube)); - assertTrue(!ProjectManager.getInstance(this.getTestConfig()).listAllCubes("default").contains(cube)); - } - - @Test - public void testProjectsLoadAfterProjectChange() throws IOException { - CubeInstance cube = CubeManager.getInstance(getTestConfig()).getCube("test_kylin_cube_with_slr_empty"); - assertTrue(ProjectManager.getInstance(this.getTestConfig()).getCubesByTable("default", "default.test_kylin_fact").contains(cube)); - - ProjectManager.getInstance(getTestConfig()).removeCubeFromProjects(cube.getName()); - - assertTrue(!ProjectManager.getInstance(this.getTestConfig()).getCubesByTable("default", "default.test_kylin_fact").contains(cube)); - - ProjectManager.getInstance(getTestConfig()).updateCubeToProject(cube.getName(), "default", "tester"); - - assertTrue(ProjectManager.getInstance(this.getTestConfig()).getCubesByTable("default", "default.test_kylin_fact").contains(cube)); - } - - private MetadataManager getMetadataManager() { - return MetadataManager.getInstance(getTestConfig()); - } - - private CubeManager getCubeManager() { - return CubeManager.getInstance(getTestConfig()); - } - - public CubeDescManager getCubeDescManager() { - return CubeDescManager.getInstance(getTestConfig()); - } -} diff --git a/job/src/test/java/com/kylinolap/job/engine/GenericJobEngineTest.java b/job/src/test/java/com/kylinolap/job/engine/GenericJobEngineTest.java index d7d1486..081bb92 100644 --- a/job/src/test/java/com/kylinolap/job/engine/GenericJobEngineTest.java +++ b/job/src/test/java/com/kylinolap/job/engine/GenericJobEngineTest.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.List; +import com.kylinolap.cube.project.CubeRealizationManager; import org.apache.commons.io.FileUtils; import org.junit.AfterClass; import org.junit.Before; @@ -39,7 +40,6 @@ import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.CubeSegmentStatusEnum; import com.kylinolap.cube.exception.CubeIntegrityException; -import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.job.JobDAO; import com.kylinolap.job.JobInstance; import com.kylinolap.job.JobInstance.JobStep; @@ -162,7 +162,7 @@ public void before() throws Exception { MetadataManager.removeInstance(KylinConfig.getInstanceFromEnv()); CubeManager.removeInstance(KylinConfig.getInstanceFromEnv()); - ProjectManager.removeInstance(KylinConfig.getInstanceFromEnv()); + CubeRealizationManager.removeInstance(KylinConfig.getInstanceFromEnv()); } @Test(expected = InvalidJobInstanceException.class) diff --git a/job/src/test/java/com/kylinolap/job/engine/JobInstanceBuilderTest.java b/job/src/test/java/com/kylinolap/job/engine/JobInstanceBuilderTest.java index 833e41a..f0d02c3 100644 --- a/job/src/test/java/com/kylinolap/job/engine/JobInstanceBuilderTest.java +++ b/job/src/test/java/com/kylinolap/job/engine/JobInstanceBuilderTest.java @@ -21,6 +21,7 @@ import java.util.TimeZone; import java.util.UUID; +import com.kylinolap.cube.project.CubeRealizationManager; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -32,7 +33,6 @@ import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.CubeSegment; -import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.dict.DictionaryManager; import com.kylinolap.job.JobInstance; import com.kylinolap.job.JobInstance.JobStep; @@ -51,7 +51,7 @@ public void before() throws Exception { this.createTestMetadata(); MetadataManager.removeInstance(this.getTestConfig()); CubeManager.removeInstance(this.getTestConfig()); - ProjectManager.removeInstance(this.getTestConfig()); + CubeRealizationManager.removeInstance(this.getTestConfig()); DictionaryManager.removeInstance(this.getTestConfig()); } diff --git a/job/src/test/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapperTest.java b/job/src/test/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapperTest.java index bb072a1..8d844c4 100644 --- a/job/src/test/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapperTest.java +++ b/job/src/test/java/com/kylinolap/job/hadoop/cube/MergeCuboidMapperTest.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.List; +import com.kylinolap.cube.project.CubeRealizationManager; import org.apache.commons.io.FileUtils; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.Text; @@ -38,7 +39,6 @@ import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.CubeSegment; import com.kylinolap.cube.exception.CubeIntegrityException; -import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.dict.Dictionary; import com.kylinolap.dict.DictionaryGenerator; import com.kylinolap.dict.DictionaryInfo; @@ -93,7 +93,7 @@ public void setUp() throws Exception { MetadataManager.removeInstance(this.getTestConfig()); CubeManager.removeInstance(this.getTestConfig()); - ProjectManager.removeInstance(this.getTestConfig()); + CubeRealizationManager.removeInstance(this.getTestConfig()); DictionaryManager.removeInstance(this.getTestConfig()); // hack for distributed cache diff --git a/server/src/main/java/com/kylinolap/rest/controller/TableController.java b/server/src/main/java/com/kylinolap/rest/controller/TableController.java index 9b036aa..8a88497 100644 --- a/server/src/main/java/com/kylinolap/rest/controller/TableController.java +++ b/server/src/main/java/com/kylinolap/rest/controller/TableController.java @@ -70,7 +70,7 @@ long start = System.currentTimeMillis(); List tables = null; try { - tables = cubeMgmtService.getProjectManager().listDefinedTablesInProject(project); + tables = cubeMgmtService.getCubeRealizationManager().listDefinedTablesInProject(project); } catch (Exception e) { logger.error("Failed to deal with the request.", e); throw new InternalErrorException(e.getLocalizedMessage()); diff --git a/server/src/main/java/com/kylinolap/rest/service/BasicService.java b/server/src/main/java/com/kylinolap/rest/service/BasicService.java index 92b6cb7..8da2a99 100644 --- a/server/src/main/java/com/kylinolap/rest/service/BasicService.java +++ b/server/src/main/java/com/kylinolap/rest/service/BasicService.java @@ -33,6 +33,7 @@ import com.kylinolap.cube.project.CubeRealizationManager; import com.kylinolap.metadata.project.ProjectInstance; +import com.kylinolap.metadata.project.ProjectManager; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -157,7 +158,11 @@ public CubeDescManager getCubeDescManager() { return CubeDescManager.getInstance(getConfig()); } - public CubeRealizationManager getProjectManager() { + public ProjectManager getProjectManager() { + return ProjectManager.getInstance(getConfig()); + } + + public CubeRealizationManager getCubeRealizationManager() { return CubeRealizationManager.getInstance(getConfig()); } diff --git a/server/src/main/java/com/kylinolap/rest/service/CubeService.java b/server/src/main/java/com/kylinolap/rest/service/CubeService.java index de58372..8e49dee 100644 --- a/server/src/main/java/com/kylinolap/rest/service/CubeService.java +++ b/server/src/main/java/com/kylinolap/rest/service/CubeService.java @@ -31,7 +31,11 @@ import java.util.Map; import java.util.Set; +import com.kylinolap.cube.project.CubeRealizationManager; +import com.kylinolap.metadata.model.realization.DataModelRealizationType; +import com.kylinolap.metadata.project.ProjectDataModel; import com.kylinolap.metadata.project.ProjectInstance; +import com.kylinolap.metadata.project.ProjectManager; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; @@ -103,7 +107,7 @@ if (null == project) { cubeInstances = getCubeManager().listAllCubes(); } else { - cubeInstances = getProjectManager().listAllCubes(projectName); + cubeInstances = listAllCubes(projectName); } List filterCubes = new ArrayList(); @@ -187,6 +191,41 @@ public CubeInstance createCubeAndDesc(String cubeName, String projectName, CubeD return createdCube; } + private List listAllCubes(String projectName) { + ProjectManager projectManager = getProjectManager(); + ProjectInstance project = projectManager.getProject(projectName); + if (project == null) { + return Collections.emptyList(); + } + ArrayList result = new ArrayList(); + for (ProjectDataModel projectDataModel: project.getDataModels()) { + if (projectDataModel.getType() == DataModelRealizationType.CUBE) { + CubeInstance cube = getCubeManager().getCube(projectDataModel.getRealization()); + assert cube != null; + result.add(cube); + } + } + return result; + } + + private boolean isCubeInProject(String projectName, CubeInstance target) { + ProjectManager projectManager = getProjectManager(); + ProjectInstance project = projectManager.getProject(projectName); + if (project == null) { + return false; + } + for (ProjectDataModel projectDataModel: project.getDataModels()) { + if (projectDataModel.getType() == DataModelRealizationType.CUBE) { + CubeInstance cube = getCubeManager().getCube(projectDataModel.getRealization()); + assert cube != null; + if (cube.equals(target)) { + return true; + } + } + } + return false; + } + @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or hasPermission(#cube, 'ADMINISTRATION') or hasPermission(#cube, 'MANAGEMENT')") public CubeDesc updateCubeAndDesc(CubeInstance cube, CubeDesc desc, String newProjectName) throws UnknownHostException, IOException, JobException { List jobInstances = this.getJobManager().listJobs(cube.getName(), null); @@ -205,10 +244,11 @@ public CubeDesc updateCubeAndDesc(CubeInstance cube, CubeDesc desc, String newPr int cuboidCount = CuboidCLI.simulateCuboidGeneration(updatedCubeDesc); logger.info("Updated cube " + cube.getName() + " has " + cuboidCount + " cuboids"); - - if (!getProjectManager().isCubeInProject(newProjectName, cube)) { + + ProjectManager projectManager = getProjectManager(); + if (!isCubeInProject(newProjectName, cube)) { String owner = SecurityContextHolder.getContext().getAuthentication().getName(); - ProjectInstance newProject = getProjectManager().updateCubeToProject(cube.getName(), newProjectName, owner); + ProjectInstance newProject = projectManager.updateCubeToProject(cube.getName(), newProjectName, owner); accessService.inherit(cube, newProject); } @@ -597,6 +637,6 @@ private void releaseAllSegments(CubeInstance cube) throws IOException, JobExcept @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN) public void syncTableToProject(String tables,String project) throws IOException { - getProjectManager().updateTableToProject(tables, project); + getCubeRealizationManager().updateTableToProject(tables, project); } } diff --git a/server/src/main/java/com/kylinolap/rest/service/QueryService.java b/server/src/main/java/com/kylinolap/rest/service/QueryService.java index badad90..d2b147f 100644 --- a/server/src/main/java/com/kylinolap/rest/service/QueryService.java +++ b/server/src/main/java/com/kylinolap/rest/service/QueryService.java @@ -247,10 +247,6 @@ public void logQuery(final SQLRequest request, final SQLResponse response, final logger.info(stringBuilder.toString()); } - /** - * @param sql - * @throws SQLException - */ @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or hasPermission(#cube, 'ADMINISTRATION') or hasPermission(#cube, 'MANAGEMENT')" + " or hasPermission(#cube, 'OPERATION') or hasPermission(#cube, 'READ')") public void checkAuthorization(CubeInstance cube) throws AccessDeniedException { } @@ -301,7 +297,7 @@ protected SQLResponse executeQuery(String sql, SQLRequest sqlRequest) throws Exc // PostgreSQL has only 5 TableMeta tblMeta = new TableMeta(catalogName == null ? Constant.FakeCatalogName : catalogName, schemaName == null ? Constant.FakeSchemaName : schemaName, JDBCTableMeta.getString(3), JDBCTableMeta.getString(4), JDBCTableMeta.getString(5), null, null, null, null, null); - if (!cubedOnly || getProjectManager().isExposedTable(project, schemaName + "." + tblMeta.getTABLE_NAME())) { + if (!cubedOnly || getCubeRealizationManager().isExposedTable(project, schemaName + "." + tblMeta.getTABLE_NAME())) { tableMetas.add(tblMeta); tableMap.put(tblMeta.getTABLE_SCHEM() + "#" + tblMeta.getTABLE_NAME(), tblMeta); } @@ -317,7 +313,7 @@ protected SQLResponse executeQuery(String sql, SQLRequest sqlRequest) throws Exc // kylin(optiq) is not strictly following JDBC specification ColumnMeta colmnMeta = new ColumnMeta(catalogName == null ? Constant.FakeCatalogName : catalogName, schemaName == null ? Constant.FakeSchemaName : schemaName, columnMeta.getString(3), columnMeta.getString(4), columnMeta.getInt(5), columnMeta.getString(6), columnMeta.getInt(7), getInt(columnMeta.getString(8)), columnMeta.getInt(9), columnMeta.getInt(10), columnMeta.getInt(11), columnMeta.getString(12), columnMeta.getString(13), getInt(columnMeta.getString(14)), getInt(columnMeta.getString(15)), columnMeta.getInt(16), columnMeta.getInt(17), columnMeta.getString(18), columnMeta.getString(19), columnMeta.getString(20), columnMeta.getString(21), getShort(columnMeta.getString(22)), columnMeta.getString(23)); - if (!cubedOnly || getProjectManager().isExposedColumn(project, schemaName + "." +colmnMeta.getTABLE_NAME(), colmnMeta.getCOLUMN_NAME())) { + if (!cubedOnly || getCubeRealizationManager().isExposedColumn(project, schemaName + "." +colmnMeta.getTABLE_NAME(), colmnMeta.getCOLUMN_NAME())) { tableMap.get(colmnMeta.getTABLE_SCHEM() + "#" + colmnMeta.getTABLE_NAME()).addColumn(colmnMeta); } } @@ -331,7 +327,7 @@ protected SQLResponse executeQuery(String sql, SQLRequest sqlRequest) throws Exc /** * @param sql - * @param project + * @param sqlRequest * @return * @throws Exception */ diff --git a/server/src/test/java/com/kylinolap/rest/controller/ProjectControllerTest.java b/server/src/test/java/com/kylinolap/rest/controller/ProjectControllerTest.java index de25bc9..6dd31b4 100644 --- a/server/src/test/java/com/kylinolap/rest/controller/ProjectControllerTest.java +++ b/server/src/test/java/com/kylinolap/rest/controller/ProjectControllerTest.java @@ -3,13 +3,13 @@ import java.io.IOException; import java.util.List; +import com.kylinolap.metadata.project.ProjectManager; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import com.kylinolap.metadata.project.ProjectInstance; -import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.rest.exception.InternalErrorException; import com.kylinolap.rest.request.CreateProjectRequest; import com.kylinolap.rest.request.UpdateProjectRequest; diff --git a/server/src/test/java/com/kylinolap/rest/service/ServiceTestBase.java b/server/src/test/java/com/kylinolap/rest/service/ServiceTestBase.java index 2d4229f..dbbf3fc 100644 --- a/server/src/test/java/com/kylinolap/rest/service/ServiceTestBase.java +++ b/server/src/test/java/com/kylinolap/rest/service/ServiceTestBase.java @@ -16,6 +16,7 @@ package com.kylinolap.rest.service; +import com.kylinolap.cube.project.CubeRealizationManager; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; @@ -31,7 +32,6 @@ import com.kylinolap.common.KylinConfig; import com.kylinolap.common.util.HBaseMetadataTestCase; import com.kylinolap.cube.CubeManager; -import com.kylinolap.cube.project.ProjectManager; import com.kylinolap.metadata.MetadataManager; /** @@ -64,7 +64,7 @@ public void setUp() { MetadataManager.removeInstance(getTestConfig()); CubeManager.removeInstance(this.getTestConfig()); - ProjectManager.removeInstance(this.getTestConfig()); + CubeRealizationManager.removeInstance(this.getTestConfig()); } @After From d5978b07d276799ecd66be1e67c290d0813ce361 Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Tue, 9 Dec 2014 11:38:06 +0800 Subject: [PATCH 62/65] fix CI issue --- .../main/java/com/kylinolap/cube/CubeManager.java | 3 + .../cube/project/CubeRealizationManager.java | 260 ++++----------------- .../cube/project/CubeRealizationManagerTest.java | 14 +- .../metadata/project/ProjectInstance.java | 18 +- .../kylinolap/metadata/project/ProjectManager.java | 13 +- .../com/kylinolap/rest/service/CubeService.java | 4 +- .../com/kylinolap/rest/service/ProjectService.java | 2 + 7 files changed, 79 insertions(+), 235 deletions(-) diff --git a/cube/src/main/java/com/kylinolap/cube/CubeManager.java b/cube/src/main/java/com/kylinolap/cube/CubeManager.java index 1302c5d..140d61f 100644 --- a/cube/src/main/java/com/kylinolap/cube/CubeManager.java +++ b/cube/src/main/java/com/kylinolap/cube/CubeManager.java @@ -27,6 +27,7 @@ import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import com.kylinolap.cube.project.CubeRealizationManager; import com.kylinolap.metadata.project.ProjectInstance; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -239,6 +240,7 @@ public CubeInstance dropCube(String cubeName, boolean deleteDesc) throws IOExcep // delete cube from project ProjectManager.getInstance(config).removeCubeFromProjects(cubeName); + CubeRealizationManager.getInstance(config).loadAllProjects(); // clean cube cache this.afterCubeDroped(cube, projects); @@ -256,6 +258,7 @@ public CubeInstance createCube(String cubeName, String projectName, CubeDesc des saveResource(cube); ProjectManager.getInstance(config).updateCubeToProject(cubeName, projectName, owner); + CubeRealizationManager.getInstance(config).loadProject(ProjectManager.getInstance(config).getProject(projectName)); return cube; } diff --git a/cube/src/main/java/com/kylinolap/cube/project/CubeRealizationManager.java b/cube/src/main/java/com/kylinolap/cube/project/CubeRealizationManager.java index a43ca67..dc88549 100644 --- a/cube/src/main/java/com/kylinolap/cube/project/CubeRealizationManager.java +++ b/cube/src/main/java/com/kylinolap/cube/project/CubeRealizationManager.java @@ -21,6 +21,7 @@ import java.util.concurrent.ConcurrentHashMap; import com.kylinolap.metadata.project.ProjectInstance; +import com.kylinolap.metadata.project.ProjectManager; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,11 +31,6 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; import com.kylinolap.common.KylinConfig; -import com.kylinolap.common.persistence.JsonSerializer; -import com.kylinolap.common.persistence.ResourceStore; -import com.kylinolap.common.persistence.Serializer; -import com.kylinolap.common.restclient.Broadcaster; -import com.kylinolap.common.restclient.SingleValueCache; import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.model.CubeDesc; @@ -55,14 +51,18 @@ // static cached instances private static final ConcurrentHashMap CACHE = new ConcurrentHashMap(); - private static final Serializer PROJECT_SERIALIZER = new JsonSerializer(ProjectInstance.class); private KylinConfig config; - // project name => ProjrectDesc - private SingleValueCache projectMap = new SingleValueCache(Broadcaster.TYPE.PROJECT); // project name => tables private Multimap projectTables = Multimaps.synchronizedMultimap(HashMultimap.create()); + private CubeRealizationManager(KylinConfig config) throws IOException { + logger.info("Initializing CubeManager with metadata url " + config); + this.config = config; + + loadAllProjects(); + } + public static CubeRealizationManager getInstance(KylinConfig config) { CubeRealizationManager r = CACHE.get(config); if (r != null) { @@ -91,102 +91,11 @@ public static synchronized void removeInstance(KylinConfig config) { CACHE.remove(config); } - private CubeRealizationManager(KylinConfig config) throws IOException { - logger.info("Initializing CubeManager with metadata url " + config); - this.config = config; - - loadAllProjects(); - } - - public static String getDefaultProjectName() { - return ProjectInstance.DEFAULT_PROJECT_NAME; - } - - public List listAllProjects() { - return new ArrayList(projectMap.values()); - } - - public List getProjects(String cubeName) { - return this.findProjects(cubeName); - } - - public ProjectInstance dropProject(String projectName) throws IOException { - if (projectName == null) - throw new IllegalArgumentException("Project name not given"); - - ProjectInstance projectInstance = getProject(projectName); - - if (projectInstance == null) { - throw new IllegalStateException("The project named " + projectName + " does not exist"); - } - - if (projectInstance.getCubes().size() != 0) { - throw new IllegalStateException("The project named " + projectName + " can not be deleted because there's still cubes in it. Delete all the cubes first."); - } - - logger.info("Dropping project '" + projectInstance.getName() + "'"); - deleteResource(projectInstance); - - return projectInstance; - } - - public ProjectInstance getProject(String projectName) { - if (projectName == null) - return null; - projectName = ProjectInstance.getNormalizedProjectName(projectName); - return projectMap.get(projectName); - } - - public ProjectInstance createProject(String projectName, String owner, String description) throws IOException { - - logger.info("Creating project '" + projectName); - - ProjectInstance currentProject = getProject(projectName); - if (currentProject == null) { - currentProject = ProjectInstance.create(projectName, owner, description, null); - } else { - throw new IllegalStateException("The project named " + projectName + "already exists"); - } - - saveResource(currentProject); - - return currentProject; - } - - public ProjectInstance updateProject(ProjectInstance project, String newName, String newDesc) throws IOException { - if (!project.getName().equals(newName)) { - ProjectInstance newProject = this.createProject(newName, project.getOwner(), newDesc); - newProject.setCreateTime(project.getCreateTime()); - newProject.recordUpdateTime(System.currentTimeMillis()); - newProject.setCubes(project.getCubes()); - - deleteResource(project); - saveResource(newProject); - - return newProject; - } else { - project.setName(newName); - project.setDescription(newDesc); - - if (project.getUuid() == null) - project.updateRandomUuid(); - - saveResource(project); - - return project; - } - } - public boolean isCubeInProject(String projectName, CubeInstance cube) { return this.listAllCubes(projectName).contains(cube); } -// public ProjectInstance updateCubeToProject(String cubeName, String newProjectName, String owner) throws IOException { -// removeCubeFromProjects(cubeName); -// return addCubeToProject(cubeName, newProjectName, owner); -// } - - public ProjectInstance updateTableToProject(String tables, String projectName) throws IOException { + public ProjectInstance addTablesToProject(String tables, String projectName) throws IOException { ProjectInstance projectInstance = getProject(projectName); String[] tokens = StringUtils.split(tables, ","); for (int i = 0; i < tokens.length; i++) { @@ -205,15 +114,6 @@ public ProjectInstance updateTableToProject(String tables, String projectName) t return projectInstance; } - -// public void removeCubeFromProjects(String cubeName) throws IOException { -// for (ProjectInstance projectInstance : findProjects(cubeName)) { -// projectInstance.removeCube(cubeName); -// -// saveResource(projectInstance); -// } -// } - public List listExposedTables(String project) { project = ProjectInstance.getNormalizedProjectName(project); List tables = Lists.newArrayList(); @@ -230,7 +130,7 @@ public ProjectInstance updateTableToProject(String tables, String projectName) t public List listDefinedTablesInProject(String project) throws IOException { - if(null==project){ + if(null == project){ return Collections.emptyList(); } project = ProjectInstance.getNormalizedProjectName(project); @@ -283,23 +183,23 @@ public boolean isExposedColumn(String project, String table, String col) { return getProjectTable(project, table).getColumns().contains(col); } - public List listAllCubes(String project) { - project = ProjectInstance.getNormalizedProjectName(project); + public List listAllCubes(String projectName) { + return listAllCubes(ProjectManager.getInstance(config).getProject(projectName)); + } + public List listAllCubes(ProjectInstance projectInstance) { + if (projectInstance == null) { + return Collections.emptyList(); + } HashSet ret = new HashSet(); - - ProjectInstance projectInstance = getProject(project); - if (projectInstance != null) { - for (String cubeName : projectInstance.getCubes()) { - CubeInstance cube = CubeManager.getInstance(config).getCube(cubeName); - if (null != cube) { - ret.add(cube); - } else { - logger.error("Failed to load cube " + cubeName); - } + for (String cubeName : projectInstance.getCubes()) { + CubeInstance cube = CubeManager.getInstance(config).getCube(cubeName); + if (null != cube) { + ret.add(cube); + } else { + logger.error("Failed to load cube " + cubeName); } } - return new ArrayList(ret); } @@ -354,19 +254,26 @@ public boolean isExposedColumn(String project, String table, String col) { return result; } - public void loadProjectCache(ProjectInstance project, boolean triggerUpdate) throws IOException { - loadProject(project.getResourcePath(), triggerUpdate); - loadTables(project.getResourcePath()); - } - - public void removeProjectCache(ProjectInstance project) { + public void unloadProject(ProjectInstance project) { String projectName = ProjectInstance.getNormalizedProjectName(project.getName()); - if (projectMap.containsKey(projectName)) { - projectMap.remove(projectName); + if (projectTables.containsKey(projectName)) { projectTables.removeAll(projectName); } } + public void loadProject(ProjectInstance project) throws IOException { + loadTables(project); + } + + public final void loadAllProjects() throws IOException { + List projectInstances = ProjectManager.getInstance(config).listAllProjects(); + for (ProjectInstance projectInstance : projectInstances) { + loadTables(projectInstance); + } + + logger.debug("Loaded " + projectInstances.size() + " Project(s)"); + } + private void mapTableToCube(ProjectInstance projectInstance, CubeInstance cubeInstance) { // schema sanity check CubeDesc cubeDesc = cubeInstance.getDescriptor(); @@ -398,9 +305,9 @@ private void mapTableToCube(ProjectInstance projectInstance, CubeInstance cubeIn } } - private List findProjects(String cubeName) { + private List findProjectsByCubeName(String cubeName) { List projects = new ArrayList(); - for (ProjectInstance projectInstance : projectMap.values()) { + for (ProjectInstance projectInstance : getProjectManager().listAllProjects()) { if (projectInstance.containsCube(cubeName)) { projects.add(projectInstance); } @@ -409,33 +316,7 @@ private void mapTableToCube(ProjectInstance projectInstance, CubeInstance cubeIn return projects; } - private synchronized ProjectInstance loadProject(String path, boolean triggerUpdate) throws IOException { - ResourceStore store = getStore(); - logger.debug("Loading CubeInstance " + store.getReadableResourcePath(path)); - - ProjectInstance projectInstance = store.getResource(path, ProjectInstance.class, PROJECT_SERIALIZER); - projectInstance.init(); - - if (StringUtils.isBlank(projectInstance.getName())) { - throw new IllegalStateException("Project name must not be blank"); - } - - if (triggerUpdate) { - projectMap.put(projectInstance.getName().toUpperCase(), projectInstance); - } else { - projectMap.putLocal(projectInstance.getName().toUpperCase(), projectInstance); - } - - return projectInstance; - } - - private synchronized void loadTables(String path) throws IOException { - ResourceStore store = getStore(); - logger.debug("Loading CubeInstance " + store.getReadableResourcePath(path)); - - ProjectInstance projectInstance = store.getResource(path, ProjectInstance.class, PROJECT_SERIALIZER); - projectInstance.init(); - + private synchronized void loadTables(ProjectInstance projectInstance) throws IOException { String project = ProjectInstance.getNormalizedProjectName(projectInstance.getName()); projectTables.removeAll(project); @@ -445,54 +326,8 @@ private synchronized void loadTables(String path) throws IOException { } } - private void loadAllProjects() throws IOException { - ResourceStore store = getStore(); - List paths = store.collectResourceRecursively(ResourceStore.PROJECT_RESOURCE_ROOT, ".json"); - - logger.debug("Loading Project from folder " + store.getReadableResourcePath(ResourceStore.PROJECT_RESOURCE_ROOT)); - - for (String path : paths) { - loadProject(path, false); - loadTables(path); - } - - logger.debug("Loaded " + paths.size() + " Project(s)"); - } - - private ProjectInstance addCubeToProject(String cubeName, String project, String user) throws IOException { - String newProjectName = ProjectInstance.getNormalizedProjectName(project); - ProjectInstance newProject = getProject(newProjectName); - if (newProject == null) { - newProject = this.createProject(newProjectName, user, "This is a project automatically added when adding cube " + cubeName); - } - newProject.addCube(cubeName); - saveResource(newProject); - - return newProject; - } - - private void saveResource(ProjectInstance proj) throws IOException { - ResourceStore store = getStore(); - store.putResource(proj.getResourcePath(), proj, PROJECT_SERIALIZER); - afterProjectUpdated(proj); - } - - private void deleteResource(ProjectInstance proj) throws IOException { - ResourceStore store = getStore(); - store.deleteResource(proj.getResourcePath()); - this.afterProjectDropped(proj); - } - - private void afterProjectUpdated(ProjectInstance updatedProject) { - try { - this.loadProjectCache(updatedProject, true); - } catch (IOException e) { - logger.error(e.getLocalizedMessage(), e); - } - } - - private void afterProjectDropped(ProjectInstance droppedProject) { - this.removeProjectCache(droppedProject); + private ProjectInstance getProject(String projectName) { + return ProjectManager.getInstance(config).getProject(projectName); } // sync on update @@ -573,11 +408,16 @@ private ProjectTable getProjectTable(String project, final String table, boolean return projectTable; } - private ResourceStore getStore() { - return ResourceStore.getStore(this.config); + private void saveResource(ProjectInstance projectInstance) throws IOException { + getProjectManager().updateProject(projectInstance); } private MetadataManager getMetadataManager() { return MetadataManager.getInstance(config); } + + private ProjectManager getProjectManager() { + return ProjectManager.getInstance(config); + } + } diff --git a/cube/src/test/java/com/kylinolap/cube/project/CubeRealizationManagerTest.java b/cube/src/test/java/com/kylinolap/cube/project/CubeRealizationManagerTest.java index 90b2efd..ceeb4ce 100644 --- a/cube/src/test/java/com/kylinolap/cube/project/CubeRealizationManagerTest.java +++ b/cube/src/test/java/com/kylinolap/cube/project/CubeRealizationManagerTest.java @@ -56,12 +56,14 @@ public void after() throws Exception { @Test(expected = IllegalStateException.class) public void testDropNonemptyProject1() throws IOException { - ProjectManager.getInstance(this.getTestConfig()).dropProject("DEFAULT"); + ProjectInstance project = ProjectManager.getInstance(this.getTestConfig()).dropProject("DEFAULT"); + CubeRealizationManager.getInstance(this.getTestConfig()).unloadProject(project); } @Test(expected = IllegalStateException.class) public void testDropNonemptyProject2() throws IOException { - ProjectManager.getInstance(this.getTestConfig()).dropProject("DEFAULT???"); + ProjectInstance project = ProjectManager.getInstance(this.getTestConfig()).dropProject("DEFAULT???"); + CubeRealizationManager.getInstance(this.getTestConfig()).unloadProject(project); } @Test @@ -89,11 +91,13 @@ public void testNewProject() throws Exception { assertTrue(CubeManager.getInstance(this.getTestConfig()).listAllCubes().size() == originalCubeCount + 1); projectmanager.updateCubeToProject("cube_in_alien_project", "default", null); + CubeRealizationManager.getInstance(getTestConfig()).loadProject(projectmanager.getProject("default")); assertTrue(cubeRealizationManager.listAllCubes("ALIEN").size() == 0); assertTrue(cubeRealizationManager.listAllCubes("default").size() == originalCubeCountInDefault + 1); assertTrue(cubeRealizationManager.listAllCubes("default").contains(createdCube)); projectmanager.updateCubeToProject("cube_in_alien_project", "alien", null); + CubeRealizationManager.getInstance(getTestConfig()).loadProject(projectmanager.getProject("default")); assertTrue(cubeRealizationManager.listAllCubes("ALIEN").size() == 1); assertTrue(cubeRealizationManager.listAllCubes("default").size() == originalCubeCountInDefault); assertTrue(cubeRealizationManager.listAllCubes("alien").contains(createdCube)); @@ -107,7 +111,8 @@ public void testNewProject() throws Exception { assertTrue(projectmanager.listAllProjects().size() == originalProjectCount + 1); assertTrue(CubeManager.getInstance(this.getTestConfig()).listAllCubes().size() == originalCubeCount); - projectmanager.dropProject("alien"); + ProjectInstance project = projectmanager.dropProject("alien"); + CubeRealizationManager.getInstance(this.getTestConfig()).unloadProject(project); assertTrue(projectmanager.listAllProjects().size() == originalProjectCount); } @@ -158,10 +163,13 @@ public void testProjectsLoadAfterProjectChange() throws IOException { assertTrue(cubeRealizationManager.getCubesByTable("default", "default.test_kylin_fact").contains(cube)); ProjectManager.getInstance(getTestConfig()).removeCubeFromProjects(cube.getName()); + CubeRealizationManager.getInstance(getTestConfig()).loadAllProjects(); + assertTrue(!cubeRealizationManager.getCubesByTable("default", "default.test_kylin_fact").contains(cube)); ProjectManager.getInstance(getTestConfig()).updateCubeToProject(cube.getName(), "default", "tester"); + CubeRealizationManager.getInstance(getTestConfig()).loadProject(ProjectManager.getInstance(getTestConfig()).getProject("default")); assertTrue(cubeRealizationManager.getCubesByTable("default", "default.test_kylin_fact").contains(cube)); } diff --git a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectInstance.java b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectInstance.java index bb0ae33..cfdc54b 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectInstance.java +++ b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectInstance.java @@ -144,13 +144,11 @@ public void setName(String name) { } public boolean containsCube(String cubeName) { - cubeName = cubeName.toUpperCase(); - return cubes.contains(cubeName); + return cubes.contains(cubeName.toUpperCase()); } public void removeCube(String cubeName) { - cubeName = cubeName.toUpperCase(); - cubes.remove(cubeName); + cubes.remove(cubeName.toUpperCase()); } public int getCubesCount() { @@ -158,8 +156,7 @@ public int getCubesCount() { } public void addCube(String cubeName) { - cubeName = cubeName.toUpperCase(); - this.cubes.add(cubeName); + this.cubes.add(cubeName.toUpperCase()); } public List getCubes() { @@ -176,13 +173,11 @@ public void setTables(Set tables) { } public boolean containsTable(String tableName) { - tableName = tableName.toUpperCase(); - return tables.contains(tableName); + return tables.contains(tableName.toUpperCase()); } public void removeTable(String tableName) { - tableName = tableName.toUpperCase(); - tables.remove(tableName); + tables.remove(tableName.toUpperCase()); } public int getTablesCount() { @@ -190,8 +185,7 @@ public int getTablesCount() { } public void addTable(String tableName) { - tableName = tableName.toUpperCase(); - this.getTables().add(tableName); + this.getTables().add(tableName.toUpperCase()); } //will return new Set for null diff --git a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectManager.java b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectManager.java index 42bbefa..ba463f8 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/project/ProjectManager.java +++ b/metadata/src/main/java/com/kylinolap/metadata/project/ProjectManager.java @@ -169,6 +169,11 @@ public ProjectInstance updateProject(ProjectInstance project, String newName, St } } + public ProjectInstance updateProject(ProjectInstance project) throws IOException{ + saveResource(project); + return project; + } + public void removeCubeFromProjects(String cubeName) throws IOException { for (ProjectInstance projectInstance : findProjects(cubeName)) { projectInstance.removeCube(cubeName); @@ -181,14 +186,6 @@ public ProjectInstance updateCubeToProject(String cubeName, String newProjectNam return addCubeToProject(cubeName, newProjectName, owner); } - public boolean containsRealization(String projectName, DataModelRealizationType realization, String name) { - ProjectInstance project = getProject(projectName); - if (project == null) { - return false; - } - return project.containsRealization(realization, name); - } - public void loadProjectCache(ProjectInstance project, boolean triggerUpdate) throws IOException { loadProject(project.getResourcePath(), triggerUpdate); } diff --git a/server/src/main/java/com/kylinolap/rest/service/CubeService.java b/server/src/main/java/com/kylinolap/rest/service/CubeService.java index 8e49dee..01ed3d0 100644 --- a/server/src/main/java/com/kylinolap/rest/service/CubeService.java +++ b/server/src/main/java/com/kylinolap/rest/service/CubeService.java @@ -31,7 +31,6 @@ import java.util.Map; import java.util.Set; -import com.kylinolap.cube.project.CubeRealizationManager; import com.kylinolap.metadata.model.realization.DataModelRealizationType; import com.kylinolap.metadata.project.ProjectDataModel; import com.kylinolap.metadata.project.ProjectInstance; @@ -249,6 +248,7 @@ public CubeDesc updateCubeAndDesc(CubeInstance cube, CubeDesc desc, String newPr if (!isCubeInProject(newProjectName, cube)) { String owner = SecurityContextHolder.getContext().getAuthentication().getName(); ProjectInstance newProject = projectManager.updateCubeToProject(cube.getName(), newProjectName, owner); + getCubeRealizationManager().loadProject(getProjectManager().getProject(newProjectName)); accessService.inherit(cube, newProject); } @@ -637,6 +637,6 @@ private void releaseAllSegments(CubeInstance cube) throws IOException, JobExcept @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN) public void syncTableToProject(String tables,String project) throws IOException { - getCubeRealizationManager().updateTableToProject(tables, project); + getCubeRealizationManager().addTablesToProject(tables, project); } } diff --git a/server/src/main/java/com/kylinolap/rest/service/ProjectService.java b/server/src/main/java/com/kylinolap/rest/service/ProjectService.java index a170167..db1691b 100644 --- a/server/src/main/java/com/kylinolap/rest/service/ProjectService.java +++ b/server/src/main/java/com/kylinolap/rest/service/ProjectService.java @@ -56,6 +56,7 @@ public ProjectInstance createProject(CreateProjectRequest projectRequest) throws } String owner = SecurityContextHolder.getContext().getAuthentication().getName(); ProjectInstance createdProject = getProjectManager().createProject(projectName, owner, description); + getCubeRealizationManager().loadProject(createdProject); accessService.init(createdProject, AclPermission.ADMINISTRATION); logger.debug("New project created."); @@ -102,6 +103,7 @@ public ProjectInstance updateProject(UpdateProjectRequest projectRequest) throws public void deleteProject(String projectName) throws IOException { ProjectInstance project = getProjectManager().getProject(projectName); getProjectManager().dropProject(projectName); + getCubeRealizationManager().unloadProject(project); accessService.clean(project, true); } From 39b0d906fa23cea48d696f2a0293e4df387ad3f9 Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Tue, 9 Dec 2014 20:16:02 +0800 Subject: [PATCH 63/65] fix CI issue --- .../rest/controller/JobControllerTest.java | 52 +++++++++++++++------- .../rest/controller/ProjectControllerTest.java | 11 +++++ 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/server/src/test/java/com/kylinolap/rest/controller/JobControllerTest.java b/server/src/test/java/com/kylinolap/rest/controller/JobControllerTest.java index ee7357e..9e963e2 100644 --- a/server/src/test/java/com/kylinolap/rest/controller/JobControllerTest.java +++ b/server/src/test/java/com/kylinolap/rest/controller/JobControllerTest.java @@ -18,8 +18,16 @@ import java.io.IOException; import java.util.Date; +import java.util.List; import java.util.Map; +import com.kylinolap.cube.CubeDescManager; +import com.kylinolap.cube.CubeInstance; +import com.kylinolap.cube.CubeManager; +import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.metadata.MetadataManager; +import com.kylinolap.rest.exception.InternalErrorException; +import com.kylinolap.rest.exception.NotFoundException; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; @@ -36,9 +44,11 @@ import com.kylinolap.rest.service.JobService; import com.kylinolap.rest.service.ServiceTestBase; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + /** * @author xduo - * */ public class JobControllerTest extends ServiceTestBase { @@ -49,12 +59,8 @@ @Autowired CubeService cubeService; + private static final String CUBE_NAME = "new_job_controller"; - @BeforeClass - public static void setupResource() throws Exception { - Authentication authentication = new TestingAuthenticationToken("ADMIN", "ADMIN", "ROLE_ADMIN"); - SecurityContextHolder.getContext().setAuthentication(authentication); - } @Before public void setup() throws Exception { @@ -65,27 +71,39 @@ public void setup() throws Exception { cubeController = new CubeController(); cubeController.setJobService(jobService); cubeController.setCubeService(cubeService); + } @Test public void testBasics() throws IOException { + + CubeManager cubeManager = CubeManager.getInstance(getTestConfig()); + if (cubeManager.getCube(CUBE_NAME) != null) { + cubeManager.dropCube(CUBE_NAME, false); + } + CubeDescManager cubeDescManager = CubeDescManager.getInstance(getTestConfig()); + CubeDesc cubeDesc = cubeDescManager.getCubeDesc("test_kylin_cube_with_slr_left_join_desc"); + CubeInstance cube = cubeManager.createCube(CUBE_NAME, "DEFAULT", cubeDesc, "test"); + assertNotNull(cube); + JobListRequest jobRequest = new JobListRequest(); Assert.assertNotNull(jobSchedulerController.list(jobRequest)); - JobInstance job = null; - try { - JobBuildRequest jobBuildRequest = new JobBuildRequest(); - jobBuildRequest.setBuildType("BUILD"); - jobBuildRequest.setStartTime(1386806400000L); - jobBuildRequest.setEndTime(new Date().getTime()); - job = cubeController.rebuild("test_kylin_cube_with_slr_ready", jobBuildRequest); - } catch (Exception e) { - e.printStackTrace(); - } + JobBuildRequest jobBuildRequest = new JobBuildRequest(); + jobBuildRequest.setBuildType("BUILD"); + jobBuildRequest.setStartTime(1386806400000L); + jobBuildRequest.setEndTime(new Date().getTime()); + JobInstance job = cubeController.rebuild(CUBE_NAME, jobBuildRequest); + Assert.assertNotNull(jobSchedulerController.get(job.getId())); Map output = jobSchedulerController.getStepOutput(job.getId(), 0); Assert.assertNotNull(output); + try { + jobSchedulerController.cancel(job.getId()); + } catch (InternalErrorException e) { + + } // jobSchedulerController.cancel(job.getId()); } @@ -96,7 +114,7 @@ public void testResume() throws IOException { jobBuildRequest.setBuildType("BUILD"); jobBuildRequest.setStartTime(20130331080000L); jobBuildRequest.setEndTime(20131212080000L); - JobInstance job = cubeController.rebuild("test_kylin_cube_with_slr_ready", jobBuildRequest); + JobInstance job = cubeController.rebuild(CUBE_NAME, jobBuildRequest); jobSchedulerController.resume(job.getId()); } diff --git a/server/src/test/java/com/kylinolap/rest/controller/ProjectControllerTest.java b/server/src/test/java/com/kylinolap/rest/controller/ProjectControllerTest.java index 6dd31b4..e4dde42 100644 --- a/server/src/test/java/com/kylinolap/rest/controller/ProjectControllerTest.java +++ b/server/src/test/java/com/kylinolap/rest/controller/ProjectControllerTest.java @@ -32,6 +32,17 @@ public void setup() { projectController = new ProjectController(); projectController.setProjectService(projectService); + try { + projectController.deleteProject("new_project"); + } catch (InternalErrorException e) { + //project doesn't exist + } + try { + projectController.deleteProject("new_project_2"); + } catch (InternalErrorException e) { + //project doesn't exist + } + } @Test From 6d491a19bb074d9a70d17d33925ee4b2637538fc Mon Sep 17 00:00:00 2001 From: "qianhao.zhou" Date: Wed, 10 Dec 2014 10:36:40 +0800 Subject: [PATCH 64/65] fix CI issue --- .../com/kylinolap/rest/controller/JobControllerTest.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/server/src/test/java/com/kylinolap/rest/controller/JobControllerTest.java b/server/src/test/java/com/kylinolap/rest/controller/JobControllerTest.java index 9e963e2..6583ebe 100644 --- a/server/src/test/java/com/kylinolap/rest/controller/JobControllerTest.java +++ b/server/src/test/java/com/kylinolap/rest/controller/JobControllerTest.java @@ -21,10 +21,12 @@ import java.util.List; import java.util.Map; +import com.kylinolap.common.KylinConfig; import com.kylinolap.cube.CubeDescManager; import com.kylinolap.cube.CubeInstance; import com.kylinolap.cube.CubeManager; import com.kylinolap.cube.model.CubeDesc; +import com.kylinolap.job.JobDAO; import com.kylinolap.metadata.MetadataManager; import com.kylinolap.rest.exception.InternalErrorException; import com.kylinolap.rest.exception.NotFoundException; @@ -77,11 +79,12 @@ public void setup() throws Exception { @Test public void testBasics() throws IOException { - CubeManager cubeManager = CubeManager.getInstance(getTestConfig()); + KylinConfig testConfig = getTestConfig(); + CubeManager cubeManager = CubeManager.getInstance(testConfig); if (cubeManager.getCube(CUBE_NAME) != null) { cubeManager.dropCube(CUBE_NAME, false); } - CubeDescManager cubeDescManager = CubeDescManager.getInstance(getTestConfig()); + CubeDescManager cubeDescManager = CubeDescManager.getInstance(testConfig); CubeDesc cubeDesc = cubeDescManager.getCubeDesc("test_kylin_cube_with_slr_left_join_desc"); CubeInstance cube = cubeManager.createCube(CUBE_NAME, "DEFAULT", cubeDesc, "test"); assertNotNull(cube); @@ -91,7 +94,7 @@ public void testBasics() throws IOException { JobBuildRequest jobBuildRequest = new JobBuildRequest(); jobBuildRequest.setBuildType("BUILD"); - jobBuildRequest.setStartTime(1386806400000L); + jobBuildRequest.setStartTime(0L); jobBuildRequest.setEndTime(new Date().getTime()); JobInstance job = cubeController.rebuild(CUBE_NAME, jobBuildRequest); @@ -99,11 +102,7 @@ public void testBasics() throws IOException { Assert.assertNotNull(jobSchedulerController.get(job.getId())); Map output = jobSchedulerController.getStepOutput(job.getId(), 0); Assert.assertNotNull(output); - try { - jobSchedulerController.cancel(job.getId()); - } catch (InternalErrorException e) { - - } + JobDAO.getInstance(testConfig).deleteJob(job); // jobSchedulerController.cancel(job.getId()); } From 37bfbabc5611bbb5014d8635ed94afb824791b3d Mon Sep 17 00:00:00 2001 From: Trevor Hartman Date: Thu, 11 Dec 2014 10:29:09 -0700 Subject: [PATCH 65/65] Avoid duplicate traitSet replacement in OLAPProjectRule --- query/src/main/java/com/kylinolap/query/optrule/OLAPProjectRule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/query/src/main/java/com/kylinolap/query/optrule/OLAPProjectRule.java b/query/src/main/java/com/kylinolap/query/optrule/OLAPProjectRule.java index e174366..97d3ca2 100644 --- a/query/src/main/java/com/kylinolap/query/optrule/OLAPProjectRule.java +++ b/query/src/main/java/com/kylinolap/query/optrule/OLAPProjectRule.java @@ -41,7 +41,7 @@ public void onMatch(RelOptRuleCall call) { ProjectRel project = call.rel(0); RelTraitSet traitSet = project.getTraitSet().replace(OLAPRel.CONVENTION); - OLAPProjectRel olapProj = new OLAPProjectRel(project.getCluster(), traitSet, convert(project.getChild(), project.getTraitSet().replace(OLAPRel.CONVENTION)), project.getProjects(), project.getRowType(), project.getFlags()); + OLAPProjectRel olapProj = new OLAPProjectRel(project.getCluster(), traitSet, convert(project.getChild(), traitSet), project.getProjects(), project.getRowType(), project.getFlags()); call.transformTo(olapProj); }