geode-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From upthewatersp...@apache.org
Subject [geode-examples] branch develop updated: GEODE-3195 Add querying example to the geode-examples (#15)
Date Thu, 26 Oct 2017 23:12:25 GMT
This is an automated email from the ASF dual-hosted git repository.

upthewaterspout pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode-examples.git


The following commit(s) were added to refs/heads/develop by this push:
     new a8f16ec  GEODE-3195 Add querying example to the geode-examples (#15)
a8f16ec is described below

commit a8f16ec366b1f46748f6f29c3aa5352b5b8b6bc3
Author: Karen Miller <karensmolermiller@users.noreply.github.com>
AuthorDate: Thu Oct 26 16:12:23 2017 -0700

    GEODE-3195 Add querying example to the geode-examples (#15)
    
    Adding an example of executing OQL queries using the java API and gfsh.
---
 queries/README.md                                  | 104 +++++++++++++++++
 queries/scripts/start.gfsh                         |  25 +++++
 queries/scripts/stop.gfsh                          |  18 +++
 .../geode/examples/queries/EmployeeData.java       |  68 +++++++++++
 .../org/apache/geode/examples/queries/Example.java | 125 +++++++++++++++++++++
 .../apache/geode/examples/queries/ExampleTest.java |  30 +++++
 settings.gradle                                    |   1 +
 7 files changed, 371 insertions(+)

diff --git a/queries/README.md b/queries/README.md
new file mode 100644
index 0000000..c87241d
--- /dev/null
+++ b/queries/README.md
@@ -0,0 +1,104 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+# Geode Querying Example
+
+This example demonstrates simple queries on a region.
+
+In this example, two servers host a single partitioned region with entries
+that represent employee information.
+The example does queries through the API and presents example queries
+to be invoked through the `gfsh` command-line interface.
+
+This example assumes that Java and Geode are installed.
+
+## Set up the cluster 
+1. Set directory ```geode-examples/queries``` to be the
+current working directory.
+Each step in this example specifies paths relative to that directory.
+
+2. Build the example (with the `EmployeeData` class)
+
+        $ ../gradlew build
+
+
+4. Run a script that starts a locator and two servers,
+and then creates the ```example-region``` region.
+
+        $ ../gradlew start
+
+## Run the example program
+1. Run the example to populate `example-region` with employee information,
+print out the region information,
+and then programmatically invoke three queries,
+printing the results of each query.
+
+        $ ../gradlew run
+
+## Issue `gfsh` commands to query the region
+
+`gfsh` can also be used to issue queries.
+
+1.  If you have not already installed Geode,
+the build step will have installed a `gfsh` executable for you
+at a path relative to the current working directory
+within a versioned directory:
+
+        ../build/apache-geode-<version>/bin/gfsh
+
+    You can use this relative path to invoke gfsh by substituting
+the appropriate `<version>`.
+
+2. Start `gfsh` and connect to the cluster:
+
+        $ gfsh
+        ...
+        gfsh>connect --locator=127.0.0.1[10334]
+
+3. The quantity of entries may be observed with `gfsh`:
+
+        gfsh>describe region --name=example-region
+
+    Here are some `gfsh` queries to try on the `example-region` region.
+
+    Query for all entries in the region:
+
+        gfsh>query --query="select * from /example-region"
+
+    Query for the `email` field of all entries in the region:
+
+        gfsh>query --query="SELECT x.email FROM /example-region x"
+
+    Query for all entries that have a `lastName` field that starts
+    with the letter 'C':
+
+        gfsh>query --query="SELECT DISTINCT * FROM /example-region x WHERE x.lastName.startsWith('C')"
+
+    Exit gfsh:
+
+        gfsh>exit
+
+## Shut down the cluster and (optionally) clean up the directory
+1. Shut down the cluster:
+
+        $ ../gradlew stop
+
+2. If desired, clean up the generated directories containing
+logs:
+    
+        $ ../gradlew cleanServer
+
diff --git a/queries/scripts/start.gfsh b/queries/scripts/start.gfsh
new file mode 100644
index 0000000..5757be1
--- /dev/null
+++ b/queries/scripts/start.gfsh
@@ -0,0 +1,25 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+start locator --name=locator --bind-address=127.0.0.1
+
+start server --name=server1 --locators=127.0.0.1[10334] --server-port=0 --classpath=../build/classes/main
+start server --name=server2 --locators=127.0.0.1[10334] --server-port=0 --classpath=../build/classes/main
+
+create region --name=example-region --type=PARTITION
+
+list members
+describe region --name=example-region
diff --git a/queries/scripts/stop.gfsh b/queries/scripts/stop.gfsh
new file mode 100644
index 0000000..9281b31
--- /dev/null
+++ b/queries/scripts/stop.gfsh
@@ -0,0 +1,18 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+connect --locator=127.0.0.1[10334]
+shutdown --include-locators=true
\ No newline at end of file
diff --git a/queries/src/main/java/org/apache/geode/examples/queries/EmployeeData.java b/queries/src/main/java/org/apache/geode/examples/queries/EmployeeData.java
new file mode 100644
index 0000000..933b512
--- /dev/null
+++ b/queries/src/main/java/org/apache/geode/examples/queries/EmployeeData.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information
regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version
2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain
a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
express
+ * or implied. See the License for the specific language governing permissions and limitations
under
+ * the License.
+ */
+package org.apache.geode.examples.queries;
+
+import java.io.Serializable;
+
+public class EmployeeData implements Serializable {
+  private static final long serialVersionUID = 1L;
+
+  private String firstName;
+  private String lastName;
+  private int emplNumber;
+  private String email;
+  private int salary;
+  private int hoursPerWeek;
+
+  public EmployeeData(String firstName, String lastName, int emplNumber, String email, int
salary,
+      int hoursPerWeek) {
+    this.firstName = firstName;
+    this.lastName = lastName;
+    this.emplNumber = emplNumber;
+    this.email = email;
+    this.salary = salary;
+    this.hoursPerWeek = hoursPerWeek;
+  }
+
+  public String getFirstName() {
+    return firstName;
+  }
+
+  public String getLastName() {
+    return lastName;
+  }
+
+  public int getEmplNumber() {
+    return emplNumber;
+  }
+
+  public String getEmail() {
+    return email;
+  }
+
+  public int getSalary() {
+    return salary;
+  }
+
+  public int getHoursPerWeek() {
+    return hoursPerWeek;
+  }
+
+  public String toString() {
+    return "EmployeeData [firstName=" + firstName + ", lastName=" + lastName + ", emplNumber="
+        + emplNumber + ", email= " + email + ", salary=" + salary + ", hoursPerWeek=" + hoursPerWeek
+        + "]";
+  }
+}
diff --git a/queries/src/main/java/org/apache/geode/examples/queries/Example.java b/queries/src/main/java/org/apache/geode/examples/queries/Example.java
new file mode 100644
index 0000000..306a266
--- /dev/null
+++ b/queries/src/main/java/org/apache/geode/examples/queries/Example.java
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information
regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version
2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain
a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
express
+ * or implied. See the License for the specific language governing permissions and limitations
under
+ * the License.
+ */
+package org.apache.geode.examples.queries;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.client.ClientCache;
+import org.apache.geode.cache.client.ClientCacheFactory;
+import org.apache.geode.cache.client.ClientRegionShortcut;
+import org.apache.geode.cache.query.FunctionDomainException;
+import org.apache.geode.cache.query.NameResolutionException;
+import org.apache.geode.cache.query.QueryInvocationTargetException;
+import org.apache.geode.cache.query.QueryService;
+import org.apache.geode.cache.query.SelectResults;
+import org.apache.geode.cache.query.TypeMismatchException;
+
+
+public class Example {
+  static String REGIONNAME = "example-region";
+  static String QUERY1 = "SELECT DISTINCT * FROM /" + REGIONNAME;
+  static String QUERY2 = "SELECT DISTINCT * FROM /" + REGIONNAME + " h WHERE h.hoursPerWeek
< 40";
+  static String QUERY3 = "SELECT DISTINCT * FROM /" + REGIONNAME + " x WHERE x.lastName=$1";
+
+  public static void main(String[] args) throws NameResolutionException, TypeMismatchException,
+      QueryInvocationTargetException, FunctionDomainException {
+    // connect to the locator using default port 10334
+    ClientCache cache = new ClientCacheFactory().addPoolLocator("127.0.0.1", 10334)
+        .set("log-level", "WARN").create();
+
+    // create a region on the server
+    Region<Integer, EmployeeData> region =
+        cache.<Integer, EmployeeData>createClientRegionFactory(ClientRegionShortcut.PROXY)
+            .create(REGIONNAME);
+
+    // create a set of employee data and put it into the region
+    Map<Integer, EmployeeData> employees = createEmployeeData();
+    region.putAll(employees);
+
+    // count the values in the region
+    int inserted = region.keySetOnServer().size();
+    System.out.println(String.format("Counted %d keys in region %s", inserted, region.getName()));
+
+    // fetch and print all values in the region (without using a query)
+    region.keySetOnServer().forEach(key -> System.out.println(region.get(key)));
+
+    // do a set of queries, printing the results of each query
+    doQueries(cache);
+
+    cache.close();
+  }
+
+
+  public static Map<Integer, EmployeeData> createEmployeeData() {
+    String[] firstNames =
+        "Alex,Bertie,Kris,Dale,Frankie,Jamie,Morgan,Pat,Ricky,Taylor,Casey,Jessie,Ryan,Skyler"
+            .split(",");
+    String[] lastNames =
+        "Able,Bell,Call,Driver,Forth,Jive,Minnow,Puts,Reliable,Tack,Catch,Jam,Redo,Skip".split(",");
+    int salaries[] = new int[] {60000, 80000, 75000, 90000, 100000};
+    int hours[] = new int[] {40, 40, 40, 40, 30, 20};
+    int emplNumber = 10000;
+
+    // put data into the hashmap
+    Map<Integer, EmployeeData> employees = new HashMap<Integer, EmployeeData>();
+    for (int index = 0; index < firstNames.length; index++) {
+      emplNumber = emplNumber + index;
+      String email = firstNames[index] + "." + lastNames[index] + "@example.com";
+      int salary = salaries[index % 5];
+      int hoursPerWeek = hours[index % 6];
+      EmployeeData value = new EmployeeData(firstNames[index], lastNames[index], emplNumber,
email,
+          salary, hoursPerWeek);
+      employees.put(emplNumber, value);
+    }
+
+    return employees;
+  }
+
+
+  // Demonstrate querying using the API by doing 3 queries.
+  public static void doQueries(ClientCache cache) throws NameResolutionException,
+      TypeMismatchException, QueryInvocationTargetException, FunctionDomainException {
+    QueryService queryService = cache.getQueryService();
+
+    // Query for every entry in the region, and print query results.
+    System.out.println("\nExecuting query: " + QUERY1);
+    SelectResults<EmployeeData> results =
+        (SelectResults<EmployeeData>) queryService.newQuery(QUERY1).execute();
+    printSetOfEmployees(results);
+
+    // Query for all part time employees, and print query results.
+    System.out.println("\nExecuting query: " + QUERY2);
+    results = (SelectResults<EmployeeData>) queryService.newQuery(QUERY2).execute();
+    printSetOfEmployees(results);
+
+    // Query for last name of Jive, and print the full name and employee number.
+    System.out.println("\nExecuting query: " + QUERY3);
+    results =
+        (SelectResults<EmployeeData>) queryService.newQuery(QUERY3).execute(new String[]
{"Jive"});
+    for (EmployeeData eachEmployee : results) {
+      System.out.println(String.format("Employee %s %s has employee number %d",
+          eachEmployee.getFirstName(), eachEmployee.getLastName(), eachEmployee.getEmplNumber()));
+    }
+  }
+
+  private static void printSetOfEmployees(SelectResults<EmployeeData> results) {
+    System.out.println("Query returned " + results.size() + " results.");
+    for (EmployeeData eachEmployee : results) {
+      System.out.println(String.format("Employee: %s", eachEmployee.toString()));
+    }
+  }
+}
diff --git a/queries/src/test/java/org/apache/geode/examples/queries/ExampleTest.java b/queries/src/test/java/org/apache/geode/examples/queries/ExampleTest.java
new file mode 100644
index 0000000..14cb786
--- /dev/null
+++ b/queries/src/test/java/org/apache/geode/examples/queries/ExampleTest.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information
regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version
2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain
a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
express
+ * or implied. See the License for the specific language governing permissions and limitations
under
+ * the License.
+ */
+package org.apache.geode.examples.queries;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+import java.util.Map;
+
+public class ExampleTest {
+
+  @Test
+  public void testCreateEmployeeData() {
+    Map<Integer, EmployeeData> data = Example.createEmployeeData();
+    assertEquals(14, data.size());
+  }
+}
diff --git a/settings.gradle b/settings.gradle
index de9db34..2c89886 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -18,6 +18,7 @@ rootProject.name = 'geode-examples'
 
 include 'replicated'
 include 'partitioned'
+include 'queries'
 include 'lucene'
 include 'loader'
 include 'putall'

-- 
To stop receiving notification emails like this one, please contact
['"commits@geode.apache.org" <commits@geode.apache.org>'].

Mime
View raw message