use of org.apache.ignite.lang.IgniteBiTuple in project ignite by apache.
the class IgfsProcessorSelfTest method testRename.
/**
* @throws Exception If failed.
*/
public void testRename() throws Exception {
// Create directories.
igfs.mkdirs(path("/A/B1/C1"));
for (Object key : metaCache.keySet()) info("Entry in cache [key=" + key + ", val=" + metaCache.get(key) + ']');
// Move under itself.
GridTestUtils.assertThrowsInherited(log, new Callable<Object>() {
@Override
public Object call() throws Exception {
igfs.rename(path("/A/B1/C1"), path("/A/B1/C1/C2"));
return null;
}
}, IgfsException.class, null);
// Move under itself.
GridTestUtils.assertThrowsInherited(log, new Callable<Object>() {
@Override
public Object call() throws Exception {
igfs.rename(path("/A/B1/C1"), path("/A/B1/C1/D/C2"));
return null;
}
}, IgfsException.class, null);
// Move under itself.
GridTestUtils.assertThrowsInherited(log, new Callable<Object>() {
@Override
public Object call() throws Exception {
igfs.rename(path("/A/B1/C1"), path("/A/B1/C1/D/E/C2"));
return null;
}
}, IgfsException.class, null);
// /
// F6 > Enter > Tab x N times
// "I like to move it, move it..."
//
Collection<IgniteBiTuple<String, String>> chain = Arrays.asList(F.t("/A/B1/C1", "/A/B1/C2"), F.t("/A/B1", "/A/B2"), F.t("/A", "/Q"), // F.t("/Q/B2/C2", "/C3"),
F.t("/Q/B2/C2", "/Q/B2/C1"), F.t("/Q/B2", "/Q/B1"), F.t("/Q", "/A"), // F.t("/C3", "/A/B1/C1")
F.t("/A/B1/C1", "/"), F.t("/C1", "/A/B1"));
final IgfsPath root = path("/");
for (IgniteBiTuple<String, String> e : chain) {
final IgfsPath p1 = path(e.get1());
final IgfsPath p2 = path(e.get2());
assertTrue("Entry: " + e, igfs.exists(p1));
igfs.rename(p1, p2);
assertFalse("Entry: " + e, igfs.exists(p1));
assertTrue("Entry: " + e, igfs.exists(p2));
// Test root rename.
GridTestUtils.assertThrowsInherited(log, new Callable<Object>() {
@Override
public Object call() throws Exception {
igfs.rename(root, p1);
return null;
}
}, IgfsException.class, null);
// Test root rename.
GridTestUtils.assertThrowsInherited(log, new Callable<Object>() {
@Override
public Object call() throws Exception {
igfs.rename(p1, root);
return null;
}
}, IgfsException.class, null);
// Test root rename.
if (!root.equals(p2)) {
GridTestUtils.assertThrowsInherited(log, new Callable<Object>() {
@Override
public Object call() throws Exception {
igfs.rename(root, p2);
return null;
}
}, IgfsException.class, null);
}
// Test same rename.
igfs.rename(p1, p1);
igfs.rename(p2, p2);
}
// List items.
assertEquals(Arrays.asList(path("/A")), sorted(igfs.listPaths(root)));
assertEquals(Arrays.asList(path("/A/B1")), sorted(igfs.listPaths(path("/A"))));
assertEquals(Arrays.asList(path("/A/B1/C1")), sorted(igfs.listPaths(path("/A/B1"))));
String text = "Test long number: " + rnd.nextLong();
// Create file.
assertEquals(text, create("/A/a", false, text));
try (IgfsInputStream in0 = igfs.open(path("/A/a"))) {
// Rename file.
igfs.rename(path("/A/a"), path("/b"));
assertEquals(text, IOUtils.toString(in0, UTF_8));
}
// Validate after renamed.
assertOpenFails("/A/a", "File not found");
assertEquals(text, read("/b"));
// Cleanup.
igfs.clear();
assertTrue(F.isEmpty(igfs.listPaths(root)));
}
use of org.apache.ignite.lang.IgniteBiTuple in project ignite by apache.
the class DmlStatementsProcessor method streamUpdateQuery.
/**
* Perform given statement against given data streamer. Only rows based INSERT is supported.
*
* @param schemaName Schema name.
* @param streamer Streamer to feed data to.
* @param stmt Statement.
* @param args Statement arguments.
* @return Number of rows in given INSERT statement.
* @throws IgniteCheckedException if failed.
*/
@SuppressWarnings({ "unchecked", "ConstantConditions" })
long streamUpdateQuery(String schemaName, IgniteDataStreamer streamer, PreparedStatement stmt, final Object[] args) throws IgniteCheckedException {
idx.checkStatementStreamable(stmt);
Prepared p = GridSqlQueryParser.prepared(stmt);
assert p != null;
final UpdatePlan plan = getPlanForStatement(schemaName, null, p, null, true, null);
assert plan.isLocalSubquery();
final GridCacheContext cctx = plan.cacheContext();
QueryCursorImpl<List<?>> cur;
final ArrayList<List<?>> data = new ArrayList<>(plan.rowCount());
QueryCursorImpl<List<?>> stepCur = new QueryCursorImpl<>(new Iterable<List<?>>() {
@Override
public Iterator<List<?>> iterator() {
try {
Iterator<List<?>> it;
if (!F.isEmpty(plan.selectQuery())) {
GridQueryFieldsResult res = idx.queryLocalSqlFields(idx.schema(cctx.name()), plan.selectQuery(), F.asList(U.firstNotNull(args, X.EMPTY_OBJECT_ARRAY)), null, false, 0, null);
it = res.iterator();
} else
it = plan.createRows(U.firstNotNull(args, X.EMPTY_OBJECT_ARRAY)).iterator();
return new GridQueryCacheObjectsIterator(it, idx.objectContext(), cctx.keepBinary());
} catch (IgniteCheckedException e) {
throw new IgniteException(e);
}
}
}, null);
data.addAll(stepCur.getAll());
cur = new QueryCursorImpl<>(new Iterable<List<?>>() {
@Override
public Iterator<List<?>> iterator() {
return data.iterator();
}
}, null);
if (plan.rowCount() == 1) {
IgniteBiTuple t = plan.processRow(cur.iterator().next());
streamer.addData(t.getKey(), t.getValue());
return 1;
}
Map<Object, Object> rows = new LinkedHashMap<>(plan.rowCount());
for (List<?> row : cur) {
final IgniteBiTuple t = plan.processRow(row);
rows.put(t.getKey(), t.getValue());
}
streamer.addData(rows);
return rows.size();
}
use of org.apache.ignite.lang.IgniteBiTuple in project ignite by apache.
the class DmlStatementsProcessor method doInsertBatched.
/**
* Execute INSERT statement plan.
*
* @param plan Plan to execute.
* @param cursor Cursor to take inserted data from. I.e. list of batch arguments for each query.
* @param pageSize Batch size for streaming, anything <= 0 for single page operations.
* @return Number of items affected.
* @throws IgniteCheckedException if failed, particularly in case of duplicate keys.
*/
private List<UpdateResult> doInsertBatched(UpdatePlan plan, List<List<List<?>>> cursor, int pageSize) throws IgniteCheckedException {
GridCacheContext cctx = plan.cacheContext();
DmlBatchSender snd = new DmlBatchSender(cctx, pageSize, cursor.size());
int rowNum = 0;
SQLException resEx = null;
for (List<List<?>> qryRow : cursor) {
for (List<?> row : qryRow) {
try {
final IgniteBiTuple keyValPair = plan.processRow(row);
snd.add(keyValPair.getKey(), new InsertEntryProcessor(keyValPair.getValue()), rowNum);
} catch (Exception e) {
String sqlState;
int code;
if (e instanceof IgniteSQLException) {
sqlState = ((IgniteSQLException) e).sqlState();
code = ((IgniteSQLException) e).statusCode();
} else {
sqlState = SqlStateCode.INTERNAL_ERROR;
code = IgniteQueryErrorCode.UNKNOWN;
}
resEx = chainException(resEx, new SQLException(e.getMessage(), sqlState, code, e));
snd.setFailed(rowNum);
}
}
rowNum++;
}
try {
snd.flush();
} catch (Exception e) {
resEx = chainException(resEx, new SQLException(e.getMessage(), SqlStateCode.INTERNAL_ERROR, IgniteQueryErrorCode.UNKNOWN, e));
}
resEx = chainException(resEx, snd.error());
if (!F.isEmpty(snd.failedKeys())) {
SQLException e = new SQLException("Failed to INSERT some keys because they are already in cache [keys=" + snd.failedKeys() + ']', SqlStateCode.CONSTRAINT_VIOLATION, DUPLICATE_KEY);
resEx = chainException(resEx, e);
}
if (resEx != null) {
BatchUpdateException e = new BatchUpdateException(resEx.getMessage(), resEx.getSQLState(), resEx.getErrorCode(), snd.perRowCounterAsArray(), resEx);
throw new IgniteCheckedException(e);
}
int[] cntPerRow = snd.perRowCounterAsArray();
List<UpdateResult> res = new ArrayList<>(cntPerRow.length);
for (int i = 0; i < cntPerRow.length; i++) {
int cnt = cntPerRow[i];
res.add(new UpdateResult(cnt, X.EMPTY_OBJECT_ARRAY));
}
return res;
}
Aggregations