Merge lp:~nwilliams/akiban-server/simplify-builder-get into lp:~akiban-technologies/akiban-server/trunk

Proposed by Nathan Williams
Status: Merged
Approved by: Thomas Jones-Low
Approved revision: 2625
Merged at revision: 2625
Proposed branch: lp:~nwilliams/akiban-server/simplify-builder-get
Merge into: lp:~akiban-technologies/akiban-server/trunk
Diff against target: 305 lines (+183/-11)
7 files modified
pom.xml (+1/-0)
src/main/java/com/akiban/rest/resources/BuilderResource.java (+2/-4)
src/main/java/com/akiban/server/service/restdml/ModelBuilder.java (+66/-3)
src/test/java/com/akiban/server/service/restdml/ModelBuilderIT.java (+44/-0)
src/test/resources/com/akiban/rest/caoi/builder-implode.check_expected (+62/-4)
src/test/resources/com/akiban/rest/caoi/builder-insert.check (+1/-0)
src/test/resources/com/akiban/rest/caoi/builder-insert.check_expected (+7/-0)
To merge this branch: bzr merge lp:~nwilliams/akiban-server/simplify-builder-get
Reviewer Review Type Date Requested Status
Thomas Jones-Low Approve
Review via email: mp+159034@code.launchpad.net

Description of the change

Expand BuilderResource rows before returning them.

This was trivial to do on the client side, but requires every client to do it. Ever so slight overlap with ExternalDataService functionality, but not enough in common to warrant a refactor.

Also ignore README from license check to quiet warning.

To post a comment you must log in.
Revision history for this message
Thomas Jones-Low (tjoneslo) wrote :

As described.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'pom.xml'
2--- pom.xml 2013-04-11 05:51:16 +0000
3+++ pom.xml 2013-04-15 22:00:35 +0000
4@@ -393,6 +393,7 @@
5 <exclude>bin/akserver</exclude>
6 <exclude>**/*.options</exclude>
7 <!-- Files requiring a specific format (packaging control, test output, etc) -->
8+ <exclude>README.md</exclude>
9 <exclude>debian/**</exclude>
10 <exclude>redhat/**</exclude>
11 <exclude>macosx/**</exclude>
12
13=== modified file 'src/main/java/com/akiban/rest/resources/BuilderResource.java'
14--- src/main/java/com/akiban/rest/resources/BuilderResource.java 2013-04-03 23:03:25 +0000
15+++ src/main/java/com/akiban/rest/resources/BuilderResource.java 2013-04-15 22:00:35 +0000
16@@ -77,8 +77,7 @@
17 .body(new RestResponseBuilder.BodyGenerator() {
18 @Override
19 public void write(PrintWriter writer) throws Exception {
20- modelBuilder.create(tableName);
21- restDMLService.getAllEntities(writer, tableName, 0);
22+ modelBuilder.getAll(writer, tableName);
23 }
24 })
25 .build();
26@@ -97,8 +96,7 @@
27 .body(new RestResponseBuilder.BodyGenerator() {
28 @Override
29 public void write(PrintWriter writer) throws Exception {
30- modelBuilder.create(tableName);
31- restDMLService.getEntities(writer, tableName, 0, getPKString(uri));
32+ modelBuilder.getKeys(writer, tableName, getPKString(uri));
33 }
34 })
35 .build();
36
37=== modified file 'src/main/java/com/akiban/server/service/restdml/ModelBuilder.java'
38--- src/main/java/com/akiban/server/service/restdml/ModelBuilder.java 2013-03-26 20:32:58 +0000
39+++ src/main/java/com/akiban/server/service/restdml/ModelBuilder.java 2013-04-15 22:00:35 +0000
40@@ -47,6 +47,8 @@
41 import com.akiban.server.service.transaction.TransactionService;
42 import com.akiban.server.service.tree.TreeService;
43 import com.akiban.server.store.Store;
44+import com.akiban.server.types3.mcompat.mtypes.MString;
45+import com.akiban.server.types3.pvalue.PValue;
46 import com.akiban.sql.optimizer.rule.PlanGenerator;
47 import com.akiban.util.AkibanAppender;
48 import com.akiban.util.JsonUtils;
49@@ -57,6 +59,7 @@
50 import java.io.PrintWriter;
51 import java.util.Collections;
52 import java.util.Iterator;
53+import java.util.List;
54 import java.util.Map;
55
56 import static com.akiban.server.service.transaction.TransactionService.CloseableTransaction;
57@@ -104,6 +107,42 @@
58 }
59 }
60
61+ public void getAll(PrintWriter writer, TableName tableName) throws IOException {
62+ try (Session session = sessionService.createSession();
63+ CloseableTransaction txn = txnService.beginCloseableTransaction(session)) {
64+ createInternal(session, tableName);
65+ Cursor cursor = groupScanCursor(session, tableName);
66+ writer.append('[');
67+ scanCursor(writer, cursor, true);
68+ writer.append(']');
69+ }
70+ }
71+
72+ public void getKeys(PrintWriter writer, TableName tableName, String identifiers) throws IOException {
73+ try (Session session = sessionService.createSession();
74+ CloseableTransaction txn = txnService.beginCloseableTransaction(session)) {
75+ createInternal(session, tableName);
76+ AkibanInformationSchema ais = ddlFunctions.getAIS(session);
77+ UserTable table = ais.getUserTable(tableName);
78+ List<List<String>> keys = PrimaryKeyParser.parsePrimaryKeys(identifiers, table.getPrimaryKey().getIndex());
79+ Operator plan = PlanGenerator.generateBranchPlan(ais, table);
80+ QueryContext context = queryContext(session, ais);
81+ Cursor cursor = API.cursor(plan, context);
82+ boolean first = true;
83+ writer.append('[');
84+ for(List<String> pk : keys) {
85+ for(int i = 0; i < pk.size(); i++) {
86+ PValue pvalue = new PValue(MString.varchar());
87+ pvalue.putString(pk.get(i), null);
88+ context.setPValue(i, pvalue);
89+ }
90+ first = scanCursor(writer, cursor, first);
91+ }
92+ writer.append(']');
93+ txn.commit();
94+ }
95+ }
96+
97 public void insert(PrintWriter writer, TableName tableName, String data) {
98 try (Session session = sessionService.createSession();
99 CloseableTransaction txn = txnService.beginCloseableTransaction(session)) {
100@@ -260,12 +299,36 @@
101 }
102 }
103
104+ private QueryContext queryContext(Session session, AkibanInformationSchema ais) {
105+ PersistitAdapter adapter = new PersistitAdapter(SchemaCache.globalSchema(ais), store, treeService, session, configService);
106+ return new SimpleQueryContext(adapter);
107+ }
108+
109 private Cursor groupScanCursor(Session session, TableName tableName) {
110 UserTable table = ddlFunctions.getUserTable(session, tableName);
111 Operator plan = PlanGenerator.generateScanPlan(table.getAIS(), table);
112- PersistitAdapter adapter = new PersistitAdapter(SchemaCache.globalSchema(table.getAIS()), store, treeService, session, configService);
113- QueryContext queryContext = new SimpleQueryContext(adapter);
114- return API.cursor(plan, queryContext);
115+ return API.cursor(plan, queryContext(session, table.getAIS()));
116+ }
117+
118+ private boolean scanCursor(PrintWriter writer, Cursor cursor, boolean first) throws IOException {
119+ Row row;
120+ cursor.open();
121+ try {
122+ while((row = cursor.next()) != null) {
123+ if(!first) {
124+ writer.append(",\n");
125+ }
126+ first = false;
127+ long id = row.pvalue(0).getInt64();
128+ String json = row.pvalue(1).getString();
129+ ObjectNode node = (ObjectNode)JsonUtils.readTree(json);
130+ node.put(EntityParser.PK_COL_NAME, id);
131+ writer.write(node.toString());
132+ }
133+ } finally {
134+ cursor.close();
135+ }
136+ return first;
137 }
138
139
140
141=== modified file 'src/test/java/com/akiban/server/service/restdml/ModelBuilderIT.java'
142--- src/test/java/com/akiban/server/service/restdml/ModelBuilderIT.java 2013-03-26 17:58:15 +0000
143+++ src/test/java/com/akiban/server/service/restdml/ModelBuilderIT.java 2013-04-15 22:00:35 +0000
144@@ -24,12 +24,16 @@
145 import com.akiban.server.error.NoSuchTableException;
146 import com.akiban.server.service.servicemanager.GuicedServiceManager;
147 import com.akiban.server.test.it.ITBase;
148+import com.akiban.util.JsonUtils;
149 import com.akiban.util.Strings;
150+import org.codehaus.jackson.JsonNode;
151+import org.codehaus.jackson.node.ArrayNode;
152 import org.junit.Before;
153 import org.junit.Test;
154
155 import java.io.IOException;
156 import java.io.PrintWriter;
157+import java.io.StringWriter;
158 import java.io.Writer;
159 import java.util.Arrays;
160 import java.util.Map;
161@@ -247,6 +251,46 @@
162 expectFullRows(tid, createNewRow(tid, 1L, expected));
163 }
164
165+ @Test
166+ public void getAll() throws IOException {
167+ builder.insert(NULL_WRITER, TABLE_NAME, SIMPLE_JSON_1);
168+ builder.insert(NULL_WRITER, TABLE_NAME, SIMPLE_JSON_1);
169+
170+ StringWriter writer = new StringWriter();
171+ PrintWriter pw = new PrintWriter(writer);
172+ builder.getAll(pw, TABLE_NAME);
173+
174+ String output = writer.toString();
175+ JsonNode node = JsonUtils.readTree(output);
176+ assertTrue("Array node type", node.isArray());
177+ assertEquals("Array size", 2, node.size());
178+ for(int i = 0; i < node.size(); ++i) {
179+ JsonNode subNode = node.get(i);
180+ assertEquals("field count", 2, subNode.size());
181+ assertEquals("id value", i+1, subNode.get(EntityParser.PK_COL_NAME).asInt());
182+ assertEquals("name value", "foo", subNode.get("name").asText());
183+ }
184+ }
185+
186+ @Test
187+ public void getKeys() throws IOException {
188+ builder.insert(NULL_WRITER, TABLE_NAME, SIMPLE_JSON_1);
189+ builder.insert(NULL_WRITER, TABLE_NAME, SIMPLE_JSON_1);
190+
191+ StringWriter writer = new StringWriter();
192+ PrintWriter pw = new PrintWriter(writer);
193+ builder.getKeys(pw, TABLE_NAME, "2");
194+
195+ String output = writer.toString();
196+ JsonNode node = JsonUtils.readTree(output);
197+ assertTrue("Array node type", node.isArray());
198+ assertEquals("Array size", 1, node.size());
199+ JsonNode subNode = node.get(0);
200+ assertEquals("field count", 2, subNode.size());
201+ assertEquals("id value", 2, subNode.get(EntityParser.PK_COL_NAME).asInt());
202+ assertEquals("name value", "foo", subNode.get("name").asText());
203+ }
204+
205 @Test(expected=ModelBuilderException.class)
206 public void implodeBuilderTable() {
207 builder.create(TABLE_NAME);
208
209=== modified file 'src/test/resources/com/akiban/rest/caoi/builder-implode.check_expected'
210--- src/test/resources/com/akiban/rest/caoi/builder-implode.check_expected 2013-03-26 20:32:58 +0000
211+++ src/test/resources/com/akiban/rest/caoi/builder-implode.check_expected 2013-04-15 22:00:35 +0000
212@@ -1,10 +1,68 @@
213 [
214 {
215- "_id": 1,
216- "_data": "{\"cid\":1,\"first_name\":\"John\",\"last_name\":\"Smith\",\"addresses\":[{\"aid\":101,\"cid\":1,\"state\":\"MA\",\"city\":\"Boston\"}],\"orders\":[{\"oid\":101,\"cid\":1,\"odate\":\"2011-03-01 00:00:00\",\"items\":[{\"iid\":1011,\"oid\":101,\"sku\":1234},{\"iid\":1012,\"oid\":101,\"sku\":4567}]},{\"oid\":102,\"cid\":1,\"odate\":\"2011-03-02 00:00:00\"}]}"
217+ "cid": 1,
218+ "first_name": "John",
219+ "last_name": "Smith",
220+ "addresses": [
221+ {
222+ "aid": 101,
223+ "cid": 1,
224+ "state": "MA",
225+ "city": "Boston"
226+ }
227+ ],
228+ "orders": [
229+ {
230+ "oid": 101,
231+ "cid": 1,
232+ "odate": "2011-03-01 00:00:00",
233+ "items": [
234+ {
235+ "iid": 1011,
236+ "oid": 101,
237+ "sku": 1234
238+ },
239+ {
240+ "iid": 1012,
241+ "oid": 101,
242+ "sku": 4567
243+ }
244+ ]
245+ },
246+ {
247+ "oid": 102,
248+ "cid": 1,
249+ "odate": "2011-03-02 00:00:00"
250+ }
251+ ],
252+ "_id": 1
253 },
254 {
255- "_id": 2,
256- "_data": "{\"cid\":2,\"first_name\":\"Willy\",\"last_name\":\"Jones\",\"addresses\":[{\"aid\":201,\"cid\":2,\"state\":\"NY\",\"city\":\"New York\"}],\"orders\":[{\"oid\":201,\"cid\":2,\"odate\":\"2011-03-03 00:00:00\",\"items\":[{\"iid\":2011,\"oid\":201,\"sku\":9876}]}]}"
257+ "cid": 2,
258+ "first_name": "Willy",
259+ "last_name": "Jones",
260+ "addresses": [
261+ {
262+ "aid": 201,
263+ "cid": 2,
264+ "state": "NY",
265+ "city": "New York"
266+ }
267+ ],
268+ "orders": [
269+ {
270+ "oid": 201,
271+ "cid": 2,
272+ "odate": "2011-03-03 00:00:00",
273+ "items": [
274+ {
275+ "iid": 2011,
276+ "oid": 201,
277+ "sku": 9876
278+ }
279+ ]
280+ }
281+ ],
282+ "_id": 2
283 }
284 ]
285\ No newline at end of file
286
287=== added file 'src/test/resources/com/akiban/rest/caoi/builder-insert.check'
288--- src/test/resources/com/akiban/rest/caoi/builder-insert.check 1970-01-01 00:00:00 +0000
289+++ src/test/resources/com/akiban/rest/caoi/builder-insert.check 2013-04-15 22:00:35 +0000
290@@ -0,0 +1,1 @@
291+/builder/entity/test.foo/1
292\ No newline at end of file
293
294=== added file 'src/test/resources/com/akiban/rest/caoi/builder-insert.check_expected'
295--- src/test/resources/com/akiban/rest/caoi/builder-insert.check_expected 1970-01-01 00:00:00 +0000
296+++ src/test/resources/com/akiban/rest/caoi/builder-insert.check_expected 2013-04-15 22:00:35 +0000
297@@ -0,0 +1,7 @@
298+[
299+ {
300+ "_id": 1,
301+ "name": "joe",
302+ "age": 30
303+ }
304+]
305\ No newline at end of file

Subscribers

People subscribed via source and target branches