All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.arcadedb.query.sql.executor.ConvertToUpdatableResultStep Maven / Gradle / Ivy

There is a newer version: 24.11.1
Show newest version
/*
 * Copyright © 2021-present Arcade Data Ltd ([email protected])
 *
 * 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.
 *
 * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd ([email protected])
 * SPDX-License-Identifier: Apache-2.0
 */
package com.arcadedb.query.sql.executor;

import com.arcadedb.database.Document;
import com.arcadedb.database.Record;
import com.arcadedb.exception.TimeoutException;

import java.util.*;

/**
 * 

* takes a normal result set and transforms it in another result set made of OUpdatableRecord instances. * Records that are not identifiable are discarded. *

*

This is the opposite of ConvertToResultInternalStep

* * @author Luigi Dell'Aquila (luigi.dellaquila-(at)-gmail.com) */ public class ConvertToUpdatableResultStep extends AbstractExecutionStep { ResultSet prevResult = null; public ConvertToUpdatableResultStep(final CommandContext context, final boolean profilingEnabled) { super(context, profilingEnabled); } @Override public ResultSet syncPull(final CommandContext context, final int nRecords) throws TimeoutException { final ExecutionStepInternal prevStep = checkForPrevious(); return new ResultSet() { public boolean finished = false; Result nextItem = null; int fetched = 0; private void fetchNextItem() { nextItem = null; if (finished) { return; } if (prevResult == null) { prevResult = prevStep.syncPull(context, nRecords); if (!prevResult.hasNext()) { finished = true; return; } } while (!finished) { while (!prevResult.hasNext()) { prevResult = prevStep.syncPull(context, nRecords); if (!prevResult.hasNext()) { finished = true; return; } } nextItem = prevResult.next(); final long begin = profilingEnabled ? System.nanoTime() : 0; try { if (nextItem instanceof UpdatableResult) { break; } if (nextItem.isElement()) { final Record element = nextItem.getElement().get(); if (element != null) { nextItem = new UpdatableResult(((Document) element.getRecord()).modify()); } break; } nextItem = null; } finally { cost = (System.nanoTime() - begin); } } } @Override public boolean hasNext() { if (fetched >= nRecords || finished) { return false; } if (nextItem == null) { fetchNextItem(); } return nextItem != null; } @Override public Result next() { if (fetched >= nRecords || finished) { throw new NoSuchElementException(); } if (nextItem == null) { fetchNextItem(); } if (nextItem == null) { throw new NoSuchElementException(); } final Result result = nextItem; nextItem = null; fetched++; context.setVariable("current", result); return result; } @Override public void close() { ConvertToUpdatableResultStep.this.close(); } }; } @Override public String prettyPrint(final int depth, final int indent) { String result = ExecutionStepInternal.getIndent(depth, indent) + "+ CONVERT TO UPDATABLE ITEM"; if (profilingEnabled) { result += " (" + getCostFormatted() + ")"; } return result; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy