public boolean isElement() { return inner.isElement(); }
public void setProperty(String name, Object value) { if (value instanceof Optional) { value = ((Optional) value).orElse(null); } if (value instanceof OResult && ((OResult) value).isElement()) { content.put(name, ((OResult) value).getElement().get()); } else { content.put(name, value); } }
@Override public OResult next() { if (localFetched >= nRecords) { throw new IllegalStateException(); } if (results.isEmpty()) { fetchNextBlock(ctx, nRecords); if (results.isEmpty()) { throw new IllegalStateException(); } } localFetched++; OResult result = results.remove(0); if (result.isElement()) { traversed.add(result.getElement().get().getIdentity()); } return result; }
@Override public boolean tryAdvance(Consumer<? super OElement> action) { while (hasNext()) { OResult elem = next(); if (elem.isElement()) { action.accept(elem.getElement().get()); return true; } } return false; }
@Override public OResult next() { OResult result = upstream.next(); long begin = profilingEnabled ? System.nanoTime() : 0; try { if (result.isElement()) { result.getElement().get().delete(); } return result; } finally { if (profilingEnabled) { cost += (System.nanoTime() - begin); } } }
default String toJSON() { if (isElement()) { return getElement().get().toJSON(); } StringBuilder result = new StringBuilder(); result.append("{"); boolean first = true; for (String prop : getPropertyNames()) { if (!first) { result.append(", "); } result.append(toJson(prop)); result.append(": "); result.append(toJson(getProperty(prop))); first = false; } result.append("}"); return result.toString(); }
/** * this is for subqueries, when a OResult is found <ul> <li>if it's a projection with a single column, the value is returned</li> * <li>if it's a document, the RID is returned</li> </ul> * * @param value * * @return */ private Object unboxOResult(Object value) { if (value instanceof List) { return ((List) value).stream().map(x -> unboxOResult(x)).collect(Collectors.toList()); } if (value instanceof OResult) { if (((OResult) value).isElement()) { return ((OResult) value).getIdentity().orElse(null); } Set<String> props = ((OResult) value).getPropertyNames(); if (props.size() == 1) { return ((OResult) value).getProperty(props.iterator().next()); } } return value; }
private void tryAddEntryPoint(OResult res, OCommandContext ctx) { if (whileClause == null || whileClause.matchesFilters(res, ctx)) { this.entryPoints.add(0, res); } if (res.isElement()) { traversed.add(res.getElement().get().getIdentity()); } else if (res.getProperty("@rid") != null && res.getProperty("@rid") instanceof OIdentifiable) { traversed.add(((OIdentifiable) res.getProperty("@rid")).getIdentity()); } }
private void markAsVisited(OResult nextValue) { if (nextValue.isElement()) { ORID identity = nextValue.getElement().get().getIdentity(); int cluster = identity.getClusterId(); long pos = identity.getClusterPosition(); if (cluster >= 0 && pos >= 0) { pastRids.add(identity); return; } } pastItems.add(nextValue); }
private boolean alreadyVisited(OResult nextValue) { if (nextValue.isElement()) { ORID identity = nextValue.getElement().get().getIdentity(); int cluster = identity.getClusterId(); long pos = identity.getClusterPosition(); if (cluster >= 0 && pos >= 0) { return pastRids.contains(identity); } } return pastItems.contains(nextValue); }
private void fetchRidsToFind(OCommandContext ctx, int nRecords) { ridsToFind = new HashSet<>(); OExecutionStepInternal prevStep = getPrev().get(); OResultSet nextSlot = prevStep.syncPull(ctx, nRecords); while (nextSlot.hasNext()) { while (nextSlot.hasNext()) { OResult nextRes = nextSlot.next(); if (nextRes.isElement()) { ridsToFind.add(nextRes.getElement().get().getIdentity()); } } nextSlot = prevStep.syncPull(ctx, nRecords); } }
@Override public OResult next() { OResult result = upstream.next(); if (!(result instanceof OResultInternal)) { if (!result.isElement()) { throw new OCommandExecutionException("Error executing INSERT, cannot modify element: " + result); } result = new OUpdatableResult((ODocument) result.getElement().get()); } List<OExpression> currentValues = values.get(nextValueSet++); if (currentValues.size() != identifiers.size()) { throw new OCommandExecutionException( "Cannot execute INSERT, the number of fields is different from the number of expressions: " + identifiers + " " + currentValues); } nextValueSet %= values.size(); for (int i = 0; i < currentValues.size(); i++) { OIdentifier identifier = identifiers.get(i); Object value = currentValues.get(i).execute(result, ctx); value = OUpdateItem.convertToPropertyType((OResultInternal) result, identifier, value, ctx); ((OResultInternal) result).setProperty(identifier.getStringValue(), value); } return result; }
@Override public OResult next() { OResult result = upstream.next(); long begin = profilingEnabled ? System.nanoTime() : 0; try { if (!result.isElement()) { throw new OCommandExecutionException("record " + result + " is not an instance of " + clazz); } OElement doc = result.getElement().get(); if (doc == null) { throw new OCommandExecutionException("record " + result + " is not an instance of " + clazz); } Optional<OClass> schema = doc.getSchemaType(); if (!schema.isPresent() || !schema.get().isSubClassOf(clazz)) { throw new OCommandExecutionException("record " + result + " is not an instance of " + clazz); } return result; } finally { if (profilingEnabled) { cost += (System.nanoTime() - begin); } } }
private OResult toTraverseResult(OResult item) { OTraverseResult res = null; if (item instanceof OTraverseResult) { res = (OTraverseResult) item; } else if (item.isElement() && item.getElement().get().getIdentity().isPersistent()) { res = new OTraverseResult(); res.setElement(item.getElement().get()); res.depth = 0; res.setMetadata("$depth", 0); } else { return null; } return res; }
@Override public OResult next() { OResult result = upstream.next(); if (result.isElement()) { if (cluster == null) { ctx.getDatabase().save(result.getElement().orElse(null)); } else { ctx.getDatabase().save(result.getElement().orElse(null), cluster.getStringValue()); } } return result; }
@Override protected void fetchNextEntryPoints(OCommandContext ctx, int nRecords) { OResultSet nextN = getPrev().get().syncPull(ctx, nRecords); while (nextN.hasNext()) { while (nextN.hasNext()) { OResult item = toTraverseResult(nextN.next()); if(item != null){ List<ORID> stack = new ArrayList<>(); item.getIdentity().ifPresent(x -> stack.add(x)); ((OResultInternal) item).setMetadata("$stack", stack); List<OIdentifiable> path = new ArrayList<>(); path.add(item.getIdentity().get()); ((OResultInternal) item).setMetadata("$path", path); if (item != null && item.isElement() && !traversed.contains(item.getElement().get().getIdentity())) { tryAddEntryPoint(item, ctx); } } } nextN = getPrev().get().syncPull(ctx, nRecords); } }
@Override public OResult next() { OResult result = upstream.next(); if (result.isElement()) { OIdentifiable element = result.getElement().get().getRecord(); if (element instanceof ODocument) { ODocument doc = (ODocument) element; doc.setClassName(targetClass); if (!(result instanceof OResultInternal)) { result = new OUpdatableResult(doc); } else { ((OResultInternal) result).setElement(doc); } } } return result; }
@Override protected void fetchNextEntryPoints(OCommandContext ctx, int nRecords) { OResultSet nextN = getPrev().get().syncPull(ctx, nRecords); while (nextN.hasNext()) { OResult item = toTraverseResult(nextN.next()); if (item == null) { continue; } ((OResultInternal) item).setMetadata("$depth", 0); List stack = new ArrayList(); item.getIdentity().ifPresent(x -> stack.add(x)); ((OResultInternal) item).setMetadata("$stack", stack); List<OIdentifiable> path = new ArrayList<>(); if (item.getIdentity().isPresent()) { path.add(item.getIdentity().get()); } else if (item.getProperty("@rid") != null) { path.add(item.getProperty("@rid")); } ((OResultInternal) item).setMetadata("$path", path); if (item != null && item.isElement() && !traversed.contains(item.getElement().get().getIdentity())) { tryAddEntryPoint(item, ctx); traversed.add(item.getElement().get().getIdentity()); } else if (item.getProperty("@rid") != null && item.getProperty("@rid") instanceof OIdentifiable) { tryAddEntryPoint(item, ctx); traversed.add(((OIdentifiable) item.getProperty("@rid")).getIdentity()); } } }
private OResult toTraverseResult(OResult item) { OTraverseResult res = null; if (item instanceof OTraverseResult) { res = (OTraverseResult) item; } else if (item.isElement() && item.getElement().get().getIdentity().isPersistent()) { res = new OTraverseResult(); res.setElement(item.getElement().get()); res.depth = 0; } else if (item.getPropertyNames().size() == 1) { Object val = item.getProperty(item.getPropertyNames().iterator().next()); if (val instanceof OIdentifiable) { res = new OTraverseResult(); res.setElement((OIdentifiable) val); res.depth = 0; res.setMetadata("$depth", 0); } } else { res = new OTraverseResult(); for (String key : item.getPropertyNames()) { res.setProperty(key, item.getProperty(key)); } for (String md : item.getMetadataKeys()) { res.setMetadata(md, item.getMetadata(md)); } } return res; }
@Override public OResult next() { OResult toCopy = upstream.next(); long begin = profilingEnabled ? System.nanoTime() : 0; try { ORecord resultDoc = null; if (toCopy.isElement()) { ORecord docToCopy = toCopy.getElement().get().getRecord(); if (docToCopy instanceof ODocument) { resultDoc = ((ODocument) docToCopy).copy(); resultDoc.getIdentity().reset(); ((ODocument) resultDoc).setClassName(null); resultDoc.setDirty(); } else if (docToCopy instanceof OBlob) { ORecordBytes newBlob = ((ORecordBytes) docToCopy).copy(); OResultInternal result = new OResultInternal(); result.setElement(newBlob); return result; } } else { resultDoc = toCopy.toElement().getRecord(); } return new OUpdatableResult((ODocument) resultDoc); } finally { if (profilingEnabled) { cost += (System.nanoTime() - begin); } } }