/*
* ModeShape (http://www.modeshape.org)
*
* Licensed 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.modeshape.jcr.query;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNull.nullValue;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.util.HashSet;
import java.util.Set;
import org.junit.Test;
import org.modeshape.jcr.JcrLexicon;
import org.modeshape.jcr.cache.CachedNode;
import org.modeshape.jcr.cache.NodeKey;
import org.modeshape.jcr.query.NodeSequence.Batch;
import org.modeshape.jcr.query.NodeSequence.RowFilter;
import org.modeshape.jcr.value.Path;
/**
* @author Randall Hauch (rhauch@redhat.com)
*/
public class NodeSequenceTest extends AbstractNodeSequenceTest {
@Test
public void shouldCreateEmptySequenceOfVariousWidths() {
for (int i = 0; i != 10; ++i) {
NodeSequence seq = NodeSequence.emptySequence(i);
assertThat("Incorrect width for empty sequence", seq.width(), is(i));
assertThat(seq.nextBatch(), is(nullValue()));
seq.close();
}
}
@Test
public void shouldCreateSequenceFromNodeKeysIterator() {
// print(true);
NodeSequence seq = allNodes();
// The sequence should not have any duplicates, since the iterator doesn't ...
Set<NodeKey> keys = new HashSet<NodeKey>();
try {
// Iterate over the batches ...
Batch batch = null;
while ((batch = seq.nextBatch()) != null) {
while (batch.hasNext()) {
batch.nextRow();
CachedNode node = batch.getNode();
NodeKey key = node != null ? node.getKey() : null;
boolean added = keys.add(key);
print("Adding " + key);
assertTrue("Failed to add " + key, added);
}
}
} finally {
seq.close();
}
}
@Test
public void shouldCreateLimitedSequenceSmallerThanDelegate() {
assertThat(countRows(NodeSequence.limit(allNodes(), 2)), is(2L));
}
@Test
public void shouldCreateLimitedSequenceSameSizeAsDelegateDelegate() {
long countAll = countRows(allNodes());
assertThat(countRows(NodeSequence.limit(allNodes(), countAll)), is(countAll));
}
@Test
public void shouldCreateLimitedSequenceSameSizeAsDelegateDelegateWhenLimitIsLarger() {
long countAll = countRows(allNodes());
assertThat(countRows(NodeSequence.limit(allNodes(), countAll + 1)), is(countAll));
}
@Test
public void shouldCreateAppendingSequenceFromTwoOtherSequences() {
// print(true);
NodeSequence seq = NodeSequence.append(allNodes(), allNodes());
// The sequence should not have two duplicates of every node ...
Set<NodeKey> keys = new HashSet<NodeKey>();
try {
// Iterate over the batches ...
Batch batch = null;
boolean shouldAdd = true;
while ((batch = seq.nextBatch()) != null) {
while (batch.hasNext()) {
batch.nextRow();
CachedNode node = batch.getNode();
NodeKey key = node != null ? node.getKey() : null;
if (keys.contains(key) && shouldAdd) shouldAdd = false;
if (shouldAdd) {
boolean added = keys.add(key);
print("Adding " + key);
assertTrue("Failed to add " + key, added);
} else {
boolean removed = keys.remove(key);
print("Removing " + key);
assertTrue("Failed to remove " + key, removed);
}
}
}
} finally {
seq.close();
}
}
@Test
public void shouldCreateFilteringSequenceThatIncludesOnlyNonSystemNodes() {
RowFilter nonSysFilter = rowFilterOfNodesWithKeysHavingWorkspaceKey(0, NodeKey.keyForWorkspaceName(workspaceName()));
NodeSequence seq = NodeSequence.filter(allNodes(), nonSysFilter);
try {
// Iterate over the batches ...
Batch batch = null;
while ((batch = seq.nextBatch()) != null) {
while (batch.hasNext()) {
batch.nextRow();
CachedNode node = batch.getNode();
if (node != null) {
Path path = node.getPath(cache);
boolean isSystem = path.getSegment(0).getName().equals(JcrLexicon.SYSTEM);
assertTrue(path.isRoot() || !isSystem);
}
}
}
} finally {
seq.close();
}
}
}