[
  {
    "path": ".gitignore",
    "content": "datasets/\nexamples/\ndatasets-old/\n.DS_Store\nbuild\ntarget\n.settings\n.project\n.idea\n.classpath\n*.iml\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"neode\"]\n\tpath = neode\n\turl = https://github.com/jexp/neode.git"
  },
  {
    "path": "README.md",
    "content": "Graph Databases Use Cases\n=========================\n\nExample use case implementations from the O'Reilly book [Graph Databases](http://graphdatabases.com/) by [@iansrobinson](http://twitter.com/iansrobinson), [@jimwebber](http://twitter.com/jimwebber) and [@emileifrem](http://twitter.com/emileifrem).\n\nSetup\n-----\n\nThis repository contains a submodule, _neode_, which is used to build the performance datasets. After cloning the repository, you will need to initialize the submodule:\n\n    git submodule init\n\nand then:\n\n    git submodule update\n\nTo run the use case queries:\n\n    mvn clean install\n\nOverview\n--------\n\nQueries are developed in a test-driven fashion against small, well-known representative graphs (as described pp.83-87 of the book). The queries can then be run against a much larger, randomly-generated graph (typically, 1-2 million nodes and several million relationships), to test their relative performance. (Note: these performance tests do not test production-like scenarios; rather, they act as a sanity check, ensuring that queries that run fast against a very small graph are still reasonably performant when run against a larger graph.)\n\nThe project contains 3 modules (in addition to the _neode_ submodule):\n\n*  _queries_\n\n   Contains the use case queries and the unit tests used to develop the queries.\n* _dataset_builders_\n\n   Builds larger, randomly-generated sample datasets.\n* _performance_tests_\n\n   Runs the queries against the large sample datasets.\n\nRunning the Performance Tests\n-----------------------------\n\nFirst, build the project as described in Setup.\n\nBefore you run the performance tests you will need to generate sample datasets. To create a sample dataset run:\n\n    mvn test -pl data-generation -DargLine=\"-Xms2g -Xmx2g\" -Dtest=AccessControl|Logistics|SocialNetwork\n\nFor example, to generate a sample dataset for the Logistics queries, run:\n\n    mvn test -pl data-generation -DargLine=\"-Xms2g -Xmx2g\" -Dtest=Logistics\n\n*WARNING:* Building the sample datasets takes a long time (several tens of minutes in some cases).\n\nTo execute the performance tests against a sample dataset, run:\n\n    mvn test -pl performance-testing -DargLine=\"-Xms2g -Xmx2g\" -Dtest=AccessControl|Logistics|SocialNetwork\n"
  },
  {
    "path": "configuration/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>org.neo4j.graphdatabases</groupId>\n    <artifactId>configuration</artifactId>\n    <version>2.0-SNAPSHOT</version>\n    <packaging>jar</packaging>\n\n    <properties>\n        <maven.compiler.source>1.7</maven.compiler.source>\n        <maven.compiler.target>1.7</maven.compiler.target>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>joda-time</groupId>\n            <artifactId>joda-time</artifactId>\n            <version>2.1</version>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "configuration/src/main/java/org/neo4j/graphdatabases/AccessControlConfig.java",
    "content": "package org.neo4j.graphdatabases;\n\npublic class AccessControlConfig\n{\n    public static final String STORE_DIR = \"../datasets/access-control-no-attributes/\";\n    public static final String TITLE = \"Access Control (fine-grained permission relationships)\";\n    public static final int NUMBER_OF_ADMINS = 1000;\n    public static final int NUMBER_OF_GROUPS = 2000;\n    public static final int NUMBER_OF_COMPANIES = 30000;\n}\n"
  },
  {
    "path": "configuration/src/main/java/org/neo4j/graphdatabases/AccessControlWithRelationshipPropertiesConfig.java",
    "content": "package org.neo4j.graphdatabases;\n\npublic class AccessControlWithRelationshipPropertiesConfig\n{\n    public static final String STORE_DIR = \"../datasets/access-control/\";\n    public static final String TITLE = \"Access Control\";\n    public static final int NUMBER_OF_ADMINS = 1000;\n    public static final int NUMBER_OF_GROUPS = 2000;\n    public static final int NUMBER_OF_COMPANIES = 30000;\n}\n"
  },
  {
    "path": "configuration/src/main/java/org/neo4j/graphdatabases/LogisticsConfig.java",
    "content": "package org.neo4j.graphdatabases;\n\nimport org.joda.time.DateTime;\nimport org.joda.time.DateTimeZone;\n\npublic class LogisticsConfig\n{\n    public static final String TITLE = \"Logistics\";\n    public static final String STORE_DIR = \"../datasets/logistics/\";\n    public static final DateTime START_DATE = new DateTime( 2012, 10, 15, 0, 0, 0, 0, DateTimeZone.UTC );\n    public static final int NUMBER_OF_PARCEL_CENTRES = 20;\n    public static final int MIN_NUMBER_OF_DELIVERY_BASES_PER_PARCEL_CENTRE = 30;\n    public static final int MAX_NUMBER_OF_DELIVERY_BASES_PER_PARCEL_CENTRE = 50;\n    public static final int MIN_NUMBER_OF_DELIVERY_AREAS_PER_DELIVERY_BASE = 20;\n    public static final int MAX_NUMBER_OF_DELIVERY_AREAS_PER_DELIVERY_BASE = 40;\n    public static final int MIN_NUMBER_OF_DELIVERY_SEGMENTS_PER_DELIVERY_AREA = 50;\n    public static final int MAX_NUMBER_OF_DELIVERY_SEGMENTS_PER_DELIVERY_AREA = 100;\n}\n"
  },
  {
    "path": "configuration/src/main/java/org/neo4j/graphdatabases/SimpleSocialNetworkConfig.java",
    "content": "package org.neo4j.graphdatabases;\n\npublic class SimpleSocialNetworkConfig\n{\n    public static final String STORE_DIR = \"../datasets/simple-social-network/\";\n    public static final String TITLE = \"Simple Social Network\";\n    public static final int NUMBER_USERS = 20900;\n    public static final int MIN_NUMBER_OF_FRIENDS = 50;\n    public static final int MAX_NUMBER_OF_FRIENDS = 100;\n}\n"
  },
  {
    "path": "configuration/src/main/java/org/neo4j/graphdatabases/SocialNetworkConfig.java",
    "content": "package org.neo4j.graphdatabases;\n\npublic class SocialNetworkConfig\n{\n    public static final String STORE_DIR = \"../datasets/social-network\";\n    public static final String TITLE = \"Social Network\";\n    public static final int NUMBER_USERS = 1000000;\n    public static final int NUMBER_COMPANIES = 10000;\n    public static final int NUMBER_TOPICS = 100;\n}\n"
  },
  {
    "path": "data-generation/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>org.neo4j.graphdatabases</groupId>\n    <artifactId>data-generation</artifactId>\n    <version>2.0-SNAPSHOT</version>\n    <packaging>jar</packaging>\n\n    <properties>\n        <maven.compiler.source>1.7</maven.compiler.source>\n        <maven.compiler.target>1.7</maven.compiler.target>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <neo4j.version>2.0.1</neo4j.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.neo4j</groupId>\n            <artifactId>neo4j-kernel</artifactId>\n            <version>${neo4j.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.neo4j</groupId>\n            <artifactId>neo4j-enterprise</artifactId>\n            <version>${neo4j.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.neo4j.graphdatabases</groupId>\n            <artifactId>configuration</artifactId>\n            <version>2.0-SNAPSHOT</version>\n        </dependency>\n        <dependency>\n            <groupId>org.neo4j.graphdatabases</groupId>\n            <artifactId>queries</artifactId>\n            <version>2.0-SNAPSHOT</version>\n        </dependency>\n        <dependency>\n            <groupId>neode</groupId>\n            <artifactId>neode</artifactId>\n            <version>2.0</version>\n        </dependency>\n        <dependency>\n            <groupId>joda-time</groupId>\n            <artifactId>joda-time</artifactId>\n            <version>2.1</version>\n        </dependency>\n        <dependency>\n            <artifactId>junit</artifactId>\n            <groupId>junit</groupId>\n            <version>4.11</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/AccessControl.java",
    "content": "package org.neo4j.graphdatabases.dataset_builders;\n\nimport java.io.File;\n\nimport org.junit.Test;\n\nimport org.neo4j.graphdatabases.AccessControlConfig;\nimport org.neo4j.graphdatabases.queries.helpers.DbUtils;\nimport org.neo4j.graphdatabases.queries.traversals.IndexResources;\nimport org.neo4j.graphdb.Direction;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.factory.GraphDatabaseFactory;\nimport org.neo4j.kernel.impl.util.FileUtils;\nimport org.neo4j.neode.Dataset;\nimport org.neo4j.neode.DatasetManager;\nimport org.neo4j.neode.NodeCollection;\nimport org.neo4j.neode.NodeSpecification;\nimport org.neo4j.neode.Range;\nimport org.neo4j.neode.RelationshipSpecification;\nimport org.neo4j.neode.RelationshipUniqueness;\nimport org.neo4j.neode.logging.SysOutLog;\nimport org.neo4j.neode.statistics.AsciiDocFormatter;\nimport org.neo4j.neode.statistics.GraphStatistics;\n\nimport static org.neo4j.neode.Range.minMax;\nimport static org.neo4j.neode.TargetNodesStrategy.create;\nimport static org.neo4j.neode.TargetNodesStrategy.getExisting;\nimport static org.neo4j.neode.TargetNodesStrategy.getOrCreate;\nimport static org.neo4j.neode.properties.Property.indexableProperty;\nimport static org.neo4j.neode.properties.Property.property;\n\npublic class AccessControl\n{\n    public static final Range GROUPS_PER_ADMIN = minMax( 1, 3 );\n    public static final Range ALLOWED_COMPANIES_PER_GROUP = minMax( 10, 50 );\n    public static final Range DENIED_COMPANIES_PER_GROUP = minMax( 2, 10 );\n    public static final Range EMPLOYEES_PER_COMPANY = minMax( 5, 100 );\n    public static final Range ACCOUNTS_PER_EMPLOYEE = minMax( 1, 5 );\n\n    @Test\n    public void buildAccessControl() throws Exception\n    {\n        File dir = new File( AccessControlConfig.STORE_DIR );\n        FileUtils.deleteRecursively( dir );\n\n        GraphDatabaseService db = new GraphDatabaseFactory()\n                .newEmbeddedDatabaseBuilder( AccessControlConfig.STORE_DIR )\n                .setConfig( DbUtils.dbConfig() )\n                .newGraphDatabase();\n        DatasetManager dsm = new DatasetManager( db, SysOutLog.INSTANCE );\n\n        NodeSpecification adminSpec = dsm.nodeSpecification( \"Administrator\", indexableProperty( db, \"Administrator\", \"name\" ) );\n        NodeSpecification groupSpec = dsm.nodeSpecification( \"Group\", property( \"name\" ) );\n        NodeSpecification companySpec = dsm.nodeSpecification( \"Company\", indexableProperty( db, \"Company\", \"name\" ) );\n        NodeSpecification customerSpec = dsm.nodeSpecification( \"Employee\", indexableProperty( db, \"Employee\", \"name\", \"Resource\"));\n        NodeSpecification accountSpec = dsm.nodeSpecification( \"Account\", indexableProperty( db, \"Account\", \"name\", \"Resource\"));\n\n        RelationshipSpecification member_of = dsm.relationshipSpecification( \"MEMBER_OF\" );\n        RelationshipSpecification allowed_inherit = dsm.relationshipSpecification( \"ALLOWED_INHERIT\" );\n        RelationshipSpecification allowed_do_not_inherit = dsm.relationshipSpecification( \"ALLOWED_DO_NOT_INHERIT\" );\n        RelationshipSpecification denied = dsm.relationshipSpecification( \"DENIED\" );\n        RelationshipSpecification child_of = dsm.relationshipSpecification( \"CHILD_OF\" );\n        RelationshipSpecification works_for = dsm.relationshipSpecification( \"WORKS_FOR\" );\n        RelationshipSpecification has_account = dsm.relationshipSpecification( \"HAS_ACCOUNT\" );\n\n        Dataset dataset = dsm.newDataset( \"Access Control (without using inherit attributes)\" );\n\n        NodeCollection administrators = adminSpec.create( AccessControlConfig.NUMBER_OF_ADMINS ).update( dataset );\n        NodeCollection groups = administrators.createRelationshipsTo(\n                getOrCreate( groupSpec, AccessControlConfig.NUMBER_OF_GROUPS )\n                        .numberOfTargetNodes( GROUPS_PER_ADMIN )\n                        .relationship( member_of )\n                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )\n                .update( dataset );\n\n        NodeCollection companies1allowedInherit = groups.createRelationshipsTo(\n                getOrCreate( companySpec, percentageOf( AccessControlConfig.NUMBER_OF_COMPANIES, 0.17 ) )\n                        .numberOfTargetNodes( ALLOWED_COMPANIES_PER_GROUP )\n                        .relationship( allowed_inherit )\n                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )\n                .update( dataset );\n\n        NodeCollection companies1allowedDoNotInherit = groups.createRelationshipsTo(\n                getOrCreate( companySpec, percentageOf( AccessControlConfig.NUMBER_OF_COMPANIES, 0.08 ) )\n                        .numberOfTargetNodes( ALLOWED_COMPANIES_PER_GROUP )\n                        .relationship( allowed_do_not_inherit )\n                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )\n                .update( dataset );\n\n        NodeCollection companies1denied = groups.createRelationshipsTo(\n                getOrCreate( companySpec, percentageOf( AccessControlConfig.NUMBER_OF_COMPANIES, 0.1 ) )\n                        .numberOfTargetNodes( DENIED_COMPANIES_PER_GROUP )\n                        .relationship( denied )\n                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )\n                .update( dataset );\n\n        NodeCollection companies2allowedInherit = groups.createRelationshipsTo(\n                getOrCreate( companySpec, percentageOf( AccessControlConfig.NUMBER_OF_COMPANIES, 0.33 ) )\n                        .numberOfTargetNodes( ALLOWED_COMPANIES_PER_GROUP )\n                        .relationship( allowed_inherit )\n                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )\n                .update( dataset );\n\n        NodeCollection companies2allowedDoNotInherit = groups.createRelationshipsTo(\n                getOrCreate( companySpec, percentageOf( AccessControlConfig.NUMBER_OF_COMPANIES, 0.17 ) )\n                        .numberOfTargetNodes( ALLOWED_COMPANIES_PER_GROUP )\n                        .relationship( allowed_do_not_inherit )\n                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )\n                .update( dataset );\n\n        NodeCollection companies2denied = groups.createRelationshipsTo(\n                getOrCreate( companySpec, percentageOf( AccessControlConfig.NUMBER_OF_COMPANIES, 0.15 ) )\n                        .numberOfTargetNodes( DENIED_COMPANIES_PER_GROUP )\n                        .relationship( denied )\n                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )\n                .update( dataset );\n\n        NodeCollection companies1 = companies1allowedInherit.combine( companies1allowedDoNotInherit ).combine(\n                companies1denied );\n        NodeCollection companies2 = companies2allowedInherit.combine( companies2allowedDoNotInherit ).combine(\n                companies2denied );\n\n        companies2.createRelationshipsTo(\n                getExisting( companies1 )\n                        .numberOfTargetNodes( 1 )\n                        .relationship( child_of )\n                        .exactlyOneRelationship() )\n                .updateNoReturn( dataset );\n\n\n        NodeCollection companies = companies1.combine( companies2 );\n        NodeCollection employees = companies.createRelationshipsTo(\n                create( customerSpec )\n                        .numberOfTargetNodes( EMPLOYEES_PER_COMPANY )\n                        .relationship( works_for, Direction.INCOMING )\n                        .exactlyOneRelationship() )\n                .update( dataset, 1000 );\n\n        employees.createRelationshipsTo(\n                create( accountSpec )\n                        .numberOfTargetNodes( ACCOUNTS_PER_EMPLOYEE )\n                        .relationship( has_account, Direction.OUTGOING )\n                        .exactlyOneRelationship() )\n                .updateNoReturn( dataset );\n\n        dataset.end();\n\n        new IndexResources( db ).execute();\n\n        GraphStatistics.create( db, AccessControlConfig.TITLE )\n                .describeTo( new AsciiDocFormatter( SysOutLog.INSTANCE ) );\n\n        db.shutdown();\n    }\n\n    private int percentageOf( int i, double percentage )\n    {\n        return (int) (i * percentage);\n    }\n}\n"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/AccessControlWithRelationshipProperties.java",
    "content": "package org.neo4j.graphdatabases.dataset_builders;\n\nimport java.io.File;\nimport java.util.Random;\n\nimport org.junit.Test;\n\nimport org.neo4j.graphdatabases.AccessControlWithRelationshipPropertiesConfig;\nimport org.neo4j.graphdatabases.queries.helpers.DbUtils;\nimport org.neo4j.graphdatabases.queries.traversals.IndexResources;\nimport org.neo4j.graphdb.Direction;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.PropertyContainer;\nimport org.neo4j.graphdb.factory.GraphDatabaseFactory;\nimport org.neo4j.kernel.impl.util.FileUtils;\nimport org.neo4j.neode.Dataset;\nimport org.neo4j.neode.DatasetManager;\nimport org.neo4j.neode.NodeCollection;\nimport org.neo4j.neode.NodeSpecification;\nimport org.neo4j.neode.Range;\nimport org.neo4j.neode.RelationshipSpecification;\nimport org.neo4j.neode.RelationshipUniqueness;\nimport org.neo4j.neode.logging.SysOutLog;\nimport org.neo4j.neode.properties.Property;\nimport org.neo4j.neode.statistics.AsciiDocFormatter;\nimport org.neo4j.neode.statistics.GraphStatistics;\n\nimport static org.neo4j.neode.Range.minMax;\nimport static org.neo4j.neode.TargetNodesStrategy.create;\nimport static org.neo4j.neode.TargetNodesStrategy.getExisting;\nimport static org.neo4j.neode.TargetNodesStrategy.getOrCreate;\nimport static org.neo4j.neode.properties.Property.indexableProperty;\nimport static org.neo4j.neode.properties.Property.property;\n\npublic class AccessControlWithRelationshipProperties\n{\n    public static final Range GROUPS_PER_ADMIN = minMax( 1, 3 );\n    public static final Range ALLOWED_COMPANIES_PER_GROUP = minMax( 10, 50 );\n    public static final Range DENIED_COMPANIES_PER_GROUP = minMax( 2, 10 );\n    public static final Range EMPLOYEES_PER_COMPANY = minMax( 5, 100 );\n    public static final Range ACCOUNTS_PER_EMPLOYEE = minMax( 1, 5 );\n\n    @Test\n    public void buildAccessControl() throws Exception\n    {\n        File dir = new File( AccessControlWithRelationshipPropertiesConfig.STORE_DIR );\n        FileUtils.deleteRecursively( dir );\n\n        GraphDatabaseService db = new GraphDatabaseFactory()\n                .newEmbeddedDatabaseBuilder( AccessControlWithRelationshipPropertiesConfig.STORE_DIR )\n                .setConfig( DbUtils.dbConfig() )\n                .newGraphDatabase();\n        DatasetManager dsm = new DatasetManager( db, SysOutLog.INSTANCE );\n\n        NodeSpecification adminSpec = dsm.nodeSpecification( \"Administrator\", indexableProperty( db, \"Administrator\", \"name\" ) );\n        NodeSpecification groupSpec = dsm.nodeSpecification( \"Group\", property( \"name\" ) );\n        NodeSpecification companySpec = dsm.nodeSpecification( \"Company\", indexableProperty( db, \"Company\", \"name\" ) );\n        NodeSpecification customerSpec = dsm.nodeSpecification( \"Employee\", indexableProperty( db, \"Employee\", \"name\", \"Resource\"));\n        NodeSpecification accountSpec = dsm.nodeSpecification( \"Account\", indexableProperty( db, \"Account\", \"name\", \"Resource\"));\n\n        Property inheritProperty = new Property()\n        {\n            private final Random random = new Random();\n\n            @Override\n            public void setProperty( PropertyContainer propertyContainer, GraphDatabaseService graphDatabaseService,\n                                     String label, int iteration )\n            {\n                int i = random.nextInt( 3 );\n                boolean value = i < 2;\n                propertyContainer.setProperty( \"inherit\", value );\n            }\n        };\n\n        RelationshipSpecification member_of = dsm.relationshipSpecification( \"MEMBER_OF\" );\n        RelationshipSpecification allowed = dsm.relationshipSpecification( \"ALLOWED\", inheritProperty );\n        RelationshipSpecification denied = dsm.relationshipSpecification( \"DENIED\" );\n        RelationshipSpecification child_of = dsm.relationshipSpecification( \"CHILD_OF\" );\n        RelationshipSpecification works_for = dsm.relationshipSpecification( \"WORKS_FOR\" );\n        RelationshipSpecification has_account = dsm.relationshipSpecification( \"HAS_ACCOUNT\" );\n\n        Dataset dataset = dsm.newDataset( AccessControlWithRelationshipPropertiesConfig.TITLE );\n\n        NodeCollection administrators = adminSpec.create( AccessControlWithRelationshipPropertiesConfig\n                .NUMBER_OF_ADMINS ).update( dataset );\n        NodeCollection groups = administrators.createRelationshipsTo(\n                getOrCreate( groupSpec, AccessControlWithRelationshipPropertiesConfig.NUMBER_OF_GROUPS )\n                        .numberOfTargetNodes( GROUPS_PER_ADMIN )\n                        .relationship( member_of )\n                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )\n                .update( dataset );\n\n        NodeCollection companies1allowed = groups.createRelationshipsTo(\n                getOrCreate( companySpec, percentageOf( AccessControlWithRelationshipPropertiesConfig\n                        .NUMBER_OF_COMPANIES, 0.25 ) )\n                        .numberOfTargetNodes( ALLOWED_COMPANIES_PER_GROUP )\n                        .relationship( allowed )\n                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )\n                .update( dataset );\n\n        NodeCollection companies1denied = groups.createRelationshipsTo(\n                getOrCreate( companySpec, percentageOf( AccessControlWithRelationshipPropertiesConfig\n                        .NUMBER_OF_COMPANIES, 0.1 ) )\n                        .numberOfTargetNodes( DENIED_COMPANIES_PER_GROUP )\n                        .relationship( denied )\n                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )\n                .update( dataset );\n\n        NodeCollection companies2allowed = groups.createRelationshipsTo(\n                getOrCreate( companySpec, percentageOf( AccessControlWithRelationshipPropertiesConfig\n                        .NUMBER_OF_COMPANIES, 0.50 ) )\n                        .numberOfTargetNodes( ALLOWED_COMPANIES_PER_GROUP )\n                        .relationship( allowed )\n                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )\n                .update( dataset );\n\n        NodeCollection companies2denied = groups.createRelationshipsTo(\n                getOrCreate( companySpec, percentageOf( AccessControlWithRelationshipPropertiesConfig\n                        .NUMBER_OF_COMPANIES, 0.15 ) )\n                        .numberOfTargetNodes( DENIED_COMPANIES_PER_GROUP )\n                        .relationship( denied )\n                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )\n                .update( dataset );\n\n        NodeCollection companies1 = companies1allowed.combine( companies1denied );\n        NodeCollection companies2 = companies2allowed.combine( companies2denied );\n\n        companies2.createRelationshipsTo(\n                getExisting( companies1 )\n                        .numberOfTargetNodes( 1 )\n                        .relationship( child_of )\n                        .exactlyOneRelationship() )\n                .updateNoReturn( dataset );\n\n\n        NodeCollection companies = companies1.combine( companies2 );\n        NodeCollection employees = companies.createRelationshipsTo(\n                create( customerSpec )\n                        .numberOfTargetNodes( EMPLOYEES_PER_COMPANY )\n                        .relationship( works_for, Direction.INCOMING )\n                        .exactlyOneRelationship() )\n                .update( dataset, 1000 );\n\n        employees.createRelationshipsTo(\n                create( accountSpec )\n                        .numberOfTargetNodes( ACCOUNTS_PER_EMPLOYEE )\n                        .relationship( has_account, Direction.OUTGOING )\n                        .exactlyOneRelationship() )\n                .updateNoReturn( dataset );\n\n        dataset.end();\n\n        new IndexResources( db ).execute();\n\n        GraphStatistics.create( db, AccessControlWithRelationshipPropertiesConfig.TITLE )\n                .describeTo( new AsciiDocFormatter( SysOutLog.INSTANCE ) );\n\n        db.shutdown();\n\n    }\n\n    private int percentageOf( int i, double percentage )\n    {\n        return (int) (i * percentage);\n    }\n\n}\n"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/Logistics.java",
    "content": "package org.neo4j.graphdatabases.dataset_builders;\n\nimport java.io.File;\nimport java.util.Iterator;\nimport java.util.NoSuchElementException;\nimport java.util.Random;\n\nimport org.joda.time.Interval;\nimport org.junit.Test;\n\nimport org.neo4j.graphdatabases.LogisticsConfig;\nimport org.neo4j.graphdatabases.dataset_builders.helpers.SevenDays;\nimport org.neo4j.graphdatabases.queries.helpers.DbUtils;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.PropertyContainer;\nimport org.neo4j.graphdb.factory.GraphDatabaseFactory;\nimport org.neo4j.kernel.impl.util.FileUtils;\nimport org.neo4j.neode.Dataset;\nimport org.neo4j.neode.DatasetManager;\nimport org.neo4j.neode.NodeCollection;\nimport org.neo4j.neode.NodeSpecification;\nimport org.neo4j.neode.logging.SysOutLog;\nimport org.neo4j.neode.properties.Property;\nimport org.neo4j.neode.statistics.AsciiDocFormatter;\nimport org.neo4j.neode.statistics.GraphStatistics;\n\nimport static org.neo4j.neode.Range.exactly;\nimport static org.neo4j.neode.Range.minMax;\nimport static org.neo4j.neode.TargetNodesStrategy.create;\nimport static org.neo4j.neode.TargetNodesStrategy.getOrCreate;\nimport static org.neo4j.neode.properties.Property.indexableProperty;\n\npublic class Logistics\n{\n    @Test\n    public void buildLogistics() throws Exception\n    {\n        File dir = new File( LogisticsConfig.STORE_DIR );\n        FileUtils.deleteRecursively( dir );\n\n        GraphDatabaseService db = new GraphDatabaseFactory()\n                .newEmbeddedDatabaseBuilder( LogisticsConfig.STORE_DIR )\n                .setConfig( DbUtils.dbConfig() )\n                .newGraphDatabase();\n        DatasetManager dsm = new DatasetManager( db, SysOutLog.INSTANCE );\n\n        NodeSpecification parcelCentreSpec = dsm.nodeSpecification( \"ParcelCentre\",\n                indexableProperty( db, \"ParcelCentre\", \"name\", \"Location\" ) );\n        NodeSpecification deliveryBaseSpec = dsm.nodeSpecification( \"DeliveryBase\",\n                indexableProperty( db, \"DeliveryBase\",\"name\", \"Location\" ) );\n        NodeSpecification deliveryAreaSpec = dsm.nodeSpecification( \"DeliveryArea\",\n                indexableProperty( db, \"DeliveryArea\", \"name\", \"Location\" ) );\n        NodeSpecification deliverySegmentSpec = dsm.nodeSpecification( \"DeliverySegment\",\n                indexableProperty( db, \"DeliverySegment\", \"name\", \"Location\" ) );\n\n        Property costProperty = new CostProperty();\n\n        Dataset dataset = dsm.newDataset( LogisticsConfig.TITLE );\n\n        NodeCollection parcelCentres = parcelCentreSpec.create( LogisticsConfig.NUMBER_OF_PARCEL_CENTRES ).update(\n                dataset );\n\n        NodeCollection deliveryBases = parcelCentres.createRelationshipsTo(\n                getOrCreate( deliveryBaseSpec, 400 )\n                        .numberOfTargetNodes( minMax(\n                                LogisticsConfig.MIN_NUMBER_OF_DELIVERY_BASES_PER_PARCEL_CENTRE,\n                                LogisticsConfig.MAX_NUMBER_OF_DELIVERY_BASES_PER_PARCEL_CENTRE ) )\n                        .relationship( dsm.relationshipSpecification( \"CONNECTED_TO\",\n                                new IntervalProperty( 2 ),\n                                costProperty ) )\n                        .relationshipConstraints( exactly( 2 ) ) )\n                .update( dataset );\n\n        NodeCollection deliveryAreas = deliveryBases.createRelationshipsTo(\n                create( deliveryAreaSpec )\n                        .numberOfTargetNodes( minMax(\n                                LogisticsConfig.MIN_NUMBER_OF_DELIVERY_AREAS_PER_DELIVERY_BASE,\n                                LogisticsConfig.MAX_NUMBER_OF_DELIVERY_AREAS_PER_DELIVERY_BASE ) )\n                        .relationship( dsm.relationshipSpecification( \"DELIVERY_ROUTE\",\n                                new IntervalProperty( 3 ),\n                                costProperty ) )\n                        .relationshipConstraints( exactly( 3 ) ) )\n                .update( dataset );\n        deliveryAreas.createRelationshipsTo(\n                create( deliverySegmentSpec )\n                        .numberOfTargetNodes( minMax(\n                                LogisticsConfig.MIN_NUMBER_OF_DELIVERY_SEGMENTS_PER_DELIVERY_AREA,\n                                LogisticsConfig.MAX_NUMBER_OF_DELIVERY_SEGMENTS_PER_DELIVERY_AREA ) )\n                        .relationship( dsm.relationshipSpecification( \"DELIVERY_ROUTE\",\n                                new IntervalProperty( 3 ),\n                                costProperty ) )\n                        .relationshipConstraints( exactly( 3 ) ) )\n                .updateNoReturn( dataset, 1000 );\n\n        dataset.end();\n\n        GraphStatistics.create( db, LogisticsConfig.TITLE )\n                .describeTo( new AsciiDocFormatter( SysOutLog.INSTANCE ) );\n\n        db.shutdown();\n\n    }\n\n    private static class IntervalProperty extends Property\n    {\n        private final int numberOfIntervals;\n        private final SevenDays sevenDays = new SevenDays( LogisticsConfig.START_DATE );\n\n        private Iterator<Interval> intervals;\n        private int counter;\n\n        private IntervalProperty( int numberOfIntervals )\n        {\n            this.numberOfIntervals = numberOfIntervals;\n            this.counter = numberOfIntervals;\n        }\n\n        @Override\n        public void setProperty( PropertyContainer propertyContainer, GraphDatabaseService graphDatabaseService,\n                                 String label, int iteration )\n        {\n            if ( counter++ >= numberOfIntervals )\n            {\n                intervals = sevenDays.calculateIntervals( numberOfIntervals ).iterator();\n                counter = 1;\n            }\n\n            try\n            {\n                Interval nextInterval = intervals.next();\n                propertyContainer.setProperty( \"start_date\", nextInterval.getStartMillis() );\n                propertyContainer.setProperty( \"end_date\", nextInterval.getEndMillis() );\n            }\n            catch ( NoSuchElementException e )\n            {\n                throw new IllegalStateException( String.format( \"counter: %s, numberOfIntervals: %s, iteration: %s\",\n                        counter, numberOfIntervals, iteration ) );\n            }\n        }\n    }\n\n    private static class CostProperty extends Property\n    {\n        private final Random random = new Random();\n\n        @Override\n        public void setProperty( PropertyContainer propertyContainer, GraphDatabaseService graphDatabaseService,\n                                 String s, int i )\n        {\n            propertyContainer.setProperty( \"cost\", random.nextInt( 10 ) + 1 );\n        }\n    }\n}\n"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/SimpleSocialNetwork.java",
    "content": "package org.neo4j.graphdatabases.dataset_builders;\n\nimport java.io.File;\n\nimport org.junit.Test;\n\nimport org.neo4j.graphdatabases.SimpleSocialNetworkConfig;\nimport org.neo4j.graphdatabases.queries.helpers.DbUtils;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.factory.GraphDatabaseFactory;\nimport org.neo4j.kernel.impl.util.FileUtils;\nimport org.neo4j.neode.Dataset;\nimport org.neo4j.neode.DatasetManager;\nimport org.neo4j.neode.NodeCollection;\nimport org.neo4j.neode.NodeSpecification;\nimport org.neo4j.neode.RelationshipSpecification;\nimport org.neo4j.neode.logging.Log;\nimport org.neo4j.neode.logging.SysOutLog;\nimport org.neo4j.neode.statistics.AsciiDocFormatter;\nimport org.neo4j.neode.statistics.GraphStatistics;\n\nimport static org.neo4j.neode.Range.minMax;\nimport static org.neo4j.neode.RelationshipUniqueness.BOTH_DIRECTIONS;\nimport static org.neo4j.neode.TargetNodesStrategy.getExisting;\nimport static org.neo4j.neode.properties.Property.indexableProperty;\n\npublic class SimpleSocialNetwork\n{\n    @Test\n    public void buildSocialNetwork() throws Exception\n    {\n        File dir = new File( SimpleSocialNetworkConfig.STORE_DIR );\n        FileUtils.deleteRecursively( dir );\n\n        GraphDatabaseService db = new GraphDatabaseFactory()\n                .newEmbeddedDatabaseBuilder( SimpleSocialNetworkConfig.STORE_DIR )\n                .setConfig( DbUtils.dbConfig() )\n                .newGraphDatabase();\n        createSampleDataset( db );\n\n        GraphStatistics.create( db, SimpleSocialNetworkConfig.TITLE )\n                .describeTo( new AsciiDocFormatter( SysOutLog.INSTANCE ) );\n\n        db.shutdown();\n    }\n\n    private void createSampleDataset( GraphDatabaseService db )\n    {\n        DatasetManager dsm = new DatasetManager( db, new Log()\n        {\n            @Override\n            public void write( String value )\n            {\n                System.out.println( value );\n            }\n        } );\n\n        NodeSpecification userSpec = dsm.nodeSpecification(\n                \"User\", indexableProperty( db, \"User\", \"name\" ) );\n        RelationshipSpecification friend =\n                dsm.relationshipSpecification( \"FRIEND\" );\n\n        Dataset dataset =\n                dsm.newDataset( \"Simple social network example\" );\n\n        NodeCollection users =\n                userSpec.create( SimpleSocialNetworkConfig.NUMBER_USERS )\n                        .update( dataset );\n\n        users.createRelationshipsTo(\n                getExisting( users )\n                        .numberOfTargetNodes( minMax( SimpleSocialNetworkConfig.MIN_NUMBER_OF_FRIENDS,\n                                SimpleSocialNetworkConfig.MAX_NUMBER_OF_FRIENDS ) )\n                        .relationship( friend )\n                        .relationshipConstraints( BOTH_DIRECTIONS ) )\n                .updateNoReturn( dataset, 20000 );\n\n        dataset.end();\n    }\n}\n"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/SocialNetwork.java",
    "content": "package org.neo4j.graphdatabases.dataset_builders;\n\nimport java.io.File;\n\nimport org.junit.Test;\n\nimport org.neo4j.graphdatabases.SocialNetworkConfig;\nimport org.neo4j.graphdatabases.dataset_builders.properties.DurationOnProjectProperty;\nimport org.neo4j.graphdatabases.dataset_builders.properties.ProjectDurationProperty;\nimport org.neo4j.graphdatabases.dataset_builders.traversers.FindAllColleagues;\nimport org.neo4j.graphdatabases.dataset_builders.traversers.IsCompanyProject;\nimport org.neo4j.graphdatabases.queries.helpers.DbUtils;\nimport org.neo4j.graphdb.Direction;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.factory.GraphDatabaseFactory;\nimport org.neo4j.graphdb.traversal.TraversalDescription;\nimport org.neo4j.kernel.Traversal;\nimport org.neo4j.kernel.Uniqueness;\nimport org.neo4j.kernel.impl.util.FileUtils;\nimport org.neo4j.neode.Dataset;\nimport org.neo4j.neode.DatasetManager;\nimport org.neo4j.neode.NodeCollection;\nimport org.neo4j.neode.NodeSpecification;\nimport org.neo4j.neode.RelationshipSpecification;\nimport org.neo4j.neode.RelationshipUniqueness;\nimport org.neo4j.neode.logging.SysOutLog;\nimport org.neo4j.neode.properties.Property;\nimport org.neo4j.neode.statistics.AsciiDocFormatter;\nimport org.neo4j.neode.statistics.GraphStatistics;\n\nimport static org.neo4j.graphdb.DynamicRelationshipType.withName;\nimport static org.neo4j.neode.GraphQuery.traversal;\nimport static org.neo4j.neode.Range.minMax;\nimport static org.neo4j.neode.TargetNodesStrategy.getExisting;\nimport static org.neo4j.neode.TargetNodesStrategy.getOrCreate;\nimport static org.neo4j.neode.TargetNodesStrategy.queryBasedGetOrCreate;\nimport static org.neo4j.neode.probabilities.ProbabilityDistribution.flatDistribution;\nimport static org.neo4j.neode.probabilities.ProbabilityDistribution.normalDistribution;\nimport static org.neo4j.neode.properties.Property.indexableProperty;\nimport static org.neo4j.neode.properties.Property.property;\n\npublic class SocialNetwork\n{\n    @Test\n    public void buildSocialNetwork() throws Exception\n    {\n        File dir = new File( SocialNetworkConfig.STORE_DIR );\n        FileUtils.deleteRecursively( dir );\n\n        GraphDatabaseService db = new GraphDatabaseFactory()\n                .newEmbeddedDatabaseBuilder( SocialNetworkConfig.STORE_DIR )\n                .setConfig( DbUtils.dbConfig() )\n                .newGraphDatabase();\n        DatasetManager dsm = new DatasetManager( db, SysOutLog.INSTANCE );\n\n        TraversalDescription findCompanyProjects = createFindCompanyProjectsTraversalDescription();\n        Property projectDuration = new ProjectDurationProperty();\n        Property durationOnProject = new DurationOnProjectProperty();\n\n        NodeSpecification userSpec = dsm.nodeSpecification( \"User\", indexableProperty(db, \"User\", \"name\" ) );\n        NodeSpecification topicSpec = dsm.nodeSpecification( \"Topic\", indexableProperty(db, \"Topic\", \"name\" ) );\n        NodeSpecification companySpec = dsm.nodeSpecification( \"Company\", indexableProperty(db, \"company\", \"name\" ) );\n        NodeSpecification projectSpec = dsm.nodeSpecification( \"Project\",\n                property( \"name\" ),\n                projectDuration );\n\n        RelationshipSpecification interested_in = dsm.relationshipSpecification( \"INTERESTED_IN\" );\n        RelationshipSpecification works_for = dsm.relationshipSpecification( \"WORKS_FOR\" );\n        RelationshipSpecification worked_on = dsm.relationshipSpecification( \"WORKED_ON\", durationOnProject );\n        RelationshipSpecification worked_with = dsm.relationshipSpecification( \"WORKED_WITH\" );\n\n        Dataset dataset = dsm.newDataset( \"Social network example\" );\n\n        NodeCollection users = userSpec.create( SocialNetworkConfig.NUMBER_USERS ).update( dataset );\n\n        users.createRelationshipsTo(\n                getOrCreate( topicSpec, SocialNetworkConfig.NUMBER_TOPICS, normalDistribution() )\n                        .numberOfTargetNodes( minMax( 1, 3 ) )\n                        .relationship( interested_in )\n                        .exactlyOneRelationship() )\n                .updateNoReturn( dataset );\n\n        users.createRelationshipsTo(\n                getOrCreate( companySpec, SocialNetworkConfig.NUMBER_COMPANIES, flatDistribution() )\n                        .numberOfTargetNodes( 1 )\n                        .relationship( works_for )\n                        .exactlyOneRelationship() )\n                .updateNoReturn( dataset );\n\n        NodeCollection allProjects = users.createRelationshipsTo(\n                queryBasedGetOrCreate( projectSpec, traversal( findCompanyProjects ), 5.0 )\n                        .numberOfTargetNodes( minMax( 1, 5 ), normalDistribution() )\n                        .relationship( worked_on )\n                        .exactlyOneRelationship() )\n                .update( dataset );\n\n        users.approxPercentage( 30 ).createRelationshipsTo(\n                getExisting( allProjects )\n                        .numberOfTargetNodes( minMax( 1, 2 ), normalDistribution() )\n                        .relationship( worked_on )\n                        .relationshipConstraints( RelationshipUniqueness.BOTH_DIRECTIONS ) )\n                .update( dataset );\n\n        users.createRelationshipsTo(\n                getExisting( new FindAllColleagues() )\n                        .numberOfTargetNodes( 1 )\n                        .relationship( worked_with )\n                        .exactlyOneRelationship() )\n                .updateNoReturn( dataset, 5000 );\n\n\n        dataset.end();\n\n        GraphStatistics.create( db, SocialNetworkConfig.TITLE ).describeTo(\n                new AsciiDocFormatter( SysOutLog.INSTANCE ) );\n\n        db.shutdown();\n    }\n\n    private TraversalDescription createFindCompanyProjectsTraversalDescription()\n    {\n        return Traversal.description()\n                .depthFirst()\n                .uniqueness( Uniqueness.NODE_GLOBAL )\n                .relationships( withName( \"WORKS_FOR\" ), Direction.BOTH )\n                .relationships( withName( \"WORKED_ON\" ), Direction.OUTGOING )\n                .evaluator( new IsCompanyProject() );\n    }\n}\n"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/helpers/SevenDays.java",
    "content": "package org.neo4j.graphdatabases.dataset_builders.helpers;\n\nimport static java.util.Arrays.asList;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Random;\n\nimport org.joda.time.DateTime;\nimport org.joda.time.Interval;\n\npublic class SevenDays\n{\n    private final DateTime start;\n    private final Random random;\n\n    @SuppressWarnings( \"unchecked\" )\n    private static final List<List<Integer>> days = asList(\n            asList( 1, 1, 5 ),\n            asList( 1, 2, 4 ),\n            asList( 1, 3, 3 ),\n            asList( 2, 2, 3 ) );\n\n    public SevenDays( DateTime start )\n    {\n        this.start = start;\n        this.random = new Random();\n    }\n\n    public Iterable<Interval> calculateIntervals( int numberOfIntervals )\n    {\n        if ( numberOfIntervals < 1 || numberOfIntervals > 3 )\n        {\n            throw new IllegalArgumentException( \"numberOfIntervals must be 1 or 3\" );\n        }\n\n        List<Interval> intervals = new ArrayList<Interval>();\n\n        if ( numberOfIntervals == 1 )\n        {\n            intervals.add( new Interval( start, start.plusDays( 7 ) ) );\n        }\n        else if ( numberOfIntervals == 2 )\n        {\n            int numberOfDays = random.nextInt( 6 ) + 1;\n            DateTime mid = start.plusDays( numberOfDays );\n            intervals.add( new Interval( start, mid ) );\n            intervals.add( new Interval( mid, start.plusDays( 7 ) ) );\n        }\n        else\n        {\n            int i = random.nextInt( days.size() );\n            List<Integer> plusDays = days.get( i );\n            Collections.shuffle( plusDays, random );\n\n            DateTime mid1 = start.plusDays( plusDays.get( 0 ) );\n            DateTime mid2 = mid1.plusDays( plusDays.get( 1 ) );\n\n            intervals.add( new Interval( start, mid1 ) );\n            intervals.add( new Interval( mid1, mid2 ) );\n            intervals.add( new Interval( mid2, start.plusDays( 7 ) ) );\n        }\n\n        return intervals;\n    }\n\n}\n"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/properties/DurationOnProjectProperty.java",
    "content": "package org.neo4j.graphdatabases.dataset_builders.properties;\n\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.Node;\nimport org.neo4j.graphdb.PropertyContainer;\nimport org.neo4j.graphdb.Relationship;\nimport org.neo4j.neode.properties.Property;\n\npublic class DurationOnProjectProperty extends Property\n{\n    @Override\n    public void setProperty( PropertyContainer propertyContainer, GraphDatabaseService graphDatabaseService,\n                             String s, int i )\n    {\n        Node endNode = ((Relationship) propertyContainer).getEndNode();\n\n        Long startDateTime = (Long) endNode.getProperty( \"start_date\" );\n        Long endDateTime = (Long) endNode.getProperty( \"end_date\" );\n        ProjectDuration projectDuration = new ProjectDuration( startDateTime, endDateTime );\n        ProjectDuration durationOnProject = projectDuration.getSubDuration();\n\n        propertyContainer.setProperty( \"duration\", durationOnProject.toString() );\n        propertyContainer.setProperty( \"start_date\", durationOnProject.getStartDateMs() );\n        propertyContainer.setProperty( \"end_date\", durationOnProject.getEndDateMs() );\n    }\n}\n"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/properties/ProjectDuration.java",
    "content": "package org.neo4j.graphdatabases.dataset_builders.properties;\n\nimport static org.neo4j.neode.Range.minMax;\nimport static org.neo4j.neode.probabilities.ProbabilityDistribution.normalDistribution;\n\nimport org.joda.time.DateTime;\nimport org.joda.time.DateTimeZone;\nimport org.joda.time.Duration;\nimport org.joda.time.format.DateTimeFormat;\nimport org.joda.time.format.DateTimeFormatter;\nimport org.neo4j.neode.probabilities.ProbabilityDistribution;\n\npublic class ProjectDuration\n{\n    private static final ProbabilityDistribution normalDistribution = normalDistribution();\n    private static final DateTimeFormatter fmt = DateTimeFormat.forPattern( \"dd-MM-yyyy\" );\n\n    private final Long startMs;\n    private final Long endMs;\n\n    public ProjectDuration( Long startMs, Long endMs )\n    {\n        this.endMs = endMs;\n        this.startMs = startMs;\n    }\n\n    public Long getStartDateMs()\n    {\n        return startMs;\n    }\n\n    public Long getEndDateMs()\n    {\n        return endMs;\n    }\n\n    public ProjectDuration getSubDuration()\n    {\n        DateTime startDateTime = new DateTime( startMs, DateTimeZone.UTC );\n        DateTime endDateTime = new DateTime( endMs, DateTimeZone.UTC );\n\n        int durationInDays = (int) new Duration( startDateTime, endDateTime ).getStandardDays();\n        int offsetDaysFromStart = normalDistribution.generateSingle( minMax( 0, (int) (durationInDays * 0.75) ) );\n        int remainingDays = durationInDays - offsetDaysFromStart;\n        int subDurationInDays = (int) ((remainingDays * 0.75) +\n                (normalDistribution.generateSingle( minMax( 0, (int) (remainingDays * (0.25)) ) )));\n\n        DateTime subDurationStartDateTime = startDateTime.plusDays( offsetDaysFromStart );\n        DateTime subDurationEndDateTime = subDurationStartDateTime.plusDays( subDurationInDays );\n\n        return new ProjectDuration( subDurationStartDateTime.getMillis(), subDurationEndDateTime.getMillis() );\n    }\n\n    public String toString()\n    {\n        return \"Start: \" + new DateTime( startMs, DateTimeZone.UTC ).toString( fmt )\n                + \", End : \" + new DateTime( endMs, DateTimeZone.UTC ).toString( fmt );\n    }\n}\n"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/properties/ProjectDurationGenerator.java",
    "content": "package org.neo4j.graphdatabases.dataset_builders.properties;\n\nimport java.util.Random;\n\nimport org.joda.time.DateTime;\nimport org.joda.time.DateTimeZone;\n\npublic class ProjectDurationGenerator\n{\n    private final static DateTime durationLowerLimit = new DateTime(2000, 1, 1, 0, 0, DateTimeZone.UTC);\n    private final Random rand = new Random();\n\n    public ProjectDuration getNextProjectDuration()\n    {\n        DateTime startDateTime = durationLowerLimit.plusMonths( rand.nextInt( 9 *12 ) );\n        DateTime endDateTime = startDateTime.plusMonths( 3 + (rand.nextInt(33)) ) ;\n        return new ProjectDuration( startDateTime.getMillis(), endDateTime.getMillis() );\n    }\n}\n"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/properties/ProjectDurationProperty.java",
    "content": "package org.neo4j.graphdatabases.dataset_builders.properties;\n\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.PropertyContainer;\nimport org.neo4j.neode.properties.Property;\n\npublic class ProjectDurationProperty extends Property\n{\n    private final ProjectDurationGenerator generator = new ProjectDurationGenerator();\n\n    @Override\n    public void setProperty( PropertyContainer propertyContainer, GraphDatabaseService graphDatabaseService,\n                             String s, int i )\n    {\n        ProjectDuration projectDuration = generator.getNextProjectDuration();\n        propertyContainer.setProperty( \"duration\", projectDuration.toString() );\n        propertyContainer.setProperty( \"start_date\", projectDuration.getStartDateMs() );\n        propertyContainer.setProperty( \"end_date\", projectDuration.getEndDateMs() );\n    }\n}\n"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/traversers/FindAllColleagues.java",
    "content": "package org.neo4j.graphdatabases.dataset_builders.traversers;\n\nimport static org.neo4j.graphdb.DynamicRelationshipType.withName;\n\nimport org.neo4j.graphalgo.GraphAlgoFactory;\nimport org.neo4j.graphalgo.PathFinder;\nimport org.neo4j.graphdb.Direction;\nimport org.neo4j.graphdb.Node;\nimport org.neo4j.graphdb.Path;\nimport org.neo4j.graphdb.PathExpander;\nimport org.neo4j.graphdb.Relationship;\nimport org.neo4j.graphdb.RelationshipExpander;\nimport org.neo4j.graphdb.RelationshipType;\nimport org.neo4j.graphdb.traversal.BranchState;\nimport org.neo4j.graphdb.traversal.Evaluation;\nimport org.neo4j.graphdb.traversal.Evaluator;\nimport org.neo4j.graphdb.traversal.TraversalDescription;\nimport org.neo4j.kernel.Traversal;\nimport org.neo4j.kernel.Uniqueness;\nimport org.neo4j.neode.GraphQuery;\n\npublic class FindAllColleagues extends GraphQuery\n{\n    private static final RelationshipType WORKED_ON = withName( \"WORKED_ON\" );\n    private static PathFinder<Path> workedWithPathFinder = GraphAlgoFactory.shortestPath( Traversal.expanderForTypes( withName( \"WORKED_WITH\" )), 1 );\n    private static final TraversalDescription traversal = Traversal.description()\n            .depthFirst()\n            .uniqueness( Uniqueness.NODE_GLOBAL )\n            .expand( new WorkOnPathExpander() )\n            .evaluator( new Evaluator()\n            {\n                @Override\n                public Evaluation evaluate( Path path )\n                {\n                    if ( path.length() == 2 )\n                    {\n                        if ( workedWithPathFinder.findSinglePath( path.startNode(), path.endNode() ) == null)\n                        {\n                            return Evaluation.INCLUDE_AND_PRUNE;\n                        }\n                        else\n                        {\n                            return Evaluation.EXCLUDE_AND_PRUNE;\n                        }\n                    }\n                    return Evaluation.EXCLUDE_AND_CONTINUE;\n                }\n            } );\n\n    @Override\n    public Iterable<Node> execute( Node node )\n    {\n        return traversal.traverse( node ).nodes();\n    }\n\n    private static class WorkOnPathExpander implements PathExpander<Object>\n    {\n        @Override\n        public Iterable<Relationship> expand( Path path, BranchState<Object> branchState )\n        {\n            if (path.length() == 0)\n            {\n                return path.endNode().getRelationships( WORKED_ON, Direction.OUTGOING );\n            }\n            else\n            {\n                return path.endNode().getRelationships( WORKED_ON, Direction.INCOMING );\n            }\n        }\n\n        @Override\n        public PathExpander<Object> reverse()\n        {\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/traversers/FindColleagues.java",
    "content": "package org.neo4j.graphdatabases.dataset_builders.traversers;\n\nimport static org.neo4j.graphdb.DynamicRelationshipType.withName;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.joda.time.Duration;\nimport org.joda.time.Interval;\nimport org.joda.time.Period;\nimport org.neo4j.graphdb.Direction;\nimport org.neo4j.graphdb.DynamicRelationshipType;\nimport org.neo4j.graphdb.Node;\nimport org.neo4j.graphdb.Path;\nimport org.neo4j.graphdb.PathExpander;\nimport org.neo4j.graphdb.Relationship;\nimport org.neo4j.graphdb.traversal.BranchState;\nimport org.neo4j.graphdb.traversal.Evaluation;\nimport org.neo4j.graphdb.traversal.Evaluator;\nimport org.neo4j.graphdb.traversal.TraversalDescription;\nimport org.neo4j.kernel.Traversal;\nimport org.neo4j.kernel.Uniqueness;\nimport org.neo4j.neode.GraphQuery;\n\npublic class FindColleagues extends GraphQuery\n{\n    private static final TraversalDescription traversal = Traversal.description()\n            .depthFirst()\n            .uniqueness( Uniqueness.NODE_GLOBAL )\n            .relationships( withName( \"WORKED_ON\" ), Direction.BOTH )\n            .expand( new OverlappingWorkedOnRels() )\n            .evaluator( new IsColleague() );\n\n    @Override\n    public Iterable<Node> execute( Node node )\n    {\n        return traversal.traverse( node ).nodes();\n    }\n\n    private static class IsColleague implements Evaluator\n    {\n        @Override\n        public Evaluation evaluate( Path path )\n        {\n            if ( path.length() == 2 )\n            {\n                return Evaluation.INCLUDE_AND_PRUNE;\n            }\n\n            return Evaluation.EXCLUDE_AND_CONTINUE;\n        }\n    }\n\n    private static class OverlappingWorkedOnRels implements PathExpander<Interval>\n    {\n        private static final DynamicRelationshipType WORKED_ON = withName( \"WORKED_ON\" );\n        private static final Duration ONE_YEAR = new Period( 0, 0, 0, 365, 0, 0, 0, 0 ).toStandardDuration();\n\n\n        @Override\n        public Iterable<Relationship> expand( Path path, BranchState<Interval> branchState )\n        {\n\n            if ( path.length() == 1 )\n            {\n                List<Relationship> rels = new ArrayList<Relationship>();\n\n\n                Long start_date = (Long) path.lastRelationship().getProperty( \"start_date\" );\n                Long end_date = (Long) path.lastRelationship().getProperty( \"end_date\" );\n                Interval interval = new Interval( start_date, end_date );\n\n\n                for ( Relationship rel : path.endNode().getRelationships( WORKED_ON, Direction.INCOMING ) )\n                {\n                    if ( !rel.equals( path.lastRelationship() ) )\n                    {\n                        Long rel_start_date = (Long) rel.getProperty( \"start_date\" );\n                        Long rel_end_date = (Long) rel.getProperty( \"end_date\" );\n                        Interval rel_interval = new Interval( rel_start_date, rel_end_date );\n\n                        if ( intervalsOverlapByDuration( interval, rel_interval ) )\n                        {\n                            rels.add( rel );\n                        }\n                    }\n                }\n\n                return rels;\n            }\n\n            return path.endNode().getRelationships( WORKED_ON, Direction.OUTGOING );\n\n        }\n\n        @Override\n        public PathExpander<Interval> reverse()\n        {\n            return null;\n        }\n\n        private boolean intervalsOverlapByDuration( Interval myInterval, Interval otherInterval )\n        {\n            return otherInterval.overlaps( myInterval ) &&\n                    otherInterval.overlap( myInterval ).toDuration().compareTo( ONE_YEAR ) > 0;\n        }\n    }\n\n}\n"
  },
  {
    "path": "data-generation/src/test/java/org/neo4j/graphdatabases/dataset_builders/traversers/IsCompanyProject.java",
    "content": "package org.neo4j.graphdatabases.dataset_builders.traversers;\n\nimport static org.neo4j.graphdb.DynamicRelationshipType.withName;\n\nimport org.neo4j.graphdb.Path;\nimport org.neo4j.graphdb.RelationshipType;\nimport org.neo4j.graphdb.traversal.Evaluation;\nimport org.neo4j.graphdb.traversal.Evaluator;\n\npublic class IsCompanyProject implements Evaluator\n{\n    private static final RelationshipType WORKED_ON = withName( \"WORKED_ON\" );\n\n    @Override\n    public Evaluation evaluate( Path path )\n    {\n        if ( path.length() == 0 )\n        {\n            return Evaluation.EXCLUDE_AND_CONTINUE;\n        }\n        if ( path.lastRelationship().isType( WORKED_ON ) )\n        {\n            return Evaluation.INCLUDE_AND_PRUNE;\n        }\n        return Evaluation.EXCLUDE_AND_CONTINUE;\n    }\n}\n"
  },
  {
    "path": "performance-testing/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>org.neo4j.graphdatabases</groupId>\n    <artifactId>performance-testing</artifactId>\n    <version>2.0-SNAPSHOT</version>\n    <packaging>jar</packaging>\n\n    <properties>\n        <maven.compiler.source>1.7</maven.compiler.source>\n        <maven.compiler.target>1.7</maven.compiler.target>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <neo4j.version>2.0.1</neo4j.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.neo4j</groupId>\n            <artifactId>neo4j-enterprise</artifactId>\n            <version>${neo4j.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.neo4j.graphdatabases</groupId>\n            <artifactId>queries</artifactId>\n            <version>2.0-SNAPSHOT</version>\n        </dependency>\n        <dependency>\n            <groupId>org.neo4j.graphdatabases</groupId>\n            <artifactId>configuration</artifactId>\n            <version>2.0-SNAPSHOT</version>\n        </dependency>\n        <dependency>\n            <groupId>neode</groupId>\n            <artifactId>neode</artifactId>\n            <version>2.0</version>\n        </dependency>\n        <dependency>\n            <artifactId>junit</artifactId>\n            <groupId>junit</groupId>\n            <version>4.11</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/DefaultExecutionEngineWrapper.java",
    "content": "package org.neo4j.graphdatabases.performance_tests.testing;\n\nimport java.util.Map;\n\nimport org.neo4j.cypher.javacompat.ExecutionEngine;\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.queries.helpers.ExecutionEngineWrapper;\nimport org.neo4j.graphdb.GraphDatabaseService;\n\npublic class DefaultExecutionEngineWrapper implements ExecutionEngineWrapper\n{\n    private final ExecutionEngine executionEngine;\n\n    public DefaultExecutionEngineWrapper( GraphDatabaseService db )\n    {\n        this.executionEngine = new ExecutionEngine( db );\n    }\n\n    @Override\n    public ExecutionResult execute( String query, Map<String, Object> params )\n    {\n        return executionEngine.execute( query, params );\n    }\n\n    @Override\n    public ExecutionResult execute( String query, Map<String, Object> params, int index )\n    {\n        return execute( query, params );\n    }\n}\n"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/DoNothingWithTestResults.java",
    "content": "package org.neo4j.graphdatabases.performance_tests.testing;\n\nimport org.neo4j.graphdatabases.queries.testing.TestOutputWriter;\n\npublic class DoNothingWithTestResults implements TestResultsHandler\n{\n    public static TestResultsHandler doNothing()\n    {\n        return new DoNothingWithTestResults();\n    }\n\n    @Override\n    public void handle( String queryType, Object results, SingleTestRunResultHandler singleTestRunResultHandler )\n    {\n        //Do nothing\n    }\n\n    @Override\n    public void writeTo( TestOutputWriter writer )\n    {\n        // Do nothing\n    }\n\n}\n"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/MultipleTestRuns.java",
    "content": "package org.neo4j.graphdatabases.performance_tests.testing;\n\nimport static org.neo4j.neode.Range.minMax;\nimport static org.neo4j.neode.probabilities.ProbabilityDistribution.flatDistribution;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.neo4j.graphdatabases.queries.testing.TestOutputWriter;\n\npublic class MultipleTestRuns\n{\n    private final int numberOfRuns;\n    private final TestOutputWriter writer;\n\n    public MultipleTestRuns( int numberOfRuns, TestOutputWriter writer )\n    {\n        this.numberOfRuns = numberOfRuns;\n        this.writer = writer;\n    }\n\n    public void execute( String title,\n                         ParamsGenerator paramsGenerator,\n                         SingleTestRunResultHandlerFactory singleTestRunResultHandlerFactory,\n                         TestResultsHandler testResultsHandler,\n                         SingleTest... tests )\n    {\n        writer.writeln( title );\n        testResultsHandler.writeTo( writer );\n\n        Map<String, Long> totalTimes = new HashMap<String, Long>();\n        for ( SingleTest singleTest : tests )\n        {\n            totalTimes.put( singleTest.queryType(), 0L );\n        }\n\n        for ( long i = 0; i < numberOfRuns; i++ )\n        {\n            SingleTestRunResultHandler singleTestRunResultHandler = singleTestRunResultHandlerFactory\n                    .createSingleTestRunResultHandler();\n\n            writer.writeln( String.format( \"\\nTest run %s of %s\", i + 1, numberOfRuns ) );\n            Map<String, String> params = paramsGenerator.generateParams();\n\n            if ( !params.isEmpty() )\n            {\n                writer.write( \"Params: \" );\n            }\n            for ( String key : params.keySet() )\n            {\n                writer.write( String.format( \"[%s: %s] \", key, params.get( key ) ) );\n            }\n\n            writer.writeln( \"\" );\n\n            //Randomize the order in which tests are executed each run\n            List<Integer> testIndexes = flatDistribution()\n                    .generateList( tests.length, minMax( 0, tests.length - 1 ) );\n\n            for ( Integer testIndex : testIndexes )\n            {\n                SingleTest singleTest = tests[testIndex];\n                writer.writeln( String.format( \"\\n  %s\", singleTest.queryType() ) );\n                long startTime = System.nanoTime();\n                Object lastResult = singleTest.execute( params );\n                testResultsHandler.handle( singleTest.queryType(), lastResult, singleTestRunResultHandler );\n                long endTime = System.nanoTime();\n                long duration = endTime - startTime;\n                writer.writeln( String.format( \"  Duration (ms): %s\", duration / 1000000 ) );\n                Long currentTotalTime = totalTimes.get( singleTest.queryType() );\n                totalTimes.put( singleTest.queryType(), currentTotalTime + duration );\n            }\n\n            singleTestRunResultHandler.summarize( writer );\n\n        }\n\n        writer.writeln( \"\\n======================================\" );\n        writer.writeln( title );\n        writer.writeln( \"Average times (ms)\" );\n\n        for ( SingleTest singleTest : tests )\n        {\n            long avgTime = totalTimes.get( singleTest.queryType() ) / numberOfRuns / 1000000;\n            writer.writeln( String.format( \"  %s: %s\", singleTest.queryType(), avgTime ) );\n        }\n        writer.writeln( \"======================================\" );\n    }\n\n    public void execute( String title,\n                         ParamsGenerator paramsGenerator,\n                         TestResultsHandler testResultsHandler,\n                         SingleTest... tests )\n    {\n        execute( title, paramsGenerator, new NullSingleTestRunResultHandlerFactory(), testResultsHandler, tests );\n    }\n\n    private static class NullSingleTestRunResultHandler implements SingleTestRunResultHandler\n    {\n        @Override\n        public void handle( String queryType, String formattedResult )\n        {\n            // Do nothing\n        }\n\n        @Override\n        public void summarize( TestOutputWriter writer )\n        {\n            // Do nothing\n        }\n    }\n\n    private static class NullSingleTestRunResultHandlerFactory implements SingleTestRunResultHandlerFactory\n    {\n        private final  SingleTestRunResultHandler instance = new NullSingleTestRunResultHandler();\n\n        @Override\n        public SingleTestRunResultHandler createSingleTestRunResultHandler()\n        {\n            return instance;\n        }\n    }\n}\n"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/ParamsGenerator.java",
    "content": "/*\n * Copyright (C) 2012 Neo Technology\n * All rights reserved\n */\npackage org.neo4j.graphdatabases.performance_tests.testing;\n\nimport java.util.Map;\n\npublic interface ParamsGenerator\n{\n    Map<String, String> generateParams();\n}\n"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/PrintTestResults.java",
    "content": "package org.neo4j.graphdatabases.performance_tests.testing;\n\nimport java.util.Iterator;\n\nimport org.neo4j.graphdatabases.queries.testing.TestOutputWriter;\n\npublic class PrintTestResults implements TestResultsHandler\n{\n    private static ResultFormatter DEFAULT_FORMATTER = new ResultFormatter()\n    {\n        @Override\n        public String format( Object result )\n        {\n            return result.toString();\n        }\n    };\n\n    public static TestResultsHandler printResults( int numberOfResults, ResultFormatter resultFormatter,\n                                                     TestOutputWriter writer )\n    {\n        return new PrintTestResults( numberOfResults, resultFormatter, writer );\n    }\n\n    public static TestResultsHandler printResults( int numberOfResults, TestOutputWriter writer )\n    {\n        return new PrintTestResults( numberOfResults, DEFAULT_FORMATTER, writer );\n    }\n\n    private final int numberOfResults;\n    private final ResultFormatter resultFormatter;\n    private final TestOutputWriter writer;\n\n    private PrintTestResults( int numberOfResults, ResultFormatter resultFormatter, TestOutputWriter writer )\n    {\n        this.numberOfResults = numberOfResults;\n        this.resultFormatter = resultFormatter;\n        this.writer = writer;\n    }\n\n    @Override\n    public void handle( String queryType, Object results, SingleTestRunResultHandler singleTestRunResultHandler )\n    {\n        if ( Iterable.class.isAssignableFrom( results.getClass() ) )\n        {\n            Iterator iterator = ((Iterable) results).iterator();\n            int count = 0;\n\n            if ( !iterator.hasNext() )\n            {\n                writer.write( \" {EMPTY}\" );\n            }\n            else\n            {\n                while ( iterator.hasNext() && count < numberOfResults )\n                {\n                    String formattedResult = resultFormatter.format( iterator.next() );\n                    singleTestRunResultHandler.handle( queryType, formattedResult );\n                    writer.writeln( String.format( \"     [%s]\", formattedResult ) );\n                    count++;\n                }\n                writer.writeln(\"\");\n                writer.writeln(String.format( \"     Total: %s\", count ) );\n                writer.writeln(\"\");\n            }\n        }\n        else\n        {\n            String formattedResult = resultFormatter.format( results );\n            singleTestRunResultHandler.handle( queryType, formattedResult );\n            writer.writeln( formattedResult );\n        }\n    }\n\n    @Override\n    public void writeTo( TestOutputWriter writer )\n    {\n        writer.writeln( String.format( \"NUMBER_OF_RESULTS: %s\", numberOfResults ) );\n    }\n\n}\n"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/QueryType.java",
    "content": "/*\n * Copyright (C) 2012 Neo Technology\n * All rights reserved\n */\npackage org.neo4j.graphdatabases.performance_tests.testing;\n\npublic enum QueryType\n{\n    CoreAPI,\n    Cypher,\n    AltCypher,\n    Gremlin,\n    Traversal,\n    GraphAlgo\n}\n"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/ResultFormatter.java",
    "content": "/*\n * Copyright (C) 2012 Neo Technology\n * All rights reserved\n */\npackage org.neo4j.graphdatabases.performance_tests.testing;\n\npublic interface ResultFormatter\n{\n    String format(Object result);\n}\n"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/ResultsContainSameElementsUnordered.java",
    "content": "package org.neo4j.graphdatabases.performance_tests.testing;\n\nimport static java.util.Arrays.asList;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.TreeMap;\n\nimport org.neo4j.graphdatabases.queries.testing.TestOutputWriter;\n\npublic class ResultsContainSameElementsUnordered implements SingleTestRunResultHandler\n{\n    public static SingleTestRunResultHandlerFactory newFactory(final String... cleanResultRegExes)\n    {\n        return new SingleTestRunResultHandlerFactory()\n        {\n            @Override\n            public SingleTestRunResultHandler createSingleTestRunResultHandler()\n            {\n                return new ResultsContainSameElementsUnordered(cleanResultRegExes);\n            }\n        };\n    }\n\n    private final List<String> cleanResultRegExes;\n    private final Map<String, List<String>> results;\n    private boolean newlineWritten = false;\n\n    public ResultsContainSameElementsUnordered( String... cleanResultRegExes )\n    {\n        this.cleanResultRegExes = asList( cleanResultRegExes );\n        results = new TreeMap<String, List<String>>();\n    }\n\n    @Override\n    public void handle( String queryType, String formattedResult )\n    {\n        if ( !results.containsKey( queryType ) )\n        {\n            results.put( queryType, new ArrayList<String>() );\n        }\n\n        for ( String cleanResultRegEx : cleanResultRegExes )\n        {\n            formattedResult = formattedResult.replaceAll( cleanResultRegEx, \"\" );\n        }\n\n        results.get( queryType ).add( formattedResult );\n    }\n\n    @Override\n    public void summarize( TestOutputWriter writer )\n    {\n        List<String> queryTypes = new ArrayList<String>( results.keySet() );\n        for ( int i = 0; i < queryTypes.size() - 1; i++ )\n        {\n            String queryType1 = queryTypes.get( i );\n            for ( int j = i + 1; j < queryTypes.size(); j++ )\n            {\n                String queryType2 = queryTypes.get( j );\n                compareCollections( queryType1, results.get( queryType1 ), queryType2, results.get( queryType2 ),\n                        writer );\n            }\n        }\n    }\n\n    private void compareCollections( String queryType1, Collection<String> results1, String queryType2,\n                                     Collection<String> results2, TestOutputWriter writer )\n    {\n        compare( queryType1, results1, queryType2, results2, writer );\n        compare( queryType2, results2, queryType1, results1, writer );\n    }\n\n    private void compare( String queryType1, Collection<String> results1, String queryType2,\n                          Collection<String> results2, TestOutputWriter writer )\n    {\n        Collection<String> copyOfResults1 = new HashSet<String>( results1 );\n        copyOfResults1.removeAll( results2 );\n        if ( !copyOfResults1.isEmpty() )\n        {\n            if (!newlineWritten)\n            {\n                writer.writeln( \"\" );\n                newlineWritten = true;\n            }\n\n            writer.writeln( String.format( \"   %s v. %s: %s contains additional elements: %s\", queryType1, queryType2,\n                    queryType1, copyOfResults1 ) );\n\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/SingleTest.java",
    "content": "/*\n * Copyright (C) 2012 Neo Technology\n * All rights reserved\n */\npackage org.neo4j.graphdatabases.performance_tests.testing;\n\nimport java.util.Map;\n\npublic interface SingleTest\n{\n    String queryType();\n    Object execute( Map<String, String> params );\n}\n"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/SingleTestRunResultHandler.java",
    "content": "/*\n * Copyright (C) 2012 Neo Technology\n * All rights reserved\n */\npackage org.neo4j.graphdatabases.performance_tests.testing;\n\nimport org.neo4j.graphdatabases.queries.testing.TestOutputWriter;\n\npublic interface SingleTestRunResultHandler\n{\n    void handle( String queryType, String formattedResult );\n    void summarize( TestOutputWriter writer );\n}\n"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/SingleTestRunResultHandlerFactory.java",
    "content": "/*\n * Copyright (C) 2012 Neo Technology\n * All rights reserved\n */\npackage org.neo4j.graphdatabases.performance_tests.testing;\n\npublic interface SingleTestRunResultHandlerFactory\n{\n    SingleTestRunResultHandler createSingleTestRunResultHandler();\n}\n"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/SysOutWriter.java",
    "content": "package org.neo4j.graphdatabases.performance_tests.testing;\n\nimport org.neo4j.graphdatabases.queries.testing.TestOutputWriter;\n\npublic class SysOutWriter implements TestOutputWriter\n{\n    public static final TestOutputWriter INSTANCE = new SysOutWriter();\n\n    private SysOutWriter(){}\n\n    @Override\n    public void begin()\n    {\n    }\n\n    @Override\n    public void write( String value )\n    {\n        System.out.print(value);\n    }\n\n    @Override\n    public void writeln( String value )\n    {\n        System.out.println( value );\n    }\n\n    @Override\n    public void flush()\n    {\n    }\n\n    @Override\n    public void end()\n    {\n    }\n}\n"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/TakeXTestResults.java",
    "content": "package org.neo4j.graphdatabases.performance_tests.testing;\n\n\nimport java.util.Iterator;\n\nimport org.neo4j.graphdatabases.queries.testing.TestOutputWriter;\n\npublic class TakeXTestResults implements TestResultsHandler\n{\n    public static TestResultsHandler take( int quantity )\n    {\n        return new TakeXTestResults( quantity );\n    }\n\n    private final int quantity;\n\n    public TakeXTestResults( int quantity )\n    {\n        this.quantity = quantity;\n    }\n\n    @Override\n    public void handle( String queryType, Object results, SingleTestRunResultHandler singleTestRunResultHandler )\n    {\n        int i = 0;\n        if ( Iterable.class.isAssignableFrom( results.getClass() ) )\n        {\n            Iterator iterator = ((Iterable) results).iterator();\n            while ( iterator.hasNext() && ++i < quantity )\n            {\n                iterator.next();\n            }\n        }\n    }\n\n    @Override\n    public void writeTo( TestOutputWriter writer )\n    {\n        writer.writeln( String.format( \"NUMBER_OF_RESULTS: %s\", quantity ) );\n    }\n\n}\n"
  },
  {
    "path": "performance-testing/src/main/java/org/neo4j/graphdatabases/performance_tests/testing/TestResultsHandler.java",
    "content": "/*\n * Copyright (C) 2012 Neo Technology\n * All rights reserved\n */\npackage org.neo4j.graphdatabases.performance_tests.testing;\n\nimport org.neo4j.graphdatabases.queries.testing.TestOutputWriter;\n\npublic interface TestResultsHandler\n{\n    void handle( String queryType, Object results, SingleTestRunResultHandler singleTestRunResultHandler );\n    void writeTo(TestOutputWriter writer);\n}\n"
  },
  {
    "path": "performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/AccessControl.java",
    "content": "package org.neo4j.graphdatabases.performance_tests;\n\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.Map;\nimport java.util.Random;\n\nimport org.junit.AfterClass;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.AccessControlConfig;\nimport org.neo4j.graphdatabases.AccessControlWithRelationshipPropertiesConfig;\nimport org.neo4j.graphdatabases.performance_tests.testing.DefaultExecutionEngineWrapper;\nimport org.neo4j.graphdatabases.performance_tests.testing.MultipleTestRuns;\nimport org.neo4j.graphdatabases.performance_tests.testing.ParamsGenerator;\nimport org.neo4j.graphdatabases.performance_tests.testing.SingleTest;\nimport org.neo4j.graphdatabases.performance_tests.testing.SysOutWriter;\nimport org.neo4j.graphdatabases.queries.AccessControlQueries;\nimport org.neo4j.graphdatabases.queries.helpers.DbUtils;\nimport org.neo4j.graphdatabases.queries.testing.TestOutputWriter;\nimport org.neo4j.graphdb.GraphDatabaseService;\n\nimport static org.neo4j.graphdatabases.performance_tests.testing.PrintTestResults.printResults;\n\npublic class AccessControl\n{\n    private static final int NUMBER_OF_TEST_RUNS = 20;\n    private static final int NUMBER_OF_RESULTS = 15;\n\n    private static int numberOfAccounts;\n    private static int numberOfEmployees;\n\n    private static GraphDatabaseService db;\n    private static AccessControlQueries queries;\n    private static MultipleTestRuns multipleTestRuns;\n    private static Random random;\n    private static TestOutputWriter writer = SysOutWriter.INSTANCE;\n\n    @BeforeClass\n    public static void init()\n    {\n        try\n        {\n            db = DbUtils.existingDB( AccessControlConfig.STORE_DIR );\n            queries = new AccessControlQueries( new DefaultExecutionEngineWrapper( db ) );\n            multipleTestRuns = new MultipleTestRuns( NUMBER_OF_TEST_RUNS, writer );\n\n            random = new Random();\n\n            numberOfAccounts = DbUtils.numberOfItemsWithLabel(db, \"Account\");\n            numberOfEmployees = DbUtils.numberOfItemsWithLabel(db, \"Employee\");\n        }\n        catch ( Exception ex )\n        {\n            System.out.println( ex.getMessage() );\n        }\n    }\n\n    @AfterClass\n    public static void teardown()\n    {\n        db.shutdown();\n    }\n\n    @Test\n    public void findAccessibleResources() throws Exception\n    {\n        // when\n        multipleTestRuns.execute( \"Find accessible resources for admin\",\n                createParams(),\n                printResults( NUMBER_OF_RESULTS, writer ),\n                new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"Cypher\";\n                    }\n\n                    @Override\n                    public ExecutionResult execute( Map<String, String> params )\n                    {\n                        return queries.findAccessibleResources( params.get( \"admin\" ) );\n                    }\n                } );\n    }\n\n    @Test\n    public void findAccessibleCompanies() throws Exception\n    {\n        // when\n        multipleTestRuns.execute( \"Find accessible companies for admin\",\n                createParams(),\n                printResults( NUMBER_OF_RESULTS, writer ),\n                new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"Cypher\";\n                    }\n\n                    @Override\n                    public ExecutionResult execute( Map<String, String> params )\n                    {\n                        return queries.findAccessibleCompanies( params.get( \"admin\" ) );\n                    }\n                } );\n    }\n\n    @Test\n    public void findAccessibleAccountsForCompany() throws Exception\n    {\n        // when\n        multipleTestRuns.execute( \"Find accessible accounts for company for admin\",\n                createParams(),\n                printResults( NUMBER_OF_RESULTS, writer ),\n                new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"Cypher\";\n                    }\n\n                    @Override\n                    public ExecutionResult execute( Map<String, String> params )\n                    {\n                        return queries.findAccessibleAccountsForCompany(\n                                params.get( \"admin\" ),\n                                params.get( \"company\" ) );\n                    }\n                } );\n    }\n\n    @Test\n    public void findAdminForCompany() throws Exception\n    {\n        // when\n        multipleTestRuns.execute( \"Find admins for company\",\n                createParams(),\n                printResults( NUMBER_OF_RESULTS, writer ),\n                new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"Cypher\";\n                    }\n\n                    @Override\n                    public ExecutionResult execute( Map<String, String> params )\n                    {\n                        return queries.findAdminForCompany( params.get( \"company\" ) );\n                    }\n                } );\n    }\n\n    @Test\n    public void findAdminForResource() throws Exception\n    {\n        // when\n        multipleTestRuns.execute( \"Find admins for resource\",\n                createParams(),\n                printResults( NUMBER_OF_RESULTS, writer ),\n                new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"Cypher\";\n                    }\n\n                    @Override\n                    public ExecutionResult execute( Map<String, String> params )\n                    {\n                        return queries.findAdminForResource( params.get( \"resource\" ) );\n                    }\n                }\n        );\n    }\n\n    @Test\n    public void hasAccessToResource() throws Exception\n    {\n        // when\n        multipleTestRuns.execute( \"Does admin have access to resource?\",\n                createParams(),\n                printResults( NUMBER_OF_RESULTS, writer ),\n                new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"Cypher (indexed resources)\";\n                    }\n\n                    @Override\n                    public ExecutionResult execute( Map<String, String> params )\n                    {\n                        return queries.hasAccessToIndexedResource( params.get( \"admin\" ), params.get( \"resource\" ) );\n                    }\n                }\n        );\n    }\n\n    @Test\n    public void hasAccessToResourceBakeoff() throws Exception\n    {\n        // when\n        multipleTestRuns.execute( \"Does admin have access to resource?\",\n                createParams(),\n                printResults( NUMBER_OF_RESULTS, writer ),\n                new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"Cypher\";\n                    }\n\n                    @Override\n                    public ExecutionResult execute( Map<String, String> params )\n                    {\n                        return queries.hasAccessToResource( params.get( \"admin\" ), params.get( \"resource\" ) );\n                    }\n                }, new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"Cypher (indexed resources)\";\n                    }\n\n                    @Override\n                    public ExecutionResult execute( Map<String, String> params )\n                    {\n                        return queries.hasAccessToIndexedResource( params.get( \"admin\" ), params.get( \"resource\" ) );\n                    }\n                }\n        );\n    }\n\n    private ParamsGenerator createParams()\n    {\n        return new ParamsGenerator()\n        {\n            @Override\n            public Map<String, String> generateParams()\n            {\n                HashMap<String, String> params = new HashMap<String, String>();\n\n                String adminName = String.format( \"Administrator-%s\",\n                        random.nextInt( AccessControlWithRelationshipPropertiesConfig.NUMBER_OF_ADMINS ) + 1 );\n\n                String resourceName;\n                if ( random.nextInt( 2 ) < 1 )\n                {\n                    resourceName = String.format( \"Account-%s\", random.nextInt( numberOfAccounts ) + 1 );\n                }\n                else\n                {\n                    resourceName = String.format( \"Customer-%s\", random.nextInt( numberOfEmployees ) + 1 );\n                }\n\n                ExecutionResult result = queries.findAccessibleCompanies( adminName );\n                Iterator<Map<String, Object>> iterator = result.iterator();\n                String companyName = (String) iterator.next().get( \"company\" );\n\n                params.put( \"admin\", adminName );\n                params.put( \"company\", companyName );\n                params.put( \"resource\", resourceName );\n\n                return params;\n            }\n        };\n    }\n\n\n}\n\n"
  },
  {
    "path": "performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/AccessControlWithRelationshipProperties.java",
    "content": "package org.neo4j.graphdatabases.performance_tests;\n\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.Map;\nimport java.util.Random;\n\nimport org.junit.AfterClass;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\nimport org.neo4j.graphdatabases.AccessControlWithRelationshipPropertiesConfig;\nimport org.neo4j.graphdatabases.performance_tests.testing.DefaultExecutionEngineWrapper;\nimport org.neo4j.graphdatabases.performance_tests.testing.MultipleTestRuns;\nimport org.neo4j.graphdatabases.performance_tests.testing.ParamsGenerator;\nimport org.neo4j.graphdatabases.performance_tests.testing.SingleTest;\nimport org.neo4j.graphdatabases.performance_tests.testing.SysOutWriter;\nimport org.neo4j.graphdatabases.queries.AccessControlWithRelationshipPropertiesQueries;\nimport org.neo4j.graphdatabases.queries.helpers.DbUtils;\nimport org.neo4j.graphdatabases.queries.helpers.QueryUnionExecutionResult;\nimport org.neo4j.graphdatabases.queries.testing.TestOutputWriter;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.Node;\n\nimport static org.neo4j.graphdatabases.performance_tests.testing.PrintTestResults.printResults;\n\npublic class AccessControlWithRelationshipProperties\n{\n    private static final int NUMBER_OF_TEST_RUNS = 20;\n    private static final int NUMBER_OF_RESULTS = 15;\n\n    private static int numberOfAccounts;\n    private static int numberOfCustomers;\n\n    private static GraphDatabaseService db;\n    private static AccessControlWithRelationshipPropertiesQueries queries;\n    private static MultipleTestRuns multipleTestRuns;\n    private static Random random;\n    private static TestOutputWriter writer = SysOutWriter.INSTANCE;\n\n    @BeforeClass\n    public static void init()\n    {\n        db = DbUtils.existingDB( AccessControlWithRelationshipPropertiesConfig.STORE_DIR );\n\n        queries = new AccessControlWithRelationshipPropertiesQueries( new DefaultExecutionEngineWrapper( db ) );\n        multipleTestRuns = new MultipleTestRuns( NUMBER_OF_TEST_RUNS, writer );\n\n        random = new Random();\n\n        numberOfAccounts = DbUtils.numberOfItemsWithLabel(db, \"Account\");\n        numberOfCustomers = DbUtils.numberOfItemsWithLabel(db, \"Employee\");\n\n    }\n\n    @AfterClass\n    public static void teardown()\n    {\n        db.shutdown();\n    }\n\n    @Test\n    public void findAccessibleResources() throws Exception\n    {\n        // when\n        multipleTestRuns.execute( \"Find accessible resources for admin\",\n                createParams(),\n                printResults( NUMBER_OF_RESULTS, writer ),\n                new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"Cypher\";\n                    }\n\n                    @Override\n                    public QueryUnionExecutionResult execute( Map<String, String> params )\n                    {\n                        return queries.findAccessibleResources( params.get( \"admin\" ) );\n                    }\n                } );\n    }\n\n    @Test\n    public void findAccessibleCompanies() throws Exception\n    {\n        // when\n        multipleTestRuns.execute( \"Find accessible companies for admin\",\n                createParams(),\n                printResults( NUMBER_OF_RESULTS, writer ),\n                new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"Cypher\";\n                    }\n\n                    @Override\n                    public QueryUnionExecutionResult execute( Map<String, String> params )\n                    {\n                        return queries.findAccessibleCompanies( params.get( \"admin\" ) );\n                    }\n                } );\n    }\n\n    @Test\n    public void findAccessibleAccountsForCompany() throws Exception\n    {\n        // when\n        multipleTestRuns.execute( \"Find accessible accounts for company for admin\",\n                createParams(),\n                printResults( NUMBER_OF_RESULTS, writer ),\n                new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"Cypher\";\n                    }\n\n                    @Override\n                    public QueryUnionExecutionResult execute( Map<String, String> params )\n                    {\n                        return queries.findAccessibleAccountsForCompany(\n                                params.get( \"admin\" ),\n                                params.get( \"company\" ) );\n                    }\n                } );\n    }\n\n    @Test\n    public void findAdminForCompany() throws Exception\n    {\n        // when\n        multipleTestRuns.execute( \"Find admins for company\",\n                createParams(),\n                printResults( NUMBER_OF_RESULTS, writer ),\n                new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"Cypher\";\n                    }\n\n                    @Override\n                    public QueryUnionExecutionResult execute( Map<String, String> params )\n                    {\n                        return queries.findAdminForCompany( params.get( \"company\" ) );\n                    }\n                } );\n    }\n\n    @Test\n    public void findAdminForResource() throws Exception\n    {\n        // when\n        multipleTestRuns.execute( \"Find admins for resource\",\n                createParams(),\n                printResults( NUMBER_OF_RESULTS, writer ),\n                new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"Cypher\";\n                    }\n\n                    @Override\n                    public QueryUnionExecutionResult execute( Map<String, String> params )\n                    {\n                        return queries.findAdminForResource( params.get( \"resource\" ) );\n                    }\n                }\n        );\n    }\n\n    @Test\n    public void hasAccessToResource() throws Exception\n    {\n        // when\n        multipleTestRuns.execute( \"Does admin have access to resource?\",\n                createParams(),\n                printResults( NUMBER_OF_RESULTS, writer ),\n                new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"Cypher (indexed resources)\";\n                    }\n\n                    @Override\n                    public QueryUnionExecutionResult execute( Map<String, String> params )\n                    {\n                        return queries.hasAccessToIndexedResource( params.get( \"admin\" ),\n                                params.get( \"resource\" ) );\n                    }\n                }\n        );\n    }\n\n    @Test\n    public void hasAccessToResourceBakeoff() throws Exception\n    {\n        // when\n        multipleTestRuns.execute( \"Does admin have access to resource?\",\n                createParams(),\n                printResults( NUMBER_OF_RESULTS, writer ),\n                new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"Cypher\";\n                    }\n\n                    @Override\n                    public QueryUnionExecutionResult execute( Map<String, String> params )\n                    {\n                        return queries.hasAccessToResource( params.get( \"admin\" ), params.get( \"resource\" ) );\n                    }\n                }, new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"Cypher (indexed resources)\";\n                    }\n\n                    @Override\n                    public QueryUnionExecutionResult execute( Map<String, String> params )\n                    {\n                        return queries.hasAccessToIndexedResource( params.get( \"admin\" ),\n                                params.get( \"resource\" ) );\n                    }\n                }\n        );\n    }\n\n    private ParamsGenerator createParams()\n    {\n        return new ParamsGenerator()\n        {\n            @Override\n            public Map<String, String> generateParams()\n            {\n                HashMap<String, String> params = new HashMap<String, String>();\n\n                String adminName = String.format( \"Administrator-%s\",\n                        random.nextInt( AccessControlWithRelationshipPropertiesConfig.NUMBER_OF_ADMINS ) + 1 );\n\n                String resourceName;\n                if ( random.nextInt( 2 ) < 1 )\n                {\n                    resourceName = String.format( \"Account-%s\", random.nextInt( numberOfAccounts ) + 1 );\n                }\n                else\n                {\n                    resourceName = String.format( \"Customer-%s\", random.nextInt( numberOfCustomers ) + 1 );\n                }\n\n                QueryUnionExecutionResult result = queries.findAccessibleCompanies( adminName );\n                Iterator<Map<String, Object>> iterator = result.iterator();\n                String companyName = ((Node) iterator.next().get( \"company\" )).getProperty( \"name\" ).toString();\n\n                params.put( \"admin\", adminName );\n                params.put( \"company\", companyName );\n                params.put( \"resource\", resourceName );\n\n                return params;\n            }\n        };\n    }\n\n}\n"
  },
  {
    "path": "performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/Logistics.java",
    "content": "package org.neo4j.graphdatabases.performance_tests;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Random;\n\nimport org.joda.time.DateTime;\nimport org.joda.time.Interval;\nimport org.junit.After;\nimport org.junit.AfterClass;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\nimport org.neo4j.cypher.javacompat.ExecutionEngine;\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.LogisticsConfig;\nimport org.neo4j.graphdatabases.performance_tests.testing.DefaultExecutionEngineWrapper;\nimport org.neo4j.graphdatabases.performance_tests.testing.MultipleTestRuns;\nimport org.neo4j.graphdatabases.performance_tests.testing.ParamsGenerator;\nimport org.neo4j.graphdatabases.performance_tests.testing.SingleTest;\nimport org.neo4j.graphdatabases.performance_tests.testing.SysOutWriter;\nimport org.neo4j.graphdatabases.queries.LogisticsQueries;\nimport org.neo4j.graphdatabases.queries.helpers.DbUtils;\nimport org.neo4j.graphdatabases.queries.testing.TestOutputWriter;\nimport org.neo4j.graphdb.DynamicLabel;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.Transaction;\nimport org.neo4j.helpers.collection.IteratorUtil;\nimport org.neo4j.tooling.GlobalGraphOperations;\n\nimport static java.util.Arrays.asList;\n\nimport static org.neo4j.graphdatabases.performance_tests.testing.PrintTestResults.printResults;\n\npublic class Logistics\n{\n    public static final int NUMBER_OF_TEST_RUNS = 20;\n    private static final int NUMBER_OF_RESULTS = 15;\n\n    private static GraphDatabaseService db;\n    private static LogisticsQueries queries;\n    private static MultipleTestRuns multipleTestRuns;\n    private static Random random;\n    private static TestOutputWriter writer = SysOutWriter.INSTANCE;\n\n    @BeforeClass\n    public static void init()\n    {\n        db = DbUtils.existingDB( LogisticsConfig.STORE_DIR );\n\n        queries = new LogisticsQueries( db, new DefaultExecutionEngineWrapper( db ) );\n        multipleTestRuns = new MultipleTestRuns( NUMBER_OF_TEST_RUNS, writer );\n\n        random = new Random();\n\n    }\n\n    @AfterClass\n    public static void teardown()\n    {\n        if ( db != null )\n        {\n            db.shutdown();\n        }\n    }\n\n\n    @Test\n    public void queryTest() throws Exception\n    {\n        List<Integer> customIds = asList( 6053, 210, 6, 56, 8, 87, 2, 95, 9, 256, 7476, 545580 );\n        List<Integer> cypherIds = asList( 6053, 210, 6, 192, 9, 256, 7476, 545580 );\n        Interval interval = Interval.parse( \"2012-10-17T00:00:00.000+01:00/2012-10-18T00:00:00.000+01:00\" );\n\n        getPath( customIds, interval );\n        getPath( cypherIds, interval );\n\n    }\n\n    private void getPath( List<Integer> ids, Interval interval )\n    {\n        StringBuilder sbWhere = new StringBuilder();\n        StringBuilder sbMatch = new StringBuilder();\n\n        for ( int i = 0; i < ids.size(); i++ )\n        {\n            sbWhere.append(\"id(n\");\n            sbWhere.append(i);\n            sbWhere.append(\")=\");\n            sbWhere.append(ids.get(i));\n            if ( i < (ids.size() - 1) )\n            {\n                sbWhere.append(\" AND \");\n            }\n            sbWhere.append(\" \");\n\n            sbMatch.append( \"n\" );\n            sbMatch.append( i );\n            if ( i < (ids.size() - 1) )\n            {\n                sbMatch.append( \"--\" );\n            }\n        }\n\n        String q = String.format(\n                \"MATCH p = %s %n\" +\n                \"WHERE %s AND ALL(r in relationships(p) where r.start_date <= %s and r.end_date >= %s) %n\" +\n                \"RETURN REDUCE(weight=0, r in relationships(p) | weight+r.cost) AS score, p\",\n                sbMatch.toString(),\n                sbWhere.toString(),\n                interval.getStartMillis(),\n                interval.getEndMillis());\n        writer.writeln(q);\n\n\n        ExecutionResult result = new ExecutionEngine( db ).execute( q );\n        writer.writeln(result.toString());\n    }\n\n    @After\n    public void flush()\n    {\n        writer.flush();\n    }\n\n    @Test\n    public void shortestRoute() throws Exception\n    {\n        TestRunParams testRunParams = new TestRunParams( db, writer );\n\n        // when\n        multipleTestRuns.execute( \"Shortest route through the parcel system\",\n                testRunParams.createParams(),\n                printResults( NUMBER_OF_RESULTS, writer ),\n\n                new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"Cypher\";\n                    }\n\n                    @Override\n                    public Object execute( Map<String, String> params )\n                    {\n                        return queries.findShortestPathWithCypherReduce(\n                                params.get( \"start\" ),\n                                params.get( \"end\" ),\n                                Interval.parse( params.get( \"interval\" ) ) );\n\n                    }\n                },\n                new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"ParcelRouteCalculator\";\n                    }\n\n                    @Override\n                    public Object execute( Map<String, String> params )\n                    {\n                        return queries.findShortestPathWithParcelRouteCalculator(\n                                params.get( \"start\" ),\n                                params.get( \"end\" ),\n                                Interval.parse( params.get( \"interval\" ) ) );\n\n                    }\n                }\n        );\n    }\n\n    @Test\n    public void testSingleCypherQuery() throws Exception\n    {\n        Map<String, String> params = new HashMap<String, String>();\n        params.put( \"start\", \"delivery-segment-181622\" );\n        params.put( \"end\", \"delivery-segment-611694\" );\n        params.put( \"interval\", \"2012-10-17T00:00:00.000-07:00/2012-10-18T00:00:00.000-07:00\" );\n\n\n        Interval interval = Interval.parse( params.get( \"interval\" ) );\n        System.out.println( \"Start: \" + interval.getStartMillis() );\n        System.out.println( \"End: \" + interval.getEndMillis() );\n        ExecutionResult result = queries.findShortestPathWithCypherReduce(\n                params.get( \"start\" ),\n                params.get( \"end\" ),\n                interval );\n\n        writer.writeln( result.toString() );\n    }\n\n    private class TestRunParams\n    {\n        private int deliveryAreaCount;\n        private int deliverySegmentCount;\n\n        public TestRunParams( GraphDatabaseService db, TestOutputWriter writer )\n        {\n            GlobalGraphOperations ops = GlobalGraphOperations.at(db);\n            try ( Transaction tx = db.beginTx())\n            {\n                deliveryAreaCount = IteratorUtil.count(ops.getAllNodesWithLabel(DynamicLabel.label(\"DeliveryArea\")));\n                deliverySegmentCount = IteratorUtil.count(ops.getAllNodesWithLabel(DynamicLabel.label(\"DeliverySegment\")));\n\n                writer.writeln( \"deliveryAreaCount \" + deliveryAreaCount );\n                writer.writeln( \"deliverySegmentCount \" + deliverySegmentCount );\n                tx.success();\n            }\n        }\n\n        public ParamsGenerator createParams()\n        {\n            return new ParamsGenerator()\n            {\n                @Override\n                public final Map<String, String> generateParams()\n                {\n                    Map<String, String> params = new HashMap<String, String>();\n                    if ( random.nextInt( 2 ) < 1 )\n                    {\n                        params.put( \"start\",\n                                String.format( \"DeliverySegment-%s\", random.nextInt( deliverySegmentCount ) + 1 ) );\n                    }\n                    else\n                    {\n                        params.put( \"start\",\n                                String.format( \"DeliveryArea-%s\", random.nextInt( deliveryAreaCount ) + 1 ) );\n                    }\n                    params.put( \"end\",\n                            String.format( \"DeliverySegment-%s\", random.nextInt( deliverySegmentCount ) + 1 ) );\n                    DateTime startDtm = LogisticsConfig.START_DATE.plusDays( random.nextInt( 6 ) );\n                    params.put( \"interval\", new Interval( startDtm, startDtm.plusDays( 1 ) ).toString() );\n                    return params;\n                }\n            };\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/SimpleSocialNetwork.java",
    "content": "package org.neo4j.graphdatabases.performance_tests;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Random;\n\nimport org.junit.AfterClass;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.SimpleSocialNetworkConfig;\nimport org.neo4j.graphdatabases.performance_tests.testing.MultipleTestRuns;\nimport org.neo4j.graphdatabases.performance_tests.testing.ParamsGenerator;\nimport org.neo4j.graphdatabases.performance_tests.testing.SingleTest;\nimport org.neo4j.graphdatabases.performance_tests.testing.SysOutWriter;\nimport org.neo4j.graphdatabases.queries.SimpleSocialNetworkQueries;\nimport org.neo4j.graphdatabases.queries.helpers.DbUtils;\nimport org.neo4j.graphdatabases.queries.testing.TestOutputWriter;\nimport org.neo4j.graphdatabases.queries.traversals.FriendOfAFriendDepth4;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.Node;\nimport org.neo4j.graphdb.Transaction;\n\nimport static org.neo4j.graphdatabases.performance_tests.testing.PrintTestResults.printResults;\n\npublic class SimpleSocialNetwork\n{\n    private static GraphDatabaseService db;\n    private static SimpleSocialNetworkQueries queries;\n    private static MultipleTestRuns multipleTestRuns;\n    private static Random random;\n    private static TestOutputWriter writer = SysOutWriter.INSTANCE;\n\n    public static final int NUMBER_OF_TEST_RUNS = 20;\n\n    @BeforeClass\n    public static void init()\n    {\n        db = DbUtils.existingDB( SimpleSocialNetworkConfig.STORE_DIR );\n\n        queries = new SimpleSocialNetworkQueries( db );\n        multipleTestRuns = new MultipleTestRuns( NUMBER_OF_TEST_RUNS, writer );\n\n        random = new Random();\n    }\n\n    @AfterClass\n    public static void teardown()\n    {\n        db.shutdown();\n    }\n\n    @Test\n    public void foafToDepthFour() throws Exception\n    {\n        try ( Transaction tx = db.beginTx() )\n        {\n            // when\n            multipleTestRuns.execute( \"Foaf to depth 4\", createParams(), printResults( 1, writer ), new SingleTest()\n            {\n                @Override\n                public String queryType()\n                {\n                    return \"Cypher\";\n                }\n\n                @Override\n                public ExecutionResult execute( Map<String, String> params )\n                {\n                    return queries.pathBetweenTwoFriends( params.get( \"first-user\" ), params.get( \"second-user\" ) );\n                }\n            } );\n            tx.success();\n        }\n    }\n\n    @Test\n    public void friendOfAFriendToDepth4() throws Exception\n    {\n        try ( Transaction tx = db.beginTx() )\n        {\n            // when\n            multipleTestRuns.execute( \"Friend of a friend to depth 4\", createParams(), printResults( 100, writer ),\n                    new SingleTest()\n                    {\n                        @Override\n                        public String queryType()\n                        {\n                            return \"Cypher\";\n                        }\n\n                        @Override\n                        public ExecutionResult execute( Map<String, String> params )\n                        {\n                            return queries.friendOfAFriendToDepth4( params.get( \"first-user\" ) );\n                        }\n                    } );\n            tx.success();\n        }\n    }\n\n    @Test\n    public void onlyFriendsAtDepth4UsingTraversalFramework() throws Exception\n    {\n        try ( Transaction tx = db.beginTx() )\n        {\n            final FriendOfAFriendDepth4 traversal = new FriendOfAFriendDepth4( db );\n\n            // when\n            multipleTestRuns.execute( \"Only friends at depth 4 using Traversal Framework\", createParams(),\n                    printResults( 300000, writer ),\n                    new SingleTest()\n                    {\n                        @Override\n                        public String queryType()\n                        {\n                            return \"Traversal Framework (custom class)\";\n                        }\n\n                        @Override\n                        public Iterable<Node> execute( Map<String, String> params )\n                        {\n                            return traversal.getFriends( params.get( \"first-user\" ) );\n                        }\n                    } );\n            tx.success();\n        }\n    }\n\n    private ParamsGenerator createParams()\n    {\n        return new ParamsGenerator()\n        {\n            @Override\n            public Map<String, String> generateParams()\n            {\n                Map<String, String> params = new HashMap<String, String>();\n                params.put( \"first-user\", String.format( \"User-%s\", random.nextInt( SimpleSocialNetworkConfig\n                        .NUMBER_USERS\n                ) + 1 ) );\n                params.put( \"second-user\", String.format( \"User-%s\", random.nextInt( SimpleSocialNetworkConfig\n                        .NUMBER_USERS\n                ) + 1 ) );\n                return params;\n            }\n        };\n    }\n}\n"
  },
  {
    "path": "performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/SocialNetwork.java",
    "content": "package org.neo4j.graphdatabases.performance_tests;\n\nimport java.util.Collection;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Random;\n\nimport org.junit.*;\nimport org.junit.rules.TestName;\n\nimport org.neo4j.cypher.javacompat.ExecutionEngine;\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.SocialNetworkConfig;\nimport org.neo4j.graphdatabases.performance_tests.testing.DefaultExecutionEngineWrapper;\nimport org.neo4j.graphdatabases.performance_tests.testing.MultipleTestRuns;\nimport org.neo4j.graphdatabases.performance_tests.testing.ParamsGenerator;\nimport org.neo4j.graphdatabases.performance_tests.testing.ResultFormatter;\nimport org.neo4j.graphdatabases.performance_tests.testing.ResultsContainSameElementsUnordered;\nimport org.neo4j.graphdatabases.performance_tests.testing.SingleTest;\nimport org.neo4j.graphdatabases.performance_tests.testing.SysOutWriter;\nimport org.neo4j.graphdatabases.queries.SocialNetworkQueries;\nimport org.neo4j.graphdatabases.queries.helpers.DbUtils;\nimport org.neo4j.graphdatabases.queries.testing.TestOutputWriter;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.Node;\nimport org.neo4j.graphdb.Transaction;\n\nimport static org.neo4j.graphdatabases.performance_tests.testing.DoNothingWithTestResults.doNothing;\nimport static org.neo4j.graphdatabases.performance_tests.testing.PrintTestResults.printResults;\nimport static org.neo4j.graphdatabases.performance_tests.testing.TakeXTestResults.take;\nimport static org.neo4j.neode.Range.minMax;\nimport static org.neo4j.neode.probabilities.ProbabilityDistribution.flatDistribution;\n\npublic class SocialNetwork\n{\n    public static final int NUMBER_OF_RESULTS = 5;\n    public static final int NUMBER_OF_TEST_RUNS = 20;\n\n    private GraphDatabaseService db;\n    private SocialNetworkQueries queries;\n    private MultipleTestRuns multipleTestRuns;\n    private Random random;\n    private TestOutputWriter writer = SysOutWriter.INSTANCE;\n\n    @Rule\n    public TestName name = new TestName();\n\n    @Before\n    public void init()\n    {\n        db = DbUtils.existingDB( SocialNetworkConfig.STORE_DIR );\n\n        queries = new SocialNetworkQueries( db, new DefaultExecutionEngineWrapper( db ) );\n        multipleTestRuns = new MultipleTestRuns( NUMBER_OF_TEST_RUNS, writer );\n\n        random = new Random();\n    }\n\n    @After\n    public void teardown()\n    {\n        db.shutdown();\n        writer.flush();\n    }\n\n    @Test\n    public void sharedInterestsSameCompany() throws Exception\n    {\n        // when\n        multipleTestRuns.execute( name.getMethodName(), createParams( \"user\" ),\n                take( NUMBER_OF_RESULTS ), new SingleTest()\n        {\n            @Override\n            public String queryType()\n            {\n                return \"Cypher\";\n            }\n\n            @Override\n            public Object execute( Map<String, String> params )\n            {\n                return queries.sharedInterestsSameCompany( params.get( \"user\" ) );\n            }\n        } );\n\n    }\n\n    @Test\n    public void sharedInterestsAllCompanies() throws Exception\n    {\n        // when\n        multipleTestRuns.execute( name.getMethodName(), createParams( \"user\" ),\n                take( NUMBER_OF_RESULTS ), new SingleTest()\n        {\n            @Override\n            public String queryType()\n            {\n                return \"Cypher\";\n            }\n\n            @Override\n            public Object execute( Map<String, String> params )\n            {\n                return queries.sharedInterestsAllCompanies( params.get( \"user\" ), NUMBER_OF_RESULTS );\n            }\n        } );\n    }\n\n    @Test\n    public void sharedInterestsAlsoInterestedInTopic() throws Exception\n    {\n        // when\n        multipleTestRuns.execute( name.getMethodName(),\n                createParams( \"user\", \"topic1\" ), take( NUMBER_OF_RESULTS ), new SingleTest()\n        {\n            @Override\n            public String queryType()\n            {\n                return \"Cypher\";\n            }\n\n            @Override\n            public Object execute( Map<String, String> params )\n            {\n                return queries.sharedInterestsAlsoInterestedInTopic( params.get( \"user\" ), params.get( \"topic1\" ) );\n            }\n        } );\n    }\n\n    @Test\n    public void friendOfAFriendWithInterest() throws Exception\n    {\n        try ( Transaction tx = db.beginTx() )\n        {\n            // when\n            multipleTestRuns.execute(\n                    name.getMethodName(), createParams( \"user\", \"topic1\" ), take( NUMBER_OF_RESULTS ),\n                    new SingleTest()\n                    {\n                        @Override\n                        public String queryType()\n                        {\n                            return \"Cypher\";\n                        }\n\n                        @Override\n                        public Object execute( Map<String, String> params )\n                        {\n                            return queries.friendOfAFriendWithInterest( params.get( \"user\" ),\n                                    params.get( \"topic1\" ), NUMBER_OF_RESULTS );\n                        }\n                    } );\n            tx.success();\n        }\n    }\n\n    @Test\n    public void friendOfAFriendWithInterestTraversalFramework() throws Exception\n    {\n        try ( Transaction tx = db.beginTx() )\n        {\n            // when\n            multipleTestRuns.execute( name.getMethodName(), createParams( \"user\", \"topic1\" ),\n                    doNothing(), new SingleTest()\n            {\n                @Override\n                public String queryType()\n                {\n                    return \"Traversal Framework\";\n                }\n\n                @Override\n                public Object execute( Map<String, String> params )\n                {\n                    return queries.friendOfAFriendWithInterestTraversalFramework(\n                            params.get( \"user\" ), params.get( \"topic1\" ), NUMBER_OF_RESULTS );\n                }\n            } );\n            tx.success();\n        }\n    }\n\n\n//    @Test\n//    public void shouldFindColleagueOfAColleagueOfAColleagueEtcWithAParticularInterestUsingGremlin() throws Exception\n//    {\n//        // when\n//        multipleTestRuns.execute( \"Colleagues of colleagues interested in particular topic (gremlin)\",\n//                createParams(), printResults( 2 ), new SingleTestRun()\n//        {\n//            @Override\n//            public QueryType queryType()\n//            {\n//                return QueryType.Gremlin;\n//            }\n//\n//            @Override\n//            public Object execute( Map<String, String> params )\n//            {\n//                try\n//                {\n//                    return queries.friendOfAFriendWithParticularInterestGremlin( params.get( \"user\" ),\n//                            params.get( \"topic\" ) );\n//                }\n//                catch ( ScriptException e )\n//                {\n//                    throw new RuntimeException( e );\n//                }\n//            }\n//        } );\n//    }\n\n    @Test\n    public void queryBakeoff() throws Exception\n    {\n        try ( Transaction tx = db.beginTx() )\n        {\n            // when\n            multipleTestRuns.execute( name.getMethodName(), createParams( \"user\", \"topic1\" ),\n                    printResults( NUMBER_OF_RESULTS, resultFormatter(), writer ),\n                    new SingleTest()\n                    {\n                        @Override\n                        public String queryType()\n                        {\n                            return \"Traversal Framework\";\n                        }\n\n                        @Override\n                        public Object execute( Map<String, String> params )\n                        {\n                            return queries.friendOfAFriendWithInterestTraversalFramework(\n                                    params.get( \"user\" ), params.get( \"topic1\" ), NUMBER_OF_RESULTS );\n                        }\n                    }\n    //                , new SingleTestRun()\n    //                {\n    //                    @Override\n    //                    public QueryType queryType()\n    //                    {\n    //                        return QueryType.Gremlin;\n    //                    }\n    //\n    //                    @Override\n    //                    public Object execute( Map<String, String> params )\n    //                    {\n    //                        try\n    //                        {\n    //                            return queries.friendOfAFriendWithParticularInterestGremlin( params.get( \"user\" ),\n    //                                    params.get( \"topic\" ) );\n    //                        }\n    //                        catch ( ScriptException e )\n    //                        {\n    //                            throw new RuntimeException( e );\n    //                        }\n    //                    }\n    //                }\n                    , new SingleTest()\n                    {\n                        @Override\n                        public String queryType()\n                        {\n                            return \"Cypher\";\n                        }\n\n                        @Override\n                        public Object execute( Map<String, String> params )\n                        {\n                            return queries.friendOfAFriendWithInterest(\n                                    params.get( \"user\" ), params.get( \"topic1\" ), NUMBER_OF_RESULTS );\n                        }\n                    }\n                    , new SingleTest()\n                    {\n                        @Override\n                        public String queryType()\n                        {\n                            return \"Cypher2\";\n                        }\n\n                        @Override\n                        public Object execute( Map<String, String> params )\n                        {\n                            return queries.friendWorkedWithFriendWithInterests(\n                                    params.get( \"user\" ), NUMBER_OF_RESULTS,\n                                    params.get( \"topic1\" ) );\n                        }\n                    }\n            );\n            tx.success();\n        }\n    }\n\n    @Test\n    public void friendWorkedWithFriendWithInterests() throws Exception\n    {\n        // when\n        multipleTestRuns.execute(\n                name.getMethodName(),\n                createParams( \"user\", \"topic1\", \"topic2\", \"topic3\" ),\n                take( NUMBER_OF_RESULTS ), new SingleTest()\n        {\n            @Override\n            public String queryType()\n            {\n                return \"Cypher\";\n            }\n\n            @Override\n            public ExecutionResult execute( Map<String, String> params )\n            {\n                return queries.friendWorkedWithFriendWithInterests( params.get( \"user\" ),\n                        NUMBER_OF_RESULTS, params.get( \"topic1\" ), params.get( \"topic2\" ), params.get( \"topic3\" ) );\n            }\n        } );\n    }\n\n    @Test\n    public void friendOfAFriendWithMultipleInterestsBakeoff() throws Exception\n    {\n        // when\n        multipleTestRuns.execute(\n                name.getMethodName(),\n                createParams( \"user\", \"topic1\", \"topic2\", \"topic3\", \"topic4\", \"topic5\" ),\n                ResultsContainSameElementsUnordered.newFactory(),\n                printResults( NUMBER_OF_RESULTS, resultFormatter(), writer ),\n                new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"friendOfAFriendWithMultipleInterest\";\n                    }\n\n                    @Override\n                    public ExecutionResult execute( Map<String, String> params )\n                    {\n                        return queries.friendOfAFriendWithMultipleInterest( params.get( \"user\" ),\n                                NUMBER_OF_RESULTS,\n                                params.get( \"topic1\" ),\n                                params.get( \"topic2\" ),\n                                params.get( \"topic3\" ),\n                                params.get( \"topic4\" ),\n                                params.get( \"topic5\" ) );\n                    }\n                },\n                new SingleTest()\n                {\n                    @Override\n                    public String queryType()\n                    {\n                        return \"friendWorkedWithFriendWithInterests\";\n                    }\n\n                    @Override\n                    public ExecutionResult execute( Map<String, String> params )\n                    {\n                        return queries.friendWorkedWithFriendWithInterests( params.get( \"user\" ),\n                                NUMBER_OF_RESULTS,\n                                params.get( \"topic1\" ),\n                                params.get( \"topic2\" ),\n                                params.get( \"topic3\" ),\n                                params.get( \"topic4\" ),\n                                params.get( \"topic5\" ) );\n                    }\n                }\n        );\n    }\n\n    private ParamsGenerator createParams( final String... keys )\n    {\n        return new ParamsGenerator()\n        {\n            @Override\n            public final Map<String, String> generateParams()\n            {\n\n                List<Integer> topicIds = flatDistribution().generateList( 5, minMax( 1,\n                        SocialNetworkConfig.NUMBER_TOPICS ) );\n\n                Map<String, String> params = new HashMap<String, String>();\n                for ( String key : keys )\n                {\n                    if ( key.equals( \"user\" ) )\n                    {\n                        params.put( \"user\", String.format( \"User-%s\",\n                                random.nextInt( SocialNetworkConfig.NUMBER_USERS ) + 1 ) );\n                    }\n                    if ( key.equals( \"topic1\" ) )\n                    {\n                        params.put( \"topic1\", String.format( \"Topic-%s\", topicIds.get( 0 ) ) );\n                    }\n                    if ( key.equals( \"topic2\" ) )\n                    {\n                        params.put( \"topic2\", String.format( \"Topic-%s\", topicIds.get( 1 ) ) );\n                    }\n                    if ( key.equals( \"topic3\" ) )\n                    {\n                        params.put( \"topic3\", String.format( \"Topic-%s\", topicIds.get( 2 ) ) );\n                    }\n                    if ( key.equals( \"topic4\" ) )\n                    {\n                        params.put( \"topic4\", String.format( \"Topic-%s\", topicIds.get( 3 ) ) );\n                    }\n                    if ( key.equals( \"topic5\" ) )\n                    {\n                        params.put( \"topic5\", String.format( \"Topic-%s\", topicIds.get( 4 ) ) );\n                    }\n                }\n\n                return params;\n            }\n        };\n    }\n\n    private ResultFormatter resultFormatter()\n    {\n        return new ResultFormatter()\n        {\n            @Override\n            public String format( Object result )\n            {\n                if ( Node.class.isAssignableFrom( result.getClass() ) )\n                {\n                    return ((Node) result).getProperty( \"name\" ).toString();\n                }\n                else\n                {\n                    return result.toString();\n                }\n            }\n        };\n    }\n\n    @Test\n    @Ignore\n    public void testSingleCypherQuery() throws Exception\n    {\n        Map<String, Object> params = new HashMap<String, Object>();\n        params.put( \"person\", \"User-309491\" );\n        params.put( \"colleague\", \"User-558252\" );\n        params.put( \"topic\",  \"Topic-78\" );\n\n\n        String cypher = \"MATCH (person:User {name:{person}}), (colleague:User {name:{colleague}}), \" +\n                \"(topic:Topic {name:{topic}})\\n\" +\n                \"MATCH p = person-[:WORKED_ON*2..4]-colleague-[:INTERESTED_IN]->topic\\n\" +\n                \"RETURN p, LENGTH(p) AS pathLength ORDER BY pathLength ASC\";\n\n\n        ExecutionResult result = new ExecutionEngine( db ).execute( cypher, params );\n\n\n        writer.writeln( result.toString() );\n    }\n\n    @Test\n    @Ignore\n    public void testTraversal() throws Exception\n    {\n        Collection<Node> nodes = queries.friendOfAFriendWithInterestTraversalFramework(\n                \"User-309491\",\n                \"Topic-78\", NUMBER_OF_RESULTS );\n\n\n        for ( Node node : nodes )\n        {\n\n        }\n    }\n}\n"
  },
  {
    "path": "performance-testing/src/test/java/org/neo4j/graphdatabases/performance_tests/testing/ResultsContainSameElementsUnorderedTest.java",
    "content": "package org.neo4j.graphdatabases.performance_tests.testing;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\nimport org.neo4j.graphdatabases.queries.testing.TestOutputWriter;\n\npublic class ResultsContainSameElementsUnorderedTest\n{\n    @Test\n    public void shouldReportDiscrepanciesBetweenTwoQueries() throws Exception\n    {\n        // given\n        ResultsContainSameElementsUnordered handler = new ResultsContainSameElementsUnordered(  );\n\n        // when\n        handler.handle( \"queryType1\", \"a\" );\n        handler.handle( \"queryType2\", \"C\" );\n        handler.handle( \"queryType1\", \"b\" );\n        handler.handle( \"queryType2\", \"b\" );\n        handler.handle( \"queryType1\", \"c\" );\n        handler.handle( \"queryType2\", \"a\" );\n\n        MyTestOutputWriter writer = new MyTestOutputWriter();\n        handler.summarize( writer );\n\n        // then\n        String expected = \"\\n\" +\n                          \"   queryType1 v. queryType2: queryType1 contains additional elements: [c]\\n\" +\n                          \"   queryType2 v. queryType1: queryType2 contains additional elements: [C]\\n\";\n\n        assertEquals( expected, writer.toString());\n\n    }\n\n    @Test\n    public void shouldReportDiscrepanciesBetweenThreeQueries() throws Exception\n    {\n        // given\n        ResultsContainSameElementsUnordered handler = new ResultsContainSameElementsUnordered(  );\n\n        // when\n        handler.handle( \"queryType1\", \"a\" );\n        handler.handle( \"queryType2\", \"b\" );\n        handler.handle( \"queryType3\", \"c\" );\n\n        MyTestOutputWriter writer = new MyTestOutputWriter();\n        handler.summarize( writer );\n\n        // then\n        String expected = \"\\n\" +\n                          \"   queryType1 v. queryType2: queryType1 contains additional elements: [a]\\n\" +\n                          \"   queryType2 v. queryType1: queryType2 contains additional elements: [b]\\n\" +\n                          \"   queryType1 v. queryType3: queryType1 contains additional elements: [a]\\n\" +\n                          \"   queryType3 v. queryType1: queryType3 contains additional elements: [c]\\n\" +\n                          \"   queryType2 v. queryType3: queryType2 contains additional elements: [b]\\n\" +\n                          \"   queryType3 v. queryType2: queryType3 contains additional elements: [c]\\n\";\n\n        assertEquals( expected, writer.toString());\n    }\n\n    private static class MyTestOutputWriter implements TestOutputWriter\n    {\n        private final StringBuilder builder = new StringBuilder(  );\n\n        @Override\n        public void begin()\n        {\n        }\n\n        @Override\n        public void write( String value )\n        {\n            builder.append( value );\n        }\n\n        @Override\n        public void writeln( String value )\n        {\n            builder.append( value );\n            builder.append( \"\\n\" );\n        }\n\n        @Override\n        public void flush()\n        {\n        }\n\n        @Override\n        public void end()\n        {\n        }\n\n        @Override\n        public String toString()\n        {\n            return builder.toString();\n        }\n    }\n}\n"
  },
  {
    "path": "pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>graph-databases-use-cases</groupId>\n    <artifactId>graph-databases-use-cases</artifactId>\n    <version>2.0-SNAPSHOT</version>\n    <packaging>pom</packaging>\n\n    <properties>\n        <maven.compiler.source>1.7</maven.compiler.source>\n        <maven.compiler.target>1.7</maven.compiler.target>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    </properties>\n\n    <modules>\n        <module>queries</module>\n        <module>neode</module>\n        <module>configuration</module>\n        <module>data-generation</module>\n        <module>performance-testing</module>\n    </modules>\n\n</project>"
  },
  {
    "path": "queries/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>org.neo4j.graphdatabases</groupId>\n    <artifactId>queries</artifactId>\n    <version>2.0-SNAPSHOT</version>\n    <packaging>jar</packaging>\n\n    <properties>\n        <maven.compiler.source>1.7</maven.compiler.source>\n        <maven.compiler.target>1.7</maven.compiler.target>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <neo4j.version>2.0.1</neo4j.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.neo4j</groupId>\n            <artifactId>neo4j</artifactId>\n            <version>${neo4j.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.neo4j</groupId>\n            <artifactId>neo4j-kernel</artifactId>\n            <version>${neo4j.version}</version>\n            <type>test-jar</type>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.neo4j</groupId>\n            <artifactId>neo4j-graphviz</artifactId>\n            <version>${neo4j.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.neo4j.app</groupId>\n            <artifactId>neo4j-server</artifactId>\n            <version>${neo4j.version}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.neo4j.app</groupId>\n            <artifactId>neo4j-server</artifactId>\n            <version>${neo4j.version}</version>\n            <type>test-jar</type>\n        </dependency>\n\n        <dependency>\n            <artifactId>junit</artifactId>\n            <groupId>junit</groupId>\n            <version>4.11</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.sun.jersey</groupId>\n            <artifactId>jersey-server</artifactId>\n            <version>1.17</version>\n        </dependency>\n        <dependency>\n            <groupId>com.sun.jersey</groupId>\n            <artifactId>jersey-servlet</artifactId>\n            <version>1.17</version>\n        </dependency>\n        <dependency>\n            <groupId>com.sun.jersey</groupId>\n            <artifactId>jersey-client</artifactId>\n            <version>1.17</version>\n        </dependency>\n        <dependency>\n            <groupId>com.sun.jersey</groupId>\n            <artifactId>jersey-core</artifactId>\n            <version>1.17</version>\n        </dependency>\n        <dependency>\n            <groupId>org.eclipse.jetty</groupId>\n            <artifactId>jetty-server</artifactId>\n            <version>9.0.5.v20130815</version>\n        </dependency>\n        <dependency>\n            <groupId>joda-time</groupId>\n            <artifactId>joda-time</artifactId>\n            <version>2.1</version>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/AccessControlQueries.java",
    "content": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.queries.helpers.ExecutionEngineWrapper;\n\npublic class AccessControlQueries\n{\n    private final ExecutionEngineWrapper executionEngine;\n\n    public AccessControlQueries( ExecutionEngineWrapper executionEngineWrapper )\n    {\n        this.executionEngine = executionEngineWrapper;\n    }\n\n    public ExecutionResult findAccessibleResources( String adminName )\n    {\n        String query = \"MATCH (admin:Administrator {name:{adminName}})\\n\" +\n                \"MATCH paths=(admin)-[:MEMBER_OF]->()-[:ALLOWED_INHERIT]->()\\n\" +\n                \"            <-[:CHILD_OF*0..3]-(company)<-[:WORKS_FOR]-(employee)\\n\" +\n                \"            -[:HAS_ACCOUNT]->(account)\\n\" +\n                \"WHERE NOT ((admin)-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-(company))\\n\" +\n                \"RETURN employee.name AS employee, account.name AS account\\n\" +\n                \"UNION\\n\" +\n                \"MATCH (admin:Administrator {name:{adminName}})\\n\" +\n                \"MATCH paths=(admin)-[:MEMBER_OF]->()-[:ALLOWED_DO_NOT_INHERIT]->()\\n\" +\n                \"      <-[:WORKS_FOR]-(employee)-[:HAS_ACCOUNT]->(account)\\n\" +\n                \"RETURN employee.name AS employee, account.name AS account\";\n\n        Map<String, Object> params = new HashMap<>();\n        params.put( \"adminName\", adminName );\n\n        return executionEngine.execute( query, params );\n    }\n\n    public ExecutionResult findAccessibleCompanies( String adminName )\n    {\n        String query = \"MATCH (admin:Administrator {name:{adminName}})\\n\" +\n                \"MATCH (admin)-[:MEMBER_OF]->()-[:ALLOWED_INHERIT]->()<-[:CHILD_OF*0..3]-(company)\\n\" +\n                \"WHERE NOT ((admin)-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-(company))\\n\" +\n                \"RETURN company.name AS company\\n\" +\n                \"UNION\\n\" +\n                \"MATCH (admin:Administrator {name:{adminName}})\\n\" +\n                \"MATCH (admin)-[:MEMBER_OF]->()-[:ALLOWED_DO_NOT_INHERIT]->(company)\\n\" +\n                \"RETURN company.name AS company\";\n\n        Map<String, Object> params = new HashMap<>();\n        params.put( \"adminName\", adminName );\n\n        return executionEngine.execute( query, params );\n    }\n\n    public ExecutionResult findAccessibleAccountsForCompany( String adminName, String companyName )\n    {\n        String query =\n                \"MATCH (admin:Administrator {name:{adminName}}),\\n\" +\n                        \"      (company:Company {name:{companyName}})\\n\" +\n                        \"MATCH (admin)-[:MEMBER_OF]->(group)-[:ALLOWED_INHERIT]->(company)\\n\" +\n                        \"      <-[:CHILD_OF*0..3]-(subcompany)<-[:WORKS_FOR]-(employee)-[:HAS_ACCOUNT]->(account)\\n\" +\n                        \"WHERE NOT ((admin)-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-(subcompany))\\n\" +\n                        \"RETURN account.name AS account\\n\" +\n                        \"UNION\\n\" +\n                        \"MATCH (admin:Administrator {name:{adminName}}),\\n\" +\n                        \"      (company:Company {name:{companyName}})\\n\" +\n                        \"MATCH (admin)-[:MEMBER_OF]->(group)-[:ALLOWED_DO_NOT_INHERIT]->(company)\\n\" +\n                        \"      <-[:WORKS_FOR]-(employee)-[:HAS_ACCOUNT]->(account)\\n\" +\n                        \"RETURN account.name AS account\";\n\n        Map<String, Object> params = new HashMap<>();\n        params.put( \"adminName\", adminName );\n        params.put( \"companyName\", companyName );\n\n        return executionEngine.execute( query, params );\n    }\n\n    public ExecutionResult findAdminForResource( String resourceName )\n    {\n        String query = \"MATCH (resource:Resource {name:{resourceName}})\\n\" +\n                       \"MATCH p=(resource)-[:WORKS_FOR|HAS_ACCOUNT*1..2]-(company)\\n\" +\n                       \"        -[:CHILD_OF*0..3]->()<-[:ALLOWED_INHERIT]-()<-[:MEMBER_OF]-(admin)\\n\" +\n                       \"WHERE NOT ((admin)-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-(company))\\n\" +\n                       \"RETURN admin.name AS admin\\n\" +\n                       \"UNION\\n\" +\n                       \"MATCH (resource:Resource {name:{resourceName}})\\n\" +\n                       \"MATCH p=(resource)-[:WORKS_FOR|HAS_ACCOUNT*1..2]-(company)\\n\" +\n                       \"        <-[:ALLOWED_DO_NOT_INHERIT]-()<-[:MEMBER_OF]-(admin)\\n\" +\n                       \"RETURN admin.name AS admin\";\n\n        Map<String, Object> params = new HashMap<>();\n        params.put( \"resourceName\", resourceName );\n\n        return executionEngine.execute( query, params );\n    }\n\n    public ExecutionResult findAdminForCompany( String companyName )\n    {\n        String query = \"MATCH (company:Company {name:{companyName}})\\n\" +\n                \"MATCH (company)-[:CHILD_OF*0..3]->()<-[:ALLOWED_INHERIT]-()<-[:MEMBER_OF]-(admin)\\n\" +\n                \"WHERE NOT ((admin)-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-(company))\\n\" +\n                \"RETURN admin.name AS admin\\n\" +\n                \"UNION\\n\" +\n                \"MATCH (company:Company {name:{companyName}})\\n\" +\n                \"MATCH (company)<-[:ALLOWED_DO_NOT_INHERIT]-()<-[:MEMBER_OF]-(admin)\\n\" +\n                \"RETURN admin.name AS admin\";\n\n        Map<String, Object> params = new HashMap<>();\n        params.put( \"companyName\", companyName );\n\n        return executionEngine.execute( query, params );\n    }\n\n    public ExecutionResult hasAccessToResource( String adminName, String resourceName )\n    {\n        String query =\n                \"MATCH (admin:Administrator {name:{adminName}}),\\n\" +\n                        \"      (resource:Resource {name:{resourceName}})\\n\" +\n                        \"MATCH p=(admin)-[:MEMBER_OF]->()-[:ALLOWED_INHERIT]->()<-[:CHILD_OF*0.\" +\n                        \".3]-(company)-[:WORKS_FOR|HAS_ACCOUNT*1..2]-(resource)\\n\" +\n                        \"WHERE NOT ((admin)-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-(company))\\n\" +\n                        \"RETURN count(p) AS accessCount\\n\" +\n                        \"UNION\\n\" +\n                        \"MATCH (admin:Administrator {name:{adminName}}),\\n\" +\n                        \"      (resource:Resource {name:{resourceName}})\\n\" +\n                        \"MATCH p=(admin)-[:MEMBER_OF]->()-[:ALLOWED_DO_NOT_INHERIT]->(company)-[:WORKS_FOR|HAS_ACCOUNT*1..2]-(resource)\\n\" +\n                        \"RETURN count(p) AS accessCount\";\n\n        Map<String, Object> params = new HashMap<>();\n        params.put( \"adminName\", adminName );\n        params.put( \"resourceName\", resourceName );\n\n        return executionEngine.execute( query, params );\n    }\n\n\n    public ExecutionResult hasAccessToIndexedResource( String adminName, String resourceName )\n    {\n        String query =\n                \"MATCH (admin:Administrator {name:{adminName}}),\\n\" +\n                        \"      c1=(company)<-[:CHILD_OF*0..3]-(:Company)-[:WORKS_FOR|HAS_ACCOUNT*1..2]-(resource:Resource {name:{resourceName}})\\n\" +\n                        \"MATCH p=(admin)-[:MEMBER_OF]->()-[:ALLOWED_INHERIT]->(company)\\n\" +\n                        \"WHERE NOT ((admin)-[:MEMBER_OF]->()-[:DENIED]->(company))\\n\" +\n                        \"RETURN count(p) AS accessCount\\n\" +\n//                        \"RETURN p, company, admin, resource,c1\\n\" +\n                        \"UNION\\n\" +\n                        \"MATCH (admin:Administrator {name:{adminName}}),\\n\" +\n                        \"      c1=(company:Company)-[:WORKS_FOR|HAS_ACCOUNT*1..2]-(resource:Resource {name:{resourceName}})\\n\" +\n                        \"MATCH p=(admin)-[:MEMBER_OF]->()-[:ALLOWED_DO_NOT_INHERIT]->(company)\\n\" +\n                        \"RETURN count(p) AS accessCount\\n\";\n//                        \"RETURN p, company, admin, resource,c1\\n\";\n\n        Map<String, Object> params = new HashMap<>();\n        params.put( \"adminName\", adminName );\n        params.put( \"resourceName\", resourceName );\n\n        return executionEngine.execute( query, params );\n    }\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/AccessControlWithRelationshipPropertiesQueries.java",
    "content": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.neo4j.graphdatabases.queries.helpers.ExecutionEngineWrapper;\nimport org.neo4j.graphdatabases.queries.helpers.QueryUnionExecutionEngine;\nimport org.neo4j.graphdatabases.queries.helpers.QueryUnionExecutionResult;\n\npublic class AccessControlWithRelationshipPropertiesQueries\n{\n    private final QueryUnionExecutionEngine executionEngine;\n\n    public AccessControlWithRelationshipPropertiesQueries( ExecutionEngineWrapper executionEngine )\n    {\n        this.executionEngine = new QueryUnionExecutionEngine( executionEngine );\n    }\n\n    public QueryUnionExecutionResult findAccessibleResources( String adminName )\n    {\n        String inheritedQuery = \"MATCH (admin:Administrator {name:{adminName}})\\n\" +\n                \"MATCH paths=(admin)-[:MEMBER_OF]->()-[permission:ALLOWED]->()<-[:CHILD_OF*0..3]-()\" +\n                \"<-[:WORKS_FOR]-(employee)-[:HAS_ACCOUNT]->(account)\\n\" +\n                \"WHERE (permission.inherit=true) AND NOT (admin-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-()\" +\n                \"<-[:WORKS_FOR]-employee-[:HAS_ACCOUNT]->account)\\n\" +\n                \"RETURN paths\";\n        String notInheritedQuery = \"MATCH (admin:Administrator {name:{adminName}})\\n\" +\n                \"MATCH paths=(admin)-[:MEMBER_OF]->()-[permission:ALLOWED]->()\" +\n                \"<-[:WORKS_FOR]-employee-[:HAS_ACCOUNT]->account\\n\" +\n                \"WHERE (permission.inherit=false)\\n\" +\n                \"RETURN paths\";\n\n        Map<String, Object> params = new HashMap<>();\n        params.put( \"adminName\", adminName );\n\n        return executionEngine.execute( params, inheritedQuery, notInheritedQuery );\n\n    }\n    // todo no result for query1 ?\n    public QueryUnionExecutionResult findAccessibleCompanies( String adminName )\n    {\n        String inheritedQuery = \"MATCH (admin:Administrator {name:{adminName}})\\n\" +\n                \"MATCH admin-[:MEMBER_OF]->()-[permission:ALLOWED]->()<-[:CHILD_OF*0..3]-company\\n\" +\n                \"WHERE (permission.inherit=true) AND NOT (admin-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0.\" +\n                \".3]-company)\\n\" +\n                \"RETURN company\";\n\n        String notInheritedQuery = \"MATCH (admin:Administrator {name:{adminName}})\\n\" +\n                \"MATCH admin-[:MEMBER_OF]->()-[permission:ALLOWED]->(company)\\n\" +\n                \"WHERE (permission.inherit=false)\\n\" +\n                \"RETURN company\";\n\n        Map<String, Object> params = new HashMap<>();\n        params.put( \"adminName\", adminName );\n\n        return executionEngine.execute( params, inheritedQuery, notInheritedQuery );\n    }\n\n    public QueryUnionExecutionResult findAccessibleAccountsForCompany( String adminName,\n                                                                           String companyName )\n    {\n        String inheritedQuery = \"MATCH (admin:Administrator {name:{adminName}}),\\n\" +\n                \"                      (company:Company{name:{companyName}})\\n\" +\n                \"MATCH admin-[:MEMBER_OF]->group-[permission:ALLOWED]->company<-[:CHILD_OF*0.\" +\n                \".3]-subcompany<-[:WORKS_FOR]-employee-[:HAS_ACCOUNT]->account\\n\" +\n                \"WHERE (permission.inherit=true) AND NOT (admin-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0.\" +\n                \".3]-subcompany)\\n\" +\n                \"RETURN account\";\n\n        String notInheritedQuery = \"MATCH (admin:Administrator {name:{adminName}}),\\n\" +\n                \"                         (company:Company{name:{companyName}})\\n\" +\n                \"MATCH admin-[:MEMBER_OF]->group-[permission:ALLOWED]->company<-[:WORKS_FOR]-employee-[:HAS_ACCOUNT\" +\n                \"]->account\\n\" +\n                \"WHERE (permission.inherit=false)\\n\" +\n                \"RETURN account\";\n\n        Map<String, Object> params = new HashMap<>();\n        params.put( \"adminName\", adminName );\n        params.put( \"companyName\", companyName );\n\n        return executionEngine.execute( params, inheritedQuery, notInheritedQuery );\n    }\n\n    // todo no result for query2\n    public QueryUnionExecutionResult findAdminForResource( String resourceName )\n    {\n        String inheritedQuery = \"MATCH (resource:Resource {name:{resourceName}}) \\n\" +\n                        \"MATCH p=resource-[:WORKS_FOR|HAS_ACCOUNT*1..2]-company-[:CHILD_OF*0..3]->()<-[permission:ALLOWED]-()\" +\n                        \"<-[:MEMBER_OF]-admin\\n\" +\n                        \"WHERE (permission.inherit=true) AND NOT (admin-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-company)\\n\" +\n                        \"RETURN DISTINCT admin, p\";\n\n                String notInheritedQuery = \"MATCH (resource:Resource{name:{resourceName}})\\n\" +\n                        \"MATCH p=resource-[:WORKS_FOR|HAS_ACCOUNT*1..2]-company<-[permission:ALLOWED]-()\" +\n                        \"<-[:MEMBER_OF]-admin\\n\" +\n                        \"WHERE (permission.inherit=false)\\n\" +\n                        \"RETURN DISTINCT admin, p\";\n\n                Map<String, Object> params = new HashMap<>();\n                params.put( \"resourceName\", resourceName );\n\n                return executionEngine.execute( params, inheritedQuery, notInheritedQuery );\n    }\n\n    public QueryUnionExecutionResult findAdminForCompany( String companyName )\n    {\n        String inheritedQuery = \"MATCH (company:Company{name:{companyName}})\\n\" +\n                        \"MATCH p=company-[:CHILD_OF*0..3]->()<-[permission:ALLOWED]-()<-[:MEMBER_OF]-admin\\n\" +\n                        \"WHERE (permission.inherit=true) AND NOT (admin-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-company)\\n\" +\n                        \"RETURN DISTINCT admin, p\";\n\n                String notInheritedQuery = \"MATCH (company:Company{name:{companyName}})\\n\" +\n                        \"MATCH p=company<-[permission:ALLOWED]-()<-[:MEMBER_OF]-admin\\n\" +\n                        \"WHERE (permission.inherit=false)\\n\" +\n                        \"RETURN DISTINCT admin, p\";\n\n                Map<String, Object> params = new HashMap<>();\n                params.put( \"companyName\", companyName );\n\n                return executionEngine.execute( params, inheritedQuery, notInheritedQuery );\n    }\n\n    public QueryUnionExecutionResult hasAccessToResource( String adminName, String resourceName )\n    {\n        String inheritedQuery =\n                        \"MATCH (admin:Administrator {name:{adminName}}),\\n\" +\n                                \"      (resource:Resource{name:{resourceName}})\\n\" +\n                                \"MATCH p=(admin)-[:MEMBER_OF]->()-[permission:ALLOWED]->()<-[:CHILD_OF*0.\" +\n                                \".3]-(company)-[:WORKS_FOR|HAS_ACCOUNT*1..2]-(resource)\\n\" +\n                                \"WHERE (permission.inherit=true) AND NOT (admin)-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-(company)\\n\" +\n                                \"RETURN COUNT(p) AS accessCount\";\n\n                String notInheritedQuery =\n                        \"MATCH (admin:Administrator {name:{adminName}}),\\n\" +\n                                \"      (resource:Resource{name:{resourceName}})\\n\" +\n                                \"MATCH p=admin-[:MEMBER_OF]->()-[permission:ALLOWED]->company-[:WORKS_FOR|HAS_ACCOUNT*1..2]-resource\\n\" +\n                                \"WHERE (permission.inherit=false)\\n\" +\n                                \"RETURN COUNT(p) AS accessCount\";\n\n                Map<String, Object> params = new HashMap<>();\n                params.put( \"adminName\", adminName );\n                params.put( \"resourceName\", resourceName );\n\n                return executionEngine.execute( params, inheritedQuery, notInheritedQuery );\n    }\n\n    public QueryUnionExecutionResult hasAccessToIndexedResource( String adminName, String resourceName )\n    {\n        String inheritedQuery =\n                        \"MATCH (admin:Administrator {name:{adminName}}),\\n\" +\n                                \"      (company)<-[:CHILD_OF*0..3]-(:Company)-[:WORKS_FOR|HAS_ACCOUNT*1..2]-(resource:Resource {name:{resourceName}})\\n\" +\n                                \"MATCH p=(admin)-[:MEMBER_OF]->()-[permission:ALLOWED]->(company)\\n\" +\n                                \"WHERE (permission.inherit=true) AND NOT ((admin)-[:MEMBER_OF]->()-[:DENIED]->()<-[:CHILD_OF*0..3]-(company))\\n\" +\n                                \"RETURN COUNT(p) AS accessCount\";\n\n                String notInheritedQuery =\n                        \"MATCH (admin:Administrator {name:{adminName}}),\\n\" +\n                                \"      (company)<-[:CHILD_OF*0..3]-(:Company)-[:WORKS_FOR|HAS_ACCOUNT*1..2]-(resource:Resource {name:{resourceName}})\\n\" +\n                                \"MATCH p=(admin)-[:MEMBER_OF]->()-[permission:ALLOWED]->(company)\\n\" +\n                                \"WHERE (permission.inherit=false)\\n\" +\n                                \"RETURN COUNT(p) AS accessCount\";\n\n                Map<String, Object> params = new HashMap<>();\n                params.put( \"adminName\", adminName );\n                params.put( \"resourceName\", resourceName );\n\n                return executionEngine.execute( params, inheritedQuery, notInheritedQuery );\n    }\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/EmailQueries.java",
    "content": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.queries.helpers.ExecutionEngineWrapper;\nimport org.neo4j.graphdb.GraphDatabaseService;\n\npublic class EmailQueries\n{\n    private final GraphDatabaseService db;\n    private final ExecutionEngineWrapper executionEngineWrapper;\n\n    public EmailQueries( GraphDatabaseService db, ExecutionEngineWrapper executionEngineWrapper )\n    {\n        this.db = db;\n        this.executionEngineWrapper = executionEngineWrapper;\n    }\n\n    public ExecutionResult suspectBehaviour()\n    {\n        String query =\n                \"MATCH (bob:User {username:'Bob'})-[:SENT]->(email)-[:CC]->(alias),\\n\" +\n                \"      (alias)-[:ALIAS_OF]->(bob)\\n\" +\n                \"RETURN email.id\";\n\n        Map<String, Object> params = new HashMap<String, Object>();\n\n        return executionEngineWrapper.execute( query, params );\n    }\n\n    public ExecutionResult suspectBehaviour2()\n    {\n        String query =\n                \"MATCH p=(email:Email {id:'6'})<-[:REPLY_TO*1..4]-()<-[:SENT]-(replier)\\n\" +\n                \"RETURN replier.username AS replier, length(p) - 1 AS depth ORDER BY depth\";\n\n        Map<String, Object> params = new HashMap<String, Object>();\n\n        return executionEngineWrapper.execute( query, params );\n    }\n\n    public ExecutionResult suspectBehaviour3()\n    {\n        String query =\n                \"MATCH (email:Email {id:'11'})<-[f:FORWARD_OF*]-() \\n\" +\n                \"RETURN count(f)\";\n\n        Map<String, Object> params = new HashMap<String, Object>();\n\n        return executionEngineWrapper.execute( query, params );\n    }\n\n    public ExecutionResult lossyDb()\n    {\n        String query =\n                \"MATCH (bob:User {username:'Bob'})-[e:EMAILED]->(charlie:User {username:'Charlie'})\\n\" +\n                \"RETURN e\";\n\n        Map<String, Object> params = new HashMap<String, Object>();\n\n        return executionEngineWrapper.execute( query, params );\n    }\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/LogisticsQueries.java",
    "content": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.joda.time.Interval;\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.queries.helpers.ExecutionEngineWrapper;\nimport org.neo4j.graphdatabases.queries.traversals.ParcelRouteCalculator;\nimport org.neo4j.graphdatabases.queries.traversals.SimpleParcelRouteCalculator;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.Node;\n\npublic class LogisticsQueries\n{\n    private final ExecutionEngineWrapper executionEngineWrapper;\n    private final ParcelRouteCalculator parcelRouteCalculator;\n    private final SimpleParcelRouteCalculator simpleParcelRouteCalculator;\n\n    public LogisticsQueries( GraphDatabaseService db, ExecutionEngineWrapper executionEngineWrapper )\n    {\n        this.executionEngineWrapper = executionEngineWrapper;\n        this.parcelRouteCalculator = new ParcelRouteCalculator( db );\n        this.simpleParcelRouteCalculator = new SimpleParcelRouteCalculator( db );\n    }\n\n    public Iterable<Node> findShortestPathWithParcelRouteCalculator( String start, String end, Interval interval )\n    {\n        return parcelRouteCalculator.calculateRoute( start, end, interval );\n    }\n\n    public Iterable<Node> findShortestPathWithSimpleParcelRouteCalculator( String start, String end, Interval interval )\n    {\n        return simpleParcelRouteCalculator.calculateRoute( start, end, interval );\n    }\n\n\n    public ExecutionResult findShortestPathWithCypherReduce( String start, String end, Interval interval )\n    {\n        String query =\n                \"MATCH (s:Location {name:{startLocation}}),\\n\" +\n                \"      (e:Location {name:{endLocation}})\\n\" +\n                \"MATCH upLeg = (s)<-[:DELIVERY_ROUTE*1..2]-(db1)\\n\" +\n                \"WHERE all(r in relationships(upLeg)\\n\" +\n                \"          WHERE r.start_date <= {intervalStart}\\n\" +\n                \"          AND r.end_date >= {intervalEnd})\\n\" +\n                \"WITH  e, upLeg, db1\\n\" +\n                \"MATCH downLeg = (db2)-[:DELIVERY_ROUTE*1..2]->(e)\\n\" +\n                \"WHERE all(r in relationships(downLeg)\\n\" +\n                \"          WHERE r.start_date <= {intervalStart}\\n\" +\n                \"          AND r.end_date >= {intervalEnd})\\n\" +\n                \"WITH  db1, db2, upLeg, downLeg\\n\" +\n                \"MATCH topRoute = (db1)<-[:CONNECTED_TO]-()-[:CONNECTED_TO*1..3]-(db2)\\n\" +\n                \"WHERE all(r in relationships(topRoute)\\n\" +\n                \"          WHERE r.start_date <= {intervalStart}\\n\" +\n                \"          AND r.end_date >= {intervalEnd})\\n\" +\n                \"WITH  upLeg, downLeg, topRoute,\\n\" +\n                \"      reduce(weight=0, r in relationships(topRoute) | weight+r.cost) AS score\\n\" +\n                \"      ORDER BY score ASC\\n\" +\n                \"      LIMIT 1\\n\" +\n                \"RETURN (nodes(upLeg) + tail(nodes(topRoute)) + tail(nodes(downLeg))) AS n\";\n\n        Map<String, Object> params = new HashMap<String, Object>();\n        params.put( \"startLocation\", start );\n        params.put( \"endLocation\", end );\n        params.put( \"intervalStart\", interval.getStartMillis() );\n        params.put( \"intervalEnd\", interval.getEndMillis() );\n\n\n        return executionEngineWrapper.execute( query, params );\n    }\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/ShakespeareQueries.java",
    "content": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.queries.helpers.ExecutionEngineWrapper;\n\npublic class ShakespeareQueries\n{\n    private final ExecutionEngineWrapper executionEngineWrapper;\n\n    public ShakespeareQueries( ExecutionEngineWrapper executionEngineWrapper )\n    {\n        this.executionEngineWrapper = executionEngineWrapper;\n    }\n\n    public ExecutionResult theatreCityBard()\n    {\n        String query =\n                \"MATCH (theater:Venue {name:'Theatre Royal'}), \\n\" +\n                        \"      (newcastle:City {name:'Newcastle'}), \\n\" +\n                        \"      (bard:Author {lastname:'Shakespeare'})\\n\" +\n                        \"RETURN theater.name AS theater, newcastle.name AS city, bard.lastname AS bard\";\n\n        Map<String, Object> params = new HashMap<String, Object>();\n\n        return executionEngineWrapper.execute( query, params );\n    }\n\n    public ExecutionResult allPlays()\n    {\n        String query =\n                \"MATCH (theater:Venue {name:'Theatre Royal'}), \\n\" +\n                        \"      (newcastle:City {name:'Newcastle'}), \\n\" +\n                        \"      (bard:Author {lastname:'Shakespeare'})\\n\" +\n                        \"MATCH (newcastle)<-[:STREET|CITY*1..2]-(theater)\\n\" +\n                        \"      <-[:VENUE]-()-[:PERFORMANCE_OF]->()-[:PRODUCTION_OF]->\\n\" +\n                        \"      (play)<-[:WROTE_PLAY]-(bard)\\n\" +\n                        \"RETURN DISTINCT play.title AS play\";\n\n        Map<String, Object> params = new HashMap<String, Object>();\n\n        return executionEngineWrapper.execute( query, params );\n    }\n\n    public ExecutionResult latePeriodPlays()\n    {\n        String query =\n                \"MATCH (theater:Venue {name:'Theatre Royal'}), \\n\" +\n                        \"      (newcastle:City {name:'Newcastle'}), \\n\" +\n                        \"      (bard:Author {lastname:'Shakespeare'})\\n\" +\n                        \"MATCH (newcastle)<-[:STREET|CITY*1..2]-(theater)<-[:VENUE]-()-[:PERFORMANCE_OF]->()\\n\" +\n                        \"      -[:PRODUCTION_OF]->(play)<-[w:WROTE_PLAY]-(bard)\\n\" +\n                        \"WHERE w.year > 1608\\n\" +\n                        \"RETURN DISTINCT play.title AS play\";\n\n        Map<String, Object> params = new HashMap<String, Object>();\n\n        return executionEngineWrapper.execute( query, params );\n    }\n\n    public ExecutionResult orderedByPerformance()\n    {\n        String query =\n                \"MATCH (theater:Venue {name:'Theatre Royal'}), \\n\" +\n                        \"      (newcastle:City {name:'Newcastle'}), \\n\" +\n                        \"      (bard:Author {lastname:'Shakespeare'})\\n\" +\n                        \"MATCH (newcastle)<-[:STREET|CITY*1..2]-(theater)<-[:VENUE]-()-[p:PERFORMANCE_OF]->()\\n\" +\n                        \"      -[:PRODUCTION_OF]->(play)<-[:WROTE_PLAY]-(bard)\\n\" +\n                        \"RETURN   play.title AS play, count(p) AS performance_count \\n\" +\n                        \"ORDER BY performance_count DESC\";\n\n        Map<String, Object> params = new HashMap<String, Object>();\n\n        return executionEngineWrapper.execute( query, params );\n    }\n\n    public ExecutionResult exampleOfWith()\n    {\n        String query =\n                       \"MATCH (bard:Author {lastname:'Shakespeare'})\\n\" +\n                               \"MATCH (bard)-[w:WROTE_PLAY]->(play)\\n\" +\n                               \"WITH play \\n\" +\n                               \"ORDER BY w.year DESC \\n\" +\n                               \"RETURN collect(play.title) AS plays\";\n\n               Map<String, Object> params = new HashMap<String, Object>();\n\n               return executionEngineWrapper.execute( query, params );\n    }\n\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/ShakespeareQueriesUsingAutoIndexes.java",
    "content": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.queries.helpers.ExecutionEngineWrapper;\n\npublic class ShakespeareQueriesUsingAutoIndexes\n{\n    private final ExecutionEngineWrapper executionEngineWrapper;\n    \n        public ShakespeareQueriesUsingAutoIndexes( ExecutionEngineWrapper executionEngineWrapper )\n        {\n            this.executionEngineWrapper = executionEngineWrapper;\n        }\n    \n        public ExecutionResult theatreCityBard()\n        {\n            String query =\n                    \"START theater=node:node_auto_index(name='Theatre Royal'), \\n\" +\n                            \"      newcastle=node:node_auto_index(name='Newcastle'), \\n\" +\n                            \"      bard=node:node_auto_index(lastname='Shakespeare')\\n\" +\n                            \"RETURN theater.name AS theater, newcastle.name AS city, bard.lastname AS bard\";\n    \n            Map<String, Object> params = new HashMap<String, Object>();\n    \n            return executionEngineWrapper.execute( query, params );\n        }\n    \n        public ExecutionResult allPlays()\n        {\n            String query =\n                    \"START theater=node:node_auto_index(name='Theatre Royal'), \\n\" +\n                            \"      newcastle=node:node_auto_index(name='Newcastle'), \\n\" +\n                            \"      bard=node:node_auto_index(lastname='Shakespeare')\\n\" +\n                            \"MATCH (newcastle)<-[:STREET|CITY*1..2]-(theater)\\n\" +\n                            \"      <-[:VENUE]-()-[:PERFORMANCE_OF]->()-[:PRODUCTION_OF]->\\n\" +\n                            \"      (play)<-[:WROTE_PLAY]-(bard)\\n\" +\n                            \"RETURN DISTINCT play.title AS play\";\n    \n            Map<String, Object> params = new HashMap<String, Object>();\n    \n            return executionEngineWrapper.execute( query, params );\n        }\n    \n        public ExecutionResult latePeriodPlays()\n        {\n            String query =\n                    \"START theater=node:node_auto_index(name='Theatre Royal'), \\n\" +\n                            \"      newcastle=node:node_auto_index(name='Newcastle'), \\n\" +\n                            \"      bard=node:node_auto_index(lastname='Shakespeare')\\n\" +\n                            \"MATCH (newcastle)<-[:STREET|CITY*1..2]-(theater)<-[:VENUE]-()-[:PERFORMANCE_OF]->()\\n\" +\n                            \"      -[:PRODUCTION_OF]->(play)<-[w:WROTE_PLAY]-(bard)\\n\" +\n                            \"WHERE w.year > 1608\\n\" +\n                            \"RETURN DISTINCT play.title AS play\";\n    \n            Map<String, Object> params = new HashMap<String, Object>();\n    \n            return executionEngineWrapper.execute( query, params );\n        }\n    \n        public ExecutionResult orderedByPerformance()\n        {\n            String query =\n                    \"START theater=node:node_auto_index(name='Theatre Royal'), \\n\" +\n                            \"      newcastle=node:node_auto_index(name='Newcastle'), \\n\" +\n                            \"      bard=node:node_auto_index(lastname='Shakespeare')\\n\" +\n                            \"MATCH (newcastle)<-[:STREET|CITY*1..2]-(theater)<-[:VENUE]-()-[p:PERFORMANCE_OF]->()\\n\" +\n                            \"      -[:PRODUCTION_OF]->(play)<-[:WROTE_PLAY]-(bard)\\n\" +\n                            \"RETURN   play.title AS play, count(p) AS performance_count \\n\" +\n                            \"ORDER BY performance_count DESC\";\n    \n            Map<String, Object> params = new HashMap<String, Object>();\n    \n            return executionEngineWrapper.execute( query, params );\n        }\n    \n        public ExecutionResult exampleOfWith()\n        {\n            String query =\n                           \"START bard=node:node_auto_index(lastname='Shakespeare')\\n\" +\n                                   \"MATCH (bard)-[w:WROTE_PLAY]->(play)\\n\" +\n                                   \"WITH play \\n\" +\n                                   \"ORDER BY w.year DESC \\n\" +\n                                   \"RETURN collect(play.title) AS plays\";\n    \n                   Map<String, Object> params = new HashMap<String, Object>();\n    \n                   return executionEngineWrapper.execute( query, params );\n        }\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/SimpleSocialNetworkQueries.java",
    "content": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.neo4j.cypher.javacompat.ExecutionEngine;\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdb.GraphDatabaseService;\n\npublic class SimpleSocialNetworkQueries\n{\n    private final ExecutionEngine executionEngine;\n\n    public SimpleSocialNetworkQueries( GraphDatabaseService db )\n    {\n        this.executionEngine = new ExecutionEngine( db );\n    }\n\n    public ExecutionResult pathBetweenTwoFriends( String firstUser, String secondUser )\n    {\n        String query = \"MATCH (first:User{name:{firstUser}}),\\n\" +\n                \" (second:User{name:{secondUser}})\\n\" +\n                \"MATCH p=shortestPath(first-[*..4]-second)\\n\" +\n                \"RETURN length(p) AS depth\";\n\n        Map<String, Object> params = new HashMap<String, Object>();\n        params.put( \"firstUser\", firstUser );\n        params.put( \"secondUser\", secondUser );\n\n        return executionEngine.execute( query, params );\n    }\n\n    public ExecutionResult friendOfAFriendToDepth4(String name)\n    {\n        String query =\n            \"MATCH (person:User {name:{name}})-[:FRIEND]-()-[:FRIEND]-()-[:FRIEND]-()-[:FRIEND]-(friend)\\n\" +\n            \"RETURN friend.name AS name\";\n\n        Map<String, Object> params = new HashMap<String, Object>();\n        params.put( \"name\", name );\n\n        return executionEngine.execute( query, params );\n\n    }\n\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/SocialNetworkQueries.java",
    "content": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.queries.helpers.ExecutionEngineWrapper;\nimport org.neo4j.graphdb.*;\nimport org.neo4j.graphdb.traversal.Evaluation;\nimport org.neo4j.graphdb.traversal.Evaluator;\nimport org.neo4j.graphdb.traversal.TraversalDescription;\nimport org.neo4j.graphdb.traversal.Uniqueness;\nimport org.neo4j.helpers.collection.IteratorUtil;\n\nimport static org.neo4j.graphdb.DynamicRelationshipType.withName;\n\npublic class SocialNetworkQueries\n{\n    public static final Label USER = DynamicLabel.label(\"User\");\n    public static final Label TOPIC = DynamicLabel.label(\"Topic\");\n    private final GraphDatabaseService db;\n    private final ExecutionEngineWrapper executionEngineWrapper;\n\n\n    public SocialNetworkQueries( GraphDatabaseService db, ExecutionEngineWrapper executionEngineWrapper )\n    {\n        this.db = db;\n        this.executionEngineWrapper = executionEngineWrapper;\n    }\n\n    public ExecutionResult sharedInterestsSameCompany( String userName )\n    {\n        String query =\n                \"MATCH  (subject:User {name:{name}})\\n\" +\n                        \"MATCH  (subject)-[:WORKS_FOR]->(company)<-[:WORKS_FOR]-(person),\\n\" +\n                        \"       (subject)-[:INTERESTED_IN]->(interest)<-[:INTERESTED_IN]-(person)\\n\" +\n                        \"RETURN person.name AS name,\\n\" +\n                        \"       count(interest) AS score,\\n\" +\n                        \"       collect(interest.name) AS interests\\n\" +\n                        \"ORDER BY score DESC\";\n\n        Map<String, Object> params = new HashMap<String, Object>();\n        params.put( \"name\", userName );\n\n        return executionEngineWrapper.execute( query, params );\n    }\n\n    public ExecutionResult sharedInterestsAllCompanies( String userName, int limit )\n    {\n        String query =\n                \"MATCH  (subject:User {name:{name}})\\n\" +\n                        \"MATCH  (subject)-[:INTERESTED_IN]->(interest)<-[:INTERESTED_IN]-(person),\\n\" +\n                        \"       (person)-[:WORKS_FOR]->(company)\\n\" +\n                        \"RETURN person.name AS name,\\n\" +\n                        \"       company.name AS company,\\n\" +\n                        \"       count(interest) AS score,\\n\" +\n                        \"       collect(interest.name) AS interests\\n\" +\n                        \"ORDER BY score DESC\";\n\n        Map<String, Object> params = new HashMap<String, Object>();\n        params.put( \"name\", userName );\n        params.put( \"resultLimit\", limit );\n\n        return executionEngineWrapper.execute( query, params );\n    }\n\n    public ExecutionResult sharedInterestsAlsoInterestedInTopic( String userName, String topicLabel )\n    {\n        String query = \"MATCH (person:User {name:{name}})\\n\" +\n                \"MATCH (person)-[:INTERESTED_IN]->()<-[:INTERESTED_IN]-(colleague)-[:INTERESTED_IN]->(topic)\\n\" +\n                \"WHERE topic.name={topic}\\n\" +\n                \"WITH  colleague\\n\" +\n                \"MATCH (colleague)-[:INTERESTED_IN]->(allTopics)\\n\" +\n                \"RETURN colleague.name AS name, collect(distinct(allTopics.name)) AS topics\";\n\n\n        Map<String, Object> params = new HashMap<String, Object>();\n        params.put( \"name\", userName );\n        params.put( \"topicQuery\", \"name:\" + topicLabel );\n        params.put( \"topic\", topicLabel );\n\n        return executionEngineWrapper.execute( query, params );\n    }\n\n    public ExecutionResult friendOfAFriendWithInterest( String userName, String topicLabel, int limit )\n    {\n        String query =\n                \"MATCH (subject:User {name:{name}})\\n\" +\n                        \"MATCH p=(subject)-[:WORKED_ON]->()-[:WORKED_ON*0..2]-()\\n\" +\n                        \"        <-[:WORKED_ON]-(person)-[:INTERESTED_IN]->(interest)\\n\" +\n                        \"WHERE person<>subject AND interest.name={topic}\\n\" +\n                        \"WITH DISTINCT person.name AS name,\\n\" +\n                        \"     min(length(p)) as pathLength\\n\" +\n                        \"ORDER BY pathLength ASC\\n\" +\n                        \"LIMIT {resultLimit}\\n\" +\n                        \"RETURN name, pathLength\";\n\n        Map<String, Object> params = new HashMap<String, Object>();\n        params.put( \"name\", userName );\n        params.put( \"topicQuery\", \"name:\" + topicLabel );\n        params.put( \"topic\", topicLabel );\n        params.put( \"resultLimit\", limit );\n\n        return executionEngineWrapper.execute( query, params );\n    }\n\n    public Collection<Node> friendOfAFriendWithInterestTraversalFramework( String userName,\n                                                                           final String topicLabel,\n                                                                           int limit )\n    {\n        Node user = IteratorUtil.single(db.findNodesByLabelAndProperty(USER, \"name\", userName));\n        final Node topic = IteratorUtil.single(db.findNodesByLabelAndProperty(TOPIC, \"name\", topicLabel));\n\n        final RelationshipType interested_in = withName( \"INTERESTED_IN\" );\n        final RelationshipType worked_on = withName( \"WORKED_ON\" );\n\n        TraversalDescription traversalDescription = db.traversalDescription()\n                .breadthFirst()\n                .uniqueness( Uniqueness.NODE_GLOBAL )\n                .relationships( worked_on )\n                .evaluator( new\n                            Evaluator()\n                            {\n                                @Override\n                                public Evaluation evaluate( Path path )\n                                {\n                                    if ( path.length() == 0 )\n                                    {\n                                        return Evaluation.EXCLUDE_AND_CONTINUE;\n                                    }\n\n                                    Node currentNode = path.endNode();\n\n\n                                    if ( path.length() % 2 == 0 )\n                                    {\n                                        for ( Relationship rel : currentNode.getRelationships(\n                                                interested_in,\n                                                Direction.OUTGOING ) )\n                                        {\n                                            if ( rel.getEndNode().equals( topic ) )\n                                            {\n                                                if ( path.length() % 4 == 0 )\n                                                {\n                                                    return Evaluation.INCLUDE_AND_PRUNE;\n                                                }\n                                                else\n                                                {\n                                                    return Evaluation.INCLUDE_AND_CONTINUE;\n                                                }\n\n                                            }\n                                        }\n                                    }\n\n                                    if ( path.length() % 4 == 0 )\n                                    {\n                                        return Evaluation.EXCLUDE_AND_PRUNE;\n                                    }\n                                    else\n                                    {\n                                        return Evaluation.EXCLUDE_AND_CONTINUE;\n                                    }\n                                }\n                            } );\n\n        Iterable<Node> nodes = traversalDescription.traverse( user ).nodes();\n\n\n        Iterator<Node> iterator = nodes.iterator();\n        int nodeCount = 0;\n        List<Node> results = new ArrayList<Node>();\n\n        while ( iterator.hasNext() && nodeCount++ < limit )\n        {\n            results.add( iterator.next() );\n        }\n\n        return results;\n    }\n\n    public ExecutionResult friendOfAFriendWithMultipleInterest( String userName, int limit, String... interestLabels )\n    {\n        String query =\n                \"MATCH (subject:User {name:{name}})\\n\" +\n                        \"MATCH p=(subject)-[:WORKED_ON]->()-[:WORKED_ON*0..2]-()\\n\" +\n                        \"        <-[:WORKED_ON]-(person)-[:INTERESTED_IN]->(interest)\\n\" +\n                        \"WHERE person<>subject AND interest.name IN {interests}\\n\" +\n                        \"WITH person, interest, min(length(p)) as pathLength\\n\" +\n                        \"ORDER BY interest.name\\n\"+\n                        \"RETURN person.name AS name,\\n\" +\n                        \"       count(interest) AS score,\\n\" +\n                        \"       collect(interest.name) AS interests,\\n\" +\n                        \"       ((pathLength - 1)/2) AS distance\\n\" +\n                        \"ORDER BY score DESC\\n\" +\n                        \"LIMIT {resultLimit}\";\n\n        Map<String, Object> params = new HashMap<String, Object>();\n        params.put( \"name\", userName );\n        params.put( \"interests\", interestLabels );\n        params.put( \"resultLimit\", limit );\n\n        return executionEngineWrapper.execute( query, params );\n    }\n\n    public ExecutionResult friendWorkedWithFriendWithInterests( String userName, int limit, String... interestLabels )\n    {\n        String query = \"MATCH (subject:User {name:{name}})\\n\" +\n                \"MATCH p=(subject)-[:WORKED_WITH*0..1]-()-[:WORKED_WITH]-(person)\\n\" +\n                \"        -[:INTERESTED_IN]->(interest)\\n\" +\n                \"WHERE person<>subject AND interest.name IN {interests}\\n\" +\n                \"WITH person, interest, min(length(p)) as pathLength\\n\" +\n                \"RETURN person.name AS name,\\n\" +\n                \"       count(interest) AS score,\\n\" +\n                \"       collect(interest.name) AS interests,\\n\" +\n                \"       (pathLength - 1) AS distance\\n\" +\n                \"ORDER BY score DESC\\n\" +\n                \"LIMIT {resultLimit}\";\n\n\n        Map<String, Object> params = new HashMap<String, Object>();\n        params.put( \"name\", userName );\n        params.put( \"userQuery\", \"name:\" + userName );\n        params.put( \"interests\", interestLabels );\n        params.put( \"resultLimit\", limit );\n\n        StringBuilder builder = new StringBuilder();\n        builder.append( \"[\" );\n        for ( int i = 0; i < interestLabels.length; i++ )\n        {\n            builder.append( \"'\" );\n            builder.append( interestLabels[i] );\n            builder.append( \"'\" );\n            if ( i < interestLabels.length - 1 )\n            {\n                builder.append( \",\" );\n            }\n        }\n        builder.append( \"]\" );\n        params.put( \"topicQuery\", builder.toString() );\n\n        return executionEngineWrapper.execute( query, params );\n    }\n\n    // todo no result?\n    public ExecutionResult createWorkedWithRelationships( String userName )\n    {\n\n        String query = \"MATCH (subject:User {name:{name}})\\n\" +\n                \"MATCH (subject)-[:WORKED_ON]->()<-[:WORKED_ON]-(person)\\n\" +\n                \"WHERE NOT((subject)-[:WORKED_WITH]-(person))\\n\" +\n                \"WITH DISTINCT subject, person\\n\" +\n                \"CREATE UNIQUE (subject)-[:WORKED_WITH]-(person)\\n\" +\n                \"RETURN subject.name AS startName, person.name AS endName\";\n\n\n        Map<String, Object> params = new HashMap<String, Object>();\n        params.put( \"name\", userName );\n\n        return executionEngineWrapper.execute( query, params );\n    }\n\n    public ExecutionResult getAllUsers()\n    {\n        String query = \"MATCH (subject:User)\\n\" +\n                \"RETURN subject.name AS name\";\n\n        return executionEngineWrapper.execute( query, new HashMap<String, Object>() );\n    }\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/DbUtils.java",
    "content": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.neo4j.graphdatabases.queries.testing.TestOutputWriter;\nimport org.neo4j.graphdb.*;\nimport org.neo4j.graphdb.factory.GraphDatabaseFactory;\nimport org.neo4j.tooling.GlobalGraphOperations;\n\nimport static org.neo4j.helpers.collection.IteratorUtil.count;\n\npublic class DbUtils\n{\n    public static GraphDatabaseService existingDB( String dir )\n    {\n        GraphDatabaseService db = new GraphDatabaseFactory()\n                .newEmbeddedDatabaseBuilder( dir )\n                .setConfig( DbUtils.dbConfig() )\n                .newGraphDatabase();\n\n        if ( countRelTypes(db) == 0 )\n        {\n            throw new IllegalStateException( \"Performance dataset does not exist. See the Readme for instructions on \" +\n                    \"generating a sample dataset.\" );\n        }\n\n        return db;\n    }\n\n    public static int countRelTypes(GraphDatabaseService db) {\n        try ( Transaction tx = db.beginTx() )\n        {\n            int count = count(GlobalGraphOperations.at(db).getAllRelationshipTypes());\n            tx.success();\n            return count;\n        }\n    }\n\n    public static Map<String, String> dbConfig()\n    {\n        Map<String, String> params = new HashMap<String, String>();\n        params.put( \"dump_configuration\", \"true\" );\n        params.put( \"cache_type\", \"gcr\" );\n        params.put( \"allow_store_upgrade\", \"true\" );\n        params.put( \"online_backup_enabled\", \"false\" );\n        return params;\n    }\n\n    public static void warmCache( GraphDatabaseService db, TestOutputWriter writer )\n    {\n        writer.writeln( \"BEGIN: Warming cache\" );\n\n        try ( Transaction tx = db.beginTx() )\n        {\n            for ( Relationship r : GlobalGraphOperations.at( db ).getAllRelationships() )\n            {\n                r.getPropertyKeys();\n                r.getStartNode();\n            }\n            for ( Node n : GlobalGraphOperations.at( db ).getAllNodes() )\n            {\n                n.getPropertyKeys();\n                for ( Relationship relationship : n.getRelationships() )\n                {\n                    relationship.getStartNode();\n                }\n            }\n            tx.success();\n        }\n        writer.writeln( \"\\nEND  : Warming cache\\n\" );\n    }\n\n    public static int numberOfItemsWithLabel(GraphDatabaseService db, String labelName)\n    {\n        try ( Transaction tx = db.beginTx() )\n        {\n            GlobalGraphOperations ops = GlobalGraphOperations.at(db);\n            int count = count(ops.getAllNodesWithLabel(DynamicLabel.label(labelName)));\n            tx.success();\n            return count;\n        }\n    }\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/ExecutionEngineWrapper.java",
    "content": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport java.util.Map;\n\nimport org.neo4j.cypher.javacompat.ExecutionResult;\n\n\npublic interface ExecutionEngineWrapper\n{\n    ExecutionResult execute(String query, Map<String, Object> params);\n    ExecutionResult execute(String query, Map<String, Object> params, int index);\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/ExecutionResultIterator.java",
    "content": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport java.util.Iterator;\nimport java.util.LinkedList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Queue;\n\nimport org.neo4j.cypher.javacompat.ExecutionResult;\n\npublic class ExecutionResultIterator\n{\n    public static ExecutionResultIterator newQueryIterators( List<String> queries,\n                                                             ExecutionEngineWrapper executionEngine,\n                                                             Map<String, Object> params )\n    {\n        Queue<String> queue = new LinkedList<String>( queries );\n        String query = queue.poll();\n        ExecutionResult executionResult = executionEngine.execute( query, params, 1 );\n        return new ExecutionResultIterator( executionResult, queue, executionEngine, params, 2 );\n    }\n\n    private final ExecutionResult currentResult;\n    private final Queue<String> queries;\n    private final ExecutionEngineWrapper executionEngine;\n    private final Map<String, Object> params;\n    private final int queryIndex;\n\n    private ExecutionResultIterator( ExecutionResult currentResult,\n                                     Queue<String> queries,\n                                     ExecutionEngineWrapper executionEngine,\n                                     Map<String, Object> params,\n                                     int queryIndex )\n    {\n        this.currentResult = currentResult;\n        this.queries = queries;\n        this.executionEngine = executionEngine;\n        this.params = params;\n        this.queryIndex = queryIndex;\n    }\n\n    public Iterator<Map<String, Object>> iterator()\n    {\n        return currentResult.iterator();\n    }\n\n    public boolean hasNextIterator()\n    {\n        return !queries.isEmpty();\n    }\n\n    public ExecutionResultIterator getNextIterator()\n    {\n        String query = queries.poll();\n        ExecutionResult executionResult = executionEngine.execute( query, params, queryIndex );\n        return new ExecutionResultIterator( executionResult, queries, executionEngine, params, queryIndex + 1 );\n    }\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/ExecutionResultsIterator.java",
    "content": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.NoSuchElementException;\n\npublic class ExecutionResultsIterator implements Iterator<Map<String, Object>>\n{\n    private ExecutionResultIterator executionResultIterator;\n\n    public ExecutionResultsIterator( List<String> queries,\n                                     ExecutionEngineWrapper executionEngine,\n                                     Map<String, Object> params )\n    {\n        executionResultIterator = ExecutionResultIterator.newQueryIterators( queries, executionEngine, params );\n    }\n\n    @Override\n    public boolean hasNext()\n    {\n        if ( executionResultIterator.iterator().hasNext() )\n        {\n            return true;\n        }\n\n        if ( !executionResultIterator.hasNextIterator() )\n        {\n            return false;\n        }\n\n        executionResultIterator = executionResultIterator.getNextIterator();\n\n        return hasNext();\n    }\n\n    @Override\n    public Map<String, Object> next()\n    {\n        if ( hasNext() )\n        {\n            return executionResultIterator.iterator().next();\n        }\n\n        throw new NoSuchElementException();\n    }\n\n    @Override\n    public void remove()\n    {\n        throw new UnsupportedOperationException();\n    }\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/IndexNodeByOtherNodeIndexer.java",
    "content": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport org.neo4j.graphdb.*;\nimport org.neo4j.graphdb.index.Index;\n\npublic class IndexNodeByOtherNodeIndexer\n{\n    private final GraphTraversal findIndexableNodes;\n    private final GraphTraversal findOtherNodesForIndexableNode;\n    private final String indexName;\n    private final String indexKey;\n    private final String nodeToIndexByPropertyName;\n\n    public IndexNodeByOtherNodeIndexer( GraphTraversal findIndexableNodes, GraphTraversal\n            findOtherNodesForIndexableNode,\n                                        String indexName, String indexKey, String nodeToIndexByPropertyName )\n\n    {\n        this.findIndexableNodes = findIndexableNodes;\n        this.findOtherNodesForIndexableNode = findOtherNodesForIndexableNode;\n        this.indexName = indexName;\n        this.indexKey = indexKey;\n        this.nodeToIndexByPropertyName = nodeToIndexByPropertyName;\n    }\n\n    public void execute( GraphDatabaseService db, Node startNode, int batchSize )\n    {\n\n        Transaction tx = db.beginTx();\n\n        Label label = DynamicLabel.label(indexName);\n        Iterable<Node> indexableNodes = findIndexableNodes.execute( startNode );\n        int currentBatchSize = 0;\n\n        try\n        {\n            for ( Node indexableNode : indexableNodes )\n            {\n                Iterable<Node> nodesToIndexBy = findOtherNodesForIndexableNode.execute( indexableNode );\n                for ( Node node : nodesToIndexBy )\n                {\n                    indexableNode.addLabel(label);\n                    indexableNode.setProperty(indexKey, node.getProperty( nodeToIndexByPropertyName ) );\n                    if ( currentBatchSize++ > batchSize )\n                    {\n                        tx.success();\n                        tx.close();\n                        tx = db.beginTx();\n                        currentBatchSize = 0;\n                    }\n                }\n            }\n            tx.success();\n        }\n        finally\n        {\n            tx.close();\n        }\n\n    }\n\n    public interface GraphTraversal\n    {\n        Iterable<Node> execute( Node startNode );\n    }\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/QueryUnionExecutionEngine.java",
    "content": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport static java.util.Arrays.asList;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class QueryUnionExecutionEngine\n{\n    private final ExecutionEngineWrapper executionEngine;\n\n    public QueryUnionExecutionEngine( ExecutionEngineWrapper executionEngine )\n    {\n        this.executionEngine = executionEngine;\n    }\n\n    public QueryUnionExecutionResult execute( final Map<String, Object> params, final String... queries )\n    {\n        if ( queries.length == 0 )\n        {\n            throw new IllegalArgumentException( \"Must supply one or more queries.\" );\n        }\n\n        return new QueryUnionExecutionResult( asList( queries ), executionEngine, params );\n    }\n\n    public Iterable<Map<String, Object>> execute( final String... queries )\n    {\n        return execute( new HashMap<String, Object>(), queries );\n    }\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/helpers/QueryUnionExecutionResult.java",
    "content": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Map;\n\npublic class QueryUnionExecutionResult implements Iterable<Map<String, Object>>\n{\n    private final List<String> queries;\n    private final ExecutionEngineWrapper executionEngine;\n    private final Map<String, Object> params;\n\n    public QueryUnionExecutionResult( List<String> queries,\n                                      ExecutionEngineWrapper executionEngine,\n                                      Map<String, Object> params )\n    {\n        this.queries = queries;\n        this.executionEngine = executionEngine;\n        this.params = params;\n    }\n\n    @Override\n    public Iterator<Map<String, Object>> iterator()\n    {\n        return new ExecutionResultsIterator( queries, executionEngine, params );\n    }\n\n    @Override\n    public String toString()\n    {\n        StringBuilder builder = new StringBuilder(  );\n        for ( String query : queries )\n        {\n            builder.append(  executionEngine.execute( query, params ).dumpToString());\n        }\n        return builder.toString();\n    }\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/server/SimpleSocialNetworkExtension.java",
    "content": "package org.neo4j.graphdatabases.queries.server;\n\nimport javax.ws.rs.GET;\nimport javax.ws.rs.Path;\nimport javax.ws.rs.PathParam;\nimport javax.ws.rs.core.Context;\n\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.queries.SimpleSocialNetworkQueries;\nimport org.neo4j.graphdb.GraphDatabaseService;\n\n@Path(\"/distance\")\npublic class SimpleSocialNetworkExtension\n{\n    private final  SimpleSocialNetworkQueries queries;\n\n    public SimpleSocialNetworkExtension( @Context GraphDatabaseService db )\n    {\n        this.queries = new SimpleSocialNetworkQueries( db );\n    }\n\n    @GET\n    @Path(\"/{name1}/{name2}\")\n    public String getDistance  ( @PathParam(\"name1\") String name1, @PathParam(\"name2\") String name2 )\n    {\n        ExecutionResult result = queries.pathBetweenTwoFriends( name1, name2 );\n\n        return String.valueOf( result.columnAs( \"depth\" ).next() );\n    }\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/testing/IndexParam.java",
    "content": "package org.neo4j.graphdatabases.queries.testing;\n\npublic class IndexParam\n{\n    public static IndexParam indexParam( String nodeLabel, String propertyName )\n    {\n        return new IndexParam( nodeLabel, propertyName);\n    }\n\n    private final String nodeLabel;\n    private final String propertyName;\n\n    private IndexParam(String nodeLabel, String propertyName)\n    {\n        this.nodeLabel = nodeLabel;\n        this.propertyName = propertyName;\n    }\n\n    public String nodeLabel()\n    {\n        return nodeLabel;\n    }\n\n    public String propertyName()\n    {\n        return propertyName;\n    }\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/testing/IndexParams.java",
    "content": "package org.neo4j.graphdatabases.queries.testing;\n\nimport static java.lang.String.format;\nimport static java.util.Arrays.asList;\n\nimport java.util.List;\n\nimport org.neo4j.cypher.javacompat.ExecutionEngine;\nimport org.neo4j.graphdb.DynamicLabel;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.Node;\nimport org.neo4j.graphdb.Transaction;\nimport org.neo4j.tooling.GlobalGraphOperations;\n\npublic class IndexParams\n{\n    private final List<IndexParam> indexParams;\n\n    public IndexParams( IndexParam... params )\n    {\n        indexParams = asList( params );\n    }\n\n    public void index(GraphDatabaseService db)\n    {\n        try (Transaction tx = db.beginTx()) {\n            for (IndexParam indexParam : indexParams) {\n                db.schema().indexFor(DynamicLabel.label(indexParam.nodeLabel())).on(indexParam.propertyName()).create();\n//                db.schema().constraintFor(DynamicLabel.label(indexParam.nodeLabel())).assertPropertyIsUnique(indexParam.propertyName()).create();\n//                engine.execute(format(\"CREATE INDEX ON :%s(%s)\", indexParam.nodeLabel(), indexParam.propertyName()));\n            }\n            tx.success();\n        }\n\n    }\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/testing/TestOutputWriter.java",
    "content": "/*\n * Copyright (C) 2012 Neo Technology\n * All rights reserved\n */\npackage org.neo4j.graphdatabases.queries.testing;\n\npublic interface TestOutputWriter\n{\n    void begin();\n    void write(String value);\n    void writeln( String value );\n    void flush();\n    void end();\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/traversals/FriendOfAFriendDepth4.java",
    "content": "package org.neo4j.graphdatabases.queries.traversals;\n\nimport static org.neo4j.graphdb.DynamicRelationshipType.withName;\nimport static org.neo4j.graphdb.traversal.Uniqueness.*;\n\nimport org.neo4j.graphdb.*;\nimport org.neo4j.graphdb.index.Index;\nimport org.neo4j.graphdb.traversal.Evaluation;\nimport org.neo4j.graphdb.traversal.Evaluator;\nimport org.neo4j.graphdb.traversal.TraversalDescription;\nimport org.neo4j.helpers.collection.IteratorUtil;\nimport org.neo4j.kernel.Traversal;\nimport org.neo4j.kernel.Uniqueness;\n\npublic class FriendOfAFriendDepth4\n{\n    public static final Label USER = DynamicLabel.label(\"User\");\n\n    private final TraversalDescription traversalDescription;\n\n    private final GraphDatabaseService db;\n\n    public FriendOfAFriendDepth4( GraphDatabaseService db )\n    {\n        this.db = db;\n        traversalDescription = traversalDescription(db);\n    }\n\n    private TraversalDescription traversalDescription(GraphDatabaseService db)\n    {\n        return db.traversalDescription()\n                .breadthFirst()\n                .uniqueness( NODE_GLOBAL )\n                .relationships( withName( \"FRIEND\" ) )\n                .evaluator( new Evaluator()\n                {\n                    @Override\n                    public Evaluation evaluate( Path path )\n                    {\n                        if ( path.length() == 4 )\n                        {\n                            return Evaluation.INCLUDE_AND_PRUNE;\n                        }\n                        return Evaluation.EXCLUDE_AND_CONTINUE;\n\n                    }\n                } );\n    }\n\n    public Iterable<Node> getFriends( String name )\n    {\n        ResourceIterable<Node> users = db.findNodesByLabelAndProperty(USER, \"name\", name);\n        Node startNode = IteratorUtil.single(users);\n        return traversalDescription.traverse(startNode).nodes();\n    }\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/traversals/IndexResources.java",
    "content": "package org.neo4j.graphdatabases.queries.traversals;\n\nimport static org.neo4j.graphdb.DynamicRelationshipType.withName;\n\nimport org.neo4j.graphdatabases.queries.helpers.IndexNodeByOtherNodeIndexer;\nimport org.neo4j.graphdb.*;\nimport org.neo4j.graphdb.traversal.Evaluation;\nimport org.neo4j.graphdb.traversal.Evaluator;\nimport org.neo4j.graphdb.traversal.TraversalDescription;\nimport org.neo4j.kernel.Traversal;\nimport org.neo4j.tooling.GlobalGraphOperations;\n\npublic class IndexResources\n{\n    private final GraphDatabaseService db;\n    private final TraversalDescription traversalDescription = Traversal.description()\n            .breadthFirst()\n            .relationships( withName( \"WORKS_FOR\" ), Direction.INCOMING )\n            .relationships( withName( \"HAS_ACCOUNT\" ), Direction.OUTGOING )\n            .evaluator( new Evaluator()\n            {\n                @Override\n                public Evaluation evaluate( Path path )\n                {\n                    if ( path.endNode().equals( path.startNode() ) )\n                    {\n                        return Evaluation.EXCLUDE_AND_CONTINUE;\n                    }\n                    return Evaluation.INCLUDE_AND_CONTINUE;\n                }\n            } );\n\n    public IndexResources( GraphDatabaseService db )\n    {\n        this.db = db;\n    }\n\n    public void execute()\n    {\n        IndexNodeByOtherNodeIndexer.GraphTraversal traversal1 = new IndexNodeByOtherNodeIndexer.GraphTraversal()\n        {\n            @Override\n            public Iterable<Node> execute( Node startNode )\n            {\n                return GlobalGraphOperations.at(db).getAllNodesWithLabel(DynamicLabel.label(\"company\"));\n            }\n        };\n\n        IndexNodeByOtherNodeIndexer.GraphTraversal traversal2 = new IndexNodeByOtherNodeIndexer.GraphTraversal()\n        {\n            @Override\n            public Iterable<Node> execute( Node startNode )\n            {\n                return traversalDescription.traverse( startNode ).nodes();\n            }\n        };\n\n        IndexNodeByOtherNodeIndexer indexer = new IndexNodeByOtherNodeIndexer( traversal1, traversal2, \"company\", \"resourceName\", \"name\" );\n        indexer.execute( db, null, 1000 );\n    }\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/traversals/ParcelRouteCalculator.java",
    "content": "package org.neo4j.graphdatabases.queries.traversals;\n\nimport static org.neo4j.graphdb.DynamicRelationshipType.withName;\n\nimport java.util.ArrayList;\nimport java.util.LinkedHashSet;\nimport java.util.List;\nimport java.util.Set;\n\nimport org.joda.time.Interval;\nimport org.neo4j.graphalgo.CommonEvaluators;\nimport org.neo4j.graphalgo.CostEvaluator;\nimport org.neo4j.graphalgo.GraphAlgoFactory;\nimport org.neo4j.graphalgo.PathFinder;\nimport org.neo4j.graphalgo.WeightedPath;\nimport org.neo4j.graphdb.*;\nimport org.neo4j.graphdb.index.Index;\nimport org.neo4j.graphdb.traversal.BranchState;\nimport org.neo4j.graphdb.traversal.Evaluation;\nimport org.neo4j.graphdb.traversal.Evaluator;\nimport org.neo4j.graphdb.traversal.InitialBranchState;\nimport org.neo4j.graphdb.traversal.TraversalDescription;\nimport org.neo4j.helpers.collection.IteratorUtil;\nimport org.neo4j.kernel.Traversal;\n\npublic class ParcelRouteCalculator\n{\n    private static final PathExpander<Interval> DELIVERY_ROUTE_EXPANDER = new IntervalPathExpander(\n            withName( \"DELIVERY_ROUTE\" ),\n            Direction.INCOMING\n    );\n\n    private static final PathExpander<Interval> CONNECTED_TO_EXPANDER = new IntervalPathExpander(\n            withName( \"CONNECTED_TO\" ),\n            Direction.BOTH\n    );\n\n    private static final TraversalDescription DELIVERY_BASE_FINDER = Traversal.description()\n            .depthFirst()\n            .evaluator( new Evaluator()\n            {\n                private final RelationshipType DELIVERY_ROUTE = withName( \"DELIVERY_ROUTE\");\n\n                @Override\n                public Evaluation evaluate( Path path )\n                {\n                    if ( isDeliveryBase( path ) )\n                    {\n                        return Evaluation.INCLUDE_AND_PRUNE;\n                    }\n\n                    return Evaluation.EXCLUDE_AND_CONTINUE;\n                }\n\n                private boolean isDeliveryBase( Path path )\n                {\n                    return !path.endNode().hasRelationship( DELIVERY_ROUTE, Direction.INCOMING );\n                }\n            } );\n\n    private static final CostEvaluator<Double> COST_EVALUATOR = CommonEvaluators.doubleCostEvaluator( \"cost\" );\n    public static final Label LOCATION = DynamicLabel.label(\"Location\");\n    private GraphDatabaseService db;\n\n    public ParcelRouteCalculator( GraphDatabaseService db )\n    {\n        this.db = db;\n    }\n\n    public Iterable<Node> calculateRoute( String start, String end, Interval interval )\n    {\n        try ( Transaction tx = db.beginTx() )\n        {\n            TraversalDescription deliveryBaseFinder = createDeliveryBaseFinder( interval );\n\n            Path upLeg = findRouteToDeliveryBase( start, deliveryBaseFinder );\n            Path downLeg = findRouteToDeliveryBase( end, deliveryBaseFinder );\n\n            Path topRoute = findRouteBetweenDeliveryBases(\n                    upLeg.endNode(),\n                    downLeg.endNode(),\n                    interval );\n\n            Set<Node> routes = combineRoutes(upLeg, downLeg, topRoute);\n            tx.success();\n            return routes;\n        }\n    }\n\n    private TraversalDescription createDeliveryBaseFinder( Interval interval )\n    {\n        return DELIVERY_BASE_FINDER.expand( DELIVERY_ROUTE_EXPANDER,\n                new InitialBranchState.State<Interval>( interval, interval ) );\n    }\n\n    private Set<Node> combineRoutes( Path upLeg, Path downLeg, Path topRoute )\n    {\n        LinkedHashSet<Node> results = new LinkedHashSet<Node>();\n        results.addAll( IteratorUtil.asCollection( upLeg.nodes() ));\n        results.addAll( IteratorUtil.asCollection( topRoute.nodes() ));\n        results.addAll( IteratorUtil.asCollection( downLeg.reverseNodes() ));\n        return results;\n    }\n\n    private Path findRouteBetweenDeliveryBases( Node deliveryBase1, Node deliveryBase2, Interval interval )\n    {\n        PathFinder<WeightedPath> routeBetweenDeliveryBasesFinder = GraphAlgoFactory.dijkstra(\n                CONNECTED_TO_EXPANDER,\n                new InitialBranchState.State<Interval>( interval, interval ),\n                COST_EVALUATOR );\n        return routeBetweenDeliveryBasesFinder.findSinglePath( deliveryBase1, deliveryBase2 );\n    }\n\n    private Path findRouteToDeliveryBase( String startPosition, TraversalDescription deliveryBaseFinder )\n    {\n        Node startNode = IteratorUtil.single(db.findNodesByLabelAndProperty(LOCATION, \"name\", startPosition));\n        return deliveryBaseFinder.traverse( startNode ).iterator().next();\n    }\n\n    private static class IntervalPathExpander implements PathExpander<Interval>\n    {\n\n        private final RelationshipType relationshipType;\n        private final Direction direction;\n\n        private IntervalPathExpander( RelationshipType relationshipType, Direction direction )\n        {\n            this.relationshipType = relationshipType;\n            this.direction = direction;\n        }\n\n        @Override\n        public Iterable<Relationship> expand( Path path, BranchState<Interval> deliveryInterval )\n        {\n            List<Relationship> results = new ArrayList<Relationship>();\n            for ( Relationship r : path.endNode().getRelationships( relationshipType, direction ) )\n            {\n                Interval relationshipInterval = new Interval(\n                        (Long) r.getProperty( \"start_date\" ),\n                        (Long) r.getProperty( \"end_date\" ) );\n                if ( relationshipInterval.contains( deliveryInterval.getState() ) )\n                {\n                    results.add( r );\n                }\n            }\n\n            return results;\n        }\n\n        @Override\n        public PathExpander<Interval> reverse()\n        {\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "queries/src/main/java/org/neo4j/graphdatabases/queries/traversals/SimpleParcelRouteCalculator.java",
    "content": "package org.neo4j.graphdatabases.queries.traversals;\n\nimport static org.neo4j.graphdb.DynamicRelationshipType.withName;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.joda.time.Interval;\nimport org.neo4j.graphalgo.CommonEvaluators;\nimport org.neo4j.graphalgo.CostEvaluator;\nimport org.neo4j.graphalgo.GraphAlgoFactory;\nimport org.neo4j.graphalgo.PathFinder;\nimport org.neo4j.graphalgo.WeightedPath;\nimport org.neo4j.graphdb.*;\nimport org.neo4j.graphdb.index.Index;\nimport org.neo4j.graphdb.traversal.BranchState;\nimport org.neo4j.graphdb.traversal.InitialBranchState;\nimport org.neo4j.helpers.collection.IteratorUtil;\n\npublic class SimpleParcelRouteCalculator\n{\n    private static final CostEvaluator<Double> COST_EVALUATOR = CommonEvaluators.doubleCostEvaluator( \"cost\" );\n    private static final PathExpander<Interval> PATH_EXPANDER = new ValidPathExpander();\n    public static final Label LOCATION = DynamicLabel.label(\"Location\");\n    private GraphDatabaseService db;\n\n    public SimpleParcelRouteCalculator( GraphDatabaseService db )\n    {\n        this.db = db;\n    }\n\n    public Iterable<Node> calculateRoute( String start, String end, Interval interval )\n    {\n        Node startNode = findByLocation ( start );\n        Node endNode = findByLocation( end );\n\n        PathFinder<WeightedPath> routeBetweenDeliveryBasesFinder = GraphAlgoFactory.dijkstra(\n                PATH_EXPANDER,\n                new InitialBranchState.State<Interval>( interval, interval ),\n                COST_EVALUATOR );\n        return IteratorUtil.asCollection(\n                routeBetweenDeliveryBasesFinder.findSinglePath( startNode, endNode ).nodes() );\n    }\n\n    private Node findByLocation(String location)\n    {\n        return IteratorUtil.single( db.findNodesByLabelAndProperty( LOCATION, \"name\", location ) );\n    }\n\n    private static class ValidPathExpander implements PathExpander<Interval>\n    {\n        @Override\n        public Iterable<Relationship> expand( Path path, BranchState<Interval> deliveryInterval )\n        {\n            List<Relationship> results = new ArrayList<Relationship>();\n            for ( Relationship r : path.endNode().getRelationships( Direction.BOTH, withName( \"CONNECTED_TO\" ),\n                    withName( \"DELIVERY_ROUTE\" ) ) )\n            {\n                Interval relationshipInterval = new Interval(\n                        (Long) r.getProperty( \"start_date\" ),\n                        (Long) r.getProperty( \"end_date\" ) );\n                if ( relationshipInterval.contains( deliveryInterval.getState() ) )\n                {\n                    results.add( r );\n                }\n            }\n\n            return results;\n        }\n\n        @Override\n        public PathExpander<Interval> reverse()\n        {\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "queries/src/main/resources/META_INF/services/javax.script.ScriptEngineFactory",
    "content": "com.tinkerpop.gremlin.jsr223.GremlinGroovyScriptEngineFactory"
  },
  {
    "path": "queries/src/main/resources/META_INF/services/org.neo4j.server.plugins.ServerPlugin",
    "content": "org.neo4j.graphdatabases.queries.server.SimpleSocialNetworkExtension"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/AccessControlQueriesTest.java",
    "content": "package org.neo4j.graphdatabases.queries;\n\nimport static java.util.Arrays.asList;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.neo4j.graphdatabases.queries.helpers.Db.createFromCypher;\nimport static org.neo4j.graphdatabases.queries.testing.IndexParam.indexParam;\n\nimport java.util.*;\n\nimport org.junit.*;\nimport org.junit.rules.TestName;\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.queries.helpers.PrintingExecutionEngineWrapper;\nimport org.neo4j.graphdatabases.queries.traversals.IndexResources;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.helpers.collection.IteratorUtil;\n\npublic class AccessControlQueriesTest\n{\n    @Rule\n    public TestName testName = new TestName();\n\n    private GraphDatabaseService db;\n    private AccessControlQueries queries;\n\n    @Before\n    public void init()\n    {\n        db = createDatabase();\n        queries = new AccessControlQueries( new PrintingExecutionEngineWrapper( db,\n                \"access-control-revised\", testName ) );\n    }\n\n    @After\n    public void shutdown()\n    {\n        db.shutdown();\n    }\n\n    @Test\n    public void allowedWithInheritTrueGivesAccessToSubcompaniesAndAccounts() throws Exception\n    {\n        // Ben is member of two groups, both of which have ALLOWED_INHERIT.\n        // He should, therefore, see all results below the companies to which\n        // these permissions are attached.\n\n        // when\n        ExecutionResult results = queries.findAccessibleResources( \"Ben\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Account-1\", iterator.next().get( \"account\" ) );\n        assertEquals( \"Account-2\", iterator.next().get( \"account\" ) );\n        assertEquals( \"Account-3\", iterator.next().get( \"account\" ) );\n        assertEquals( \"Account-6\", iterator.next().get( \"account\" ) );\n        assertEquals( \"Account-4\", iterator.next().get( \"account\" ) );\n        assertEquals( \"Account-5\", iterator.next().get( \"account\" ) );\n        assertEquals( \"Account-7\", iterator.next().get( \"account\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void deniedExcludesCompanyFromPermissionsTree() throws Exception\n    {\n        // Sarah is a member of Group-2, which has DENIED on Skunkworx.\n        // Therefore Account-7 should not appear in the results.\n        // Group-2 also has ALLOWED_DO_NOT_INHERIT on Acme, so Spinoff accounts,\n        // a child of Acme, should not be included in results\n\n        // when\n        ExecutionResult results = queries.findAccessibleResources( \"Sarah\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Account-4\", iterator.next().get( \"account\" ) );\n        assertEquals( \"Account-5\", iterator.next().get( \"account\" ) );\n        assertEquals( \"Account-1\", iterator.next().get( \"account\" ) );\n        assertEquals( \"Account-2\", iterator.next().get( \"account\" ) );\n        assertEquals( \"Account-3\", iterator.next().get( \"account\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void deniedExcludesCompanyFromPermissionsTree2() throws Exception\n    {\n        // Liz is a member of Group-4, which has ALLOWED_INHERIT on BigCo.\n        // However, she is also a member of Group-5, which has DENIED on AcquiredLtd.\n        // This DENIED also debars Liz from Subsidiary and DevShop.\n        // Liz's membership of Group-6, with its ALLOWED_DO_NOT_INHERIT on One-Man Shop\n        // gives Liz access to One-Man Shop\n\n        // when\n        ExecutionResult results = queries.findAccessibleResources( \"Liz\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Account-8\", iterator.next().get( \"account\" ) );\n        assertEquals( \"Account-10\", iterator.next().get( \"account\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldGetAccessibleCompaniesForAdmin() throws Exception\n    {\n        // Sarah is a member of groups that have ALLOWED_INHERIT, ALLOWED_DO_NOT_INHERIT and DENIED\n        // This tests this combination (for a 2-layer organizational structure).\n\n        // given\n        ExecutionResult results = queries.findAccessibleCompanies( \"Sarah\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Startup\", iterator.next().get( \"company\" ) );\n        assertEquals( \"Acme\", iterator.next().get( \"company\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldGetAccessibleCompaniesForAdminWhereNoAllowedInheritFalse() throws Exception\n    {\n        // Ben is a member of groups that have ALLOWED_INHERIT\n\n        // given\n        ExecutionResult results = queries.findAccessibleCompanies( \"Ben\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Acme\", iterator.next().get( \"company\" ) );\n        assertEquals( \"Spinoff\", iterator.next().get( \"company\" ) );\n        assertEquals( \"Startup\", iterator.next().get( \"company\" ) );\n        assertEquals( \"Skunkworkz\", iterator.next().get( \"company\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void moreComplexShouldGetAccessibleCompaniesForAdmin() throws Exception\n    {\n        // Liz has ALLOWED_INHERIT at the top of a 3-layer org structure,\n        // DENIED at the next level, and ALLOWED_DO_NOT_INHERIT at the bottom layer.\n\n        // given\n        ExecutionResult results = queries.findAccessibleCompanies( \"Liz\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"BigCompany\", iterator.next().get( \"company\" ) );\n        assertEquals( \"One-ManShop\", iterator.next().get( \"company\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldFindAccessibleAccountsForAdminAndCompany() throws Exception\n    {\n        // given\n        ExecutionResult results = queries.findAccessibleAccountsForCompany( \"Sarah\", \"Startup\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Account-4\", iterator.next().get( \"account\" ) );\n        assertEquals( \"Account-5\", iterator.next().get( \"account\" ) );\n\n        assertFalse( iterator.hasNext() );\n\n    }\n\n    @Test\n    public void moreComplexShouldFindAccessibleAccountsForAdminAndCompany() throws Exception\n    {\n        // given\n        ExecutionResult results = queries.findAccessibleAccountsForCompany( \"Liz\", \"BigCompany\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Account-8\", iterator.next().get( \"account\" ) );\n\n        assertFalse( iterator.hasNext() );\n\n    }\n\n    @Test\n    public void shouldFindAccessibleAccountsForAdminAndCompanyWhenNoAllowedWithInheritFalse() throws Exception\n    {\n        // given\n        ExecutionResult results = queries.findAccessibleAccountsForCompany( \"Ben\", \"Startup\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Account-4\", iterator.next().get( \"account\" ) );\n        assertEquals( \"Account-5\", iterator.next().get( \"account\" ) );\n        assertEquals( \"Account-7\", iterator.next().get( \"account\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldFindAdminForAccountResourceWhereAllowedInheritAndAllowedNotInherit() throws Exception\n    {\n        // Account-10 is associated with One-ManShop\n        // One-ManShop-CHILD_OF->Subsidiary-CHILD_OF->AcquiredLtd->CHILD_OF->BigCompany\n\n        // Liz is a member of:\n        //   Group-6, which has ALLOWED_DO_NOT_INHERIT to OneManShop\n        //   Group-5, which has DENIED on AcquiredLtd\n        //   Group-4, which has ALLOWED_INHERIT on BigCompany\n        // She has access to Account-10 by virtue of Group-6\n\n        // Phil is a member of:\n        //   Group-7, which has ALLOWED_INHERIT on Subsidiary\n        // He has access to Account-10 by virtue of Group-7\n\n        // given\n        ExecutionResult results = queries.findAdminForResource( \"Account-10\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Phil\", iterator.next().get( \"admin\" ) );\n        assertEquals( \"Liz\", iterator.next().get( \"admin\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldFindAdminForEmployeeResourceWhereAllowedInheritAndDenied() throws Exception\n    {\n        // Kate works for Skunkworkz\n        // Skunkworkz-CHILD_OF->Startup\n\n        // Sarah is a member of:\n        //  Group-2, which has DENIED on Skunkworkz\n        //  Group-3, which has ALLOWED_INHERIT on Startup\n        // She is denied access to Kate by virtue of Group-2\n\n        // Ben is a member of:\n        //  Group-3, which has ALLOWED_INHERIT on Startup\n        //  Group-1, which has no access to Kate's company chain\n        // He has access by to Kate virtue of Group-3\n\n        // given\n        ExecutionResult results = queries.findAdminForResource( \"Kate\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Ben\", iterator.next().get( \"admin\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldFindAdminForCompanyWithAllowedInherit() throws Exception\n    {\n        // BigCompany<-CHILD_OF-AcquiredLtd<-CHILD_OF-Subsidiary<-CHILD_OF-One-ManShop\n\n        // Liz is a member of:\n        //   Group-6, which has ALLOWED_DO_NOT_INHERIT to One-ManShop\n        //   Group-5, which has DENIED on AcquiredLtd\n        //   Group-4, which has ALLOWED_INHERIT on BigCompany\n        // She has access to BigCompany by virtue of Group-4\n\n        // Phil is a member of:\n        //   Group-7, which has ALLOWED_INHERIT on Subsidiary\n        // He does not have access to BigCompany\n\n        // given\n        ExecutionResult results = queries.findAdminForCompany( \"BigCompany\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Liz\", iterator.next().get( \"admin\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldFindAdminForCompanyWithDenied() throws Exception\n    {\n        // AcquiredLtd<-CHILD_OF-Subsidiary<-CHILD_OF-One-ManShop\n\n        // Liz is a member of:\n        //   Group-6, which has ALLOWED_DO_NOT_INHERIT to One-ManShop\n        //   Group-5, which has DENIED on AcquiredLtd\n        //   Group-4, which has ALLOWED_INHERIT on BigCompany\n        // She is denied access to AcquiredLtd by virtue of Group-5\n\n        // Phil is a member of:\n        //   Group-7, which has ALLOWED_INHERIT on Subsidiary\n        // He does not have access to AcquiredLtd\n\n        // given\n        ExecutionResult results = queries.findAdminForCompany( \"AcquiredLtd\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldFindAdminForCompanyWithAllowedInheritAndAllowedDoNotInheritTooLowInTree() throws Exception\n    {\n        //Subsidiary<-CHILD_OF-One-ManShop\n\n        // Liz is a member of:\n        //   Group-6, which has ALLOWED_DO_NOT_INHERIT to One-ManShop\n        //   Group-5, which has DENIED on AcquiredLtd\n        //   Group-4, which has ALLOWED_INHERIT on BigCompany\n        // She is denied access to Subsidiary by virtue of Group-5\n\n        // Phil is a member of:\n        //   Group-7, which has ALLOWED_INHERIT on Subsidiary\n        // He has access to Subsidiary by virtue of Group-7\n\n        // given\n        ExecutionResult results = queries.findAdminForCompany( \"Subsidiary\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Phil\", iterator.next().get( \"admin\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldFindAdminForCompanyWithAllowedInheritAndAllowedAllowedDoNotInherit() throws Exception\n    {\n        //One-ManShop\n\n        // Liz is a member of:\n        //   Group-6, which has ALLOWED_DO_NOT_INHERIT to One-ManShop\n        //   Group-5, which has DENIED on AcquiredLtd\n        //   Group-4, which has ALLOWED_INHERIT on BigCompany\n        // She has access to One-ManShop by virtue of Group-6\n\n        // Phil is a member of:\n        //   Group-7, which has ALLOWED_INHERIT on Subsidiary\n        // He has access to One-ManShop by virtue of Group-7\n\n        // given\n        ExecutionResult results = queries.findAdminForCompany( \"One-ManShop\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Phil\", iterator.next().get( \"admin\" ) );\n        assertEquals( \"Liz\", iterator.next().get( \"admin\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldDetermineWhetherAdminHasAccessToResource() throws Exception\n    {\n        Map<String, List<Long>> testData = new LinkedHashMap<>();\n        testData.put( \"Alistair\", asList( 1L, 0L ) );\n        testData.put( \"Account-8\", asList( 1L, 0L ) );\n        testData.put( \"Eve\", asList( 0L ) );\n        testData.put( \"Account-9\", asList( 0L ) );\n        testData.put( \"Mary\", asList( 0L ) );\n        testData.put( \"Account-12\", asList( 0L ) );\n        testData.put( \"Gary\", asList( 0L ) );\n        testData.put( \"Account-11\", asList( 0L ) );\n        testData.put( \"Bill\", asList( 0L, 1L ) );\n        testData.put( \"Account-10\", asList( 0L, 1L ) );\n\n        for ( String resourceName : testData.keySet() )\n        {\n            List<Long> expectedResults = testData.get( resourceName );\n            Iterator<Long> expectedResultsIterator = expectedResults.iterator();\n\n            // given\n            ExecutionResult results = queries.hasAccessToResource( \"Liz\", resourceName );\n\n            // then\n            Iterator<Map<String, Object>> iterator = results.iterator();\n\n            assertTrue( iterator.hasNext() );\n            assertEquals( expectedResultsIterator.next(), iterator.next().get( \"accessCount\" ) );\n            if ( expectedResultsIterator.hasNext() )\n            {\n                assertEquals( expectedResultsIterator.next(), iterator.next().get( \"accessCount\" ) );\n            }\n            assertFalse( iterator.hasNext() );\n        }\n\n    }\n\n    @Test\n    @Ignore(\"does conceptually not work\")\n    public void shouldDetermineWhetherAdminHasAccessToIndexedResource() throws Exception\n    {\n        Map<String, Boolean> testData = new LinkedHashMap<>();\n        testData.put( \"Alistair\", true );\n        testData.put( \"Account-8\", true );\n        testData.put( \"Eve\", false );\n        testData.put( \"Account-9\", false );\n        testData.put( \"Mary\", false );\n        testData.put( \"Account-12\", false );\n        testData.put( \"Gary\", false );\n        testData.put( \"Account-11\", false );\n        testData.put( \"Bill\", true );\n        testData.put( \"Account-10\", true );\n\n        for ( Map.Entry<String, Boolean> entry : testData.entrySet() )\n        {\n            // given\n            ExecutionResult results = queries.hasAccessToIndexedResource( \"Liz\", entry.getKey() );\n//            System.out.println(results.dumpToString());\n            // then\n            assertEquals( entry.getKey(), entry.getValue(), isAuthorized( results ) );\n        }\n\n    }\n\n    private boolean isAuthorized( ExecutionResult result )\n    {\n        Iterator<Long> accessCountIterator = result.columnAs( \"accessCount\" );\n        boolean isAuthorized = false;\n        while ( accessCountIterator.hasNext() )\n        {\n            isAuthorized |= accessCountIterator.next() > 0L;\n        }\n        return isAuthorized;\n    }\n\n\n    private static GraphDatabaseService createDatabase()\n    {\n        String cypher = \"CREATE\\n\" +\n                \"(ben:Administrator {name:'Ben'}),\\n\" +\n                \"(sarah:Administrator {name:'Sarah'}),\\n\" +\n                \"(liz:Administrator {name:'Liz'}),\\n\" +\n                \"(phil:Administrator {name:'Phil'}),\\n\" +\n                \"(arnold:Employee:Resource {name:'Arnold'}),\\n\" +\n                \"(charlie:Employee:Resource {name:'Charlie'}),\\n\" +\n                \"(gordon:Employee:Resource {name:'Gordon'}),\\n\" +\n                \"(lucy:Employee:Resource {name:'Lucy'}),\\n\" +\n                \"(emily:Employee:Resource {name:'Emily'}),\\n\" +\n                \"(kate:Employee:Resource {name:'Kate'}),\\n\" +\n                \"(alistair:Employee:Resource {name:'Alistair'}),\\n\" +\n                \"(eve:Employee:Resource {name:'Eve'}),\\n\" +\n                \"(bill:Employee:Resource {name:'Bill'}),\\n\" +\n                \"(gary:Employee:Resource {name:'Gary'}),\\n\" +\n                \"(mary:Employee:Resource {name:'Mary'}),\\n\" +\n                \"(group1:Group {name:'Group-1'}),\\n\" +\n                \"(group2:Group {name:'Group-2'}),\\n\" +\n                \"(group3:Group {name:'Group-3'}),\\n\" +\n                \"(group4:Group {name:'Group-4'}),\\n\" +\n                \"(group5:Group {name:'Group-5'}),\\n\" +\n                \"(group6:Group {name:'Group-6'}),\\n\" +\n                \"(group7:Group {name:'Group-7'}),\\n\" +\n                \"(acme:Company {name:'Acme'}),\\n\" +\n                \"(spinoff:Company {name:'Spinoff'}),\\n\" +\n                \"(startup:Company {name:'Startup'}),\\n\" +\n                \"(skunkworkz:Company {name:'Skunkworkz'}),\\n\" +\n                \"(bigco:Company {name:'BigCompany'}),\\n\" +\n                \"(acquired:Company {name:'AcquiredLtd'}),\\n\" +\n                \"(subsidiary:Company {name:'Subsidiary'}),\\n\" +\n                \"(devshop:Company {name:'DevShop'}),\\n\" +\n                \"(onemanshop:Company {name:'One-ManShop'}),\\n\" +\n                \"(account1:Account:Resource {name:'Account-1'}),\\n\" +\n                \"(account2:Account:Resource {name:'Account-2'}),\\n\" +\n                \"(account3:Account:Resource {name:'Account-3'}),\\n\" +\n                \"(account4:Account:Resource {name:'Account-4'}),\\n\" +\n                \"(account5:Account:Resource {name:'Account-5'}),\\n\" +\n                \"(account6:Account:Resource {name:'Account-6'}),\\n\" +\n                \"(account7:Account:Resource {name:'Account-7'}),\\n\" +\n                \"(account8:Account:Resource {name:'Account-8'}),\\n\" +\n                \"(account9:Account:Resource {name:'Account-9'}),\\n\" +\n                \"(account10:Account:Resource {name:'Account-10'}),\\n\" +\n                \"(account11:Account:Resource {name:'Account-11'}),\\n\" +\n                \"(account12:Account:Resource {name:'Account-12'}),\\n\" +\n                \"ben-[:MEMBER_OF]->group1,\\n\" +\n                \"ben-[:MEMBER_OF]->group3,\\n\" +\n                \"sarah-[:MEMBER_OF]->group2,\\n\" +\n                \"sarah-[:MEMBER_OF]->group3,\\n\" +\n                \"liz-[:MEMBER_OF]->group4,\\n\" +\n                \"liz-[:MEMBER_OF]->group5,\\n\" +\n                \"liz-[:MEMBER_OF]->group6,\\n\" +\n                \"phil-[:MEMBER_OF]->group7,\\n\" +\n                \"spinoff-[:CHILD_OF]->acme,\\n\" +\n                \"skunkworkz-[:CHILD_OF]->startup,\\n\" +\n                \"acquired-[:CHILD_OF]->bigco,\\n\" +\n                \"subsidiary-[:CHILD_OF]->acquired,\\n\" +\n                \"onemanshop-[:CHILD_OF]->subsidiary,\\n\" +\n                \"devshop-[:CHILD_OF]->subsidiary,\\n\" +\n                \"arnold-[:WORKS_FOR]->acme,\\n\" +\n                \"charlie-[:WORKS_FOR]->acme,\\n\" +\n                \"gordon-[:WORKS_FOR]->startup,\\n\" +\n                \"lucy-[:WORKS_FOR]->startup,\\n\" +\n                \"emily-[:WORKS_FOR]->spinoff,\\n\" +\n                \"kate-[:WORKS_FOR]->skunkworkz,\\n\" +\n                \"alistair-[:WORKS_FOR]->bigco,\\n\" +\n                \"eve-[:WORKS_FOR]->acquired,\\n\" +\n                \"gary-[:WORKS_FOR]->subsidiary,\\n\" +\n                \"mary-[:WORKS_FOR]->devshop,\\n\" +\n                \"bill-[:WORKS_FOR]->onemanshop,\\n\" +\n                \"arnold-[:HAS_ACCOUNT]->account1,\\n\" +\n                \"arnold-[:HAS_ACCOUNT]->account2,\\n\" +\n                \"charlie-[:HAS_ACCOUNT]->account3,\\n\" +\n                \"gordon-[:HAS_ACCOUNT]->account4,\\n\" +\n                \"lucy-[:HAS_ACCOUNT]->account5,\\n\" +\n                \"emily-[:HAS_ACCOUNT]->account6,\\n\" +\n                \"kate-[:HAS_ACCOUNT]->account7,\\n\" +\n                \"alistair-[:HAS_ACCOUNT]->account8,\\n\" +\n                \"eve-[:HAS_ACCOUNT]->account9,\\n\" +\n                \"bill-[:HAS_ACCOUNT]->account10,\\n\" +\n                \"gary-[:HAS_ACCOUNT]->account11,\\n\" +\n                \"mary-[:HAS_ACCOUNT]->account12,\\n\" +\n                \"group1-[:ALLOWED_INHERIT]->acme,\\n\" +\n                \"group2-[:ALLOWED_DO_NOT_INHERIT]->acme,\\n\" +\n                \"group2-[:DENIED]->skunkworkz,\\n\" +\n                \"group3-[:ALLOWED_INHERIT]->startup,\\n\" +\n                \"group4-[:ALLOWED_INHERIT]->bigco,\\n\" +\n                \"group5-[:DENIED]->acquired,\\n\" +\n                \"group6-[:ALLOWED_DO_NOT_INHERIT]->onemanshop,\\n\" +\n                \"group7-[:ALLOWED_INHERIT]->subsidiary\";\n\n        GraphDatabaseService graph = createFromCypher(\n                \"Access Control Revised\",\n                cypher,\n                indexParam( \"Administrator\", \"name\" ),\n                indexParam( \"Employee\", \"name\" ),\n                indexParam( \"Company\", \"name\" ),\n                indexParam( \"Account\", \"name\" ),\n                indexParam( \"Resource\", \"name\" ));\n\n        new IndexResources( graph ).execute();\n\n        return graph;\n    }\n}\n"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/AccessControlWithRelationshipPropertiesQueriesTest.java",
    "content": "package org.neo4j.graphdatabases.queries;\n\nimport static java.util.Arrays.asList;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.neo4j.graphdatabases.queries.helpers.Db.createFromCypher;\nimport static org.neo4j.graphdatabases.queries.testing.IndexParam.indexParam;\n\nimport java.util.*;\n\nimport org.junit.*;\nimport org.junit.rules.TestName;\nimport org.neo4j.graphdatabases.queries.helpers.PrintingExecutionEngineWrapper;\nimport org.neo4j.graphdatabases.queries.helpers.QueryUnionExecutionResult;\nimport org.neo4j.graphdatabases.queries.traversals.IndexResources;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.Node;\nimport org.neo4j.graphdb.Path;\nimport org.neo4j.graphdb.Transaction;\n\npublic class AccessControlWithRelationshipPropertiesQueriesTest\n{\n    @Rule\n    public TestName name = new TestName();\n\n    private GraphDatabaseService db;\n    private AccessControlWithRelationshipPropertiesQueries queries;\n    private Transaction tx;\n\n    @Before\n    public  void init()\n    {\n        db = createDatabase();\n        queries = new AccessControlWithRelationshipPropertiesQueries( new PrintingExecutionEngineWrapper( db, \"access-control\", name ) );\n        tx = db.beginTx();\n    }\n\n    @After\n    public void shutdown()\n    {\n        if ( tx!=null )\n        {\n            tx.success();\n            tx.close();\n        }\n        db.shutdown();\n    }\n\n    @Test\n    public void allowedWithInheritTrueGivesAccessToSubcompaniesAndAccounts() throws Exception\n    {\n        // Ben is member of two groups, both of which have ALLOWED_INHERIT.\n        // He should, therefore, see all results below the companies to which\n        // these permissions are attached.\n\n        // when\n        QueryUnionExecutionResult results = queries.findAccessibleResources( \"Ben\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Account-1\", ((Path) iterator.next().get( \"paths\" )).endNode().getProperty( \"name\" ) );\n        assertEquals( \"Account-2\", ((Path) iterator.next().get( \"paths\" )).endNode().getProperty( \"name\" ) );\n        assertEquals( \"Account-3\", ((Path) iterator.next().get( \"paths\" )).endNode().getProperty( \"name\" ) );\n        assertEquals( \"Account-6\", ((Path) iterator.next().get( \"paths\" )).endNode().getProperty( \"name\" ) );\n        assertEquals( \"Account-4\", ((Path) iterator.next().get( \"paths\" )).endNode().getProperty( \"name\" ) );\n        assertEquals( \"Account-5\", ((Path) iterator.next().get( \"paths\" )).endNode().getProperty( \"name\" ) );\n        assertEquals( \"Account-7\", ((Path) iterator.next().get( \"paths\" )).endNode().getProperty( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void deniedExcludesCompanyFromPermissionsTree() throws Exception\n    {\n        // Sarah is a member of Group-2, which has DENIED on Skunkworx.\n        // Therefore Account-7 should not appear in the results.\n        // Group-2 also has ALLOWED_DO_NOT_INHERIT on Acme, so Spinoff accounts,\n        // a child of Acme, should not be included in results\n\n        // when\n        QueryUnionExecutionResult results = queries.findAccessibleResources( \"Sarah\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Account-4\", ((Path) iterator.next().get( \"paths\" )).endNode().getProperty( \"name\" ) );\n        assertEquals( \"Account-5\", ((Path) iterator.next().get( \"paths\" )).endNode().getProperty( \"name\" ) );\n        assertEquals( \"Account-1\", ((Path) iterator.next().get( \"paths\" )).endNode().getProperty( \"name\" ) );\n        assertEquals( \"Account-2\", ((Path) iterator.next().get( \"paths\" )).endNode().getProperty( \"name\" ) );\n        assertEquals( \"Account-3\", ((Path) iterator.next().get( \"paths\" )).endNode().getProperty( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldGetAccessibleCompaniesForAdmin() throws Exception\n    {\n        // Sarah is a member of groups that have ALLOWED_INHERIT, ALLOWED_DO_NOT_INHERIT and DENIED\n        // This tests this combination (for a 2-layer organizational structure).\n\n        // given\n        QueryUnionExecutionResult results = queries.findAccessibleCompanies( \"Sarah\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Startup\", ((Node) iterator.next().get( \"company\" )).getProperty( \"name\" ) );\n        assertEquals( \"Acme\", ((Node) iterator.next().get( \"company\" )).getProperty( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldGetAccessibleCompaniesForAdminWhereNoAllowedInheritFalse() throws Exception\n    {\n        // Ben is a member of groups that have ALLOWED_INHERIT\n\n        // given\n        QueryUnionExecutionResult results = queries.findAccessibleCompanies( \"Ben\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Acme\", ((Node) iterator.next().get( \"company\" )).getProperty( \"name\" ) );\n        assertEquals( \"Spinoff\", ((Node) iterator.next().get( \"company\" )).getProperty( \"name\" ) );\n        assertEquals( \"Startup\", ((Node) iterator.next().get( \"company\" )).getProperty( \"name\" ) );\n        assertEquals( \"Skunkworkz\", ((Node) iterator.next().get( \"company\" )).getProperty( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void moreComplexShouldGetAccessibleCompaniesForAdmin() throws Exception\n    {\n        // Liz has ALLOWED_INHERIT at the top of a 3-layer org structure,\n        // DENIED at the next level, and ALLOWED_DO_NOT_INHERIT at the bottom layer.\n\n        // given\n        QueryUnionExecutionResult results = queries.findAccessibleCompanies( \"Liz\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"BigCompany\", ((Node) iterator.next().get( \"company\" )).getProperty( \"name\" ) );\n        assertEquals( \"One-ManShop\", ((Node) iterator.next().get( \"company\" )).getProperty( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldFindAccessibleAccountsForAdminAndCompany() throws Exception\n    {\n        // given\n        QueryUnionExecutionResult results = queries.findAccessibleAccountsForCompany( \"Sarah\", \"Startup\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Account-4\", ((Node) iterator.next().get( \"account\" )).getProperty( \"name\" ) );\n        assertEquals( \"Account-5\", ((Node) iterator.next().get( \"account\" )).getProperty( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n\n    }\n\n    @Test\n    public void moreComplexShouldFindAccessibleAccountsForAdminAndCompany() throws Exception\n    {\n        // given\n        QueryUnionExecutionResult results = queries.findAccessibleAccountsForCompany( \"Liz\", \"BigCompany\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Account-8\", ((Node) iterator.next().get( \"account\" )).getProperty( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n\n    }\n\n    @Test\n    public void shouldFindAccessibleAccountsForAdminAndCompanyWhenNoAllowedWithInheritFalse() throws Exception\n    {\n        // given\n        QueryUnionExecutionResult results = queries.findAccessibleAccountsForCompany( \"Ben\", \"Startup\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Account-4\", ((Node) iterator.next().get( \"account\" )).getProperty( \"name\" ) );\n        assertEquals( \"Account-5\", ((Node) iterator.next().get( \"account\" )).getProperty( \"name\" ) );\n        assertEquals( \"Account-7\", ((Node) iterator.next().get( \"account\" )).getProperty( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldFindAdminForAccountResourceWhereAllowedInheritAndAllowedNotInherit() throws Exception\n    {\n        // Account-10 is associated with One-ManShop\n        // One-ManShop-CHILD_OF->Subsidiary-CHILD_OF->AcquiredLtd->CHILD_OF->BigCompany\n\n        // Liz is a member of:\n        //   Group-6, which has ALLOWED_DO_NOT_INHERIT to OneManShop\n        //   Group-5, which has DENIED on AcquiredLtd\n        //   Group-4, which has ALLOWED_INHERIT on BigCompany\n        // She has access to Account-10 by virtue of Group-6\n\n        // Phil is a member of:\n        //   Group-7, which has ALLOWED_INHERIT on Subsidiary\n        // He has access to Account-10 by virtue of Group-7\n\n        // given\n        QueryUnionExecutionResult results = queries.findAdminForResource( \"Account-10\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Phil\", ((Node) iterator.next().get( \"admin\" )).getProperty( \"name\" ) );\n        assertEquals( \"Liz\", ((Node) iterator.next().get( \"admin\" )).getProperty( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldFindAdminForEmployeeResourceWhereAllowedInheritAndDenied() throws Exception\n    {\n        // Kate works for Skunkworkz\n        // Skunkworkz-CHILD_OF->Startup\n\n        // Sarah is a member of:\n        //  Group-2, which has DENIED on Skunkworkz\n        //  Group-3, which has ALLOWED_INHERIT on Startup\n        // She is denied access to Kate by virtue of Group-2\n\n        // Ben is a member of:\n        //  Group-3, which has ALLOWED_INHERIT on Startup\n        //  Group-1, which has no access to Kate's company chain\n        // He has access by to Kate virtue of Group-3\n\n        // given\n        QueryUnionExecutionResult results = queries.findAdminForResource( \"Kate\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Ben\", ((Node) iterator.next().get( \"admin\" )).getProperty( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldFindAdminForCompanyWithAllowedInherit() throws Exception\n    {\n        // BigCompany<-CHILD_OF-AcquiredLtd<-CHILD_OF-Subsidiary<-CHILD_OF-One-ManShop\n\n        // Liz is a member of:\n        //   Group-6, which has ALLOWED_DO_NOT_INHERIT to One-ManShop\n        //   Group-5, which has DENIED on AcquiredLtd\n        //   Group-4, which has ALLOWED_INHERIT on BigCompany\n        // She has access to BigCompany by virtue of Group-4\n\n        // Phil is a member of:\n        //   Group-7, which has ALLOWED_INHERIT on Subsidiary\n        // He does not have access to BigCompany\n\n        // given\n        QueryUnionExecutionResult results = queries.findAdminForCompany( \"BigCompany\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Liz\", ((Node) iterator.next().get( \"admin\" )).getProperty( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldFindAdminForCompanyWithDenied() throws Exception\n    {\n        // AcquiredLtd<-CHILD_OF-Subsidiary<-CHILD_OF-One-ManShop\n\n        // Liz is a member of:\n        //   Group-6, which has ALLOWED_DO_NOT_INHERIT to One-ManShop\n        //   Group-5, which has DENIED on AcquiredLtd\n        //   Group-4, which has ALLOWED_INHERIT on BigCompany\n        // She is denied access to AcquiredLtd by virtue of Group-5\n\n        // Phil is a member of:\n        //   Group-7, which has ALLOWED_INHERIT on Subsidiary\n        // He does not have access to AcquiredLtd\n\n        // given\n        QueryUnionExecutionResult results = queries.findAdminForCompany( \"AcquiredLtd\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldFindAdminForCompanyWithAllowedInheritAndAllowedDoNotInheritTooLowInTree() throws Exception\n    {\n        //Subsidiary<-CHILD_OF-One-ManShop\n\n        // Liz is a member of:\n        //   Group-6, which has ALLOWED_DO_NOT_INHERIT to One-ManShop\n        //   Group-5, which has DENIED on AcquiredLtd\n        //   Group-4, which has ALLOWED_INHERIT on BigCompany\n        // She is denied access to Subsidiary by virtue of Group-5\n\n        // Phil is a member of:\n        //   Group-7, which has ALLOWED_INHERIT on Subsidiary\n        // He has access to Subsidiary by virtue of Group-7\n\n        // given\n        QueryUnionExecutionResult results = queries.findAdminForCompany( \"Subsidiary\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Phil\", ((Node) iterator.next().get( \"admin\" )).getProperty( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldFindAdminForCompanyWithAllowedInheritAndAllowedAllowedDoNotInherit() throws Exception\n    {\n        //One-ManShop\n\n        // Liz is a member of:\n        //   Group-6, which has ALLOWED_DO_NOT_INHERIT to One-ManShop\n        //   Group-5, which has DENIED on AcquiredLtd\n        //   Group-4, which has ALLOWED_INHERIT on BigCompany\n        // She has access to One-ManShop by virtue of Group-6\n\n        // Phil is a member of:\n        //   Group-7, which has ALLOWED_INHERIT on Subsidiary\n        // He has access to One-ManShop by virtue of Group-7\n\n        // given\n        QueryUnionExecutionResult results = queries.findAdminForCompany( \"One-ManShop\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        assertEquals( \"Phil\", ((Node) iterator.next().get( \"admin\" )).getProperty( \"name\" ) );\n        assertEquals( \"Liz\", ((Node) iterator.next().get( \"admin\" )).getProperty( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldDetermineWhetherAdminHasAccessToResource() throws Exception\n    {\n        Map<String, List<Long>> testData = new HashMap<String, List<Long>>();\n        testData.put( \"Alistair\", asList( 1L, 0L ) );\n        testData.put( \"Account-8\", asList( 1L, 0L ) );\n        testData.put( \"Eve\", asList( 0L, 0L ) );\n        testData.put( \"Account-9\", asList( 0L, 0L ) );\n        testData.put( \"Mary\", asList( 0L, 0L ) );\n        testData.put( \"Account-12\", asList( 0L, 0L ) );\n        testData.put( \"Gary\", asList( 0L, 0L ) );\n        testData.put( \"Account-11\", asList( 0L, 0L ) );\n        testData.put( \"Bill\", asList( 0L, 1L ) );\n        testData.put( \"Account-10\", asList( 0L, 1L ) );\n\n        for ( String resourceName : testData.keySet() )\n        {\n            List<Long> expectedResults = testData.get( resourceName );\n            Iterator<Long> expectedResultsIterator = expectedResults.iterator();\n\n            // given\n            QueryUnionExecutionResult results = queries.hasAccessToResource( \"Liz\", resourceName );\n\n            // then\n            Iterator<Map<String, Object>> iterator = results.iterator();\n\n            assertTrue( iterator.hasNext() );\n\n            assertEquals( resourceName + \" inherited\", expectedResultsIterator.next(),\n                    iterator.next().get( \"accessCount\" ) );\n            assertEquals( resourceName + \" not inherited\", expectedResultsIterator.next(),\n                    iterator.next().get( \"accessCount\" ) );\n\n            assertFalse( iterator.hasNext() );\n            assertFalse( expectedResultsIterator.hasNext() );\n        }\n\n    }\n\n    @Test\n    @Ignore(\"does not work conceptually\")\n    public void shouldDetermineWhetherAdminHasAccessToIndexedResource() throws Exception\n    {\n        Map<String, List<Long>> testData = new LinkedHashMap<>();\n        testData.put( \"Alistair\", asList( 1L, 0L ) );\n        testData.put( \"Account-8\", asList( 1L, 0L ) );\n        testData.put( \"Eve\", asList( 0L, 0L ) );\n        testData.put( \"Account-9\", asList( 0L, 0L ) );\n        testData.put( \"Mary\", asList( 0L, 0L ) );\n        testData.put( \"Account-12\", asList( 0L, 0L ) );\n        testData.put( \"Gary\", asList( 0L, 0L ) );\n        testData.put( \"Account-11\", asList( 0L, 0L ) );\n        testData.put( \"Bill\", asList( 0L, 1L ) );\n        testData.put( \"Account-10\", asList( 0L, 1L ) );\n\n        for ( String resourceName : testData.keySet() )\n        {\n            List<Long> expectedResults = testData.get( resourceName );\n            Iterator<Long> expectedResultsIterator = expectedResults.iterator();\n\n            // given\n            QueryUnionExecutionResult results = queries.hasAccessToIndexedResource( \"Liz\", resourceName );\n\n            // then\n            Iterator<Map<String, Object>> iterator = results.iterator();\n\n            assertTrue( iterator.hasNext() );\n\n            assertEquals( resourceName + \" inherited\", expectedResultsIterator.next(),\n                    iterator.next().get( \"accessCount\" ) );\n            assertEquals( resourceName + \" not inherited\", expectedResultsIterator.next(),\n                    iterator.next().get( \"accessCount\" ) );\n\n            assertFalse( iterator.hasNext() );\n            assertFalse( expectedResultsIterator.hasNext() );\n        }\n\n    }\n\n\n    private static GraphDatabaseService createDatabase()\n    {\n        String cypher = \"CREATE\\n\" +\n                \"(ben:Administrator {name:'Ben'}),\\n\" +\n                \"(sarah:Administrator {name:'Sarah'}),\\n\" +\n                \"(liz:Administrator {name:'Liz'}),\\n\" +\n                \"(phil:Administrator {name:'Phil'}),\\n\" +\n                \"(arnold:Employee:Resource {name:'Arnold'}),\\n\" +\n                \"(charlie:Employee:Resource {name:'Charlie'}),\\n\" +\n                \"(gordon:Employee:Resource {name:'Gordon'}),\\n\" +\n                \"(lucy:Employee:Resource {name:'Lucy'}),\\n\" +\n                \"(emily:Employee:Resource {name:'Emily'}),\\n\" +\n                \"(kate:Employee:Resource {name:'Kate'}),\\n\" +\n                \"(alistair:Employee:Resource {name:'Alistair'}),\\n\" +\n                \"(eve:Employee:Resource {name:'Eve'}),\\n\" +\n                \"(bill:Employee:Resource {name:'Bill'}),\\n\" +\n                \"(gary:Employee:Resource {name:'Gary'}),\\n\" +\n                \"(mary:Employee:Resource {name:'Mary'}),\\n\" +\n                \"(group1:Group {name:'Group-1'}),\\n\" +\n                \"(group2:Group {name:'Group-2'}),\\n\" +\n                \"(group3:Group {name:'Group-3'}),\\n\" +\n                \"(group4:Group {name:'Group-4'}),\\n\" +\n                \"(group5:Group {name:'Group-5'}),\\n\" +\n                \"(group6:Group {name:'Group-6'}),\\n\" +\n                \"(group7:Group {name:'Group-7'}),\\n\" +\n                \"(acme:Company {name:'Acme'}),\\n\" +\n                \"(spinoff:Company {name:'Spinoff'}),\\n\" +\n                \"(startup:Company {name:'Startup'}),\\n\" +\n                \"(skunkworkz:Company {name:'Skunkworkz'}),\\n\" +\n                \"(bigco:Company {name:'BigCompany'}),\\n\" +\n                \"(acquired:Company {name:'AcquiredLtd'}),\\n\" +\n                \"(subsidiary:Company {name:'Subsidiary'}),\\n\" +\n                \"(devshop:Company {name:'DevShop'}),\\n\" +\n                \"(onemanshop:Company {name:'One-ManShop'}),\\n\" +\n                \"(account1:Account:Resource {name:'Account-1'}),\\n\" +\n                \"(account2:Account:Resource {name:'Account-2'}),\\n\" +\n                \"(account3:Account:Resource {name:'Account-3'}),\\n\" +\n                \"(account4:Account:Resource {name:'Account-4'}),\\n\" +\n                \"(account5:Account:Resource {name:'Account-5'}),\\n\" +\n                \"(account6:Account:Resource {name:'Account-6'}),\\n\" +\n                \"(account7:Account:Resource {name:'Account-7'}),\\n\" +\n                \"(account8:Account:Resource {name:'Account-8'}),\\n\" +\n                \"(account9:Account:Resource {name:'Account-9'}),\\n\" +\n                \"(account10:Account:Resource {name:'Account-10'}),\\n\" +\n                \"(account11:Account:Resource {name:'Account-11'}),\\n\" +\n                \"(account12:Account:Resource {name:'Account-12'}),\\n\" +\n                \"ben-[:MEMBER_OF]->group1,\\n\" +\n                \"ben-[:MEMBER_OF]->group3,\\n\" +\n                \"sarah-[:MEMBER_OF]->group2,\\n\" +\n                \"sarah-[:MEMBER_OF]->group3,\\n\" +\n                \"liz-[:MEMBER_OF]->group4,\\n\" +\n                \"liz-[:MEMBER_OF]->group5,\\n\" +\n                \"liz-[:MEMBER_OF]->group6,\\n\" +\n                \"phil-[:MEMBER_OF]->group7,\\n\" +\n                \"spinoff-[:CHILD_OF]->acme,\\n\" +\n                \"skunkworkz-[:CHILD_OF]->startup,\\n\" +\n                \"acquired-[:CHILD_OF]->bigco,\\n\" +\n                \"subsidiary-[:CHILD_OF]->acquired,\\n\" +\n                \"onemanshop-[:CHILD_OF]->subsidiary,\\n\" +\n                \"devshop-[:CHILD_OF]->subsidiary,\\n\" +\n                \"arnold-[:WORKS_FOR]->acme,\\n\" +\n                \"charlie-[:WORKS_FOR]->acme,\\n\" +\n                \"gordon-[:WORKS_FOR]->startup,\\n\" +\n                \"lucy-[:WORKS_FOR]->startup,\\n\" +\n                \"emily-[:WORKS_FOR]->spinoff,\\n\" +\n                \"kate-[:WORKS_FOR]->skunkworkz,\\n\" +\n                \"alistair-[:WORKS_FOR]->bigco,\\n\" +\n                \"eve-[:WORKS_FOR]->acquired,\\n\" +\n                \"gary-[:WORKS_FOR]->subsidiary,\\n\" +\n                \"mary-[:WORKS_FOR]->devshop,\\n\" +\n                \"bill-[:WORKS_FOR]->onemanshop,\\n\" +\n                \"arnold-[:HAS_ACCOUNT]->account1,\\n\" +\n                \"arnold-[:HAS_ACCOUNT]->account2,\\n\" +\n                \"charlie-[:HAS_ACCOUNT]->account3,\\n\" +\n                \"gordon-[:HAS_ACCOUNT]->account4,\\n\" +\n                \"lucy-[:HAS_ACCOUNT]->account5,\\n\" +\n                \"emily-[:HAS_ACCOUNT]->account6,\\n\" +\n                \"kate-[:HAS_ACCOUNT]->account7,\\n\" +\n                \"alistair-[:HAS_ACCOUNT]->account8,\\n\" +\n                \"eve-[:HAS_ACCOUNT]->account9,\\n\" +\n                \"bill-[:HAS_ACCOUNT]->account10,\\n\" +\n                \"gary-[:HAS_ACCOUNT]->account11,\\n\" +\n                \"mary-[:HAS_ACCOUNT]->account12,\\n\" +\n                \"group1-[:ALLOWED {inherit:true}]->acme,\\n\" +\n                \"group2-[:ALLOWED {inherit:false}]->acme,\\n\" +\n                \"group2-[:DENIED]->skunkworkz,\\n\" +\n                \"group3-[:ALLOWED {inherit:true}]->startup,\\n\" +\n                \"group4-[:ALLOWED {inherit:true}]->bigco,\\n\" +\n                \"group5-[:DENIED]->acquired,\\n\" +\n                \"group6-[:ALLOWED {inherit:false}]->onemanshop,\\n\" +\n                \"group7-[:ALLOWED {inherit:true}]->subsidiary\";\n\n        GraphDatabaseService graph = createFromCypher(\n                \"Access Control Revised\",\n                cypher,\n                indexParam( \"Administrator\", \"name\" ),\n                indexParam( \"Employee\", \"name\" ),\n                indexParam( \"Company\", \"name\" ),\n                indexParam( \"Account\", \"name\" ),\n                indexParam( \"Resource\", \"name\" ));\n\n        new IndexResources( graph ).execute();\n\n        return graph;\n    }\n}\n"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/EmailQueriesTest.java",
    "content": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.Iterator;\nimport java.util.Map;\n\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.junit.rules.TestName;\n\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.queries.helpers.PrintingExecutionEngineWrapper;\nimport org.neo4j.graphdatabases.queries.testing.IndexParam;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.Node;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\n\nimport static org.neo4j.graphdatabases.queries.helpers.Db.createFromCypher;\nimport static org.neo4j.helpers.collection.IteratorUtil.count;\n\npublic class EmailQueriesTest\n{\n    @Rule\n    public TestName name = new TestName();\n\n    @Test\n    public void suspectBehaviour() throws Exception\n    {\n        GraphDatabaseService db = createDatabase();\n        EmailQueries queries = new EmailQueries( db, new PrintingExecutionEngineWrapper( db, \"email\", name ) );\n\n        ExecutionResult result = queries.suspectBehaviour();\n        Iterator<Map<String, Object>> iterator = result.iterator();\n        Map<String, Object> next = iterator.next();\n        assertEquals( \"1\", next.get( \"email.id\" ));\n        assertFalse( iterator.hasNext() );\n\n        db.shutdown();\n    }\n\n    @Test\n    public void suspectBehaviour2() throws Exception\n    {\n        GraphDatabaseService db = createDatabase2();\n        EmailQueries queries = new EmailQueries( db, new PrintingExecutionEngineWrapper( db, \"email\", name ) );\n\n        ExecutionResult result = queries.suspectBehaviour2();\n\n        Iterator<Map<String, Object>> iterator = result.iterator();\n        Map<String, Object> next = iterator.next();\n        assertEquals( 1L, next.get( \"depth\" ) );\n        assertEquals( \"Davina\", next.get( \"replier\" ) );\n\n        next = iterator.next();\n        assertEquals( 1L, next.get( \"depth\" ) );\n        assertEquals( \"Bob\", next.get( \"replier\" ) );\n\n        next = iterator.next();\n        assertEquals( 2L, next.get( \"depth\" ) );\n        assertEquals( \"Charlie\", next.get( \"replier\" ) );\n\n        next = iterator.next();\n        assertEquals( 3L, next.get( \"depth\" ) );\n        assertEquals( \"Bob\", next.get( \"replier\" ) );\n\n        assertFalse( iterator.hasNext() );\n\n\n        db.shutdown();\n    }\n\n    @Test\n    public void suspectBehaviour3() throws Exception\n    {\n        GraphDatabaseService db = createDatabase3();\n        EmailQueries queries = new EmailQueries( db, new PrintingExecutionEngineWrapper( db, \"email\", name ) );\n\n        ExecutionResult result = queries.suspectBehaviour3();\n\n        Iterator<Object> objectIterator = result.columnAs( \"count(f)\" );\n        assertEquals( 2L, objectIterator.next() );\n\n        assertFalse( objectIterator.hasNext() );\n\n        db.shutdown();\n    }\n\n    @Test\n    public void lossyDb() throws Exception\n    {\n        GraphDatabaseService db = createDatabase4();\n        EmailQueries queries = new EmailQueries( db, new PrintingExecutionEngineWrapper( db, \"email\", name ) );\n\n        ExecutionResult result = queries.lossyDb();\n\n        assertEquals(1, count(result.iterator()));\n\n        db.shutdown();\n    }\n\n    private static GraphDatabaseService createDatabase()\n    {\n        String cypher = \"CREATE \\n\" +\n                \"(charlie:User {username:'Charlie'}),\\n\" +\n                \"(davina:User {username:'Davina'}),\\n\" +\n                \"(edward:User {username:'Edward'}),\\n\" +\n                \"(alice:User {username:'Alice'}),\\n\" +\n                \"(bob:User {username:'Bob'}),\\n\" +\n                \"(alice)-[:ALIAS_OF]->(bob),\\n\" +\n                \"\\n\" +\n                \"(email_1:Email {id: '1', content: 'email contents'}),\\n\" +\n                \"(bob)-[:SENT]->(email_1),\\n\" +\n                \"(email_1)-[:TO]->(charlie),\\n\" +\n                \"(email_1)-[:CC]->(davina),\\n\" +\n                \"(email_1)-[:CC]->(alice),\\n\" +\n                \"(email_1)-[:BCC]->(edward),\\n\" +\n                \"\\n\" +\n                \"(email_2:Email {id: '2', content: 'email contents'}),\\n\" +\n                \"(bob)-[:SENT]->(email_2),\\n\" +\n                \"(email_2)-[:TO]->(davina),\\n\" +\n                \"(email_2)-[:BCC]->(edward),\\n\" +\n                \"\\n\" +\n                \"(email_3:Email {id: '3', content: 'email contents'}),\\n\" +\n                \"(davina)-[:SENT]->(email_3),\\n\" +\n                \"(email_3)-[:TO]->(bob),\\n\" +\n                \"(email_3)-[:CC]->(edward),\\n\" +\n                \"\\n\" +\n                \"(email_4:Email {id: '4', content: 'email contents'}),\\n\" +\n                \"(charlie)-[:SENT]->(email_4),\\n\" +\n                \"(email_4)-[:TO]->(bob),\\n\" +\n                \"(email_4)-[:TO]->(davina),\\n\" +\n                \"(email_4)-[:TO]->(edward),\\n\" +\n                \"\\n\" +\n                \"(email_5:Email {id: '5', content: 'email contents'}),\\n\" +\n                \"(davina)-[:SENT]->(email_5),\\n\" +\n                \"(email_5)-[:TO]->(alice),\\n\" +\n                \"(email_5)-[:BCC]->(bob),\\n\" +\n                \"(email_5)-[:BCC]->(edward)\";\n\n        return createFromCypher(\n                \"Email\",\n                cypher,\n                IndexParam.indexParam( \"User\", \"username\" ),\n                IndexParam.indexParam( \"Email\", \"id\" )\n        );\n    }\n\n    private static GraphDatabaseService createDatabase2()\n    {\n        String cypher = \"CREATE \\n\" +\n                \"(charlie:User {username:'Charlie'}),\\n\" +\n                \"(davina:User {username:'Davina'}),\\n\" +\n                \"(edward:User {username:'Edward'}),\\n\" +\n                \"(alice:User {username:'Alice'}),\\n\" +\n                \"(bob:User {username:'Bob'}),\\n\" +\n                \"(alice)-[:ALIAS_OF]->(bob),\\n\" +\n                \"\\n\" +\n                \"(email_6:Email {id: '6', content: 'email'}),\\n\" +\n                \"(bob)-[:SENT]->(email_6),\\n\" +\n                \"(email_6)-[:TO]->(charlie),\\n\" +\n                \"(email_6)-[:TO]->(davina),\\n\" +\n                \"\\n\" +\n                \"(reply_1:Email {id: '7', content: 'response'}),\\n\" +\n                \"(reply_1)-[:REPLY_TO]->(email_6),\\n\" +\n                \"(davina)-[:SENT]->(reply_1),\\n\" +\n                \"(reply_1)-[:TO]->(bob),\\n\" +\n                \"(reply_1)-[:TO]->(charlie),\\n\" +\n                \"\\n\" +\n                \"(reply_2:Email {id: '8', content: 'response'}),\\n\" +\n                \"(reply_2)-[:REPLY_TO]->(email_6),\\n\" +\n                \"(bob)-[:SENT]->(reply_2),\\n\" +\n                \"(reply_2)-[:TO]->(davina),\\n\" +\n                \"(reply_2)-[:TO]->(charlie),\\n\" +\n                \"(reply_2)-[:CC]->(alice),\\n\" +\n                \"\\n\" +\n                \"(reply_3:Email {id: '9', content: 'response'}),\\n\" +\n                \"(reply_3)-[:REPLY_TO]->(reply_1),\\n\" +\n                \"(charlie)-[:SENT]->(reply_3),\\n\" +\n                \"(reply_3)-[:TO]->(bob),\\n\" +\n                \"(reply_3)-[:TO]->(davina),\\n\" +\n                \"\\n\" +\n                \"(reply_4:Email {id: '10', content: 'response'}),\\n\" +\n                \"(reply_4)-[:REPLY_TO]->(reply_3),\\n\" +\n                \"(bob)-[:SENT]->(reply_4),\\n\" +\n                \"(reply_4)-[:TO]->(charlie),\\n\" +\n                \"(reply_4)-[:TO]->(davina)\";\n\n        return createFromCypher(\n                \"Email\",\n                cypher,\n                IndexParam.indexParam( \"User\", \"username\" ),\n                IndexParam.indexParam( \"Email\", \"id\" )\n        );\n    }\n\n    private static GraphDatabaseService createDatabase3()\n    {\n        String cypher = \"CREATE \\n\" +\n                \"(charlie:User {username:'Charlie'}),\\n\" +\n                \"(davina:User {username:'Davina'}),\\n\" +\n                \"(edward:User {username:'Edward'}),\\n\" +\n                \"(alice:User {username:'Alice'}),\\n\" +\n                \"(bob:User {username:'Bob'}),\\n\" +\n                \"(alice)-[:ALIAS_OF]->(bob),\\n\" +\n                \"\\n\" +\n                \"(email_11:Email {id: '11', content: 'email'}),\\n\" +\n                \"       (alice)-[:SENT]->(email_11)-[:TO]->(bob),\\n\" +\n                \"\\n\" +\n                \"(email_12:Email {id: '12', content: 'email'}),\\n\" +\n                \"       (email_12)-[:FORWARD_OF]->(email_11),\\n\" +\n                \"       (bob)-[:SENT]->(email_12)-[:TO]->(charlie),\\n\" +\n                \"\\n\" +\n                \"(email_13:Email {id: '13', content: 'email'}),\\n\" +\n                \"       (email_13)-[:FORWARD_OF]->(email_12),\\n\" +\n                \"       (charlie)-[:SENT]->(email_13)-[:TO]->(davina)\";\n\n        return createFromCypher(\n                \"Email\",\n                cypher,\n                IndexParam.indexParam( \"User\", \"username\" ),\n                IndexParam.indexParam( \"Email\", \"id\" )\n        );\n    }\n\n    private static GraphDatabaseService createDatabase4()\n    {\n        String cypher = \"CREATE (alice:User {username: 'Alice'}),\\n\" +\n                \"(bob:User {username: 'Bob'}),\\n\" +\n                \"(charlie:User {username: 'Charlie'}),\\n\" +\n                \"(davina:User {username: 'Davina'}),\\n\" +\n                \"(edward:User {username: 'Edward'}),\\n\" +\n                \"(alice)-[:ALIAS_OF]->(bob),\\n\" +\n                \"(bob)-[:EMAILED]->(charlie),\\n\" +\n                \"(bob)-[:CC]->(davina),\\n\" +\n                \"(bob)-[:BCC]->(edward)\";\n\n        return createFromCypher(\n                \"Email\",\n                cypher,\n                IndexParam.indexParam( \"User\", \"username\" )\n        );\n    }\n}\n"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/LogisticsQueriesTest.java",
    "content": "package org.neo4j.graphdatabases.queries;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.neo4j.graphdatabases.queries.helpers.Db.createFromCypher;\nimport static org.neo4j.graphdatabases.queries.testing.IndexParam.indexParam;\n\nimport java.util.Iterator;\n\nimport org.joda.time.DateTime;\nimport org.joda.time.Interval;\nimport org.junit.*;\nimport org.junit.rules.TestName;\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.queries.helpers.PrintingExecutionEngineWrapper;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.Node;\nimport org.neo4j.graphdb.Transaction;\n\npublic class LogisticsQueriesTest\n{\n    @Rule\n    public TestName name = new TestName();\n\n    private GraphDatabaseService db;\n    private LogisticsQueries queries;\n\n    private static Interval interval1 = Interval.parse( \"2012-10-15T00:00:00.000+01:00/2012-10-22T00:00:00.000+01:00\" );\n    private static Interval interval2 = Interval.parse( \"2012-10-22T00:00:00.000+01:00/2012-10-29T00:00:00.000+01:00\" );\n    private static Interval interval3 = Interval.parse( \"2012-10-29T00:00:00.000+01:00/2012-11-05T00:00:00.000+01:00\" );\n    private Transaction tx;\n\n\n    @Before\n    public void init()\n    {\n        try\n        {\n\n            db = createDatabase();\n            queries = new LogisticsQueries( db, new PrintingExecutionEngineWrapper( db, \"logistics\", name ) );\n            tx = db.beginTx();\n        }\n        catch ( Exception e )\n        {\n            e.printStackTrace();\n            System.out.println( e.getMessage() );\n        }\n    }\n\n    @After\n    public void shutdown()\n    {\n        if ( tx != null )\n        {\n            tx.success();\n            tx.close();\n        }\n        db.shutdown();\n    }\n\n    @Test\n    public void parcelRoutingUsingParcelRouteCalculator() throws Exception\n    {\n        // given\n        DateTime startDtm = interval1.getStart().plusDays( 2 );\n        Interval queryInterval = new Interval( startDtm, startDtm.plusDays( 1 ) );\n\n        // when\n        Iterable<Node> results = queries.findShortestPathWithParcelRouteCalculator( \"DeliveryArea-1\",\n                \"DeliverySegment-3\",\n                queryInterval );\n\n\n        // then\n        Iterator<Node> iterator = results.iterator();\n\n\n        assertEquals( \"DeliveryArea-1\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-1\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"ParcelCentre-1\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-2\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"ParcelCentre-2\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-3\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryArea-2\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliverySegment-3\", iterator.next().getProperty( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void parcelRoutingUsingParcelRouteCalculatorChoosesShortestRouteBetweenDeliveryBases() throws Exception\n    {\n        // given\n        DateTime startDtm = interval2.getStart().plusDays( 2 );\n        Interval queryInterval = new Interval( startDtm, startDtm.plusDays( 1 ) );\n\n        // when\n        Iterable<Node> results = queries.findShortestPathWithParcelRouteCalculator( \"DeliveryArea-1\",\n                \"DeliverySegment-3\",\n                queryInterval );\n\n\n        // then\n        Iterator<Node> iterator = results.iterator();\n\n\n        assertEquals( \"DeliveryArea-1\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-1\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"ParcelCentre-2\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-3\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryArea-2\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliverySegment-3\", iterator.next().getProperty( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void parcelRoutingUsingParcelRouteCalculatorRespectsIntervals() throws Exception\n    {\n        // given\n        DateTime startDtm = interval3.getStart().plusDays( 2 );\n        Interval queryInterval = new Interval( startDtm, startDtm.plusDays( 1 ) );\n\n        // when\n        Iterable<Node> results = queries.findShortestPathWithParcelRouteCalculator( \"DeliveryArea-1\",\n                \"DeliverySegment-3\",\n                queryInterval );\n\n\n        // then\n        Iterator<Node> iterator = results.iterator();\n\n\n        assertEquals( \"DeliveryArea-1\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-1\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"ParcelCentre-1\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-3\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryArea-3\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliverySegment-3\", iterator.next().getProperty( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void parcelRoutingUsingSimpleParcelRouteCalculatorRespectsIntervals() throws Exception\n    {\n        // given\n        DateTime startDtm = interval3.getStart().plusDays( 2 );\n        Interval queryInterval = new Interval( startDtm, startDtm.plusDays( 1 ) );\n\n        // when\n        Iterable<Node> results = queries.findShortestPathWithSimpleParcelRouteCalculator( \"DeliveryArea-1\",\n                \"DeliverySegment-3\",\n                queryInterval );\n\n\n        // then\n        Iterator<Node> iterator = results.iterator();\n\n\n        assertEquals( \"DeliveryArea-1\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-1\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"ParcelCentre-1\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-3\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryArea-3\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliverySegment-3\", iterator.next().getProperty( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void withinScopeOfSingleParcelCentreParcelRouteCalculator() throws Exception\n    {\n        // given\n        DateTime startDtm = interval2.getStart().plusDays( 2 );\n        Interval queryInterval = new Interval( startDtm, startDtm.plusDays( 1 ) );\n\n        // when\n        Iterable<Node> results = queries.findShortestPathWithParcelRouteCalculator( \"DeliveryArea-1\",\n                \"DeliverySegment-8\",\n                queryInterval );\n\n\n        // then\n        Iterator<Node> iterator = results.iterator();\n\n\n        assertEquals( \"DeliveryArea-1\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-1\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"ParcelCentre-1\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-2\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryArea-4\", iterator.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliverySegment-8\", iterator.next().getProperty( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void parcelRoutingUsingCypherReduce() throws Exception\n    {\n        // given\n        DateTime startDtm = interval1.getStart().plusDays( 2 );\n        Interval queryInterval = new Interval( startDtm, startDtm.plusDays( 1 ) );\n\n        // when\n        ExecutionResult result = queries.findShortestPathWithCypherReduce( \"DeliveryArea-1\", \"DeliverySegment-3\",\n                queryInterval );\n\n\n        // then\n        Iterator<Iterable<Node>> rows = result.columnAs( \"n\" );\n        Iterator<Node> nodes = rows.next().iterator();\n\n\n        assertEquals( \"DeliveryArea-1\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-1\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"ParcelCentre-1\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-2\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"ParcelCentre-2\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-3\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryArea-2\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliverySegment-3\", nodes.next().getProperty( \"name\" ) );\n\n        assertFalse( nodes.hasNext() );\n    }\n\n    @Test\n    public void parcelRoutingUsingCypherReduceChoosesShortestRouteBetweenDeliveryBases() throws Exception\n    {\n        // given\n        DateTime startDtm = interval2.getStart().plusDays( 2 );\n        Interval queryInterval = new Interval( startDtm, startDtm.plusDays( 1 ) );\n\n        // when\n        ExecutionResult result = queries.findShortestPathWithCypherReduce( \"DeliveryArea-1\", \"DeliverySegment-3\",\n                queryInterval );\n\n\n        // then\n        Iterator<Iterable<Node>> rows = result.columnAs( \"n\" );\n        Iterator<Node> nodes = rows.next().iterator();\n\n        assertEquals( \"DeliveryArea-1\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-1\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"ParcelCentre-2\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-3\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryArea-2\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliverySegment-3\", nodes.next().getProperty( \"name\" ) );\n\n        assertFalse( nodes.hasNext() );\n    }\n\n    @Test\n    public void parcelRoutingUsingCypherReduceRespectsIntervals() throws Exception\n    {\n        // given\n        DateTime startDtm = interval3.getStart().plusDays( 2 );\n        Interval queryInterval = new Interval( startDtm, startDtm.plusDays( 1 ) );\n\n        // when\n        ExecutionResult result = queries.findShortestPathWithCypherReduce( \"DeliveryArea-1\", \"DeliverySegment-3\",\n                queryInterval );\n\n\n        // then\n        Iterator<Iterable<Node>> rows = result.columnAs( \"n\" );\n        Iterator<Node> nodes = rows.next().iterator();\n\n        assertEquals( \"DeliveryArea-1\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-1\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"ParcelCentre-1\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-3\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryArea-3\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliverySegment-3\", nodes.next().getProperty( \"name\" ) );\n\n        assertFalse( nodes.hasNext() );\n    }\n\n    @Test\n    public void withinScopeOfSingleParcelCentreCypher() throws Exception\n    {\n        // given\n        DateTime startDtm = interval2.getStart().plusDays( 2 );\n        Interval queryInterval = new Interval( startDtm, startDtm.plusDays( 1 ) );\n\n        // when\n        ExecutionResult result = queries.findShortestPathWithCypherReduce( \"DeliveryArea-1\", \"DeliverySegment-8\",\n                queryInterval );\n\n\n        // then\n        Iterator<Iterable<Node>> rows = result.columnAs( \"n\" );\n        Iterator<Node> nodes = rows.next().iterator();\n\n        assertEquals( \"DeliveryArea-1\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-1\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"ParcelCentre-1\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryBase-2\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliveryArea-4\", nodes.next().getProperty( \"name\" ) );\n        assertEquals( \"DeliverySegment-8\", nodes.next().getProperty( \"name\" ) );\n\n\n        assertFalse( nodes.hasNext() );\n    }\n\n    private static GraphDatabaseService createDatabase()\n    {\n        String cypher = \"CREATE\\n\" +\n                \"(pc1:ParcelCentre:Location {name:'ParcelCentre-1'}),\\n\" +\n                \"(pc2:ParcelCentre:Location {name:'ParcelCentre-2'}),\\n\" +\n\n                \"(db1:DeliveryBase:Location {name:'DeliveryBase-1'}),\\n\" +\n                \"(db2:DeliveryBase:Location {name:'DeliveryBase-2'}),\\n\" +\n                \"(db3:DeliveryBase:Location {name:'DeliveryBase-3'}),\\n\" +\n\n                \"(da1:DeliveryArea:Location {name:'DeliveryArea-1'}),\\n\" +\n                \"(da2:DeliveryArea:Location {name:'DeliveryArea-2'}),\\n\" +\n                \"(da3:DeliveryArea:Location {name:'DeliveryArea-3'}),\\n\" +\n                \"(da4:DeliveryArea:Location {name:'DeliveryArea-4'}),\\n\" +\n\n                \"(ds1:DeliverySegment:Location {name:'DeliverySegment-1'}),\\n\" +\n                \"(ds2:DeliverySegment:Location {name:'DeliverySegment-2'}),\\n\" +\n                \"(ds3:DeliverySegment:Location {name:'DeliverySegment-3'}),\\n\" +\n                \"(ds4:DeliverySegment:Location {name:'DeliverySegment-4'}),\\n\" +\n                \"(ds5:DeliverySegment:Location {name:'DeliverySegment-5'}),\\n\" +\n                \"(ds6:DeliverySegment:Location {name:'DeliverySegment-6'}),\\n\" +\n                \"(ds7:DeliverySegment:Location {name:'DeliverySegment-7'}),\\n\" +\n                \"(ds8:DeliverySegment:Location {name:'DeliverySegment-8'}),\\n\" +\n\n                \"pc1-[:CONNECTED_TO {cost:3, \" + intervalProperties( interval1 ) + \"}]->db1,\\n\" +\n                \"pc1-[:CONNECTED_TO {cost:3, \" + intervalProperties( interval1 ) + \"}]->db2,\\n\" +\n                \"pc2-[:CONNECTED_TO {cost:3, \" + intervalProperties( interval1 ) + \"}]->db2,\\n\" +\n                \"pc2-[:CONNECTED_TO {cost:3, \" + intervalProperties( interval1 ) + \"}]->db3,\\n\" +\n\n                \"db1-[:DELIVERY_ROUTE {cost:3, \" + intervalProperties( interval1 ) + \"}]->da1,\\n\" +\n                \"db1-[:DELIVERY_ROUTE {cost:3, \" + intervalProperties( interval1 ) + \"}]->da4,\\n\" +\n                \"db2-[:DELIVERY_ROUTE {cost:5, \" + intervalProperties( interval1 ) + \"}]->da3,\\n\" +\n                \"db3-[:DELIVERY_ROUTE {cost:3, \" + intervalProperties( interval1 ) + \"}]->da2,\\n\" +\n\n                \"da1-[:DELIVERY_ROUTE {cost:3, \" + intervalProperties( interval1 ) + \"}]->ds1,\\n\" +\n                \"da1-[:DELIVERY_ROUTE {cost:3, \" + intervalProperties( interval1 ) + \"}]->ds2,\\n\" +\n                \"da2-[:DELIVERY_ROUTE {cost:3, \" + intervalProperties( interval1 ) + \"}]->ds3,\\n\" +\n                \"da2-[:DELIVERY_ROUTE {cost:3, \" + intervalProperties( interval1 ) + \"}]->ds4,\\n\" +\n                \"da4-[:DELIVERY_ROUTE {cost:3, \" + intervalProperties( interval1 ) + \"}]->ds5,\\n\" +\n                \"da3-[:DELIVERY_ROUTE {cost:3, \" + intervalProperties( interval1 ) + \"}]->ds6,\\n\" +\n                \"da1-[:DELIVERY_ROUTE {cost:3, \" + intervalProperties( interval1 ) + \"}]->ds7,\\n\" +\n                \"da1-[:DELIVERY_ROUTE {cost:3, \" + intervalProperties( interval1 ) + \"}]->ds8,\\n\" +\n\n                \"pc1-[:CONNECTED_TO {cost:2, \" + intervalProperties( interval2 ) + \"}]->db1,\\n\" +\n                \"pc1-[:CONNECTED_TO {cost:2, \" + intervalProperties( interval2 ) + \"}]->db2,\\n\" +\n                \"pc2-[:CONNECTED_TO {cost:2, \" + intervalProperties( interval2 ) + \"}]->db2,\\n\" +\n                \"pc2-[:CONNECTED_TO {cost:2, \" + intervalProperties( interval2 ) + \"}]->db3,\\n\" +\n\n                //Parcel centre connected directly to db1 for 2nd interval\n                \"pc2-[:CONNECTED_TO {cost:5, \" + intervalProperties( interval2 ) + \"}]->db1,\\n\" +\n\n                \"db1-[:DELIVERY_ROUTE {cost:2, \" + intervalProperties( interval2 ) + \"}]->da1,\\n\" +\n                \"db2-[:DELIVERY_ROUTE {cost:2, \" + intervalProperties( interval2 ) + \"}]->da4,\\n\" +\n                \"db3-[:DELIVERY_ROUTE {cost:5, \" + intervalProperties( interval2 ) + \"}]->da3,\\n\" +\n                \"db3-[:DELIVERY_ROUTE {cost:2, \" + intervalProperties( interval2 ) + \"}]->da2,\\n\" +\n\n                \"da4-[:DELIVERY_ROUTE {cost:2, \" + intervalProperties( interval2 ) + \"}]->ds1,\\n\" +\n                \"da4-[:DELIVERY_ROUTE {cost:2, \" + intervalProperties( interval2 ) + \"}]->ds2,\\n\" +\n                \"da2-[:DELIVERY_ROUTE {cost:2, \" + intervalProperties( interval2 ) + \"}]->ds3,\\n\" +\n                \"da2-[:DELIVERY_ROUTE {cost:2, \" + intervalProperties( interval2 ) + \"}]->ds4,\\n\" +\n                \"da3-[:DELIVERY_ROUTE {cost:2, \" + intervalProperties( interval2 ) + \"}]->ds5,\\n\" +\n                \"da3-[:DELIVERY_ROUTE {cost:2, \" + intervalProperties( interval2 ) + \"}]->ds6,\\n\" +\n                \"da4-[:DELIVERY_ROUTE {cost:2, \" + intervalProperties( interval2 ) + \"}]->ds7,\\n\" +\n                \"da4-[:DELIVERY_ROUTE {cost:2, \" + intervalProperties( interval2 ) + \"}]->ds8,\\n\" +\n\n                \"pc1-[:CONNECTED_TO {cost:6, \" + intervalProperties( interval3 ) + \"}]->db1,\\n\" +\n                \"pc1-[:CONNECTED_TO {cost:6, \" + intervalProperties( interval3 ) + \"}]->db2,\\n\" +\n                \"pc2-[:CONNECTED_TO {cost:6, \" + intervalProperties( interval3 ) + \"}]->db2,\\n\" +\n                \"pc1-[:CONNECTED_TO {cost:6, \" + intervalProperties( interval3 ) + \"}]->db3,\\n\" +\n\n                \"db1-[:DELIVERY_ROUTE {cost:6, \" + intervalProperties( interval3 ) + \"}]->da1,\\n\" +\n                \"db2-[:DELIVERY_ROUTE {cost:6, \" + intervalProperties( interval3 ) + \"}]->da4,\\n\" +\n                \"db3-[:DELIVERY_ROUTE {cost:5, \" + intervalProperties( interval3 ) + \"}]->da3,\\n\" +\n                \"db2-[:DELIVERY_ROUTE {cost:6, \" + intervalProperties( interval3 ) + \"}]->da2,\\n\" +\n\n                \"da1-[:DELIVERY_ROUTE {cost:6, \" + intervalProperties( interval3 ) + \"}]->ds1,\\n\" +\n                \"da1-[:DELIVERY_ROUTE {cost:6, \" + intervalProperties( interval3 ) + \"}]->ds2,\\n\" +\n                //Different delivery centre for ds3 for 3rd interval\n                \"da3-[:DELIVERY_ROUTE {cost:6, \" + intervalProperties( interval3 ) + \"}]->ds3,\\n\" +\n                \"da3-[:DELIVERY_ROUTE {cost:6, \" + intervalProperties( interval3 ) + \"}]->ds4,\\n\" +\n                \"da3-[:DELIVERY_ROUTE {cost:6, \" + intervalProperties( interval3 ) + \"}]->ds5,\\n\" +\n                \"da3-[:DELIVERY_ROUTE {cost:6, \" + intervalProperties( interval3 ) + \"}]->ds6,\\n\" +\n                \"da4-[:DELIVERY_ROUTE {cost:6, \" + intervalProperties( interval3 ) + \"}]->ds7,\\n\" +\n                \"da4-[:DELIVERY_ROUTE {cost:6, \" + intervalProperties( interval3 ) + \"}]->ds8\";\n\n        return createFromCypher(\n                \"Logistics\",\n                cypher,\n                indexParam( \"Location\", \"name\" ),\n                indexParam( \"ParcelCentre\", \"name\" ),\n                indexParam( \"DeliveryBase\", \"name\" ),\n                indexParam( \"DeliveryArea\", \"name\" ),\n                indexParam( \"DeliverySegment\", \"name\" ) );\n    }\n\n    private static String intervalProperties( Interval interval )\n    {\n        StringBuilder builder = new StringBuilder();\n        builder.append( \"start_date:\" );\n        builder.append( interval.getStartMillis() );\n        builder.append( \", end_date:\" );\n        builder.append( interval.getEndMillis() );\n        return builder.toString();\n    }\n}\n"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/ShakespeareQueriesTest.java",
    "content": "package org.neo4j.graphdatabases.queries;\n\nimport java.util.Iterator;\nimport java.util.Map;\n\nimport org.junit.*;\nimport org.junit.rules.TestName;\n\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.queries.helpers.Db;\nimport org.neo4j.graphdatabases.queries.helpers.PrintingExecutionEngineWrapper;\nimport org.neo4j.graphdatabases.queries.testing.IndexParam;\nimport org.neo4j.graphdb.*;\nimport org.neo4j.graphdb.index.Index;\n\nimport static java.util.Arrays.asList;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\n\nimport static org.neo4j.graphdatabases.queries.helpers.Db.createFromCypherWithAutoIndexing;\nimport static org.neo4j.graphdb.DynamicLabel.label;\nimport static org.neo4j.graphdb.DynamicRelationshipType.withName;\n\npublic class ShakespeareQueriesTest\n{\n    @Rule\n    public TestName name = new TestName();\n\n    private GraphDatabaseService db;\n    private GraphDatabaseService dbUsingCoreApi;\n    private ShakespeareQueries queries;\n    private ShakespeareQueries queries2;\n    private ShakespeareQueriesUsingAutoIndexes queriesUsingAutoIndexes;\n\n    @Before\n    public void init()\n    {\n        db = createDatabase();\n        dbUsingCoreApi = createDatabaseUsingCoreApi();\n        queries = new ShakespeareQueries( new PrintingExecutionEngineWrapper( db, \"shakespeare\", name ) );\n        queries2 = new ShakespeareQueries( new PrintingExecutionEngineWrapper( dbUsingCoreApi, \"shakespeare\", name ) );\n        queriesUsingAutoIndexes = new ShakespeareQueriesUsingAutoIndexes(\n                new PrintingExecutionEngineWrapper( db, \"shakespeare-auot-indexes\", name ) );\n    }\n\n    @After\n    public void shutdown()\n    {\n        db.shutdown();\n        dbUsingCoreApi.shutdown();\n    }\n\n    @Test\n    public void theatreCityBard() throws Exception\n    {\n        try ( Transaction tx = db.beginTx() )\n        {\n            assertTheatreCityBard( queries.theatreCityBard() );\n            assertTheatreCityBard( queries2.theatreCityBard() );\n            assertTheatreCityBard( queriesUsingAutoIndexes.theatreCityBard() );\n            tx.success();\n        }\n    }\n\n    private void assertTheatreCityBard( ExecutionResult results )\n    {\n        Iterator<Map<String, Object>> iterator = results.iterator();\n        Map<String, Object> result = iterator.next();\n\n        assertEquals( \"Theatre Royal\", result.get( \"theater\" ) );\n        assertEquals( \"Newcastle\", result.get( \"city\" ) );\n        assertEquals( \"Shakespeare\", result.get( \"bard\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void exampleOfWith() throws Exception\n    {\n        try ( Transaction tx = db.beginTx() )\n        {\n            assertExampleOfWith( queries.exampleOfWith() );\n            assertExampleOfWith( queries2.exampleOfWith() );\n            assertExampleOfWith( queriesUsingAutoIndexes.exampleOfWith() );\n            tx.success();\n        }\n    }\n\n    private void assertExampleOfWith( ExecutionResult results )\n    {\n        Iterator<Map<String, Object>> iterator = results.iterator();\n        Map<String, Object> result = iterator.next();\n\n        assertEquals( asList( \"The Tempest\", \"Julius Caesar\" ), result.get( \"plays\" ) );\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldReturnAllPlays() throws Exception\n    {\n        try ( Transaction tx = db.beginTx() )\n        {\n            assertAllPlays( queries.allPlays() );\n            assertAllPlays( queries2.allPlays() );\n            assertAllPlays( queriesUsingAutoIndexes.allPlays() );\n        }\n    }\n\n    private void assertAllPlays( ExecutionResult result )\n    {\n        try ( Transaction tx = db.beginTx() )\n        {\n            Iterator<String> plays = result.columnAs( \"play\" );\n\n            assertEquals( \"Julius Caesar\", plays.next() );\n            assertEquals( \"The Tempest\", plays.next() );\n            assertFalse( plays.hasNext() );\n            tx.success();\n        }\n    }\n\n    @Test\n    public void shouldReturnLatePeriodPlays() throws Exception\n    {\n        try ( Transaction tx = db.beginTx() )\n        {\n            assertLatePeriodPlays( queries.latePeriodPlays() );\n            assertLatePeriodPlays( queries2.latePeriodPlays() );\n            assertLatePeriodPlays( queriesUsingAutoIndexes.latePeriodPlays() );\n            tx.success();\n        }\n    }\n\n    private void assertLatePeriodPlays( ExecutionResult result )\n    {\n        try ( Transaction tx = db.beginTx() )\n        {\n            Iterator<String> plays = result.columnAs( \"play\" );\n\n            assertEquals( \"The Tempest\", plays.next() );\n            assertFalse( plays.hasNext() );\n            tx.success();\n        }\n    }\n\n    @Test\n    public void orderedByPerformance() throws Exception\n    {\n        try ( Transaction tx = db.beginTx() )\n        {\n            assertOrderedByPerformance( queries.orderedByPerformance() );\n            assertOrderedByPerformance( queries2.orderedByPerformance() );\n            assertOrderedByPerformance( queriesUsingAutoIndexes.orderedByPerformance() );\n            tx.success();\n        }\n    }\n\n    private void assertOrderedByPerformance( ExecutionResult result )\n    {\n        try ( Transaction tx = db.beginTx() )\n        {\n            Iterator<Map<String, Object>> plays = result.iterator();\n\n            Map<String, Object> row = plays.next();\n            assertEquals( \"Julius Caesar\", row.get( \"play\" ) );\n            assertEquals( 2L, row.get( \"performance_count\" ) );\n\n            row = plays.next();\n            assertEquals( \"The Tempest\", row.get( \"play\" ) );\n            assertEquals( 1L, row.get( \"performance_count\" ) );\n\n            assertFalse( plays.hasNext() );\n            tx.success();\n        }\n    }\n\n    private static GraphDatabaseService createDatabase()\n    {\n        String cypher = \"CREATE (shakespeare:Author { firstname: 'William', lastname: 'Shakespeare' }),\\n\" +\n                \"       (juliusCaesar:Play { title: 'Julius Caesar' }),\\n\" +\n                \"       (shakespeare)-[:WROTE_PLAY { year: 1599 }]->(juliusCaesar),\\n\" +\n                \"       (theTempest:Play { title: 'The Tempest' }),\\n\" +\n                \"       (shakespeare)-[:WROTE_PLAY { year: 1610}]->(theTempest),\\n\" +\n                \"       (rsc:Company { name: 'RSC' }),\\n\" +\n                \"       (production1:Production { name: 'Julius Caesar' }),\\n\" +\n                \"       (rsc)-[:PRODUCED]->(production1),\\n\" +\n                \"       (production1)-[:PRODUCTION_OF]->(juliusCaesar),\\n\" +\n                \"       (performance1:Performance { date: 20120729 }),\\n\" +\n                \"       (performance1)-[:PERFORMANCE_OF]->(production1),\\n\" +\n                \"       (production2:Production { name: 'The Tempest' }),\\n\" +\n                \"       (rsc)-[:PRODUCED]->(production2),\\n\" +\n                \"       (production2)-[:PRODUCTION_OF]->(theTempest),\\n\" +\n                \"       (performance2:Performance { date: 20061121 }),\\n\" +\n                \"       (performance2)-[:PERFORMANCE_OF]->(production2),\\n\" +\n                \"       (performance3:Performance { date: 20120730 }),\\n\" +\n                \"       (performance3)-[:PERFORMANCE_OF]->(production1),\\n\" +\n                \"       (billy:User { name: 'Billy' }),\\n\" +\n                \"       (review:Review { rating: 5, review: 'This was awesome!' }),\\n\" +\n                \"       (billy)-[:WROTE_REVIEW]->(review),\\n\" +\n                \"       (review)-[:RATED]->(performance1),\\n\" +\n                \"       (theatreRoyal:Venue { name: 'Theatre Royal' }),\\n\" +\n                \"       (performance1)-[:VENUE]->(theatreRoyal),\\n\" +\n                \"       (performance2)-[:VENUE]->(theatreRoyal),\\n\" +\n                \"       (performance3)-[:VENUE]->(theatreRoyal),\\n\" +\n                \"       (greyStreet:Street { name: 'Grey Street' }),\\n\" +\n                \"       (theatreRoyal)-[:STREET]->(greyStreet),\\n\" +\n                \"       (newcastle:City { name: 'Newcastle' }),\\n\" +\n                \"       (greyStreet)-[:CITY]->(newcastle),\\n\" +\n                \"       (tyneAndWear:County { name: 'Tyne and Wear' }),\\n\" +\n                \"       (newcastle)-[:COUNTY]->(tyneAndWear),\\n\" +\n                \"       (england:Country { name: 'England' }),\\n\" +\n                \"       (tyneAndWear)-[:COUNTRY]->(england),\\n\" +\n                \"       (stratford:City { name: 'Stratford upon Avon' }),\\n\" +\n                \"       (stratford)-[:COUNTRY]->(england),\\n\" +\n                \"       (rsc)-[:BASED_IN]->(stratford),\\n\" +\n                \"       (shakespeare)-[:BORN_IN]->stratford\";\n\n        return createFromCypherWithAutoIndexing(\n                \"Shakespeare\",\n                cypher,\n                IndexParam.indexParam( \"Venue\", \"name\" ),\n                IndexParam.indexParam( \"Author\", \"lastname\" ),\n                IndexParam.indexParam( \"City\", \"name\" ) );\n    }\n\n    private static GraphDatabaseService createDatabaseUsingCoreApi()\n    {\n        GraphDatabaseService db = Db.tempDb();\n\n        try (Transaction tx = db.beginTx())\n        {\n            db.schema().indexFor(label(\"Author\")).on(\"lastname\").create();\n            db.schema().indexFor(label(\"City\")).on(\"name\").create();\n            db.schema().indexFor(label(\"Venue\")).on(\"name\").create();\n            tx.success();\n        }\n        try (Transaction tx = db.beginTx())\n        {\n            Node shakespeare = db.createNode(label(\"Author\"));\n            shakespeare.setProperty(\"firstname\", \"William\");\n            shakespeare.setProperty(\"lastname\", \"Shakespeare\");\n\n            Node juliusCaesar = db.createNode(label(\"Play\"));\n            juliusCaesar.setProperty(\"title\", \"Julius Caesar\");\n\n            Relationship wrote_play_jc = shakespeare.createRelationshipTo(juliusCaesar, withName(\"WROTE_PLAY\"));\n            wrote_play_jc.setProperty(\"year\", 1599);\n\n            Node tempest = db.createNode(label(\"Play\"));\n            tempest.setProperty(\"title\", \"The Tempest\");\n\n            Relationship wrote_play_t = shakespeare.createRelationshipTo(tempest, withName(\"WROTE_PLAY\"));\n            wrote_play_t.setProperty(\"year\", 1610);\n\n            Node rsc = db.createNode(label(\"Company\"));\n            rsc.setProperty(\"name\", \"RSC\");\n\n            Node production1 = db.createNode(label(\"Production\"));\n            production1.setProperty(\"name\", \"Julius Caesar\");\n\n            rsc.createRelationshipTo(production1, withName(\"PRODUCED\"));\n            production1.createRelationshipTo(juliusCaesar, withName(\"PRODUCTION_OF\"));\n\n            Node performance1 = db.createNode(label(\"Performance\"));\n            performance1.setProperty(\"date\", 20120729);\n            performance1.createRelationshipTo(production1, withName(\"PERFORMANCE_OF\"));\n\n            Node production2 = db.createNode(label(\"Production\"));\n            production2.setProperty(\"name\", \"The Tempest\");\n            production2.createRelationshipTo(tempest, withName(\"PRODUCTION_OF\"));\n            rsc.createRelationshipTo(production2, withName(\"PRODUCED\"));\n\n            Node performance2 = db.createNode(label(\"Performance\"));\n            performance2.setProperty(\"date\", 20061121);\n            performance2.createRelationshipTo(production2, withName(\"PERFORMANCE_OF\"));\n\n            Node performance3 = db.createNode(label(\"Performance\"));\n            performance3.setProperty(\"date\", 20120730);\n            performance3.createRelationshipTo(production1, withName(\"PERFORMANCE_OF\"));\n\n            Node billy = db.createNode(label(\"User\"));\n            billy.setProperty(\"name\", \"Billy\");\n\n            Node review = db.createNode(label(\"Review\"));\n            review.setProperty(\"rating\", 5);\n            review.setProperty(\"review\", \"This was awesome!\");\n            review.createRelationshipTo(performance1, withName(\"RATED\"));\n            billy.createRelationshipTo(review, withName(\"WROTE_REVIEW\"));\n\n            Node theatreRoyal = db.createNode(label(\"Venue\"));\n            theatreRoyal.setProperty(\"name\", \"Theatre Royal\");\n\n            performance1.createRelationshipTo(theatreRoyal, withName(\"VENUE\"));\n            performance2.createRelationshipTo(theatreRoyal, withName(\"VENUE\"));\n            performance3.createRelationshipTo(theatreRoyal, withName(\"VENUE\"));\n\n            Node greyStreet = db.createNode(label(\"Street\"));\n            greyStreet.setProperty(\"name\", \"Grey Street\");\n            theatreRoyal.createRelationshipTo(greyStreet, withName(\"STREET\"));\n\n            Node newcastle = db.createNode(label(\"City\"));\n            newcastle.setProperty(\"name\", \"Newcastle\");\n            greyStreet.createRelationshipTo(newcastle, withName(\"CITY\"));\n\n            Node tyneAndWear = db.createNode(label(\"County\"));\n            tyneAndWear.setProperty(\"name\", \"Tyne and Wear\");\n            newcastle.createRelationshipTo(tyneAndWear, withName(\"COUNTY\"));\n\n            Node england = db.createNode(label(\"Country\"));\n            england.setProperty(\"name\", \"England\");\n            tyneAndWear.createRelationshipTo(england, withName(\"COUNTRY\"));\n\n            Node stratford = db.createNode(label(\"City\"));\n            stratford.setProperty(\"name\", \"Stratford upon Avon\");\n            stratford.createRelationshipTo(england, withName(\"COUNTRY\"));\n            rsc.createRelationshipTo(stratford, withName(\"BASED_IN\"));\n            shakespeare.createRelationshipTo(stratford, withName(\"BORN_IN\"));\n\n            tx.success();\n        }\n\n        return db;\n    }\n\n\n}\n"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/SimpleSocialNetworkQueriesTest.java",
    "content": "package org.neo4j.graphdatabases.queries;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.neo4j.graphdatabases.queries.helpers.Db.createFromCypher;\n\nimport org.junit.AfterClass;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.queries.testing.IndexParam;\nimport org.neo4j.graphdb.GraphDatabaseService;\n\npublic class SimpleSocialNetworkQueriesTest\n{\n    private static GraphDatabaseService db;\n    private static SimpleSocialNetworkQueries queries;\n\n    @BeforeClass\n    public static void init()\n    {\n        db = createDatabase();\n        queries = new SimpleSocialNetworkQueries( db );\n    }\n\n    @AfterClass\n    public static void shutdown()\n    {\n        db.shutdown();\n    }\n\n    @Test\n    public void shouldReturnShortestPathBetweenTwoFriends() throws Exception\n    {\n        // when\n        ExecutionResult results = queries.pathBetweenTwoFriends( \"Ben\", \"Mike\" );\n\n        // then\n        assertTrue( results.iterator().hasNext() );\n        assertEquals( 4, results.iterator().next().get( \"depth\" ) );\n    }\n\n    @Test\n    public void friendOfAFriendToDepth4() throws Exception\n    {\n        // when\n        ExecutionResult results = queries.friendOfAFriendToDepth4( \"Ben\" );\n\n        // then\n        assertTrue( results.iterator().hasNext() );\n        assertEquals( \"Mike\", results.iterator().next().get( \"name\" ) );\n        assertFalse( results.iterator().hasNext() );\n    }\n\n    @Test\n    public void shouldReturnNoResultsWhenThereIsNotAPathBetweenTwoFriends() throws Exception\n    {\n        // when\n        ExecutionResult results = queries.pathBetweenTwoFriends( \"Ben\", \"Arnold\" );\n\n        // then\n        assertFalse( results.iterator().hasNext() );\n    }\n\n    private static GraphDatabaseService createDatabase()\n    {\n        String cypher = \"CREATE\\n\" +\n                \"(ben:User {name:'Ben'}),\\n\" +\n                \"(arnold:User {name:'Arnold'}),\\n\" +\n                \"(charlie:User {name:'Charlie'}),\\n\" +\n                \"(gordon:User {name:'Gordon'}),\\n\" +\n                \"(lucy:User {name:'Lucy'}),\\n\" +\n                \"(emily:User {name:'Emily'}),\\n\" +\n                \"(sarah:User {name:'Sarah'}),\\n\" +\n                \"(kate:User {name:'Kate'}),\\n\" +\n                \"(mike:User {name:'Mike'}),\\n\" +\n                \"(paula:User {name:'Paula'}),\\n\" +\n                \"ben-[:FRIEND]->charlie,\\n\" +\n                \"charlie-[:FRIEND]->lucy,\\n\" +\n                \"lucy-[:FRIEND]->sarah,\\n\" +\n                \"sarah-[:FRIEND]->mike,\\n\" +\n                \"arnold-[:FRIEND]->gordon,\\n\" +\n                \"gordon-[:FRIEND]->emily,\\n\" +\n                \"emily-[:FRIEND]->kate,\\n\" +\n                \"kate-[:FRIEND]->paula\";\n\n        return createFromCypher(\n                \"Simple Social Network\",\n                cypher,\n                IndexParam.indexParam( \"User\", \"name\" ) );\n    }\n}\n"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/SocialNetworkQueriesTest.java",
    "content": "package org.neo4j.graphdatabases.queries;\n\nimport static java.util.Arrays.asList;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.neo4j.graphdatabases.queries.helpers.Db.createFromCypher;\n\nimport java.util.Collection;\nimport java.util.Iterator;\nimport java.util.Map;\n\nimport org.junit.After;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.junit.rules.TestName;\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.queries.helpers.PrintingExecutionEngineWrapper;\nimport org.neo4j.graphdatabases.queries.testing.IndexParam;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.Node;\nimport org.neo4j.graphdb.Transaction;\n\npublic class SocialNetworkQueriesTest\n{\n    @Rule\n    public TestName name = new TestName();\n\n    private GraphDatabaseService db;\n    private SocialNetworkQueries queries;\n\n    @Before\n    public void init()\n    {\n        db = createDatabase();\n        queries = new SocialNetworkQueries( db, new PrintingExecutionEngineWrapper( db, \"social-network\", name ) );\n    }\n\n    @After\n    public void shutdown()\n    {\n        db.shutdown();\n    }\n\n    @Test\n    public void sharedInterestsSameCompany() throws Exception\n    {\n        // when\n        ExecutionResult results = queries.sharedInterestsSameCompany( \"Sarah\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        Map<String, Object> result = iterator.next();\n        assertEquals( \"Ben\", result.get( \"name\" ) );\n        assertEquals( 2l, result.get( \"score\" ) );\n        assertEquals( asList( \"Graphs\", \"REST\" ), result.get( \"interests\" ) );\n\n        result = iterator.next();\n        assertEquals( \"Charlie\", result.get( \"name\" ) );\n        assertEquals( 1l, result.get( \"score\" ) );\n        assertEquals( asList( \"Graphs\" ), result.get( \"interests\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void sharedInterestsAllCompanies() throws Exception\n    {\n        // when\n        ExecutionResult results = queries.sharedInterestsAllCompanies( \"Sarah\", 10 );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        Map<String, Object> result;\n\n        result = iterator.next();\n        assertEquals( \"Arnold\", result.get( \"name\" ) );\n        assertEquals( \"Startup, Ltd\", result.get( \"company\" ) );\n        assertEquals( 3l, result.get( \"score\" ) );\n        assertEquals( asList( \"Java\", \"Graphs\", \"REST\" ), result.get( \"interests\" ) );\n\n        result = iterator.next();\n        assertEquals( \"Ben\", result.get( \"name\" ) );\n        assertEquals( \"Acme, Inc\", result.get( \"company\" ) );\n        assertEquals( 2l, result.get( \"score\" ) );\n        assertEquals( asList( \"Graphs\", \"REST\" ), result.get( \"interests\" ) );\n\n        result = iterator.next();\n        assertEquals( \"Gordon\", result.get( \"name\" ) );\n        assertEquals( \"Startup, Ltd\", result.get( \"company\" ) );\n        assertEquals( 1l, result.get( \"score\" ) );\n        assertEquals( asList( \"Graphs\" ), result.get( \"interests\" ) );\n\n        result = iterator.next();\n        assertEquals( \"Charlie\", result.get( \"name\" ) );\n        assertEquals( \"Acme, Inc\", result.get( \"company\" ) );\n        assertEquals( 1l, result.get( \"score\" ) );\n        assertEquals( asList( \"Graphs\" ), result.get( \"interests\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void sharedInterestsAlsoInterestedInTopic() throws Exception\n    {\n        // when\n        ExecutionResult results = queries.sharedInterestsAlsoInterestedInTopic( \"Ben\", \"Travel\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        Map<String, Object> result = iterator.next();\n        assertEquals( \"Arnold\", result.get( \"name\" ) );\n        assertEquals( asList( \"Graphs\", \"Java\", \"REST\", \"Travel\" ), result.get( \"topics\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void friendOfAFriendWithInterest() throws Exception\n    {\n        // when\n        ExecutionResult results = queries.friendOfAFriendWithInterest( \"Sarah\", \"Java\", 3 );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        Map<String, Object> result = iterator.next();\n        assertEquals( \"Arnold\", result.get( \"name\" ) );\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void friendOfAFriendWithInterestTraversalFramework() throws Exception\n    {\n        try ( Transaction tx = db.beginTx() )\n        {\n            // when\n            Collection<Node> results = queries.friendOfAFriendWithInterestTraversalFramework( \"Arnold\", \"Art\", 5 );\n\n            // then\n            Iterator<Node> iterator = results.iterator();\n            assertEquals( \"Emily\", iterator.next().getProperty( \"name\" ) );\n            assertFalse( iterator.hasNext() );\n            tx.success();\n        }\n    }\n\n    @Test\n    public void friendWorkedWithFriendWithInterests() throws Exception\n    {\n        // when\n        createAllWorkedWithRelationships();\n\n        ExecutionResult results = queries.friendWorkedWithFriendWithInterests( \"Arnold\", 5, \"Art\", \"Design\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        Map<String, Object> result = iterator.next();\n        assertEquals( \"Emily\", result.get( \"name\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void friendOfAFriendWithMultipleInterest() throws Exception\n    {\n        // when\n        ExecutionResult results = queries.friendOfAFriendWithMultipleInterest( \"Arnold\", 5, \"Art\", \"Design\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        Map<String, Object> result = iterator.next();\n        assertEquals( \"Emily\", result.get( \"name\" ) );\n        assertEquals( 2L, result.get( \"score\" ) );\n        assertEquals( 2L, result.get( \"distance\" ) );\n        assertEquals( asList( \"Art\", \"Design\" ), result.get( \"interests\" ) );\n\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void friendOfAFriendWithMultipleInterestShouldOrderByScore() throws Exception\n    {\n        // when\n        ExecutionResult results = queries.friendOfAFriendWithMultipleInterest( \"Sarah\", 5, \"Java\", \"Travel\", \"Medicine\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        Map<String, Object> result = iterator.next();\n        assertEquals( \"Arnold\", result.get( \"name\" ) );\n        assertEquals( 2L, result.get( \"score\" ) );\n        assertEquals( 2L, result.get( \"distance\" ) );\n        assertEquals( asList( \"Java\", \"Travel\" ), result.get( \"interests\" ) );\n\n        result = iterator.next();\n        assertEquals( \"Charlie\", result.get( \"name\" ) );\n        assertEquals( 1L, result.get( \"score\" ) );\n        assertEquals( 1L, result.get( \"distance\" ) );\n        assertEquals( asList( \"Medicine\" ), result.get( \"interests\" ) );\n\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    @Test\n    public void shouldCreateNewWorkedWithRelationships() throws Exception\n    {\n        // given\n        String cypher = \"MATCH (sarah:User {name:'Sarah'}),\\n\" +\n                \" (ben:User {name:'Ben'})\\n\" +\n                \"CREATE sarah-[:WORKED_WITH]->ben\";\n\n        createFromCypher( db, \"Enriched Social Network\", cypher );\n\n        // when\n        ExecutionResult results = queries.createWorkedWithRelationships( \"Sarah\" );\n\n        // then\n        Iterator<Map<String, Object>> iterator = results.iterator();\n\n        assertTrue( iterator.hasNext() );\n\n        Map<String, Object> result = iterator.next();\n        assertEquals( \"Emily\", result.get( \"endName\" ) );\n\n        result = iterator.next();\n        assertEquals( \"Charlie\", result.get( \"endName\" ) );\n\n        result = iterator.next();\n        assertEquals( \"Kate\", result.get( \"endName\" ) );\n\n        assertFalse( iterator.hasNext() );\n    }\n\n    private void createAllWorkedWithRelationships()\n    {\n        ExecutionResult allUsers = queries.getAllUsers();\n        Iterator<Map<String, Object>> iterator = allUsers.iterator();\n        while (iterator.hasNext())\n        {\n            queries.createWorkedWithRelationships( iterator.next().get( \"name\" ).toString() );\n        }\n    }\n\n\n\n//    @Test\n//    public void runGremlinQuery() throws Exception\n//    {\n//        // given\n//        GremlinPipeline result = queries.friendOfAFriendWithParticularInterestGremlin( \"Arnold\", \"Art\" );\n//\n//        assertTrue( Iterable.class.isAssignableFrom( result.getClass() ) );\n//\n//        // then\n//        Iterator iterator = result.iterator();\n//\n//        Object next = iterator.next();\n//        assertEquals( \"Emily\", next );\n//        assertFalse( iterator.hasNext() );\n//    }\n\n    private static GraphDatabaseService createDatabase()\n    {\n        String cypher = \"CREATE\\n\" +\n                \"(ben:User {name:'Ben'}),\\n\" +\n                \"(arnold:User {name:'Arnold'}),\\n\" +\n                \"(charlie:User {name:'Charlie'}),\\n\" +\n                \"(gordon:User {name:'Gordon'}),\\n\" +\n                \"(lucy:User {name:'Lucy'}),\\n\" +\n                \"(emily:User {name:'Emily'}),\\n\" +\n                \"(sarah:User {name:'Sarah'}),\\n\" +\n                \"(kate:User {name:'Kate'}),\\n\" +\n                \"(acme:User {name:'Acme, Inc'}),\\n\" +\n                \"(startup:Company {name:'Startup, Ltd'}),\\n\" +\n                \"(graphs:Topic {name:'Graphs'}),\\n\" +\n                \"(rest:Topic {name:'REST'}),\\n\" +\n                \"(art:Topic {name:'Art'}),\\n\" +\n                \"(design:Topic {name:'Design'}),\\n\" +\n                \"(medicine:Topic {name:'Medicine'}),\\n\" +\n                \"(drama:Topic {name:'Drama'}),\\n\" +\n                \"(java:Topic {name:'Java'}),\\n\" +\n                \"(music:Topic {name:'Music'}),\\n\" +\n                \"(cars:Topic {name:'Cars'}),\\n\" +\n                \"(travel:Topic {name:'Travel'}),\\n\" +\n                \"(phoenix:Topic {name:'Phoenix'}),\\n\" +\n                \"(quantumLeap:Topic {name:'Quantum Leap'}),\\n\" +\n                \"(nextGenPlatform:Topic {name:'Next Gen Platform'}),\\n\" +\n                \"ben-[:WORKS_FOR]->acme,\\n\" +\n                \"charlie-[:WORKS_FOR]->acme,\\n\" +\n                \"lucy-[:WORKS_FOR]->acme,\\n\" +\n                \"sarah-[:WORKS_FOR]->acme,\\n\" +\n                \"arnold-[:WORKS_FOR]->startup,\\n\" +\n                \"gordon-[:WORKS_FOR]->startup,\\n\" +\n                \"emily-[:WORKS_FOR]->startup,\\n\" +\n                \"kate-[:WORKS_FOR]->startup,\\n\" +\n                \"ben-[:INTERESTED_IN]->graphs,\\n\" +\n                \"ben-[:INTERESTED_IN]->rest,\\n\" +\n                \"arnold-[:INTERESTED_IN]->graphs,\\n\" +\n                \"arnold-[:INTERESTED_IN]->java,\\n\" +\n                \"arnold-[:INTERESTED_IN]->rest,\\n\" +\n                \"arnold-[:INTERESTED_IN]->travel,\\n\" +\n                \"charlie-[:INTERESTED_IN]->graphs,\\n\" +\n                \"charlie-[:INTERESTED_IN]->cars,\\n\" +\n                \"charlie-[:INTERESTED_IN]->medicine,\\n\" +\n                \"gordon-[:INTERESTED_IN]->graphs,\\n\" +\n                \"gordon-[:INTERESTED_IN]->art,\\n\" +\n                \"gordon-[:INTERESTED_IN]->music,\\n\" +\n                \"lucy-[:INTERESTED_IN]->art,\\n\" +\n                \"lucy-[:INTERESTED_IN]->drama,\\n\" +\n                \"lucy-[:INTERESTED_IN]->music,\\n\" +\n                \"emily-[:INTERESTED_IN]->art,\\n\" +\n                \"emily-[:INTERESTED_IN]->design,\\n\" +\n                \"sarah-[:INTERESTED_IN]->java,\\n\" +\n                \"sarah-[:INTERESTED_IN]->graphs,\\n\" +\n                \"sarah-[:INTERESTED_IN]->rest,\\n\" +\n                \"kate-[:INTERESTED_IN]->drama,\\n\" +\n                \"kate-[:INTERESTED_IN]->music,\\n\" +\n                \"arnold-[:WORKED_ON]->phoenix,\\n\" +\n                \"kate-[:WORKED_ON]->phoenix,\\n\" +\n                \"kate-[:WORKED_ON]->quantumLeap,\\n\" +\n                \"emily-[:WORKED_ON]->quantumLeap,\\n\" +\n                \"ben-[:WORKED_ON]->nextGenPlatform,\\n\" +\n                \"emily-[:WORKED_ON]->nextGenPlatform,\\n\" +\n                \"charlie-[:WORKED_ON]->nextGenPlatform,\\n\" +\n                \"sarah-[:WORKED_ON]->nextGenPlatform,\\n\" +\n                \"sarah-[:WORKED_ON]->quantumLeap\";\n\n        return createFromCypher(\n                \"Social Network\",\n                cypher,\n                IndexParam.indexParam( \"User\", \"name\" ),\n                IndexParam.indexParam( \"Topic\", \"name\" ),\n                IndexParam.indexParam( \"Project\", \"name\" ) );\n\n    }\n}\n"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/helpers/Db.java",
    "content": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.PrintWriter;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.neo4j.cypher.javacompat.ExecutionEngine;\nimport org.neo4j.graphdatabases.queries.testing.IndexParam;\nimport org.neo4j.graphdatabases.queries.testing.IndexParams;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.Node;\nimport org.neo4j.graphdb.NotFoundException;\nimport org.neo4j.graphdb.factory.GraphDatabaseFactory;\nimport org.neo4j.graphdb.index.AutoIndexer;\nimport org.neo4j.test.AsciiDocGenerator;\nimport org.neo4j.test.TestGraphDatabaseFactory;\nimport org.neo4j.visualization.asciidoc.AsciidocHelper;\n\npublic final class Db\n{\n    private Db()\n    {\n    }\n\n    public static GraphDatabaseService impermanentDb()\n    {\n        Map<String, String> params = new HashMap<String, String>();\n        params.put( \"online_backup_enabled\", \"false\" );\n\n        return new TestGraphDatabaseFactory().newImpermanentDatabaseBuilder().setConfig( params ).newGraphDatabase();\n    }\n\n    public static GraphDatabaseService tempDb()\n    {\n        return new GraphDatabaseFactory().newEmbeddedDatabase( createTempDatabaseDir().getAbsolutePath() );\n    }\n\n    public static GraphDatabaseService createFromCypher( String name, String cypher, IndexParam... indexParams )\n    {\n        GraphDatabaseService db = Db.impermanentDb();\n\n        return createFromCypher( db, name, cypher, indexParams );\n    }\n\n    public static GraphDatabaseService createFromCypherWithAutoIndexing( String name, String cypher,\n                                                                         IndexParam... indexParams )\n    {\n        GraphDatabaseService db = Db.impermanentDb();\n\n        AutoIndexer<Node> nodeAutoIndexer = db.index().getNodeAutoIndexer();\n        for ( IndexParam indexParam : indexParams )\n        {\n            nodeAutoIndexer.startAutoIndexingProperty( indexParam.propertyName() );\n        }\n        nodeAutoIndexer.setEnabled( true );\n\n        return createFromCypher( db, name, cypher, indexParams );\n    }\n\n    public static GraphDatabaseService createFromCypher( GraphDatabaseService db, String name, String cypher,\n                                                         IndexParam... indexParams )\n    {\n        ExecutionEngine engine = new ExecutionEngine( db );\n        engine.execute( cypher );\n\n        new IndexParams( indexParams ).index( db);\n\n        printGraph( name, db );\n\n        return db;\n    }\n\n    private static void printGraph( String name, GraphDatabaseService db )\n    {\n        try\n        {\n            printFile( name, AsciidocHelper.createGraphVizDeletingReferenceNode( name, db, \"graph\" ) );\n        }\n        catch ( NotFoundException e )\n        {\n            printFile( name, AsciidocHelper.createGraphViz( name, db, \"graph\" ) );\n        }\n    }\n\n    private static void printFile( String fileName, String contents )\n    {\n        PrintWriter writer = AsciiDocGenerator.getPrintWriter( \"../examples/\", fileName );\n        try\n        {\n            writer.println( contents );\n        }\n        finally\n        {\n            writer.close();\n        }\n    }\n\n    private static File createTempDatabaseDir()\n    {\n\n        File d;\n        try\n        {\n            d = File.createTempFile( \"gdb-\", \"dir\" );\n            System.out.println( String.format( \"Created a new Neo4j database at [%s]\", d.getAbsolutePath() ) );\n        }\n        catch ( IOException e )\n        {\n            throw new RuntimeException( e );\n        }\n        if ( !d.delete() )\n        {\n            throw new RuntimeException( \"temp config directory pre-delete failed\" );\n        }\n        if ( !d.mkdirs() )\n        {\n            throw new RuntimeException( \"temp config directory not created\" );\n        }\n        d.deleteOnExit();\n        return d;\n    }\n}\n"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/helpers/IndexNodeByOtherNodeIndexerTest.java",
    "content": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.neo4j.graphdatabases.queries.helpers.Db.createFromCypher;\nimport static org.neo4j.graphdb.DynamicRelationshipType.withName;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.junit.Ignore;\nimport org.junit.Test;\nimport org.neo4j.cypher.javacompat.ExecutionEngine;\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdatabases.queries.testing.IndexParam;\nimport org.neo4j.graphdb.*;\nimport org.neo4j.graphdb.traversal.Evaluation;\nimport org.neo4j.graphdb.traversal.Evaluator;\nimport org.neo4j.graphdb.traversal.TraversalDescription;\nimport org.neo4j.kernel.Traversal;\nimport org.neo4j.tooling.GlobalGraphOperations;\n\npublic class IndexNodeByOtherNodeIndexerTest\n{\n    @Test\n    @Ignore(\"Doesn't work like that, the code used to index multiple children under one parent, not possible with the new indexes\")\n    public void shouldIndexNodesByOtherNodes() throws Exception\n    {\n        // given\n        String cypher = \"CREATE (a:Parent {name:'a'}), \\n\" +\n                \"(b:Child {name:'b'}), \\n\" +\n                \"(c:Child {name:'c'}), \\n\" +\n                \"(d:Child {name:'d'}), \\n\" +\n                \"(e:Child {name:'e'}), \\n\" +\n                \"(f:Child {name:'f'}),\\n\" +\n                \"(g:Child {name:'g'}),\\n\" +\n                \"(h:Child {name:'h'}),\\n\" +\n                \"a-[:CONNECTED_TO]->b,\\n\" +\n                \"a-[:CONNECTED_TO]->c,\\n\" +\n                \"a-[:CONNECTED_TO]->g,\\n\" +\n                \"d-[:CONNECTED_TO]->e,\\n\" +\n                \"d-[:CONNECTED_TO]->f,\\n\" +\n                \"d-[:CONNECTED_TO]->h\";\n\n        final GraphDatabaseService db = createFromCypher(\n                \"Example\",\n                cypher,\n                IndexParam.indexParam( \"Parent\", \"name\" ) );\n        ExecutionEngine executionEngine = new ExecutionEngine(db);\n\n        IndexNodeByOtherNodeIndexer.GraphTraversal traversal1 = new IndexNodeByOtherNodeIndexer.GraphTraversal(){\n            @Override\n            public Iterable<Node> execute( Node startNode )\n            {\n                return GlobalGraphOperations.at(db).getAllNodesWithLabel(DynamicLabel.label(\"Parent\"));\n            }\n        };\n\n        IndexNodeByOtherNodeIndexer.GraphTraversal traversal2 = new IndexNodeByOtherNodeIndexer.GraphTraversal(){\n                    @Override\n                    public Iterable<Node> execute( Node startNode )\n                    {\n                        TraversalDescription traversalDescription = db.traversalDescription().breadthFirst().relationships(\n                                withName( \"CONNECTED_TO\" ), Direction.OUTGOING ).evaluator( new Evaluator()\n                        {\n                            @Override\n                            public Evaluation evaluate( Path path )\n                            {\n                                if ( path.endNode().equals( path.startNode() ) )\n                                {\n                                    return Evaluation.EXCLUDE_AND_CONTINUE;\n                                }\n                                return Evaluation.INCLUDE_AND_CONTINUE;\n                            }\n                        } );\n                        return traversalDescription.traverse( startNode ).nodes();\n                    }\n                };\n\n        IndexNodeByOtherNodeIndexer indexer = new IndexNodeByOtherNodeIndexer( traversal1, traversal2, \"Parent\", \"child\", \"name\" );\n\n        // when\n        indexer.execute( db, null, 2 );\n\n        // then\n        Map<String, String> indexValueToResult = new HashMap<>(  );\n        indexValueToResult.put( \"b\", \"a\" );\n        indexValueToResult.put( \"c\", \"a\" );\n        indexValueToResult.put( \"g\", \"a\" );\n        indexValueToResult.put( \"e\", \"d\" );\n        indexValueToResult.put( \"f\", \"d\" );\n        indexValueToResult.put( \"h\", \"d\" );\n\n        for ( String indexValue : indexValueToResult.keySet() )\n        {\n            String query = \"MATCH (n:Parent {child:'\"+indexValue+\"'}) RETURN n.name AS parent\";\n\n            ExecutionResult result = executionEngine.execute(query);\n            assertEquals(indexValueToResult.get( indexValue ), result.iterator().next().get( \"parent\" ));\n        }\n    }\n}\n"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/helpers/PrintingExecutionEngineWrapper.java",
    "content": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport java.io.PrintWriter;\nimport java.util.Map;\n\nimport org.junit.rules.TestName;\nimport org.neo4j.cypher.javacompat.ExecutionEngine;\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.test.AsciiDocGenerator;\n\npublic class PrintingExecutionEngineWrapper implements ExecutionEngineWrapper\n{\n    private final ExecutionEngine executionEngine;\n    private final String useCase;\n    private final TestName testName;\n\n    public PrintingExecutionEngineWrapper( GraphDatabaseService db, String useCase, TestName testName )\n    {\n        this.useCase = useCase;\n        this.executionEngine = new ExecutionEngine( db );\n        this.testName = testName;\n    }\n\n    @Override\n    public ExecutionResult execute( String query, Map<String, Object> params )\n    {\n        return execute( query, params, 1 );\n    }\n\n    @Override\n    public ExecutionResult execute( String query, Map<String, Object> params, int index )\n    {\n        printQuery( query, index );\n        ExecutionResult returnResult = executionEngine.execute( query, params );\n        // For CREATE queries, this may not return the same results\n        ExecutionResult printResult = executionEngine.execute( query, params );\n        printResult( printResult, index );\n        return returnResult;\n    }\n\n    private void printResult( org.neo4j.cypher.javacompat.ExecutionResult results, int index )\n    {\n        String output = \"[queryresult]\\n----\\n\" + results.dumpToString()\n                + \"\\n----\\n\";\n        printFile( useCase + \"-\" + testName.getMethodName() + \"-result-\" + index, output );\n    }\n\n    private void printQuery( String query, int index )\n    {\n        String output = \"----\\n\" + query + \"\\n----\\n\";\n        printFile( useCase + \"-\" + testName.getMethodName() + \"-query-\" + index, output );\n    }\n\n    private static void printFile( String fileName, String contents )\n    {\n        try (PrintWriter writer = AsciiDocGenerator.getPrintWriter(\"../examples\", fileName)) {\n            writer.println(contents);\n        }\n    }\n}\n"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/helpers/QueryUnionExecutionEngineTest.java",
    "content": "package org.neo4j.graphdatabases.queries.helpers;\n\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.Map;\n\nimport org.junit.AfterClass;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\nimport org.neo4j.cypher.javacompat.ExecutionEngine;\nimport org.neo4j.cypher.javacompat.ExecutionResult;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.graphdb.Node;\nimport org.neo4j.graphdb.Transaction;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\nimport static org.junit.Assert.fail;\n\nimport static org.neo4j.graphdatabases.queries.helpers.Db.createFromCypher;\nimport static org.neo4j.graphdatabases.queries.testing.IndexParam.indexParam;\n\npublic class QueryUnionExecutionEngineTest\n{\n    private static final GraphDatabaseService database = createDatabase();\n    private static ExecutionEngineWrapper executionEngine;\n    private static Transaction transaction;\n\n    @BeforeClass\n    public static void init()\n    {\n        try\n        {\n            executionEngine = new ExecutionEngineWrapper()\n            {\n                private ExecutionEngine engine = new ExecutionEngine(database);\n\n                @Override\n                public ExecutionResult execute( String query, Map<String, Object> params )\n                {\n                    return engine.execute( query, params );\n                }\n\n                @Override\n                public ExecutionResult execute( String query, Map<String, Object> params, int index )\n                {\n                    return execute( query, params );\n                }\n            };\n        }\n        catch ( Exception e )\n        {\n            System.out.println( e.getMessage() );\n        }\n\n        transaction = database.beginTx();\n    }\n\n    @AfterClass\n    public static void end() {\n        transaction.close();\n        database.shutdown();\n    }\n\n    @Test\n    public void shouldAllowIteratingSingleResult() throws Exception\n    {\n        // given\n        String query =\n                \"MATCH (a:User {name:'a'})-[:FRIEND]->(person)\\n\" +\n                \"RETURN person\";\n        QueryUnionExecutionEngine queryUnionExecutionEngine = new QueryUnionExecutionEngine( executionEngine );\n\n        // when\n        Iterator<Map<String, Object>> results = queryUnionExecutionEngine.execute( query ).iterator();\n\n        // then\n        assertEquals( \"b\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertEquals( \"c\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertFalse( results.hasNext() );\n    }\n\n    @Test\n    public void shouldAllowIteratingMultipleResults() throws Exception\n    {\n        // given\n        String query1 =\n                \"MATCH (a:User {name:'a'})-[:FRIEND]->(person)\\n\" +\n                \"RETURN person\";\n        String query2 =\n                \"MATCH (a:User {name:'a'})-[:ENEMY]->(person)\\n\" +\n                \"RETURN person\";\n        QueryUnionExecutionEngine queryUnionExecutionEngine = new QueryUnionExecutionEngine( executionEngine );\n\n        // when\n        Iterator<Map<String, Object>> results = queryUnionExecutionEngine.execute( query1, query2 ).iterator();\n\n        // then\n        assertEquals( \"b\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertEquals( \"c\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertEquals( \"d\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertEquals( \"e\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertFalse( results.hasNext() );\n    }\n\n    @Test\n    public void shouldReturnCorrectResultsWhenFirstQueryReturnsEmptyResults() throws Exception\n    {\n        // given\n        String query1 =\n                \"MATCH (a:User {name:'a'})-[:COLLEAGUE]->(person)\\n\" +\n                \"RETURN person\";\n        String query2 =\n                \"MATCH (a:User {name:'a'})-[:ENEMY]->(person)\\n\" +\n                \"RETURN person\";\n        QueryUnionExecutionEngine queryUnionExecutionEngine = new QueryUnionExecutionEngine( executionEngine );\n\n        // when\n        Iterator<Map<String, Object>> results = queryUnionExecutionEngine.execute( query1, query2 ).iterator();\n\n        // then\n        assertEquals( \"d\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertEquals( \"e\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertFalse( results.hasNext() );\n    }\n\n    @Test\n    public void shouldReturnCorrectResultsWhenLastQueryReturnsEmptyResults() throws Exception\n    {\n        // given\n        String query1 =\n                \"MATCH (a:User {name:'a'})-[:FRIEND]->(person)\\n\" +\n                \"RETURN person\";\n        String query2 =\n                \"MATCH (a:User {name:'a'})-[:COLLEAGUE]->(person)\\n\" +\n                \"RETURN person\";\n        QueryUnionExecutionEngine queryUnionExecutionEngine = new QueryUnionExecutionEngine( executionEngine );\n\n        // when\n        Iterator<Map<String, Object>> results = queryUnionExecutionEngine.execute( query1, query2 ).iterator();\n\n        // then\n        assertEquals( \"b\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertEquals( \"c\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertFalse( results.hasNext() );\n    }\n\n    @Test\n    public void shouldReturnCorrectResultsWhenMiddleQueryReturnsEmptyResults() throws Exception\n    {\n        // given\n        String query1 =\n                \"MATCH (a:User {name:'a'})-[:FRIEND]->(person)\\n\" +\n                \"RETURN person\";\n        String query2 =\n                \"MATCH (a:User {name:'a'})-[:COLLEAGUE]->(person)\\n\" +\n                \"RETURN person\";\n        String query3 =\n                \"MATCH (a:User {name:'a'})-[:ENEMY]->(person)\\n\" +\n                \"RETURN person\";\n        QueryUnionExecutionEngine queryUnionExecutionEngine = new QueryUnionExecutionEngine( executionEngine );\n\n        // when\n        Iterator<Map<String, Object>> results = queryUnionExecutionEngine.execute( query1, query2, query3 ).iterator();\n\n        // then\n        assertEquals( \"b\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertEquals( \"c\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertEquals( \"d\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertEquals( \"e\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertFalse( results.hasNext() );\n    }\n\n    @Test\n    public void shouldReturnCorrectResultsWhenAllQueriesReturnEmptyResults() throws Exception\n    {\n        // given\n        String query1 =\n                \"MATCH (a:User {name:'a'})-[:COLLEAGUE]->(person)\\n\" +\n                \"RETURN person\";\n        String query2 =\n                \"MATCH (a:User {name:'a'})-[:COLLEAGUE]->(person)\\n\" +\n                \"RETURN person\";\n        QueryUnionExecutionEngine queryUnionExecutionEngine = new QueryUnionExecutionEngine( executionEngine );\n\n        // when\n        Iterator<Map<String, Object>> results = queryUnionExecutionEngine.execute( query1, query2 ).iterator();\n\n        // then\n        assertFalse( results.hasNext() );\n    }\n\n    @Test\n    public void shouldAllowSameParametersToBePassedToAllQueries() throws Exception\n    {\n        // given\n        String query1 =\n                \"MATCH (a:User {name:'a'})-[:FRIEND]->(person)\\n\" +\n                \"RETURN person\";\n        String query2 =\n                \"MATCH (a:User {name:'a'})-[:ENEMY]->(person)\\n\" +\n                \"RETURN person\";\n        QueryUnionExecutionEngine queryUnionExecutionEngine = new QueryUnionExecutionEngine( executionEngine );\n\n        Map<String, Object> params = new HashMap<String, Object>();\n        params.put( \"name\", \"a\" );\n\n        // when\n        Iterator<Map<String, Object>> results = queryUnionExecutionEngine.execute( params, query1, query2 ).iterator();\n\n        // then\n        assertEquals( \"b\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertEquals( \"c\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertEquals( \"d\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertEquals( \"e\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertFalse( results.hasNext() );\n    }\n\n    @Test\n    public void shouldAllowDifferentParametersToBePassedToDifferentQueries() throws Exception\n    {\n        // given\n        String query1 =\n                \"MATCH (a:User {name:'a'})-[:FRIEND]->(person)\\n\" +\n                \"RETURN person\";\n        String query2 =\n                \"MATCH (a:User {name:'a'})-[:ENEMY]->(person)\\n\" +\n                \"RETURN person\";\n        QueryUnionExecutionEngine queryUnionExecutionEngine = new QueryUnionExecutionEngine( executionEngine );\n\n        Map<String, Object> params = new HashMap<String, Object>();\n        params.put( \"name\", \"a\" );\n        params.put( \"user\", \"a\" );\n\n        // when\n        Iterator<Map<String, Object>> results = queryUnionExecutionEngine.execute( params, query1, query2 ).iterator();\n\n        // then\n        assertEquals( \"b\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertEquals( \"c\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertEquals( \"d\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertEquals( \"e\", ((Node) results.next().get( \"person\" )).getProperty( \"name\" ) );\n        assertFalse( results.hasNext() );\n    }\n\n    @Test\n    public void shouldThrowExceptionIfNoQueriesSupplied() throws Exception\n    {\n        // given\n        QueryUnionExecutionEngine queryUnionExecutionEngine = new QueryUnionExecutionEngine( executionEngine );\n\n        // then\n        try\n        {\n            queryUnionExecutionEngine.execute();\n            fail( \"Expected IllegalArgumentException\" );\n        }\n        catch ( IllegalArgumentException ex )\n        {\n            assertEquals( \"Must supply one or more queries.\", ex.getMessage() );\n        }\n    }\n\n    @Test\n    public void shouldReturnAllResultsAsString() throws Exception\n    {\n        // given\n        String query1 =\n                \"MATCH (a:User {name:'a'})-[:FRIEND]->(person)\\n\" +\n                \"RETURN person.name\";\n        String query2 =\n                \"MATCH (a:User {name:'a'})-[:ENEMY]->(person)\\n\" +\n                \"RETURN person.name\";\n        QueryUnionExecutionEngine queryUnionExecutionEngine = new QueryUnionExecutionEngine( executionEngine );\n\n        // when\n        QueryUnionExecutionResult results = (QueryUnionExecutionResult) queryUnionExecutionEngine.execute(\n                query1,\n                query2 );\n\n        // then\n        String resultsString = results.toString();\n        assertTrue( resultsString.startsWith(\n                \"+-------------+\\n\" +\n                        \"| person.name |\\n\" +\n                        \"+-------------+\\n\" +\n                        \"| \\\"b\\\"         |\\n\" +\n                        \"| \\\"c\\\"         |\\n\" +\n                        \"+-------------+\\n\" +\n                        \"2 rows\\n\" ) );\n        assertTrue( resultsString.contains(\n                \"+-------------+\\n\" +\n                        \"| person.name |\\n\" +\n                        \"+-------------+\\n\" +\n                        \"| \\\"d\\\"         |\\n\" +\n                        \"| \\\"e\\\"         |\\n\" +\n                        \"+-------------+\\n\" +\n                        \"2 rows\\n\" ) );\n    }\n\n    private static GraphDatabaseService createDatabase()\n    {\n        String cypher = \"CREATE\\n\" +\n                \"(a:User {name:'a'}),\\n\" +\n                \"(b:User {name:'b'}),\\n\" +\n                \"(c:User {name:'c'}),\\n\" +\n                \"(d:User {name:'d'}),\\n\" +\n                \"(e:User {name:'e'}),\\n\" +\n                \"(a)-[:FRIEND]->(b), (a)-[:FRIEND]->(c), (a)-[:ENEMY]->(d), (a)-[:ENEMY]->(e)\";\n\n        return createFromCypher(\n                \"Union example\",\n                cypher,\n                indexParam( \"User\", \"name\" ) );\n    }\n}\n"
  },
  {
    "path": "queries/src/test/java/org/neo4j/graphdatabases/queries/server/SimpleSocialNetworkExtensionTest.java",
    "content": "package org.neo4j.graphdatabases.queries.server;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.neo4j.graphdatabases.queries.helpers.Db.createFromCypher;\n\nimport java.io.IOException;\n\nimport javax.ws.rs.core.MediaType;\n\nimport com.sun.jersey.api.client.Client;\nimport com.sun.jersey.api.client.ClientResponse;\nimport com.sun.jersey.api.client.WebResource;\nimport com.sun.jersey.api.client.config.ClientConfig;\nimport com.sun.jersey.api.client.config.DefaultClientConfig;\nimport org.junit.AfterClass;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\nimport org.neo4j.graphdatabases.queries.testing.IndexParam;\nimport org.neo4j.graphdb.GraphDatabaseService;\nimport org.neo4j.server.CommunityNeoServer;\nimport org.neo4j.server.helpers.CommunityServerBuilder;\n\npublic class SimpleSocialNetworkExtensionTest\n{\n    private static CommunityNeoServer server;\n    private static GraphDatabaseService db;\n\n    @BeforeClass\n    public static void init() throws IOException\n    {\n        server = CommunityServerBuilder.server()\n                .withThirdPartyJaxRsPackage(\n                        \"org.neo4j.graphdatabases.queries.server\",\n                        \"/socnet\" )\n                .build();\n        server.start();\n\n        db = server.getDatabase().getGraph();\n        populateDatabase( db );\n    }\n\n    @AfterClass\n    public static void teardown()\n    {\n        server.stop();\n    }\n\n    @Test\n    public void serverShouldReturnDistance() throws Exception\n    {\n        ClientConfig config = new DefaultClientConfig();\n        Client client = Client.create( config );\n\n        WebResource resource = client\n                .resource( \"http://localhost:7474/socnet/distance/Ben/Mike\" );\n        ClientResponse response = resource\n                .accept( MediaType.TEXT_PLAIN )\n                .get( ClientResponse.class );\n\n        assertEquals( 200, response.getStatus() );\n        assertEquals( \"text/plain\",\n                response.getHeaders().get( \"Content-Type\" ).get( 0 ) );\n        assertEquals( \"4\", response.getEntity( String.class ) );\n    }\n\n    @Test\n    public void extensionShouldReturnDistance() throws Exception\n    {\n        // given\n        SimpleSocialNetworkExtension extension = new SimpleSocialNetworkExtension( db );\n\n        // when\n        String distance = extension.getDistance( \"Ben\", \"Mike\" );\n\n        // then\n        assertEquals( \"4\", distance );\n    }\n\n    private static GraphDatabaseService populateDatabase( GraphDatabaseService db )\n    {\n        String cypher = \"CREATE\\n\" +\n                \"(ben:User {name:'Ben'}),\\n\" +\n                \"(arnold:User {name:'Arnold'}),\\n\" +\n                \"(charlie:User {name:'Charlie'}),\\n\" +\n                \"(gordon:User {name:'Gordon'}),\\n\" +\n                \"(lucy:User {name:'Lucy'}),\\n\" +\n                \"(emily:User {name:'Emily'}),\\n\" +\n                \"(sarah:User {name:'Sarah'}),\\n\" +\n                \"(kate:User {name:'Kate'}),\\n\" +\n                \"(mike:User {name:'Mike'}),\\n\" +\n                \"(paula:User {name:'Paula'}),\\n\" +\n                \"ben-[:FRIEND]->charlie,\\n\" +\n                \"charlie-[:FRIEND]->lucy,\\n\" +\n                \"lucy-[:FRIEND]->sarah,\\n\" +\n                \"sarah-[:FRIEND]->mike,\\n\" +\n                \"arnold-[:FRIEND]->gordon,\\n\" +\n                \"gordon-[:FRIEND]->emily,\\n\" +\n                \"emily-[:FRIEND]->kate,\\n\" +\n                \"kate-[:FRIEND]->paula\";\n\n        return createFromCypher( db,\n                \"Simple Social Network\",\n                cypher,\n                IndexParam.indexParam( \"User\", \"name\" ) );\n    }\n}\n"
  }
]