diff --git a/docs/content/Historical-Config.md b/docs/content/Historical-Config.md index 6ef83196c61..9cbb8cce45c 100644 --- a/docs/content/Historical-Config.md +++ b/docs/content/Historical-Config.md @@ -36,8 +36,6 @@ druid.processing.numThreads=1 druid.segmentCache.locations=[{"path": "/tmp/druid/indexCache", "maxSize"\: 10000000000}] ``` -Note: This will spin up a Historical node with the local filesystem as deep storage. - Production Configs ------------------ These production configs are using S3 as a deep store. diff --git a/publications/demo/Makefile b/publications/demo/Makefile new file mode 100644 index 00000000000..66e52924773 --- /dev/null +++ b/publications/demo/Makefile @@ -0,0 +1,12 @@ +all : druid_demo.pdf + +clean : + @rm -f *.aux *.bbl *.blg *.log + +%.tex : %.bib + +%.pdf : %.tex %.bib + lualatex $(*F) + bibtex $(*F) + lualatex $(*F) + lualatex $(*F) diff --git a/publications/demo/druid_demo.aux b/publications/demo/druid_demo.aux new file mode 100644 index 00000000000..4bcb602b2ed --- /dev/null +++ b/publications/demo/druid_demo.aux @@ -0,0 +1,54 @@ +\relax +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\citation{hunt2010zookeeper} +\@writefile{toc}{\contentsline {section}{\numberline {1}Introduction}{1}{section.1}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}The Need for Druid}{1}{subsection.1.1}} +\@writefile{toc}{\contentsline {section}{\numberline {2}Architecture}{1}{section.2}} +\citation{abadi2008column} +\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces An overview of a Druid cluster and the flow of data through the cluster.}}{2}{figure.1}} +\newlabel{fig:cluster}{{1}{2}{An overview of a Druid cluster and the flow of data through the cluster}{figure.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Real-time Nodes}{2}{subsection.2.1}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Historical Nodes}{2}{subsection.2.2}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Broker Nodes}{2}{subsection.2.3}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.4}Coordinator Nodes}{2}{subsection.2.4}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.5}Query Processing}{2}{subsection.2.5}} +\citation{tomasic1993performance} +\citation{colantonio2010concise} +\@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces Sample sales data set.}}{3}{table.1}} +\newlabel{tab:sample_data}{{1}{3}{Sample sales data set}{table.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.6}Query Capabilities}{3}{subsection.2.6}} +\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces Query latencies of production data sources.}}{3}{figure.2}} +\newlabel{fig:query_latency}{{2}{3}{Query latencies of production data sources}{figure.2}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces Druid \& MySQL benchmarks -- 100GB TPC-H data.}}{3}{figure.3}} +\newlabel{fig:tpch_100gb}{{3}{3}{Druid \& MySQL benchmarks -- 100GB TPC-H data}{figure.3}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3}Performance}{3}{section.3}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Query Performance}{3}{subsection.3.1}} +\bibstyle{abbrv} +\bibdata{druid_demo} +\bibcite{abadi2008column}{1} +\bibcite{colantonio2010concise}{2} +\bibcite{hunt2010zookeeper}{3} +\bibcite{tomasic1993performance}{4} +\@writefile{lof}{\contentsline {figure}{\numberline {4}{\ignorespaces Combined cluster ingestion rates.}}{4}{figure.4}} +\newlabel{fig:ingestion_rate}{{4}{4}{Combined cluster ingestion rates}{figure.4}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Data Ingestion Performance}{4}{subsection.3.2}} +\@writefile{toc}{\contentsline {section}{\numberline {4}Demonstration Details}{4}{section.4}} +\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Setup}{4}{subsection.4.1}} +\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Goals}{4}{subsection.4.2}} +\@writefile{toc}{\contentsline {section}{\numberline {5}Acknowledgments}{4}{section.5}} +\@writefile{toc}{\contentsline {section}{\numberline {6}Additional Authors}{4}{section.6}} +\@writefile{toc}{\contentsline {section}{\numberline {7}References}{4}{section.7}} diff --git a/publications/demo/druid_demo.bbl b/publications/demo/druid_demo.bbl new file mode 100644 index 00000000000..019345a714e --- /dev/null +++ b/publications/demo/druid_demo.bbl @@ -0,0 +1,27 @@ +\begin{thebibliography}{1} + +\bibitem{abadi2008column} +D.~J. Abadi, S.~R. Madden, and N.~Hachem. +\newblock Column-stores vs. row-stores: How different are they really? +\newblock In {\em Proceedings of the 2008 ACM SIGMOD international conference + on Management of data}, pages 967--980. ACM, 2008. + +\bibitem{colantonio2010concise} +A.~Colantonio and R.~Di~Pietro. +\newblock Concise: Compressed ‘n’composable integer set. +\newblock {\em Information Processing Letters}, 110(16):644--650, 2010. + +\bibitem{hunt2010zookeeper} +P.~Hunt, M.~Konar, F.~P. Junqueira, and B.~Reed. +\newblock Zookeeper: Wait-free coordination for internet-scale systems. +\newblock In {\em USENIX ATC}, volume~10, 2010. + +\bibitem{tomasic1993performance} +A.~Tomasic and H.~Garcia-Molina. +\newblock Performance of inverted indices in shared-nothing distributed text + document information retrieval systems. +\newblock In {\em Parallel and Distributed Information Systems, 1993., + Proceedings of the Second International Conference on}, pages 8--17. IEEE, + 1993. + +\end{thebibliography} diff --git a/publications/demo/druid_demo.bib b/publications/demo/druid_demo.bib new file mode 100644 index 00000000000..07b824f3f94 --- /dev/null +++ b/publications/demo/druid_demo.bib @@ -0,0 +1,420 @@ + @article{cattell2011scalable, + title={Scalable SQL and NoSQL data stores}, + author={Cattell, Rick}, + journal={ACM SIGMOD Record}, + volume={39}, + number={4}, + pages={12--27}, + year={2011}, + publisher={ACM} + } + + @article{chang2008bigtable, + title={Bigtable: A distributed storage system for structured data}, + author={Chang, Fay and Dean, Jeffrey and Ghemawat, Sanjay and Hsieh, Wilson C and Wallach, Deborah A and Burrows, Mike and Chandra, Tushar and Fikes, Andrew and Gruber, Robert E}, + journal={ACM Transactions on Computer Systems (TOCS)}, + volume={26}, + number={2}, + pages={4}, + year={2008}, + publisher={ACM} + } + + @inproceedings{decandia2007dynamo, + title={Dynamo: amazon's highly available key-value store}, + author={DeCandia, Giuseppe and Hastorun, Deniz and Jampani, Madan and Kakulapati, Gunavardhan and Lakshman, Avinash and Pilchin, Alex and Sivasubramanian, Swaminathan and Vosshall, Peter and Vogels, Werner}, + booktitle={ACM SIGOPS Operating Systems Review}, + volume={41}, + number={6}, + pages={205--220}, + year={2007}, + organization={ACM} + } + + @inproceedings{abadi2008column, + title={Column-Stores vs. Row-Stores: How different are they really?}, + author={Abadi, Daniel J and Madden, Samuel R and Hachem, Nabil}, + booktitle={Proceedings of the 2008 ACM SIGMOD international conference on Management of data}, + pages={967--980}, + year={2008}, + organization={ACM} + } + + @inproceedings{bear2012vertica, + title={The vertica database: SQL RDBMS for managing big data}, + author={Bear, Chuck and Lamb, Andrew and Tran, Nga}, + booktitle={Proceedings of the 2012 workshop on Management of big data systems}, + pages={37--38}, + year={2012}, + organization={ACM} + } + + @article{lakshman2010cassandra, + title={Cassandra—A decentralized structured storage system}, + author={Lakshman, Avinash and Malik, Prashant}, + journal={Operating systems review}, + volume={44}, + number={2}, + pages={35}, + year={2010} + } + + @article{melnik2010dremel, + title={Dremel: interactive analysis of web-scale datasets}, + author={Melnik, Sergey and Gubarev, Andrey and Long, Jing Jing and Romer, Geoffrey and Shivakumar, Shiva and Tolton, Matt and Vassilakis, Theo}, + journal={Proceedings of the VLDB Endowment}, + volume={3}, + number={1-2}, + pages={330--339}, + year={2010}, + publisher={VLDB Endowment} + } + + @article{hall2012processing, + title={Processing a trillion cells per mouse click}, + author={Hall, Alexander and Bachmann, Olaf and B{\"u}ssow, Robert and G{\u{a}}nceanu, Silviu and Nunkesser, Marc}, + journal={Proceedings of the VLDB Endowment}, + volume={5}, + number={11}, + pages={1436--1446}, + year={2012}, + publisher={VLDB Endowment} + } + + @inproceedings{shvachko2010hadoop, + title={The hadoop distributed file system}, + author={Shvachko, Konstantin and Kuang, Hairong and Radia, Sanjay and Chansler, Robert}, + booktitle={Mass Storage Systems and Technologies (MSST), 2010 IEEE 26th Symposium on}, + pages={1--10}, + year={2010}, + organization={IEEE} + } + + @article{colantonio2010concise, + title={Concise: Compressed ‘n’Composable Integer Set}, + author={Colantonio, Alessandro and Di Pietro, Roberto}, + journal={Information Processing Letters}, + volume={110}, + number={16}, + pages={644--650}, + year={2010}, + publisher={Elsevier} + } + + @inproceedings{stonebraker2005c, + title={C-store: a column-oriented DBMS}, + author={Stonebraker, Mike and Abadi, Daniel J and Batkin, Adam and Chen, Xuedong and Cherniack, Mitch and Ferreira, Miguel and Lau, Edmond and Lin, Amerson and Madden, Sam and O'Neil, Elizabeth and others}, + booktitle={Proceedings of the 31st international conference on Very large data bases}, + pages={553--564}, + year={2005}, + organization={VLDB Endowment} + } + + @inproceedings{engle2012shark, + title={Shark: fast data analysis using coarse-grained distributed memory}, + author={Engle, Cliff and Lupher, Antonio and Xin, Reynold and Zaharia, Matei and Franklin, Michael J and Shenker, Scott and Stoica, Ion}, + booktitle={Proceedings of the 2012 international conference on Management of Data}, + pages={689--692}, + year={2012}, + organization={ACM} + } + + @inproceedings{zaharia2012discretized, + title={Discretized streams: an efficient and fault-tolerant model for stream processing on large clusters}, + author={Zaharia, Matei and Das, Tathagata and Li, Haoyuan and Shenker, Scott and Stoica, Ion}, + booktitle={Proceedings of the 4th USENIX conference on Hot Topics in Cloud Computing}, + pages={10--10}, + year={2012}, + organization={USENIX Association} + } + + @misc{marz2013storm, + author = {Marz, Nathan}, + title = {Storm: Distributed and Fault-Tolerant Realtime Computation}, + month = {February}, + year = {2013}, + howpublished = "\url{http://storm-project.net/}" + } + + @misc{tschetter2011druid, + author = {Eric Tschetter}, + title = {Introducing Druid: Real-Time Analytics at a Billion Rows Per Second}, + month = {April}, + year = {2011}, + howpublished = "\url{http://druid.io/blog/2011/04/30/introducing-druid.html}" + } + + @article{farber2012sap, + title={SAP HANA database: data management for modern business applications}, + author={F{\"a}rber, Franz and Cha, Sang Kyun and Primsch, J{\"u}rgen and Bornh{\"o}vd, Christof and Sigg, Stefan and Lehner, Wolfgang}, + journal={ACM Sigmod Record}, + volume={40}, + number={4}, + pages={45--51}, + year={2012}, + publisher={ACM} + } + + @misc{voltdb2010voltdb, + title={VoltDB Technical Overview}, + author={VoltDB, LLC}, + year={2010}, + howpublished = "\url{https://voltdb.com/}" + } + + @inproceedings{macnicol2004sybase, + title={Sybase IQ multiplex-designed for analytics}, + author={MacNicol, Roger and French, Blaine}, + booktitle={Proceedings of the Thirtieth international conference on Very large data bases-Volume 30}, + pages={1227--1230}, + year={2004}, + organization={VLDB Endowment} + } + + @inproceedings{singh2011introduction, + title={Introduction to the IBM Netezza warehouse appliance}, + author={Singh, Malcolm and Leonhardi, Ben}, + booktitle={Proceedings of the 2011 Conference of the Center for Advanced Studies on Collaborative Research}, + pages={385--386}, + year={2011}, + organization={IBM Corp.} + } + + @inproceedings{miner2012unified, + title={Unified analytics platform for big data}, + author={Miner, Donald}, + booktitle={Proceedings of the WICSA/ECSA 2012 Companion Volume}, + pages={176--176}, + year={2012}, + organization={ACM} + } + + @inproceedings{fink2012distributed, + title={Distributed computation on dynamo-style distributed storage: riak pipe}, + author={Fink, Bryan}, + booktitle={Proceedings of the eleventh ACM SIGPLAN workshop on Erlang workshop}, + pages={43--50}, + year={2012}, + organization={ACM} + } + + @misc{paraccel2013, + key = {ParAccel Analytic Database}, + title = {ParAccel Analytic Database}, + month = {March}, + year = {2013}, + howpublished = "\url{http://www.paraccel.com/resources/Datasheets/ParAccel-Core-Analytic-Database.pdf}" + } + + @misc{cloudera2013, + key = {Cloudera Impala}, + title = {Cloudera Impala}, + month = {March}, + year = {2013}, + url = {}, + howpublished = "\url{http://blog.cloudera.com/blog}" + } + + @inproceedings{hunt2010zookeeper, + title={ZooKeeper: Wait-free coordination for Internet-scale systems}, + author={Hunt, Patrick and Konar, Mahadev and Junqueira, Flavio P and Reed, Benjamin}, + booktitle={USENIX ATC}, + volume={10}, + year={2010} + } + + @inproceedings{kreps2011kafka, + title={Kafka: A distributed messaging system for log processing}, + author={Kreps, Jay and Narkhede, Neha and Rao, Jun}, + booktitle={Proceedings of 6th International Workshop on Networking Meets Databases (NetDB), Athens, Greece}, + year={2011} + } + + @misc{liblzf2013, + title = {LibLZF}, + key = {LibLZF}, + month = {March}, + year = {2013}, + howpublished = "\url{http://freecode.com/projects/liblzf}" + } + + @inproceedings{tomasic1993performance, + title={Performance of inverted indices in shared-nothing distributed text document information retrieval systems}, + author={Tomasic, Anthony and Garcia-Molina, Hector}, + booktitle={Parallel and Distributed Information Systems, 1993., Proceedings of the Second International Conference on}, + pages={8--17}, + year={1993}, + organization={IEEE} + } + + @inproceedings{antoshenkov1995byte, + title={Byte-aligned bitmap compression}, + author={Antoshenkov, Gennady}, + booktitle={Data Compression Conference, 1995. DCC'95. Proceedings}, + pages={476}, + year={1995}, + organization={IEEE} + } + + @inproceedings{van2011memory, + title={A memory efficient reachability data structure through bit vector compression}, + author={van Schaik, Sebastiaan J and de Moor, Oege}, + booktitle={Proceedings of the 2011 international conference on Management of data}, + pages={913--924}, + year={2011}, + organization={ACM} + } + + @inproceedings{o1993lru, + title={The LRU-K page replacement algorithm for database disk buffering}, + author={O'neil, Elizabeth J and O'neil, Patrick E and Weikum, Gerhard}, + booktitle={ACM SIGMOD Record}, + volume={22}, + number={2}, + pages={297--306}, + year={1993}, + organization={ACM} + } + + @article{kim2001lrfu, + title={LRFU: A spectrum of policies that subsumes the least recently used and least frequently used policies}, + author={Kim, Chong Sang}, + journal={IEEE Transactions on Computers}, + volume={50}, + number={12}, + year={2001} + } + + @article{wu2006optimizing, + title={Optimizing bitmap indices with efficient compression}, + author={Wu, Kesheng and Otoo, Ekow J and Shoshani, Arie}, + journal={ACM Transactions on Database Systems (TODS)}, + volume={31}, + number={1}, + pages={1--38}, + year={2006}, + publisher={ACM} + } + + @misc{twitter2013, + key = {Twitter Public Streams}, + title = {Twitter Public Streams}, + month = {March}, + year = {2013}, + howpublished = "\url{https://dev.twitter.com/docs/streaming-apis/streams/public}" + } + + @article{fitzpatrick2004distributed, + title={Distributed caching with memcached}, + author={Fitzpatrick, Brad}, + journal={Linux journal}, + number={124}, + pages={72--74}, + year={2004} + } + @inproceedings{amdahl1967validity, + title={Validity of the single processor approach to achieving large scale computing capabilities}, + author={Amdahl, Gene M}, + booktitle={Proceedings of the April 18-20, 1967, spring joint computer conference}, + pages={483--485}, + year={1967}, + organization={ACM} + } + @book{sarawagi1998discovery, + title={Discovery-driven exploration of OLAP data cubes}, + author={Sarawagi, Sunita and Agrawal, Rakesh and Megiddo, Nimrod}, + year={1998}, + publisher={Springer} + } + @article{hu2011stream, + title={Stream Database Survey}, + author={Hu, Bo}, + year={2011} + } + + @article{dean2008mapreduce, + title={MapReduce: simplified data processing on large clusters}, + author={Dean, Jeffrey and Ghemawat, Sanjay}, + journal={Communications of the ACM}, + volume={51}, + number={1}, + pages={107--113}, + year={2008}, + publisher={ACM} + } + + @misc{linkedin2013senseidb, + author = {LinkedIn}, + title = {SenseiDB}, + month = {July}, + year = {2013}, + howpublished = "\url{http://www.senseidb.com/}" + } + + @misc{apache2013solr, + author = {Apache}, + title = {Apache Solr}, + month = {February}, + year = {2013}, + howpublished = "\url{http://lucene.apache.org/solr/}" + } + + @misc{banon2013elasticsearch, + author = {Banon, Shay}, + title = {ElasticSearch}, + month = {July}, + year = {2013}, + howpublished = "\url{http://www.elasticseach.com/}" + } + +@book{oehler2012ibm, + title={IBM Cognos TM1: The Official Guide}, + author={Oehler, Karsten and Gruenes, Jochen and Ilacqua, Christopher and Perez, Manuel}, + year={2012}, + publisher={McGraw-Hill} +} + +@book{schrader2009oracle, + title={Oracle Essbase \& Oracle OLAP}, + author={Schrader, Michael and Vlamis, Dan and Nader, Mike and Claterbos, Chris and Collins, Dave and Campbell, Mitch and Conrad, Floyd}, + year={2009}, + publisher={McGraw-Hill, Inc.} +} + +@book{lachev2005applied, + title={Applied Microsoft Analysis Services 2005: And Microsoft Business Intelligence Platform}, + author={Lachev, Teo}, + year={2005}, + publisher={Prologika Press} +} + +@article{o1996log, + title={The log-structured merge-tree (LSM-tree)}, + author={O’Neil, Patrick and Cheng, Edward and Gawlick, Dieter and O’Neil, Elizabeth}, + journal={Acta Informatica}, + volume={33}, + number={4}, + pages={351--385}, + year={1996}, + publisher={Springer} +} + +@inproceedings{o1997improved, + title={Improved query performance with variant indexes}, + author={O'Neil, Patrick and Quass, Dallan}, + booktitle={ACM Sigmod Record}, + volume={26}, + number={2}, + pages={38--49}, + year={1997}, + organization={ACM} +} + +@inproceedings{cipar2012lazybase, + title={LazyBase: trading freshness for performance in a scalable database}, + author={Cipar, James and Ganger, Greg and Keeton, Kimberly and Morrey III, Charles B and Soules, Craig AN and Veitch, Alistair}, + booktitle={Proceedings of the 7th ACM european conference on Computer Systems}, + pages={169--182}, + year={2012}, + organization={ACM} +} diff --git a/publications/demo/druid_demo.blg b/publications/demo/druid_demo.blg new file mode 100644 index 00000000000..62d6915ffd0 --- /dev/null +++ b/publications/demo/druid_demo.blg @@ -0,0 +1,46 @@ +This is BibTeX, Version 0.99d (TeX Live 2012) +Capacity: max_strings=35307, hash_size=35307, hash_prime=30011 +The top-level auxiliary file: druid_demo.aux +The style file: abbrv.bst +Database file #1: druid_demo.bib +You've used 4 entries, + 2118 wiz_defined-function locations, + 524 strings with 4556 characters, +and the built_in function-call counts, 1592 in all, are: += -- 160 +> -- 67 +< -- 3 ++ -- 26 +- -- 22 +* -- 105 +:= -- 251 +add.period$ -- 14 +call.type$ -- 4 +change.case$ -- 23 +chr.to.int$ -- 0 +cite$ -- 4 +duplicate$ -- 67 +empty$ -- 133 +format.name$ -- 22 +if$ -- 349 +int.to.chr$ -- 0 +int.to.str$ -- 4 +missing$ -- 4 +newline$ -- 23 +num.names$ -- 8 +pop$ -- 30 +preamble$ -- 1 +purify$ -- 19 +quote$ -- 0 +skip$ -- 47 +stack$ -- 0 +substring$ -- 96 +swap$ -- 22 +text.length$ -- 3 +text.prefix$ -- 0 +top$ -- 0 +type$ -- 16 +warning$ -- 0 +while$ -- 16 +width$ -- 5 +write$ -- 48 diff --git a/publications/demo/druid_demo.out b/publications/demo/druid_demo.out new file mode 100644 index 00000000000..dcc6d6ba024 --- /dev/null +++ b/publications/demo/druid_demo.out @@ -0,0 +1,18 @@ +\BOOKMARK [1][-]{section.1}{Introduction}{}% 1 +\BOOKMARK [2][-]{subsection.1.1}{The Need for Druid}{section.1}% 2 +\BOOKMARK [1][-]{section.2}{Architecture}{}% 3 +\BOOKMARK [2][-]{subsection.2.1}{Real-time Nodes}{section.2}% 4 +\BOOKMARK [2][-]{subsection.2.2}{Historical Nodes}{section.2}% 5 +\BOOKMARK [2][-]{subsection.2.3}{Broker Nodes}{section.2}% 6 +\BOOKMARK [2][-]{subsection.2.4}{Coordinator Nodes}{section.2}% 7 +\BOOKMARK [2][-]{subsection.2.5}{Query Processing}{section.2}% 8 +\BOOKMARK [2][-]{subsection.2.6}{Query Capabilities}{section.2}% 9 +\BOOKMARK [1][-]{section.3}{Performance}{}% 10 +\BOOKMARK [2][-]{subsection.3.1}{Query Performance}{section.3}% 11 +\BOOKMARK [2][-]{subsection.3.2}{Data Ingestion Performance}{section.3}% 12 +\BOOKMARK [1][-]{section.4}{Demonstration Details}{}% 13 +\BOOKMARK [2][-]{subsection.4.1}{Setup}{section.4}% 14 +\BOOKMARK [2][-]{subsection.4.2}{Goals}{section.4}% 15 +\BOOKMARK [1][-]{section.5}{Acknowledgments}{}% 16 +\BOOKMARK [1][-]{section.6}{Additional Authors}{}% 17 +\BOOKMARK [1][-]{section.7}{References}{}% 18 diff --git a/publications/demo/druid_demo.pdf b/publications/demo/druid_demo.pdf new file mode 100644 index 00000000000..4e6e74d2ed2 Binary files /dev/null and b/publications/demo/druid_demo.pdf differ diff --git a/publications/demo/druid_demo.tex b/publications/demo/druid_demo.tex new file mode 100644 index 00000000000..ec5bd134849 --- /dev/null +++ b/publications/demo/druid_demo.tex @@ -0,0 +1,464 @@ +% THIS IS AN EXAMPLE DOCUMENT FOR VLDB 2012 +% based on ACM SIGPROC-SP.TEX VERSION 2.7 +% Modified by Gerald Weber +% Removed the requirement to include *bbl file in here. (AhmetSacan, Sep2012) +% Fixed the equation on page 3 to prevent line overflow. (AhmetSacan, Sep2012) + +\documentclass{vldb} +\usepackage{graphicx} +\usepackage{balance} % for \balance command ON LAST PAGE (only there!) +\usepackage{fontspec} +\usepackage{hyperref} +\graphicspath{{figures/}} +\usepackage{enumitem} + +\begin{document} + +% ****************** TITLE **************************************** + +\title{Druid: Open Source Real-time Analytics at Scale} + +% possible, but not really needed or used for PVLDB: +%\subtitle{[Extended Abstract] +%\titlenote{A full version of this paper is available as\textit{Author's Guide to Preparing ACM SIG Proceedings Using \LaTeX$2_\epsilon$\ and BibTeX} at \texttt{www.acm.org/eaddress.htm}}} + +% ****************** AUTHORS ************************************** + +% You need the command \numberofauthors to handle the 'placement +% and alignment' of the authors beneath the title. +% +% For aesthetic reasons, we recommend 'three authors at a time' +% i.e. three 'name/affiliation blocks' be placed beneath the title. +% +% NOTE: You are NOT restricted in how many 'rows' of +% "name/affiliations" may appear. We just ask that you restrict +% the number of 'columns' to three. +% +% Because of the available 'opening page real-estate' +% we ask you to refrain from putting more than six authors +% (two rows with three columns) beneath the article title. +% More than six makes the first-page appear very cluttered indeed. +% +% Use the \alignauthor commands to handle the names +% and affiliations for an 'aesthetic maximum' of six authors. +% Add names, affiliations, addresses for +% the seventh etc. author(s) as the argument for the +% \additionalauthors command. +% These 'additional authors' will be output/set for you +% without further effort on your part as the last section in +% the body of your article BEFORE References or any Appendices. + +\numberofauthors{6} % in this sample file, there are a *total* +% of EIGHT authors. SIX appear on the 'first-page' (for formatting +% reasons) and the remaining two appear in the \additionalauthors section. + +\author{ +% You can go ahead and credit any number of authors here, +% e.g. one 'row of three' or two rows (consisting of one row of three +% and a second row of one, two or three). +% +% The command \alignauthor (no curly braces needed) should +% precede each author name, affiliation/snail-mail address and +% e-mail address. Additionally, tag each line of +% affiliation/address with \affaddr, and tag the +% e-mail address with \email. +% +% 1st. author +\alignauthor +Fangjin Yang\\ + \affaddr{Metamarkets Group, Inc.}\\ + \email{fangjin@metamarkets.com} +% 2nd. author +\alignauthor +Eric Tschetter\\ + \email{echeddar@gmail.com} +% 3rd. author +\alignauthor +Xavier Léauté\\ + \affaddr{Metamarkets Group, Inc.}\\ + \email{xavier@metamarkets.com} +\and % use '\and' if you need 'another row' of author names +% 4th. author +\alignauthor +Nishant Bangarwa\\ + \affaddr{Metamarkets Group, Inc.}\\ + \email{nishant@metamarkets.com} +% 5th. author +\alignauthor +Nelson Ray\\ + \email{ncray86@gmail.com} +% 6th. author +\alignauthor +Gian Merlino\\ + \affaddr{Metamarkets Group, Inc.}\\ + \email{gian@metamarkets.com} +} +% There's nothing stopping you putting the seventh, eighth, etc. +% author on the opening page (as the 'third row') but we ask, +% for aesthetic reasons that you place these 'additional authors' +% in the \additional authors block, viz. +\additionalauthors{Additional authors: Deep Ganguli (Metamarkets Group, Inc., {\texttt{deep@metamarkets.com}}), Himadri Singh (Metamarkets Group, Inc., {\texttt{himadri@metamarkets.com}}), Igal Levy (Metamarkets Group, Inc., {\texttt{igal@metamarkets.com}})} +\date{14 March 2014} +% Just remember to make sure that the TOTAL number of authors +% is the number that will appear on the first page PLUS the +% number that will appear in the \additionalauthors section. + + +\maketitle + +\begin{abstract} +Druid is an open +source\footnote{\href{https://github.com/metamx/druid}{https://github.com/metamx/druid}} +data store built for exploratory analytics on large data sets. Druid supports +fast data aggregation, low latency data ingestion, and arbitrary data +exploration. The system combines a column-oriented storage layout, a +distributed, shared-nothing architecture, and an advanced indexing structure to +return queries on billions of rows in milliseconds. Druid is petabyte scale and +is deployed in production at several technology companies. +\end{abstract} + +\section{Introduction} +The recent proliferation of internet technology has created a surge +in machine-generated events. Individually, these events contain minimal useful +information and are of low value. Given the time and resources required to +extract meaning from large collections of events, many companies were willing +to discard this data instead. + +A few years ago, Google introduced MapReduce as their mechanism of leveraging +commodity hardware to index the internet and analyze logs. The Hadoop project +soon followed and was largely patterned after the insights that came out of the +original MapReduce paper. Hadoop has contributed much to helping companies +convert their low-value event streams into high-value aggregates for a variety +of applications such as business intelligence and A-B testing. + +As with a lot of great systems, Hadoop has opened our eyes to a new space of +problems. Specifically, Hadoop excels at storing and providing access to large +amounts of data, however, it does not make any performance guarantees around +how quickly that data can be accessed. Furthermore, although Hadoop is a +highly available system, performance degrades under heavy concurrent load. +Lastly, while Hadoop works well for storing data, it is not optimized for +ingesting data and making that data immediately readable. + +\subsection{The Need for Druid} +Druid was originally designed to solve problems around ingesting and exploring +large quantities of transactional events (log data). This form of timeseries +data (OLAP data) is commonly found in the business intelligence +space and the nature of the data tends to be very append heavy. Events typically +have three distinct components: a timestamp column indicating when the event +occurred, a set of dimension columns indicating various attributes about the +event, and a set of metric columns containing values (usually numeric) that can +be aggregated. Queries are typically issued for the sum of some set of metrics, +filtered by some set of dimensions, over some span of time. + +The Druid project first began out of necessity at Metamarkets to power a +business intelligence dashboard that allowed users to arbitrarily explore and +visualize event streams. Existing open source Relational Database Management +Systems, cluster computing frameworks, and NoSQL key/value stores were unable +to provide a low latency data ingestion and query platform for an interactive +dashboard. Queries needed to return fast enough to allow the data +visualizations in the dashboard to update interactively. + +In addition to the query latency needs, the system had to be multi-tenant and +highly available, as the dashboard is used in a highly concurrent environment. +Downtime is costly and many businesses cannot afford to wait if a system is +unavailable in the face of software upgrades or network failure. Finally, +Metamarkets also wanted to allow users and alerting systems to be able to make +business decisions in ``real-time". The time from when an event is created to +when that event is queryable determines how fast users and systems are able to +react to potentially catastrophic occurrences in their systems. + +The problems of data exploration, ingestion, and availability span multiple +industries. Since Druid was open sourced in October 2012, it has been deployed as a +video, network monitoring, operations monitoring, and online advertising +analytics platform at multiple companies\footnote{\href{http://druid.io/druid.html}{http://druid.io/druid.html}}. + +\begin{figure*} +\centering +\includegraphics[width = 4.5in]{cluster} +\caption{An overview of a Druid cluster and the flow of data through the cluster.} +\label{fig:cluster} +\end{figure*} + +\section{Architecture} +A Druid cluster consists of different types of nodes and each node type is +designed to perform a specific set of things. We believe this design separates +concerns and simplifies the complexity of the system. The different node types +operate fairly independently of each other and there is minimal interaction among +them. Hence, intra-cluster communication failures have minimal impact on data +availability. To solve complex data analysis problems, the different node +types come together to form a fully working system. The composition of and flow +of data in a Druid cluster are shown in Figure~\ref{fig:cluster}. All Druid +nodes announce their availability and the data they are serving over +Zookeeper\cite{hunt2010zookeeper}. + +\subsection{Real-time Nodes} +Real-time nodes encapsulate the functionality to ingest and query event +streams. Events indexed via these nodes are immediately available for querying. +These nodes are only concerned with events for some small time range. They +periodically hand off batches of immutable events to other nodes in the Druid +cluster that are specialized in dealing with batches of immutable events. + +Real-time nodes maintain an in-memory index buffer for all incoming events. +These indexes are incrementally populated as new events are ingested and the +indexes are also directly queryable. To avoid heap overflow problems, real-time +nodes persist their in-memory indexes to disk either periodically or after some +maximum row limit is reached. This persist process converts data stored in the +in-memory buffer to a column oriented storage format. Each persisted index is +immutable and real-time nodes load persisted indexes into off-heap memory such +that they can still be queried. On a periodic basis, each real-time node will +schedule a background task that searches for all locally persisted indexes. The +task merges these indexes together and builds an immutable block of data that +contains all the events that have ingested by a real-time node for some span of +time. We refer to this block of data as a ``segment". During the handoff stage, +a real-time node uploads this segment to permanent backup storage, typically +a distributed file system that Druid calls ``deep storage". + +\subsection{Historical Nodes} +Historical nodes encapsulate the functionality to load and serve the immutable +blocks of data (segments) created by real-time nodes. In many real-world +workflows, most of the data loaded in a Druid cluster is immutable and hence +historical nodes are typically the main workers of a Druid cluster. Historical +nodes follow a shared-nothing architecture and there is no single point of +contention among the nodes. The nodes have no knowledge of one another and are +operationally simple; they only know how to load, drop, and serve immutable +segments. + +\subsection{Broker Nodes} +Broker nodes act as query routers to historical and real-time nodes. Broker +nodes understand what segments are queryable and where those segments are +located. Broker nodes route incoming queries such that the queries hit the +right historical or real-time nodes. Broker nodes also merge partial results +from historical and real-time nodes before returning a final consolidated +result to the caller. + +\subsection{Coordinator Nodes} +Druid coordinator nodes are primarily in charge of data management and +distribution on historical nodes. The coordinator nodes tell historical nodes +to load new data, drop outdated data, replicate data, and move data to load +balance. Coordinator nodes undergo a +leader-election process that determines a single node that runs the coordinator +functionality. The remaining coordinator nodes act as redundant backups. + +A coordinator node runs periodically to determine the current state of the +cluster. It makes decisions by comparing the expected state of the cluster with +the actual state of the cluster at the time of the run. Coordinator nodes also +maintain a connection to a MySQL database that contains additional operational +parameters and configurations. One of the key pieces of information located in +the MySQL database is a table that contains a list of all segments that should +be served by historical nodes. This table can be updated by any service that +creates segments, such as real-time nodes. + +\subsection{Query Processing} +Data tables in Druid (called \emph{data sources}) are collections of +timestamped events partitioned into a set of segments, where each segment +is typically 5--10 million rows. Formally, we define a segment as a collection +of rows of data that span some period in time. Segments represent the +fundamental storage unit in Druid and replication and distribution are done at +a segment level. + +Druid segments are stored in a column orientation. Given that Druid is best +used for aggregating event streams (all data going into Druid must have a +timestamp), the advantages storing aggregate information as columns rather than +rows are well documented \cite{abadi2008column}. Column storage allows for more +efficient CPU usage as only what is needed is actually loaded and scanned. + +Druid has multiple column types to represent various data formats. Depending on +the column type, different compression methods are used to reduce the cost of +storing a column in memory and on disk. For example, if an entire column only +contains string values, storing the raw strings is unnecessarily costly. +String columns can be dictionary encoded instead. Dictionary encoding is a +common method to compress data in column stores. + +In many real world OLAP workflows, queries are issued for the aggregated +results of some set of metrics where some set of dimension specifications are +met. Consider Table~\ref{tab:sample_data}. An example query for this table may +ask: ``How much revenue was generated in the first hour of 2014-01-01 in the +city of San Francisco?". This query is filtering a sales data set based on a +Boolean expression of dimension values. In many real world data sets, dimension +columns contain strings and metric columns contain numbers. Druid creates +additional lookup indices for string columns such that only those rows that +pertain to a particular query filter are ever scanned. + +\begin{table} + \centering + \begin{tabular}{| l | l | l |} + \hline + \textbf{Timestamp} & \textbf{City} & \textbf{Revenue} \\ \hline + 2014-01-01T01:00:00Z & San Francisco & 25 \\ \hline + 2014-01-01T01:00:00Z & San Francisco & 42 \\ \hline + 2014-01-01T02:00:00Z & New York & 17 \\ \hline + 2014-01-01T02:00:00Z & New York & 170 \\ \hline + \end{tabular} + \caption{Sample sales data set.} + \label{tab:sample_data} +\end{table} + +For each unique city in +Table~\ref{tab:sample_data}, we can form some representation +indicating in which table rows a particular city is seen. We can +store this information in a binary array where the array indices +represent our rows. If a particular page is seen in a certain +row, that array index is marked as \texttt{1}. For example: +{\small\begin{verbatim} +San Francisco -> rows [0, 1] -> [1][1][0][0] +New York -> rows [2, 3] -> [0][0][1][1] +\end{verbatim}} + +\texttt{San Francisco} is seen in rows \texttt{0} and \texttt{1}. This mapping of column values +to row indices forms an inverted index \cite{tomasic1993performance}. To know which +rows contain {\ttfamily San Francisco} or {\ttfamily New York}, we can \texttt{OR} together +the two arrays. +{\small\begin{verbatim} +[0][1][0][1] OR [1][0][1][0] = [1][1][1][1] +\end{verbatim}} + +This approach of performing Boolean operations on large bitmap sets is commonly +used in search engines. Druid compresses each bitmap index using the Concise +algorithm \cite{colantonio2010concise}. All Boolean operations on top of these +Concise sets are done without decompressing the set. + +\subsection{Query Capabilities} +Druid supports many types of aggregations including double sums, long sums, +minimums, maximums, and complex aggregations such as cardinality estimation and +approximate quantile estimation. The results of aggregations can be combined +in mathematical expressions to form other aggregations. Druid supports +different query types ranging from simple aggregates for an interval time, +groupBys, and approximate top-K queries. + +\section{Performance} +Druid runs in production at several organizations, and to briefly demonstrate its +performance, we have chosen to share some real world numbers for the main production +cluster running at Metamarkets in early 2014. For comparison with other databases +we also include results from synthetic workloads on TPC-H data. + +\subsection{Query Performance} +Query latencies are shown in Figure~\ref{fig:query_latency} for a cluster +hosting approximately 10.5TB of data using 1302 processing threads and 672 +total cores (hyperthreaded). There are approximately 50 billion rows of data in +this cluster. + +\begin{figure} +\centering +\includegraphics[width = 2.3in]{avg_query_latency} +\caption{Query latencies of production data sources.} +\label{fig:query_latency} +\end{figure} + +\begin{figure} +\centering +\includegraphics[width = 2.3in]{tpch_100gb} +\caption{Druid \& MySQL benchmarks -- 100GB TPC-H data.} +\label{fig:tpch_100gb} +\end{figure} + +The average queries per minute during this time was approximately +1000. The number of dimensions the various data sources vary from 25 to 78 +dimensions, and 8 to 35 metrics. Across all the various data sources, average +query latency is approximately 550 milliseconds, with 90\% of queries returning +in less than 1 second, 95\% in under 2 seconds, and 99\% of queries returning +in less than 10 seconds. + +Approximately 30\% of the queries are standard +aggregates involving different types of metrics and filters, 60\% of queries +are ordered group bys over one or more dimensions with aggregates, and 10\% of +queries are search queries and metadata retrieval queries. The number of +columns scanned in aggregate queries roughly follows an exponential +distribution. Queries involving a single column are very frequent, and queries +involving all columns are very rare. + +We also present Druid benchmarks on TPC-H data in Figure~\ref{fig:tpch_100g}. +Most TPC-H queries do not directly apply to Druid, so we selected queries more +typical of Druid's workload to demonstrate query performance. As a comparison, +we also provide the results of the same queries using MySQL using the MyISAM +engine (InnoDB was slower in our experiments). + +We benchmarked Druid's scan rate at 53,539,211 rows/second/core for +\texttt{select count(*)} equivalent query over a given time interval and +36,246,530 rows/second/core for a \texttt{select sum(float)} type query. + +\subsection{Data Ingestion Performance} +To showcase Druid's data ingestion latency, we selected several production +datasources of varying dimensions, metrics, and event volumes. Druid's data +ingestion latency is heavily dependent on the complexity of the data set being +ingested. The data complexity is determined by the number of dimensions in each +event, the number of metrics in each event, and the types of aggregations we +want to perform on those metrics. + +\begin{figure} +\centering +\includegraphics[width = 2.3in]{ingestion_rate} +\caption{Combined cluster ingestion rates.} +\label{fig:ingestion_rate} +\end{figure} + +For the given datasources, the number of dimensions vary from 5 to 35, and the +number of metrics vary from 2 to 24. The peak ingestion latency we measured in +production was 22914.43 events/second/core on a datasource with 30 dimensions +and 19 metrics. + +The latency measurements we presented are sufficient to address the our stated +problems of interactivity. We would prefer the variability in the latencies to +be less, which can be achieved by adding additional +hardware, but we have not chosen to do so because of cost concerns. + +\section{Demonstration Details} + +We would like to do an end-to-end demonstratation of Druid, from setting up a +cluster, ingesting data, structuring a query, and obtaining results. We would +also like to showcase how to solve real-world data analysis problems with Druid +and demonstrate tools that can be built on top of it, including interactive +data visualizations, approximate algorithms, and machine-learning components. +We already use similar tools in production. + +\subsection{Setup} + +Users will be able to set up a local Druid cluster to better understand the +components and architecture of the system. Druid is designed to run on +commodity hardware and Druid nodes are simply java processes that need to be +started up. The local setup will allow users to ingest data from Twitter's +public API and query it. We will also provide users access to an AWS hosted +Druid cluster that contains several terabytes of Twitter data that we have been +collecting for over 2 years. There are over 3 billion tweets in this data set, +and new events are constantly being ingested. We will walk through a variety of +different queries to demonstrate Druid's arbitrary data-exploration +capabilities. + +Finally, we will teach users how to build a simple interactive dashboard on top +of Druid. The dashboard will use some of Druid's more powerful features such as +approximate algorithms for quickly determining the cardinality of sets, and +machine learning algorithms for scientific computing problems such as anomaly +detection. These use cases represent some of the more interesting problems we +use Druid for in production. + +\subsection{Goals} + +We will not only walk users through solving real-world problems with Druid and +different tools that have been built on top of Druid, but also answer +conference-specific questions such as what are the trending tweets and topics +at VLDB, what netizens are conversing about in the general area, and even +perform a sentiment analysis of VLDB. Our goal is to clearly explain why the +architecture of Druid makes it highly optimal for certain types of queries, and +the potential of the system as a real-time analytics platform. + +%\end{document} % This is where a 'short' article might terminate + +% ensure same length columns on last page (might need two sub-sequent latex runs) +\balance + +%ACKNOWLEDGMENTS are optional +\section{Acknowledgments} +Druid could not have been built without the help of many great people in the +community. We want to thank everyone that has contributed to the Druid +codebase for their invaluable support. + +% The following two commands are all you need in the +% initial runs of your .tex file to +% produce the bibliography for the citations in your paper. +\bibliographystyle{abbrv} +\bibliography{druid_demo} % vldb_sample.bib is the name of the Bibliography in this case +% You must have a proper ".bib" file +% and remember to run: +% latex bibtex latex latex +% to resolve all references + +\end{document} diff --git a/publications/demo/figures/90th_percentile.pdf b/publications/demo/figures/90th_percentile.pdf new file mode 100644 index 00000000000..78d53d63571 Binary files /dev/null and b/publications/demo/figures/90th_percentile.pdf differ diff --git a/publications/demo/figures/95th_percentile.pdf b/publications/demo/figures/95th_percentile.pdf new file mode 100644 index 00000000000..0ce91b4aced Binary files /dev/null and b/publications/demo/figures/95th_percentile.pdf differ diff --git a/publications/demo/figures/99th_percentile.pdf b/publications/demo/figures/99th_percentile.pdf new file mode 100644 index 00000000000..8cddbd61377 Binary files /dev/null and b/publications/demo/figures/99th_percentile.pdf differ diff --git a/publications/demo/figures/avg_query_latency.pdf b/publications/demo/figures/avg_query_latency.pdf new file mode 100644 index 00000000000..5ae784e97c5 Binary files /dev/null and b/publications/demo/figures/avg_query_latency.pdf differ diff --git a/publications/demo/figures/caching.png b/publications/demo/figures/caching.png new file mode 100644 index 00000000000..e3ee4dd94df Binary files /dev/null and b/publications/demo/figures/caching.png differ diff --git a/publications/demo/figures/cluster.png b/publications/demo/figures/cluster.png new file mode 100644 index 00000000000..1a07213e2cd Binary files /dev/null and b/publications/demo/figures/cluster.png differ diff --git a/publications/demo/figures/cluster_scan_rate.pdf b/publications/demo/figures/cluster_scan_rate.pdf new file mode 100644 index 00000000000..df837caa0c8 Binary files /dev/null and b/publications/demo/figures/cluster_scan_rate.pdf differ diff --git a/publications/demo/figures/concise_plot.pdf b/publications/demo/figures/concise_plot.pdf new file mode 100644 index 00000000000..c5e153b8e8c Binary files /dev/null and b/publications/demo/figures/concise_plot.pdf differ diff --git a/publications/demo/figures/core_scan_rate.pdf b/publications/demo/figures/core_scan_rate.pdf new file mode 100644 index 00000000000..94198fc06c1 Binary files /dev/null and b/publications/demo/figures/core_scan_rate.pdf differ diff --git a/publications/demo/figures/historical_download.png b/publications/demo/figures/historical_download.png new file mode 100644 index 00000000000..a9db3fd3609 Binary files /dev/null and b/publications/demo/figures/historical_download.png differ diff --git a/publications/demo/figures/ingestion_rate.pdf b/publications/demo/figures/ingestion_rate.pdf new file mode 100644 index 00000000000..fe14933c7c1 Binary files /dev/null and b/publications/demo/figures/ingestion_rate.pdf differ diff --git a/publications/demo/figures/queries_per_min.pdf b/publications/demo/figures/queries_per_min.pdf new file mode 100644 index 00000000000..b1782ca1db9 Binary files /dev/null and b/publications/demo/figures/queries_per_min.pdf differ diff --git a/publications/demo/figures/query_percentiles.pdf b/publications/demo/figures/query_percentiles.pdf new file mode 100644 index 00000000000..35c2e560afe Binary files /dev/null and b/publications/demo/figures/query_percentiles.pdf differ diff --git a/publications/demo/figures/realtime_flow.png b/publications/demo/figures/realtime_flow.png new file mode 100644 index 00000000000..4f50a5c54b5 Binary files /dev/null and b/publications/demo/figures/realtime_flow.png differ diff --git a/publications/demo/figures/realtime_pipeline.png b/publications/demo/figures/realtime_pipeline.png new file mode 100644 index 00000000000..f338d239117 Binary files /dev/null and b/publications/demo/figures/realtime_pipeline.png differ diff --git a/publications/demo/figures/realtime_timeline.png b/publications/demo/figures/realtime_timeline.png new file mode 100644 index 00000000000..76806bc9aa2 Binary files /dev/null and b/publications/demo/figures/realtime_timeline.png differ diff --git a/publications/demo/figures/throughput_vs_cardinality.png b/publications/demo/figures/throughput_vs_cardinality.png new file mode 100644 index 00000000000..86890a594bb Binary files /dev/null and b/publications/demo/figures/throughput_vs_cardinality.png differ diff --git a/publications/demo/figures/throughput_vs_num_dims.png b/publications/demo/figures/throughput_vs_num_dims.png new file mode 100644 index 00000000000..60f4842a3cc Binary files /dev/null and b/publications/demo/figures/throughput_vs_num_dims.png differ diff --git a/publications/demo/figures/throughput_vs_num_metrics.png b/publications/demo/figures/throughput_vs_num_metrics.png new file mode 100644 index 00000000000..b4f8ae9b079 Binary files /dev/null and b/publications/demo/figures/throughput_vs_num_metrics.png differ diff --git a/publications/demo/figures/tpch_100gb.pdf b/publications/demo/figures/tpch_100gb.pdf new file mode 100644 index 00000000000..ea73efc056d Binary files /dev/null and b/publications/demo/figures/tpch_100gb.pdf differ diff --git a/publications/demo/figures/tpch_1gb.pdf b/publications/demo/figures/tpch_1gb.pdf new file mode 100644 index 00000000000..df1c74bc369 Binary files /dev/null and b/publications/demo/figures/tpch_1gb.pdf differ diff --git a/publications/demo/figures/tpch_scaling.png b/publications/demo/figures/tpch_scaling.png new file mode 100644 index 00000000000..e929da0c5dd Binary files /dev/null and b/publications/demo/figures/tpch_scaling.png differ diff --git a/publications/demo/vldb.cls b/publications/demo/vldb.cls new file mode 100644 index 00000000000..7ff7547658b --- /dev/null +++ b/publications/demo/vldb.cls @@ -0,0 +1,1400 @@ +% VLDB.CLS - Version 1.8c +% +% based on: +% SIG-ALTERNATE.CLS - VERSION 1.8 +% "COMPATIBLE" WITH THE "ACM_PROC_ARTICLE-SP.CLS" V2.7SP +% Gerald Murray July 26th. 2005 +% +% ---- Start of 'updates' ---- +% +% Allowance made to switch default fonts between those systems using +% METAFONT and those using 'Type 1' or 'Truetype' fonts. +% See LINE NUMBER 252 for details. +% Also provided for enumerated/annotated Corollaries 'surrounded' by +% enumerated Theorems (line 841). +% Gerry November 11th. 1999 +% +% Made the Permission Statement / Conference Info / Copyright Info +% 'user definable' in the source .tex file OR automatic if +% not specified. +% +% Georgia fixed bug in sub-sub-section numbering in paragraphs (July 29th. 2002) +% JS/GM fix to vertical spacing before Proofs (July 30th. 2002) +% +% Footnotes inside table cells using \minipage (Oct. 2002) +% +% Enforced 'US letter' page size and updated PVLDB copyright (UR, Oct 2010) +% +% Made the file template-able, so vol/no information can be dynmacally generated. (AhmetSacan, Sep 2012) +% +% Added widow line penalties. (AhmetSacan, Sep 2012) +% ---- End of 'updates' ---- +% +\def\fileversion{v1.8c} % for VLDB's and ACM's tracking purposes +\def\filedate{July 26, 2005} % Gerry Murray's tracking data +\def\docdate {Tuesday 26th. July 2005} % Gerry Murray (with deltas to doc} +\usepackage[pdftex,letterpaper]{geometry} % fixed to US letter size for output (since version 1.8c - UR 2010) +\usepackage{epsfig} +\usepackage{amssymb} +\usepackage{amsmath} +\usepackage{amsfonts} +% +% VLDB DOCUMENT STYLE +% based on ACM's sig-alternate.cls, modified 31 Oct 2010 for PVLDB, +% with VLDB-specific copyright notice and fixed US letter paper size. +% +% SIG-ALTERNATE DOCUMENT STYLE +% G.K.M. Tobin August-October 1999 +% adapted from ARTICLE document style by Ken Traub, Olin Shivers +% also using elements of esub2acm.cls +% HEAVILY MODIFIED, SUBSEQUENTLY, BY GERRY MURRAY 2000 +% ARTICLE DOCUMENT STYLE -- Released 16 March 1988 +% for LaTeX version 2.09 +% Copyright (C) 1988 by Leslie Lamport +% +% +%%% sig-alternate.cls is an 'ALTERNATE' document style for producing +%%% two-column camera-ready pages for ACM conferences. +%%% THIS FILE DOES NOT STRICTLY ADHERE TO THE SIGS (BOARD-ENDORSED) +%%% PROCEEDINGS STYLE. It has been designed to produce a 'tighter' +%%% paper in response to concerns over page budgets. +%%% The main features of this style are: +%%% +%%% 1) Two columns. +%%% 2) Side and top margins of 4.5pc, bottom margin of 6pc, column gutter of +%%% 2pc, hence columns are 20pc wide and 55.5pc tall. (6pc =3D 1in, approx) +%%% 3) First page has title information, and an extra 6pc of space at the +%%% bottom of the first column for the ACM copyright notice. +%%% 4) Text is 9pt on 10pt baselines; titles (except main) are 9pt bold. +%%% 5) US letter paper size (since v1.8c) +%%% +%%% +%%% There are a few restrictions you must observe: +%%% +%%% 1) You cannot change the font size; ACM wants you to use 9pt. +%%% 3) You must start your paper with the \maketitle command. Prior to the +%%% \maketitle you must have \title and \author commands. If you have a +%%% \date command it will be ignored; no date appears on the paper, since +%%% the proceedings will have a date on the front cover. +%%% 4) Marginal paragraphs, tables of contents, lists of figures and tables, +%%% and page headings are all forbidden. +%%% 5) The `figure' environment will produce a figure one column wide; if you +%%% want one that is two columns wide, use `figure*'. +%%% +% +%%% Copyright Space: +%%% This style automatically reserves 1" blank space at the bottom of page 1/ +%%% column 1. This space can optionally be filled with some text using the +%%% \toappear{...} command. If used, this command must be BEFORE the \maketitle +%%% command. If this command is defined AND [preprint] is on, then the +%%% space is filled with the {...} text (at the bottom); otherwise, it is +%%% blank. If you use \toappearbox{...} instead of \toappear{...} then a +%%% box will be drawn around the text (if [preprint] is on). +%%% +%%% A typical usage looks like this: +%%% \toappear{To appear in the Ninth AES Conference on Medievil Lithuanian +%%% Embalming Technique, June 1991, Alfaretta, Georgia.} +%%% This will be included in the preprint, and left out of the conference +%%% version. +%%% +%%% WARNING: +%%% Some dvi-ps converters heuristically allow chars to drift from their +%%% true positions a few pixels. This may be noticeable with the 9pt sans-serif +%%% bold font used for section headers. +%%% You may turn this hackery off via the -e option: +%%% dvips -e 0 foo.dvi >foo.ps +%%% +\typeout{Document Class 'vldb' - based on 'sig-alternate' <26th. July '05>. Modified by G.K.M. Tobin/Gerry Murray} +\typeout{Based in part upon document Style `acmconf' <22 May 89>. Hacked 4/91 by} +\typeout{shivers@cs.cmu.edu, 4/93 by theobald@cs.mcgill.ca} +\typeout{Excerpts were taken from (Journal Style) 'esub2acm.cls'.} +\typeout{****** Bugs/comments/suggestions/technicalities to Gerry Murray -- murray@hq.acm.org ******} +\typeout{Questions on the style, SIGS policies, etc. to Adrienne Griscti griscti@acm.org} +\oddsidemargin 4.5pc +\evensidemargin 4.5pc +\advance\oddsidemargin by -1in % Correct for LaTeX gratuitousness +\advance\evensidemargin by -1in % Correct for LaTeX gratuitousness +\marginparwidth 0pt % Margin pars are not allowed. +\marginparsep 11pt % Horizontal space between outer margin and + % marginal note + + % Top of page: +\topmargin 4.5pc % Nominal distance from top of page to top of + % box containing running head. +\advance\topmargin by -1in % Correct for LaTeX gratuitousness +\headheight 0pt % Height of box containing running head. +\headsep 0pt % Space between running head and text. + % Bottom of page: +\footskip 30pt % Distance from baseline of box containing foot + % to baseline of last line of text. +\@ifundefined{footheight}{\newdimen\footheight}{}% this is for LaTeX2e +\footheight 12pt % Height of box containing running foot. + +%% Must redefine the top margin so there's room for headers and +%% page numbers if you are using the preprint option. Footers +%% are OK as is. Olin. +\advance\topmargin by -37pt % Leave 37pt above text for headers +\headheight 12pt % Height of box containing running head. +\headsep 25pt % Space between running head and text. + +\textheight 666pt % 9 1/4 column height +\textwidth 42pc % Width of text line. + % For two-column mode: +\columnsep 2pc % Space between columns +\columnseprule 0pt % Width of rule between columns. +\hfuzz 1pt % Allow some variation in column width, otherwise it's + % too hard to typeset in narrow columns. + +\footnotesep 5.6pt % Height of strut placed at the beginning of every + % footnote =3D height of normal \footnotesize strut, + % so no extra space between footnotes. + +\skip\footins 8.1pt plus 4pt minus 2pt % Space between last line of text and + % top of first footnote. +\floatsep 11pt plus 2pt minus 2pt % Space between adjacent floats moved + % to top or bottom of text page. +\textfloatsep 18pt plus 2pt minus 4pt % Space between main text and floats + % at top or bottom of page. +\intextsep 11pt plus 2pt minus 2pt % Space between in-text figures and + % text. +\@ifundefined{@maxsep}{\newdimen\@maxsep}{}% this is for LaTeX2e +\@maxsep 18pt % The maximum of \floatsep, + % \textfloatsep and \intextsep (minus + % the stretch and shrink). +\dblfloatsep 11pt plus 2pt minus 2pt % Same as \floatsep for double-column + % figures in two-column mode. +\dbltextfloatsep 18pt plus 2pt minus 4pt% \textfloatsep for double-column + % floats. +\@ifundefined{@dblmaxsep}{\newdimen\@dblmaxsep}{}% this is for LaTeX2e +\@dblmaxsep 18pt % The maximum of \dblfloatsep and + % \dbltexfloatsep. +\@fptop 0pt plus 1fil % Stretch at top of float page/column. (Must be + % 0pt plus ...) +\@fpsep 8pt plus 2fil % Space between floats on float page/column. +\@fpbot 0pt plus 1fil % Stretch at bottom of float page/column. (Must be + % 0pt plus ... ) +\@dblfptop 0pt plus 1fil % Stretch at top of float page. (Must be 0pt plus ...) +\@dblfpsep 8pt plus 2fil % Space between floats on float page. +\@dblfpbot 0pt plus 1fil % Stretch at bottom of float page. (Must be + % 0pt plus ... ) +\marginparpush 5pt % Minimum vertical separation between two marginal + % notes. + +\parskip 0pt plus 1pt % Extra vertical space between paragraphs. +\parindent 9pt % GM July 2000 / was 0pt - width of paragraph indentation. +\partopsep 2pt plus 1pt minus 1pt% Extra vertical space, in addition to + % \parskip and \topsep, added when user + % leaves blank line before environment. + +\@lowpenalty 51 % Produced by \nopagebreak[1] or \nolinebreak[1] +\@medpenalty 151 % Produced by \nopagebreak[2] or \nolinebreak[2] +\@highpenalty 301 % Produced by \nopagebreak[3] or \nolinebreak[3] + +\@beginparpenalty -\@lowpenalty % Before a list or paragraph environment. +\@endparpenalty -\@lowpenalty % After a list or paragraph environment. +\@itempenalty -\@lowpenalty % Between list items. + +% Try to prevent widow lines. +\clubpenalty=9996 +\widowpenalty=9999 +\brokenpenalty=4991 +\predisplaypenalty=10000 +\postdisplaypenalty=1549 +\displaywidowpenalty=1602 + +\@namedef{ds@10pt}{\@latexerr{The `10pt' option is not allowed in the `acmconf' + document style.}\@eha} +\@namedef{ds@11pt}{\@latexerr{The `11pt' option is not allowed in the `acmconf' + document style.}\@eha} +\@namedef{ds@12pt}{\@latexerr{The `12pt' option is not allowed in the `acmconf' + document style.}\@eha} + +\@options + +\lineskip 2pt % \lineskip is 1pt for all font sizes. +\normallineskip 2pt +\def\baselinestretch{1} + +\abovedisplayskip 9pt plus2pt minus4.5pt% +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip \z@ plus3pt% +\belowdisplayshortskip 5.4pt plus3pt minus3pt% +\let\@listi\@listI % Setting of \@listi added 9 Jun 87 + +\def\small{\@setsize\small{9pt}\viiipt\@viiipt +\abovedisplayskip 7.6pt plus 3pt minus 4pt% +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip \z@ plus2pt% +\belowdisplayshortskip 3.6pt plus2pt minus 2pt +\def\@listi{\leftmargin\leftmargini %% Added 22 Dec 87 +\topsep 4pt plus 2pt minus 2pt\parsep 2pt plus 1pt minus 1pt +\itemsep \parsep}} + +\def\footnotesize{\@setsize\footnotesize{9pt}\ixpt\@ixpt +\abovedisplayskip 6.4pt plus 2pt minus 4pt% +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip \z@ plus 1pt% +\belowdisplayshortskip 2.7pt plus 1pt minus 2pt +\def\@listi{\leftmargin\leftmargini %% Added 22 Dec 87 +\topsep 3pt plus 1pt minus 1pt\parsep 2pt plus 1pt minus 1pt +\itemsep \parsep}} + +\newcount\aucount +\newcount\originalaucount +\newdimen\auwidth +\auwidth=\textwidth +\newdimen\auskip +\newcount\auskipcount +\newdimen\auskip +\global\auskip=1pc +\newdimen\allauboxes +\allauboxes=\auwidth +\newtoks\addauthors +\newcount\addauflag +\global\addauflag=0 %Haven't shown additional authors yet + +\newtoks\subtitletext +\gdef\subtitle#1{\subtitletext={#1}} + +\gdef\additionalauthors#1{\addauthors={#1}} + +\gdef\numberofauthors#1{\global\aucount=#1 +\ifnum\aucount>3\global\originalaucount=\aucount \global\aucount=3\fi %g} +\global\auskipcount=\aucount\global\advance\auskipcount by 1 +\global\multiply\auskipcount by 2 +\global\multiply\auskip by \auskipcount +\global\advance\auwidth by -\auskip +\global\divide\auwidth by \aucount} + +% \and was modified to count the number of authors. GKMT 12 Aug 1999 +\def\alignauthor{% % \begin{tabular} +\end{tabular}% + \begin{tabular}[t]{p{\auwidth}}\centering}% + +% *** NOTE *** NOTE *** NOTE *** NOTE *** +% If you have 'font problems' then you may need +% to change these, e.g. 'arialb' instead of "arialbd". +% Gerry Murray 11/11/1999 +% *** OR ** comment out block A and activate block B or vice versa. +% ********************************************** +% +% -- Start of block A -- (Type 1 or Truetype fonts) +%\newfont{\secfnt}{timesbd at 12pt} % was timenrb originally - now is timesbd +%\newfont{\secit}{timesbi at 12pt} %13 Jan 00 gkmt +%\newfont{\subsecfnt}{timesi at 11pt} % was timenrri originally - now is timesi +%\newfont{\subsecit}{timesbi at 11pt} % 13 Jan 00 gkmt -- was times changed to timesbi gm 2/4/2000 +% % because "normal" is italic, "italic" is Roman +%\newfont{\ttlfnt}{arialbd at 18pt} % was arialb originally - now is arialbd +%\newfont{\ttlit}{arialbi at 18pt} % 13 Jan 00 gkmt +%\newfont{\subttlfnt}{arial at 14pt} % was arialr originally - now is arial +%\newfont{\subttlit}{ariali at 14pt} % 13 Jan 00 gkmt +%\newfont{\subttlbf}{arialbd at 14pt} % 13 Jan 00 gkmt +%\newfont{\aufnt}{arial at 12pt} % was arialr originally - now is arial +%\newfont{\auit}{ariali at 12pt} % 13 Jan 00 gkmt +%\newfont{\affaddr}{arial at 10pt} % was arialr originally - now is arial +%\newfont{\affaddrit}{ariali at 10pt} %13 Jan 00 gkmt +%\newfont{\eaddfnt}{arial at 12pt} % was arialr originally - now is arial +%\newfont{\ixpt}{times at 9pt} % was timenrr originally - now is times +%\newfont{\confname}{timesi at 8pt} % was timenrri - now is timesi +%\newfont{\crnotice}{times at 8pt} % was timenrr originally - now is times +%\newfont{\ninept}{times at 9pt} % was timenrr originally - now is times + +% ********************************************* +% -- End of block A -- +% +% +% -- Start of block B -- METAFONT +% +++++++++++++++++++++++++++++++++++++++++++++ +% Next (default) block for those using Metafont +% Gerry Murray 11/11/1999 +% *** THIS BLOCK FOR THOSE USING METAFONT ***** +% ********************************************* +\newfont{\secfnt}{ptmb at 12pt} +\newfont{\secit}{ptmbi at 12pt} %13 Jan 00 gkmt +\newfont{\subsecfnt}{ptmri at 11pt} +\newfont{\subsecit}{ptmbi at 11pt} % 13 Jan 00 gkmt -- was ptmr changed to ptmbi gm 2/4/2000 + % because "normal" is italic, "italic" is Roman +\newfont{\ttlfnt}{phvb at 18pt} +\newfont{\ttlit}{phvbo at 18pt} % GM 2/4/2000 +\newfont{\subttlfnt}{phvr at 14pt} +\newfont{\subttlit}{phvro at 14pt} % GM 2/4/2000 +\newfont{\subttlbf}{phvb at 14pt} % 13 Jan 00 gkmt +\newfont{\aufnt}{phvr at 12pt} +\newfont{\auit}{phvro at 12pt} % GM 2/4/2000 +\newfont{\affaddr}{phvr at 10pt} +\newfont{\affaddrit}{phvro at 10pt} % GM 2/4/2000 +\newfont{\eaddfnt}{phvr at 12pt} +\newfont{\ixpt}{ptmr at 9pt} +\newfont{\confname}{ptmri at 8pt} +\newfont{\crnotice}{ptmr at 8pt} +\newfont{\ninept}{ptmr at 9pt} +% +++++++++++++++++++++++++++++++++++++++++++++ +% -- End of block B -- + + +\def\email#1{{{\eaddfnt{\vskip 4pt#1}}}} + +\def\addauthorsection{\ifnum\originalaucount>3 + \section{Additional Authors}\the\addauthors + \fi} + +\newcount\savesection +\newcount\sectioncntr +\global\sectioncntr=1 + +\setcounter{secnumdepth}{3} + +\def\appendix{\par +\section*{APPENDIX} +\setcounter{section}{0} + \setcounter{subsection}{0} + \def\thesection{\Alph{section}} } + +\leftmargini 22.5pt +\leftmarginii 19.8pt % > \labelsep + width of '(m)' +\leftmarginiii 16.8pt % > \labelsep + width of 'vii.' +\leftmarginiv 15.3pt % > \labelsep + width of 'M.' +\leftmarginv 9pt +\leftmarginvi 9pt + +\leftmargin\leftmargini +\labelsep 4.5pt +\labelwidth\leftmargini\advance\labelwidth-\labelsep + +\def\@listI{\leftmargin\leftmargini \parsep 3.6pt plus 2pt minus 1pt% +\topsep 7.2pt plus 2pt minus 4pt% +\itemsep 3.6pt plus 2pt minus 1pt} + +\let\@listi\@listI +\@listi + +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth-\labelsep + \topsep 3.6pt plus 2pt minus 1pt + \parsep 1.8pt plus 0.9pt minus 0.9pt + \itemsep \parsep} + +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii\advance\labelwidth-\labelsep + \topsep 1.8pt plus 0.9pt minus 0.9pt + \parsep \z@ \partopsep 1pt plus 0pt minus 1pt + \itemsep \topsep} + +\def\@listiv{\leftmargin\leftmarginiv + \labelwidth\leftmarginiv\advance\labelwidth-\labelsep} + +\def\@listv{\leftmargin\leftmarginv + \labelwidth\leftmarginv\advance\labelwidth-\labelsep} + +\def\@listvi{\leftmargin\leftmarginvi + \labelwidth\leftmarginvi\advance\labelwidth-\labelsep} + +\def\labelenumi{\theenumi.} +\def\theenumi{\arabic{enumi}} + +\def\labelenumii{(\theenumii)} +\def\theenumii{\alph{enumii}} +\def\p@enumii{\theenumi} + +\def\labelenumiii{\theenumiii.} +\def\theenumiii{\roman{enumiii}} +\def\p@enumiii{\theenumi(\theenumii)} + +\def\labelenumiv{\theenumiv.} +\def\theenumiv{\Alph{enumiv}} +\def\p@enumiv{\p@enumiii\theenumiii} + +\def\labelitemi{$\bullet$} +\def\labelitemii{\bf --} +\def\labelitemiii{$\ast$} +\def\labelitemiv{$\cdot$} + +\def\verse{\let\\=\@centercr + \list{}{\itemsep\z@ \itemindent -1.5em\listparindent \itemindent + \rightmargin\leftmargin\advance\leftmargin 1.5em}\item[]} +\let\endverse\endlist + +\def\quotation{\list{}{\listparindent 1.5em + \itemindent\listparindent + \rightmargin\leftmargin \parsep 0pt plus 1pt}\item[]} +\let\endquotation=\endlist + +\def\quote{\list{}{\rightmargin\leftmargin}\item[]} +\let\endquote=\endlist + +\def\descriptionlabel#1{\hspace\labelsep \bf #1} +\def\description{\list{}{\labelwidth\z@ \itemindent-\leftmargin + \let\makelabel\descriptionlabel}} + +\let\enddescription\endlist + +\def\theequation{\arabic{equation}} + +\arraycolsep 4.5pt % Half the space between columns in an array environment. +\tabcolsep 5.4pt % Half the space between columns in a tabular environment. +\arrayrulewidth .4pt % Width of rules in array and tabular environment. +\doublerulesep 1.8pt % Space between adjacent rules in array or tabular env. + +\tabbingsep \labelsep % Space used by the \' command. (See LaTeX manual.) + +\skip\@mpfootins =\skip\footins + +\fboxsep =2.7pt % Space left between box and text by \fbox and \framebox. +\fboxrule =.4pt % Width of rules in box made by \fbox and \framebox. + +\def\thepart{\Roman{part}} % Roman numeral part numbers. +\def\thesection {\arabic{section}} +\def\thesubsection {\thesection.\arabic{subsection}} +%\def\thesubsubsection {\thesubsection.\arabic{subsubsection}} % GM 7/30/2002 +%\def\theparagraph {\thesubsubsection.\arabic{paragraph}} % GM 7/30/2002 +\def\thesubparagraph {\theparagraph.\arabic{subparagraph}} + +\def\@pnumwidth{1.55em} +\def\@tocrmarg {2.55em} +\def\@dotsep{4.5} +\setcounter{tocdepth}{3} + +\def\tableofcontents{\@latexerr{\tableofcontents: Tables of contents are not + allowed in the `acmconf' document style.}\@eha} + +\def\l@part#1#2{\addpenalty{\@secpenalty} + \addvspace{2.25em plus 1pt} % space above part line + \begingroup + \@tempdima 3em % width of box holding part number, used by + \parindent \z@ \rightskip \@pnumwidth %% \numberline + \parfillskip -\@pnumwidth + {\large \bf % set line in \large boldface + \leavevmode % TeX command to enter horizontal mode. + #1\hfil \hbox to\@pnumwidth{\hss #2}}\par + \nobreak % Never break after part entry + \endgroup} + +\def\l@section#1#2{\addpenalty{\@secpenalty} % good place for page break + \addvspace{1.0em plus 1pt} % space above toc entry + \@tempdima 1.5em % width of box holding section number + \begingroup + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + \bf % Boldface. + \leavevmode % TeX command to enter horizontal mode. + \advance\leftskip\@tempdima %% added 5 Feb 88 to conform to + \hskip -\leftskip %% 25 Jan 88 change to \numberline + #1\nobreak\hfil \nobreak\hbox to\@pnumwidth{\hss #2}\par + \endgroup} + + +\def\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} +\def\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\def\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} +\def\l@subparagraph{\@dottedtocline{5}{10em}{5em}} + +\def\listoffigures{\@latexerr{\listoffigures: Lists of figures are not + allowed in the `acmconf' document style.}\@eha} + +\def\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} + +\def\listoftables{\@latexerr{\listoftables: Lists of tables are not + allowed in the `acmconf' document style.}\@eha} +\let\l@table\l@figure + +\def\footnoterule{\kern-3\p@ + \hrule width .4\columnwidth + \kern 2.6\p@} % The \hrule has default height of .4pt . +% ------ +\long\def\@makefntext#1{\noindent +%\hbox to .5em{\hss$^{\@thefnmark}$}#1} % original +\hbox to .5em{\hss\textsuperscript{\@thefnmark}}#1} % C. Clifton / GM Oct. 2nd. 2002 +% ------- + +\long\def\@maketntext#1{\noindent +#1} + +\long\def\@maketitlenotetext#1#2{\noindent + \hbox to 1.8em{\hss$^{#1}$}#2} + +\setcounter{topnumber}{2} +\def\topfraction{.7} +\setcounter{bottomnumber}{1} +\def\bottomfraction{.3} +\setcounter{totalnumber}{3} +\def\textfraction{.2} +\def\floatpagefraction{.5} +\setcounter{dbltopnumber}{2} +\def\dbltopfraction{.7} +\def\dblfloatpagefraction{.5} + +% +\long\def\@makecaption#1#2{ + \vskip \baselineskip + \setbox\@tempboxa\hbox{\textbf{#1: #2}} + \ifdim \wd\@tempboxa >\hsize % IF longer than one line: + \textbf{#1: #2}\par % THEN set as ordinary paragraph. + \else % ELSE center. + \hbox to\hsize{\hfil\box\@tempboxa\hfil}\par + \fi} + +% + +\long\def\@makecaption#1#2{ + \vskip 10pt + \setbox\@tempboxa\hbox{\textbf{#1: #2}} + \ifdim \wd\@tempboxa >\hsize % IF longer than one line: + \textbf{#1: #2}\par % THEN set as ordinary paragraph. + \else % ELSE center. + \hbox to\hsize{\hfil\box\@tempboxa\hfil} + \fi} + +\@ifundefined{figure}{\newcounter {figure}} % this is for LaTeX2e + +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{Figure \thefigure} +\def\figure{\@float{figure}} +\let\endfigure\end@float +\@namedef{figure*}{\@dblfloat{figure}} +\@namedef{endfigure*}{\end@dblfloat} + +\@ifundefined{table}{\newcounter {table}} % this is for LaTeX2e + +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{Table \thetable} +\def\table{\@float{table}} +\let\endtable\end@float +\@namedef{table*}{\@dblfloat{table}} +\@namedef{endtable*}{\end@dblfloat} + +\newtoks\titleboxnotes +\newcount\titleboxnoteflag + +\def\maketitle{\par + \begingroup + \def\thefootnote{\fnsymbol{footnote}} + \def\@makefnmark{\hbox + to 0pt{$^{\@thefnmark}$\hss}} + \twocolumn[\@maketitle] +\@thanks + \endgroup + \setcounter{footnote}{0} + \let\maketitle\relax + \let\@maketitle\relax + \gdef\@thanks{}\gdef\@author{}\gdef\@title{}\gdef\@subtitle{}\let\thanks\relax + \@copyrightspace} + +%% CHANGES ON NEXT LINES +\newif\if@ll % to record which version of LaTeX is in use + +\expandafter\ifx\csname LaTeXe\endcsname\relax % LaTeX2.09 is used +\else% LaTeX2e is used, so set ll to true +\global\@lltrue +\fi + +\if@ll + \NeedsTeXFormat{LaTeX2e} + \ProvidesClass{vldb} [2010/10/19 - V1.8b - based on sig-alternate V1.8 - based on acmproc.cls V1.3 ] + \RequirePackage{latexsym}% QUERY: are these two really needed? + \let\dooptions\ProcessOptions +\else + \let\dooptions\@options +\fi +%% END CHANGES + +\def\@height{height} +\def\@width{width} +\def\@minus{minus} +\def\@plus{plus} +\def\hb@xt@{\hbox to} +\newif\if@faircopy +\@faircopyfalse +\def\ds@faircopy{\@faircopytrue} + +\def\ds@preprint{\@faircopyfalse} + +\@twosidetrue +\@mparswitchtrue +\def\ds@draft{\overfullrule 5\p@} +%% CHANGE ON NEXT LINE +\dooptions + +\lineskip \p@ +\normallineskip \p@ +\def\baselinestretch{1} +\def\@ptsize{0} %needed for amssymbols.sty + +%% CHANGES ON NEXT LINES +\if@ll% allow use of old-style font change commands in LaTeX2e +\@maxdepth\maxdepth +% +\DeclareOldFontCommand{\rm}{\ninept\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*{\cal}{\@fontswitch{\relax}{\mathcal}} +\DeclareRobustCommand*{\mit}{\@fontswitch{\relax}{\mathnormal}} +\fi +% +\if@ll + \renewcommand{\rmdefault}{cmr} % was 'ttm' +% Note! I have also found 'mvr' to work ESPECIALLY well. +% Gerry - October 1999 +% You may need to change your LV1times.fd file so that sc is +% mapped to cmcsc - -for smallcaps -- that is if you decide +% to change {cmr} to {times} above. (Not recommended) + \renewcommand{\@ptsize}{} + \renewcommand{\normalsize}{% + \@setfontsize\normalsize\@ixpt{10.5\p@}%\ninept% + \abovedisplayskip 6\p@ \@plus2\p@ \@minus\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip 6\p@ \@minus 3\p@ + \belowdisplayshortskip 6\p@ \@minus 3\p@ + \let\@listi\@listI + } +\else + \def\@normalsize{%changed next to 9 from 10 + \@setsize\normalsize{9\p@}\ixpt\@ixpt + \abovedisplayskip 6\p@ \@plus2\p@ \@minus\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip 6\p@ \@minus 3\p@ + \belowdisplayshortskip 6\p@ \@minus 3\p@ + \let\@listi\@listI + }% +\fi +\if@ll + \newcommand\scriptsize{\@setfontsize\scriptsize\@viipt{8\p@}} + \newcommand\tiny{\@setfontsize\tiny\@vpt{6\p@}} + \newcommand\large{\@setfontsize\large\@xiipt{14\p@}} + \newcommand\Large{\@setfontsize\Large\@xivpt{18\p@}} + \newcommand\LARGE{\@setfontsize\LARGE\@xviipt{20\p@}} + \newcommand\huge{\@setfontsize\huge\@xxpt{25\p@}} + \newcommand\Huge{\@setfontsize\Huge\@xxvpt{30\p@}} +\else + \def\scriptsize{\@setsize\scriptsize{8\p@}\viipt\@viipt} + \def\tiny{\@setsize\tiny{6\p@}\vpt\@vpt} + \def\large{\@setsize\large{14\p@}\xiipt\@xiipt} + \def\Large{\@setsize\Large{18\p@}\xivpt\@xivpt} + \def\LARGE{\@setsize\LARGE{20\p@}\xviipt\@xviipt} + \def\huge{\@setsize\huge{25\p@}\xxpt\@xxpt} + \def\Huge{\@setsize\Huge{30\p@}\xxvpt\@xxvpt} +\fi +\normalsize + +% make aubox hsize/number of authors up to 3, less gutter +% then showbox gutter showbox gutter showbox -- GKMT Aug 99 +\newbox\@acmtitlebox +\def\@maketitle{\newpage + \null + \setbox\@acmtitlebox\vbox{% +\baselineskip 20pt +\vskip 2em % Vertical space above title. + \begin{center} + {\ttlfnt \@title\par} % Title set in 18pt Helvetica (Arial) bold size. + \vskip 1.5em % Vertical space after title. +%This should be the subtitle. +{\subttlfnt \the\subtitletext\par}\vskip 1.25em%\fi + {\baselineskip 16pt\aufnt % each author set in \12 pt Arial, in a + \lineskip .5em % tabular environment + \begin{tabular}[t]{c}\@author + \end{tabular}\par} + \vskip 1.5em % Vertical space after author. + \end{center}} + \dimen0=\ht\@acmtitlebox + \advance\dimen0 by -12.75pc\relax % Increased space for title box -- KBT + \unvbox\@acmtitlebox + \ifdim\dimen0<0.0pt\relax\vskip-\dimen0\fi} + + +\newcount\titlenotecount +\global\titlenotecount=0 +\newtoks\tntoks +\newtoks\tntokstwo +\newtoks\tntoksthree +\newtoks\tntoksfour +\newtoks\tntoksfive + +\def\abstract{ +\ifnum\titlenotecount>0 % was =1 + \insert\footins{% + \reset@font\footnotesize + \interlinepenalty\interfootnotelinepenalty + \splittopskip\footnotesep + \splitmaxdepth \dp\strutbox \floatingpenalty \@MM + \hsize\columnwidth \@parboxrestore + \protected@edef\@currentlabel{% + }% + \color@begingroup +\ifnum\titlenotecount=1 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\@finalstrut\strutbox}% +\fi +\ifnum\titlenotecount=2 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\dagger$}\rule\z@\footnotesep\ignorespaces\the\tntokstwo\@finalstrut\strutbox}% +\fi +\ifnum\titlenotecount=3 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\dagger$}\rule\z@\footnotesep\ignorespaces\the\tntokstwo\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\ddagger$}\rule\z@\footnotesep\ignorespaces\the\tntoksthree\@finalstrut\strutbox}% +\fi +\ifnum\titlenotecount=4 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\dagger$}\rule\z@\footnotesep\ignorespaces\the\tntokstwo\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\ddagger$}\rule\z@\footnotesep\ignorespaces\the\tntoksthree\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\S$}\rule\z@\footnotesep\ignorespaces\the\tntoksfour\@finalstrut\strutbox}% +\fi +\ifnum\titlenotecount=5 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\dagger$}\rule\z@\footnotesep\ignorespaces\the\tntokstwo\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\ddagger$}\rule\z@\footnotesep\ignorespaces\the\tntoksthree\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\S$}\rule\z@\footnotesep\ignorespaces\the\tntoksfour\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\P$}\rule\z@\footnotesep\ignorespaces\the\tntoksfive\@finalstrut\strutbox}% +\fi + \color@endgroup} %g} +\fi +\setcounter{footnote}{0} +\section*{ABSTRACT}\normalsize%\ninept +} + +\def\endabstract{\if@twocolumn\else\endquotation\fi} + +\def\keywords{\if@twocolumn +\section*{Keywords} +\else \small +\quotation +\fi} + +\def\terms{\if@twocolumn +\section*{General Terms} +\else \small +\quotation +\fi} + +% -- Classification needs to be a bit smart due to optionals - Gerry/Georgia November 2nd. 1999 +\newcount\catcount +\global\catcount=1 + +\def\category#1#2#3{% +\ifnum\catcount=1 +\section*{Categories and Subject Descriptors} +\advance\catcount by 1\else{\unskip; }\fi + \@ifnextchar [{\@category{#1}{#2}{#3}}{\@category{#1}{#2}{#3}[]}% +} + +\def\@category#1#2#3[#4]{% + \begingroup + \let\and\relax + #1 [\textbf{#2}]% + \if!#4!% + \if!#3!\else : #3\fi + \else + :\space + \if!#3!\else #3\kern\z@---\hskip\z@\fi + \textit{#4}% + \fi + \endgroup +} +% + +%%% This section (written by KBT) handles the 1" box in the lower left +%%% corner of the left column of the first page by creating a picture, +%%% and inserting the predefined string at the bottom (with a negative +%%% displacement to offset the space allocated for a non-existent +%%% caption). +%%% +\newtoks\copyrightnotice +\def\ftype@copyrightbox{8} +\def\@copyrightspace{ +\@float{copyrightbox}[b] +\begin{center} +\setlength{\unitlength}{1pc} +\begin{picture}(20,6) %Space for copyright notice +\put(0,-0.95){\crnotice{\@toappear}} +\end{picture} +\end{center} +\end@float} + +\def\@toappear{} % Default setting blank - commands below change this. +\long\def\toappear#1{\def\@toappear{\parbox[b]{20pc}{\baselineskip 9pt#1}}} +\def\toappearbox#1{\def\@toappear{\raisebox{5pt}{\framebox[20pc]{\parbox[b]{19pc}{#1}}}}} + +\newtoks\conf +\newtoks\confinfo +\def\conferenceinfo#1#2{\global\conf={#1}\global\confinfo{#2}} + + +\def\marginpar{\@latexerr{The \marginpar command is not allowed in the + `acmconf' document style.}\@eha} + +\mark{{}{}} % Initializes TeX's marks + +\def\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} + +\def\@begintheorem#1#2{% + \parskip 0pt % GM July 2000 (for tighter spacing) + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {{\sc #1}\hskip 5\p@\relax#2.}% + ] + \it +} +\def\@opargbegintheorem#1#2#3{% + \parskip 0pt % GM July 2000 (for tighter spacing) + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {\sc #1\ #2\ % This mod by Gerry to enumerate corollaries + \setbox\@tempboxa\hbox{(#3)} % and bracket the 'corollary title' + \ifdim \wd\@tempboxa>\z@ % and retain the correct numbering of e.g. theorems + \hskip 5\p@\relax % if they occur 'around' said corollaries. + \box\@tempboxa % Gerry - Nov. 1999. + \fi.}% + ] + \it +} +\newif\if@qeded +\global\@qededfalse + +% -- original +%\def\proof{% +% \vspace{-\parskip} % GM July 2000 (for tighter spacing) +% \global\@qededfalse +% \@ifnextchar[{\@xproof}{\@proof}% +%} +% -- end of original + +% (JSS) Fix for vertical spacing bug - Gerry Murray July 30th. 2002 +\def\proof{% +\vspace{-\lastskip}\vspace{-\parsep}\penalty-51% +\global\@qededfalse +\@ifnextchar[{\@xproof}{\@proof}% +} + +\def\endproof{% + \if@qeded\else\qed\fi + \endtrivlist +} +\def\@proof{% + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {\sc Proof.}% + ] + \ignorespaces +} +\def\@xproof[#1]{% + \trivlist + \item[\hskip 10\p@\hskip \labelsep{\sc Proof #1.}]% + \ignorespaces +} +\def\qed{% + \unskip + \kern 10\p@ + \begingroup + \unitlength\p@ + \linethickness{.4\p@}% + \framebox(6,6){}% + \endgroup + \global\@qededtrue +} + +\def\newdef#1#2{% + \expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \global\@namedef{#1}{\@defthm{#1}{#2}}% + \global\@namedef{end#1}{\@endtheorem}% + }% +} +\def\@defthm#1#2{% + \refstepcounter{#1}% + \@ifnextchar[{\@ydefthm{#1}{#2}}{\@xdefthm{#1}{#2}}% +} +\def\@xdefthm#1#2{% + \@begindef{#2}{\csname the#1\endcsname}% + \ignorespaces +} +\def\@ydefthm#1#2[#3]{% + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {\it #2% + \savebox\@tempboxa{#3}% + \ifdim \wd\@tempboxa>\z@ + \ \box\@tempboxa + \fi.% + }]% + \ignorespaces +} +\def\@begindef#1#2{% + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {\it #1\ \rm #2.}% + ]% +} +\def\theequation{\arabic{equation}} + +\newcounter{part} +\newcounter{section} +\newcounter{subsection}[section] +\newcounter{subsubsection}[subsection] +\newcounter{paragraph}[subsubsection] +\def\thepart{\Roman{part}} +\def\thesection{\arabic{section}} +\def\thesubsection{\thesection.\arabic{subsection}} +\def\thesubsubsection{\thesubsection.\arabic{subsubsection}} %removed \subsecfnt 29 July 2002 gkmt +\def\theparagraph{\thesubsubsection.\arabic{paragraph}} %removed \subsecfnt 29 July 2002 gkmt +\newif\if@uchead +\@ucheadfalse + +%% CHANGES: NEW NOTE +%% NOTE: OK to use old-style font commands below, since they were +%% suitably redefined for LaTeX2e +%% END CHANGES +\setcounter{secnumdepth}{3} +\def\part{% + \@startsection{part}{9}{\z@}{-10\p@ \@plus -4\p@ \@minus -2\p@} + {4\p@}{\normalsize\@ucheadtrue}% +} +\def\section{% + \@startsection{section}{1}{\z@}{-10\p@ \@plus -4\p@ \@minus -2\p@}% GM + {4\p@}{\baselineskip 14pt\secfnt\@ucheadtrue}% +} + +\def\subsection{% + \@startsection{subsection}{2}{\z@}{-8\p@ \@plus -2\p@ \@minus -\p@} + {4\p@}{\secfnt}% +} +\def\subsubsection{% + \@startsection{subsubsection}{3}{\z@}{-8\p@ \@plus -2\p@ \@minus -\p@}% + {4\p@}{\subsecfnt}% +} +\def\paragraph{% + \vskip 12pt\@startsection{paragraph}{3}{\z@}{6\p@ \@plus \p@}% + {-5\p@}{\subsecfnt}% +} +\let\@period=. +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec %gkmt, 11 aug 99 + \global\let\@period\@empty + \leavevmode + \global\let\@period.% + \fi + \par % + \@tempskipa #4\relax + \@afterindenttrue + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa + \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty + \addvspace\@tempskipa + \fi +\parskip=0pt % GM July 2000 (non numbered) section heads + \@ifstar + {\@ssect{#3}{#4}{#5}{#6}} + {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}% +} +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \edef\@svsec{% + \begingroup + %\ifnum#2>2 \noexpand\rm \fi % changed to next 29 July 2002 gkmt + \ifnum#2>2 \noexpand#6 \fi + \csname the#1\endcsname + \endgroup + \ifnum #2=1\relax .\fi + \hskip 1em + }% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + #6\relax + \@hangfrom{\hskip #3\relax\@svsec}% + \begingroup + \interlinepenalty \@M + \if@uchead + \uppercase{#8}% + \else + #8% + \fi + \par + \endgroup + \endgroup + \csname #1mark\endcsname{#7}% + \vskip -12pt %gkmt, 11 aug 99 and GM July 2000 (was -14) - numbered section head spacing +\addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7% + }% + \else + \def\@svsechd{% + #6% + \hskip #3\relax + \@svsec + \if@uchead + \uppercase{#8}% + \else + #8% + \fi + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7% + }% + }% + \fi + \@xsect{#5}\hskip 1pt + \par +} +\def\@xsect#1{% + \@tempskipa #1\relax + \ifdim \@tempskipa>\z@ + \par + \nobreak + \vskip \@tempskipa + \@afterheading + \else + \global\@nobreakfalse + \global\@noskipsectrue + \everypar{% + \if@noskipsec + \global\@noskipsecfalse + \clubpenalty\@M + \hskip -\parindent + \begingroup + \@svsechd + \@period + \endgroup + \unskip + \@tempskipa #1\relax + \hskip -\@tempskipa + \else + \clubpenalty \@clubpenalty + \everypar{}% + \fi + }% + \fi + \ignorespaces +} +\def\@trivlist{% + \@topsepadd\topsep + \if@noskipsec + \global\let\@period\@empty + \leavevmode + \global\let\@period.% + \fi + \ifvmode + \advance\@topsepadd\partopsep + \else + \unskip + \par + \fi + \if@inlabel + \@noparitemtrue + \@noparlisttrue + \else + \@noparlistfalse + \@topsep\@topsepadd + \fi + \advance\@topsep \parskip + \leftskip\z@skip + \rightskip\@rightskip + \parfillskip\@flushglue + \@setpar{\if@newlist\else{\@@par}\fi} + \global\@newlisttrue + \@outerparskip\parskip +} + +%%% Actually, 'abbrev' works just fine as the default +%%% Bibliography style. + +\typeout{Using 'Abbrev' bibliography style} +\newcommand\bibyear[2]{% + \unskip\quad\ignorespaces#1\unskip + \if#2..\quad \else \quad#2 \fi +} +\newcommand{\bibemph}[1]{{\em#1}} +\newcommand{\bibemphic}[1]{{\em#1\/}} +\newcommand{\bibsc}[1]{{\sc#1}} +\def\@normalcite{% + \def\@cite##1##2{[##1\if@tempswa , ##2\fi]}% +} +\def\@citeNB{% + \def\@cite##1##2{##1\if@tempswa , ##2\fi}% +} +\def\@citeRB{% + \def\@cite##1##2{##1\if@tempswa , ##2\fi]}% +} +\def\start@cite#1#2{% + \edef\citeauthoryear##1##2##3{% + ###1% + \ifnum#2=\z@ \else\ ###2\fi + }% + \ifnum#1=\thr@@ + \let\@@cite\@citeyear + \else + \let\@@cite\@citenormal + \fi + \@ifstar{\@citeNB\@@cite}{\@normalcite\@@cite}% +} +\def\cite{\start@cite23} +\def\citeNP{\cite*} +\def\citeA{\start@cite10} +\def\citeANP{\citeA*} +\def\shortcite{\start@cite23} +\def\shortciteNP{\shortcite*} +\def\shortciteA{\start@cite20} +\def\shortciteANP{\shortciteA*} +\def\citeyear{\start@cite30} +\def\citeyearNP{\citeyear*} +\def\citeN{% + \@citeRB + \def\citeauthoryear##1##2##3{##1\ [##3% + \def\reserved@a{##1}% + \def\citeauthoryear####1####2####3{% + \def\reserved@b{####1}% + \ifx\reserved@a\reserved@b + ####3% + \else + \errmessage{Package acmart Error: author mismatch + in \string\citeN^^J^^J% + See the acmart package documentation for explanation}% + \fi + }% + }% + \@ifstar\@citeyear\@citeyear +} +\def\shortciteN{% + \@citeRB + \def\citeauthoryear##1##2##3{##2\ [##3% + \def\reserved@a{##2}% + \def\citeauthoryear####1####2####3{% + \def\reserved@b{####2}% + \ifx\reserved@a\reserved@b + ####3% + \else + \errmessage{Package acmart Error: author mismatch + in \string\shortciteN^^J^^J% + See the acmart package documentation for explanation}% + \fi + }% + }% + \@ifstar\@citeyear\@citeyear % GM July 2000 +} +\def\@citenormal{% + \@ifnextchar [{\@tempswatrue\@citex;} + {\@tempswafalse\@citex,[]}% % GM July 2000 +} +\def\@citeyear{% + \@ifnextchar [{\@tempswatrue\@citex,}% + {\@tempswafalse\@citex,[]}% +} +\def\@citex#1[#2]#3{% + \let\@citea\@empty + \@cite{% + \@for\@citeb:=#3\do{% + \@citea + \def\@citea{#1 }% + \edef\@citeb{\expandafter\@iden\@citeb}% + \if@filesw + \immediate\write\@auxout{\string\citation{\@citeb}}% + \fi + \@ifundefined{b@\@citeb}{% + {\bf ?}% + \@warning{% + Citation `\@citeb' on page \thepage\space undefined% + }% + }% + {\csname b@\@citeb\endcsname}% + }% + }{#2}% +} +\let\@biblabel\@gobble +\newdimen\bibindent +\setcounter{enumi}{1} +\bibindent=0em +\def\thebibliography#1{% +\ifnum\addauflag=0\addauthorsection\global\addauflag=1\fi + \section[References]{% <=== OPTIONAL ARGUMENT ADDED HERE + {References} % was uppercased but this affects pdf bookmarks (SP/GM October 2004) + \vskip -9pt % GM July 2000 (for tighter spacing) + \@mkboth{{\refname}}{{\refname}}% + }% + \list{[\arabic{enumi}]}{% + \settowidth\labelwidth{[#1]}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \advance\leftmargin\bibindent + \parsep=0pt\itemsep=1pt % GM July 2000 + \itemindent -\bibindent + \listparindent \itemindent + \usecounter{enumi} + }% + \let\newblock\@empty + \raggedright % GM July 2000 + \sloppy + \sfcode`\.=1000\relax +} + + +\gdef\balancecolumns +{\vfill\eject +\global\@colht=\textheight +\global\ht\@cclv=\textheight +} + +\newcount\colcntr +\global\colcntr=0 +\newbox\savebox + +\gdef \@makecol {% +\global\advance\colcntr by 1 +\ifnum\colcntr>2 \global\colcntr=1\fi + \ifvoid\footins + \setbox\@outputbox \box\@cclv + \else + \setbox\@outputbox \vbox{% +\boxmaxdepth \@maxdepth + \@tempdima\dp\@cclv + \unvbox \@cclv + \vskip-\@tempdima + \vskip \skip\footins + \color@begingroup + \normalcolor + \footnoterule + \unvbox \footins + \color@endgroup + }% + \fi + \xdef\@freelist{\@freelist\@midlist}% + \global \let \@midlist \@empty + \@combinefloats + \ifvbox\@kludgeins + \@makespecialcolbox + \else + \setbox\@outputbox \vbox to\@colht {% +\@texttop + \dimen@ \dp\@outputbox + \unvbox \@outputbox + \vskip -\dimen@ + \@textbottom + }% + \fi + \global \maxdepth \@maxdepth +} +\def\titlenote{\@ifnextchar[\@xtitlenote{\stepcounter\@mpfn +\global\advance\titlenotecount by 1 +\ifnum\titlenotecount=1 + \raisebox{9pt}{$\ast$} +\fi +\ifnum\titlenotecount=2 + \raisebox{9pt}{$\dagger$} +\fi +\ifnum\titlenotecount=3 + \raisebox{9pt}{$\ddagger$} +\fi +\ifnum\titlenotecount=4 +\raisebox{9pt}{$\S$} +\fi +\ifnum\titlenotecount=5 +\raisebox{9pt}{$\P$} +\fi + \@titlenotetext +}} + +\long\def\@titlenotetext#1{\insert\footins{% +\ifnum\titlenotecount=1\global\tntoks={#1}\fi +\ifnum\titlenotecount=2\global\tntokstwo={#1}\fi +\ifnum\titlenotecount=3\global\tntoksthree={#1}\fi +\ifnum\titlenotecount=4\global\tntoksfour={#1}\fi +\ifnum\titlenotecount=5\global\tntoksfive={#1}\fi + \reset@font\footnotesize + \interlinepenalty\interfootnotelinepenalty + \splittopskip\footnotesep + \splitmaxdepth \dp\strutbox \floatingpenalty \@MM + \hsize\columnwidth \@parboxrestore + \protected@edef\@currentlabel{% + }% + \color@begingroup + \color@endgroup}} + +%%%%%%%%%%%%%%%%%%%%%%%%% +\ps@plain +\baselineskip=11pt +\let\thepage\relax % For NO page numbers - GM Nov. 30th. 1999 and July 2000 +\def\setpagenumber#1{\global\setcounter{page}{#1}} +\pagenumbering{arabic} % Arabic page numbers GM July 2000 +\twocolumn % Double column. +\flushbottom % Even bottom -- alas, does not balance columns at end of document +\pagestyle{plain} + +% Need Copyright Year and Copyright Data to be user definable (in .tex file). +% Gerry Nov. 30th. 1999 +\newtoks\copyrtyr +\newtoks\acmcopyr +\newtoks\boilerplate +\global\acmcopyr={X-XXXXX-XX-X/XX/XX} % Default - 5/11/2001 *** Gerry +\global\copyrtyr={200X} % Default - 3/3/2003 *** Gerry +\def\CopyrightYear#1{\global\copyrtyr{#1}} +\def\crdata#1{\global\acmcopyr{#1}} +\def\permission#1{\global\boilerplate{#1}} +% +%\global\boilerplate={Permission to make digital or hard copies of all or part of this work for personal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. To copy otherwise, to republish, to post on servers or to redistribute to lists, requires prior specific permission and/or a fee.} +%\newtoks\copyrightetc +%\global\copyrightetc{Copyright \the\copyrtyr\ ACM \the\acmcopyr\ ...\$5.00} + +\global\boilerplate={Permission to make digital or hard copies of all or part of this work for personal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. To copy otherwise, to republish, to post on servers or to redistribute to lists, requires prior specific permission and/or a fee. Articles from this volume were invited to present their results at The 38th International Conference on Very Large Data Bases, August 26th - 31st 2013, Riva del Garda, Trento, Italy. } + +\global\conf{Proceedings of the VLDB Endowment,} +\global\confinfo{Vol. 6, No. XXX} +\newtoks\copyrightetc +\global\copyrightetc{Copyright 2011 VLDB Endowment 2150-8097/11/11... \$ 10.00} + +%ahmetsacan, 20111024: disabled showing conference name and Vol/Issue/Month. We now stamp this on the papers ourselves. +%\toappear{\the\boilerplate\par +%{\confname{\the\conf}} \the\confinfo\par \the\copyrightetc. +%} +% +%% End of vldb.cls -- V1.8c - 05/15/2011 -- +%% Ahmet Sacan -- December 2011 (volume, issue, and dates are dynamically updated) +%% Uwe Roehm -- Oct-Dec 2010 & Jan-Apr 2011 +%% Gerry Murray -- Wednesday July 26th. 2005