Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions engine/src/main/java/com/arcadedb/database/RID.java
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,11 @@ public PageId getPageId() {
(int) (getPosition() / ((LocalBucket) db.getSchema().getBucketById(bucketId)).getMaxRecordsInPage()));
}

public PageId getPageId(final BasicDatabase db) {
return new PageId(db, bucketId,
(int) (getPosition() / ((LocalBucket) db.getSchema().getBucketById(bucketId)).getMaxRecordsInPage()));
}

private BasicDatabase requireDatabase() {
final BasicDatabase db = DatabaseContext.INSTANCE.getActiveDatabase();
if (db == null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public Iterator<Edge> edgeIterator(final String... edgeTypes) {

public Iterator<Vertex> vertexIterator(final String... edgeTypes) {
if (edgeTypes == null || edgeTypes.length == 0)
return new VertexIterator(lastSegment);
return new VertexIterator((DatabaseInternal) vertex.getDatabase(), lastSegment);
return new VertexIteratorFilter((DatabaseInternal) vertex.getDatabase(), lastSegment, edgeTypes);
}

Expand Down
4 changes: 2 additions & 2 deletions engine/src/main/java/com/arcadedb/graph/ImmutableVertex.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,13 +71,13 @@ public MutableVertex modify() {
if (recordInCache != null) {
if (recordInCache instanceof MutableVertex fromCache)
return fromCache;
} else if (!database.getTransaction().hasPageForRecord(rid.getPageId())) {
} else if (!database.getTransaction().hasPageForRecord(rid.getPageId(database))) {
// THE RECORD IS NOT IN TX, SO IT MUST HAVE BEEN LOADED WITHOUT A TX OR PASSED FROM ANOTHER TX
// IT MUST BE RELOADED TO GET THE LATEST CHANGES. FORCE RELOAD
try {
// RELOAD THE PAGE FIRST TO AVOID LOOP WITH TRIGGERS (ENCRYPTION)
database.getTransaction()
.getPageToModify(rid.getPageId(), ((LocalBucket) database.getSchema().getBucketById(rid.getBucketId())).getPageSize(),
.getPageToModify(rid.getPageId(database), ((LocalBucket) database.getSchema().getBucketById(rid.getBucketId())).getPageSize(),
false);
reload();
} catch (final IOException e) {
Expand Down
7 changes: 4 additions & 3 deletions engine/src/main/java/com/arcadedb/graph/VertexIterator.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,16 @@
*/
package com.arcadedb.graph;

import com.arcadedb.database.DatabaseInternal;
import com.arcadedb.database.RID;
import com.arcadedb.exception.RecordNotFoundException;

import java.util.*;

public class VertexIterator extends ResettableIteratorBase<Vertex> {

public VertexIterator(final EdgeSegment current) {
super(null, current);
public VertexIterator(final DatabaseInternal database, final EdgeSegment current) {
super(database, current);
}

@Override
Expand Down Expand Up @@ -61,7 +62,7 @@ public Vertex next() {

try {
// LAZY LOAD THE CONTENT TO IMPROVE PERFORMANCE WITH TRAVERSAL. NOTE: THE RECORD NOT FOUND WILL NEVER BE TRIGGERED HERE ANYMORE
return rid.asVertex(false);
return (Vertex) database.lookupByRID(rid, false);
} catch (final RecordNotFoundException e) {
// SKIP
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public Vertex next() {
throw new NoSuchElementException();

try {
return next.asVertex(false);
return (Vertex) database.lookupByRID(next, false);
} catch (final SchemaException e) {
LogManager.instance().log(this, Level.WARNING, "Error on loading vertex %s from edge %s", e, next, nextEdge);
throw e;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -701,8 +701,9 @@ public IndexCursor searchMoreLikeThis(final Set<RID> sourceRids, final MoreLikeT
final List<String> propertyNames = getPropertyNames();

if (propertyNames != null && !propertyNames.isEmpty()) {
final DatabaseInternal db = underlyingIndex.getComponent().getDatabase();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

While the current implementation is correct, you can simplify the retrieval of the database instance by using the getComponent() method already available in this class, which delegates to the underlying index.

Suggested change
final DatabaseInternal db = underlyingIndex.getComponent().getDatabase();
final DatabaseInternal db = getComponent().getDatabase();

for (final RID sourceRid : sourceRids) {
final Identifiable identifiable = sourceRid.getRecord();
final Identifiable identifiable = db.lookupByRID(sourceRid, true);
if (identifiable == null)
continue;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.apache.commons.configuration2.Configuration;
import org.apache.tinkerpop.gremlin.AbstractGraphProvider;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
import org.apache.tinkerpop.gremlin.process.traversal.step.ComparabilitySemanticsTest;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountTest;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileTest;
import org.apache.tinkerpop.gremlin.structure.Graph;
Expand Down Expand Up @@ -52,6 +53,9 @@ public class ArcadeGraphProvider extends AbstractGraphProvider {
IGNORED_TESTS.put(ProfileTest.Traversals.class, Arrays.asList("testProfileStrategyCallback", "testProfileStrategyCallbackSideEffect"));
IGNORED_TESTS.put(IoGraphTest.class, Arrays.asList("shouldReadWriteClassicToFileWithHelpers[graphml]", "shouldReadWriteModernToFileWithHelpers[graphml]"));
IGNORED_TESTS.put(CountTest.Traversals.class, Arrays.asList("g_VX1X_valuesXageX_countXlocalX"));
// TinkerPop 3.8.0 comparability semantics: COMPARABILITY.compare() throws IllegalStateException for mixed types
// instead of returning false, causing checkHasNext(false,...) to propagate the exception as a failure
IGNORED_TESTS.put(ComparabilitySemanticsTest.class, Arrays.asList("testCompareNaN", "testAnd", "testNot", "testOr", "testXor"));
}

private static final Set<Class> IMPLEMENTATIONS = new HashSet<>() {{
Expand Down
Binary file not shown.
27 changes: 27 additions & 0 deletions network/src/main/java/com/arcadedb/remote/RemoteMutableEdge.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,12 @@
import com.arcadedb.database.Binary;
import com.arcadedb.database.Database;
import com.arcadedb.database.Document;
import com.arcadedb.database.RID;
import com.arcadedb.serializer.JsonSerializer;
import com.arcadedb.exception.RecordNotFoundException;
import com.arcadedb.graph.Edge;
import com.arcadedb.graph.MutableEdge;
import com.arcadedb.graph.Vertex;
import com.arcadedb.query.sql.executor.ResultSet;
import com.arcadedb.schema.DocumentType;
import com.arcadedb.schema.EdgeType;
Expand Down Expand Up @@ -147,6 +149,31 @@ protected Object convertValueToSchemaType(final String name, final Object value,
return value;
}

@Override
public Vertex getOutVertex() {
return loadVertex(out);
}

@Override
public Vertex getInVertex() {
return loadVertex(in);
}

@Override
public Vertex getVertex(final Vertex.DIRECTION direction) {
if (direction == Vertex.DIRECTION.OUT)
return getOutVertex();
else
return getInVertex();
}

private Vertex loadVertex(final RID rid) {
final ResultSet result = remoteDatabase.query("sql", "select from " + rid);
if (result.hasNext())
return result.next().getVertex().get();
return null;
}

@Override
public Edge asEdge() {
return this;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@
*/
package com.arcadedb.remote;

import com.arcadedb.database.RID;
import com.arcadedb.graph.Edge;
import com.arcadedb.graph.Vertex;
import com.arcadedb.query.sql.executor.Result;
import com.arcadedb.query.sql.executor.ResultSet;
import com.arcadedb.schema.Property;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -140,4 +142,60 @@ void toMapWithMetadataIncludesRid() {
if (edge.getIdentity() != null)
assertThat(map).containsKey("@rid");
}

@Test
void getOutVertexLoadsFromRemote() {
final Vertex mockVertex = mock(Vertex.class);
final Result mockResult = mock(Result.class);
final ResultSet mockResultSet = mock(ResultSet.class);

when(mockDatabase.query(ArgumentMatchers.eq("sql"), ArgumentMatchers.contains("#1:0"))).thenReturn(mockResultSet);
when(mockResultSet.hasNext()).thenReturn(true);
when(mockResultSet.next()).thenReturn(mockResult);
when(mockResult.getVertex()).thenReturn(Optional.of(mockVertex));

assertThat(edge.getOutVertex()).isSameAs(mockVertex);
}

@Test
void getInVertexLoadsFromRemote() {
final Vertex mockVertex = mock(Vertex.class);
final Result mockResult = mock(Result.class);
final ResultSet mockResultSet = mock(ResultSet.class);

when(mockDatabase.query(ArgumentMatchers.eq("sql"), ArgumentMatchers.contains("#2:0"))).thenReturn(mockResultSet);
when(mockResultSet.hasNext()).thenReturn(true);
when(mockResultSet.next()).thenReturn(mockResult);
when(mockResult.getVertex()).thenReturn(Optional.of(mockVertex));

assertThat(edge.getInVertex()).isSameAs(mockVertex);
}

@Test
void getVertexOutDirectionLoadsFromRemote() {
final Vertex mockVertex = mock(Vertex.class);
final Result mockResult = mock(Result.class);
final ResultSet mockResultSet = mock(ResultSet.class);

when(mockDatabase.query(ArgumentMatchers.eq("sql"), ArgumentMatchers.contains("#1:0"))).thenReturn(mockResultSet);
when(mockResultSet.hasNext()).thenReturn(true);
when(mockResultSet.next()).thenReturn(mockResult);
when(mockResult.getVertex()).thenReturn(Optional.of(mockVertex));

assertThat(edge.getVertex(Vertex.DIRECTION.OUT)).isSameAs(mockVertex);
}

@Test
void getVertexInDirectionLoadsFromRemote() {
final Vertex mockVertex = mock(Vertex.class);
final Result mockResult = mock(Result.class);
final ResultSet mockResultSet = mock(ResultSet.class);

when(mockDatabase.query(ArgumentMatchers.eq("sql"), ArgumentMatchers.contains("#2:0"))).thenReturn(mockResultSet);
when(mockResultSet.hasNext()).thenReturn(true);
when(mockResultSet.next()).thenReturn(mockResult);
when(mockResult.getVertex()).thenReturn(Optional.of(mockVertex));

assertThat(edge.getVertex(Vertex.DIRECTION.IN)).isSameAs(mockVertex);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ void explicitLock() {

assertThat(database.countType("Node", true)).isEqualTo(1);

assertThat(rid[0].asVertex().getInteger("id")).isEqualTo(CONCURRENT_THREADS * TOT);
assertThat(database.lookupByRID(rid[0]).asVertex().getInteger("id")).isEqualTo(CONCURRENT_THREADS * TOT);
assertThat(committed.get()).isEqualTo(CONCURRENT_THREADS * TOT);
assertThat(caughtExceptions.get()).isEqualTo(0);
assertThat(committed.get() + caughtExceptions.get()).isEqualTo(TOT * CONCURRENT_THREADS);
Expand Down
Loading