This is an automated email from the ASF dual-hosted git repository.
mhubail pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git
The following commit(s) were added to refs/heads/master by this push:
new fb391e9fc0 [ASTERIXDB-3483]: Index Owner changes
fb391e9fc0 is described below
commit fb391e9fc01ef08d10d762fee34d41bb0839aad4
Author: janhavitripurwar <[email protected]>
AuthorDate: Wed Oct 9 15:13:17 2024 +0530
[ASTERIXDB-3483]: Index Owner changes
- user model changes: no
- storage format changes: no
- interface changes: yes
Ext-ref: MB-62971
Change-Id: I4c61edec9731a5ab5f6aefc5cdd7e7c3953df31e
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18948
Integration-Tests: Jenkins <[email protected]>
Tested-by: Jenkins <[email protected]>
Reviewed-by: Murtadha Hubail <[email protected]>
---
.../asterix/app/translator/QueryTranslator.java | 25 ++++++++------
.../asterix/app/bootstrap/TestNodeController.java | 2 +-
.../dataflow/CheckpointInSecondaryIndexTest.java | 4 ++-
.../test/dataflow/ConcurrentInsertTest.java | 10 +++---
.../test/dataflow/LSMFlushRecoveryTest.java | 2 +-
.../test/dataflow/MultiPartitionLSMIndexTest.java | 6 ++--
.../create_dataset_with_filter_on_meta.1.adm | 6 ++--
.../ddl/index-cast-null/index-cast-null.015.adm | 2 +-
.../stopwords-full-text-filter-1.7.adm | 8 ++---
.../org/apache/asterix/metadata/MetadataNode.java | 2 +-
.../metadata/MetadataTransactionContext.java | 2 +-
.../asterix/metadata/entities/EntityDetails.java | 7 +++-
.../apache/asterix/metadata/entities/Index.java | 25 +++++++++-----
.../IndexTupleTranslator.java | 38 +++++++++++++++++++++-
.../apache/asterix/metadata/utils/IndexUtil.java | 3 +-
.../IndexTupleTranslatorTest.java | 3 +-
16 files changed, 101 insertions(+), 44 deletions(-)
diff --git
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
index 2a26d637c6..d6bace5ff5 100644
---
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
+++
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
@@ -398,7 +398,8 @@ public class QueryTranslator extends AbstractLangTranslator
implements IStatemen
Creator.DEFAULT_CREATOR);
break;
case CREATE_INDEX:
- handleCreateIndexStatement(metadataProvider, stmt,
hcc, requestParameters);
+ handleCreateIndexStatement(metadataProvider, stmt,
hcc, requestParameters,
+ Creator.DEFAULT_CREATOR);
break;
case CREATE_FULL_TEXT_FILTER:
handleCreateFullTextFilterStatement(metadataProvider,
stmt);
@@ -1289,7 +1290,7 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
}
public void handleCreateIndexStatement(MetadataProvider metadataProvider,
Statement stmt,
- IHyracksClientConnection hcc, IRequestParameters
requestParameters) throws Exception {
+ IHyracksClientConnection hcc, IRequestParameters
requestParameters, Creator creator) throws Exception {
CreateIndexStatement stmtCreateIndex = (CreateIndexStatement) stmt;
String datasetName = stmtCreateIndex.getDatasetName().getValue();
String indexName = stmtCreateIndex.getIndexName().getValue();
@@ -1306,7 +1307,7 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
fullTextConfigName);
try {
doCreateIndex(metadataProvider, stmtCreateIndex, databaseName,
dataverseName, datasetName, hcc,
- requestParameters);
+ requestParameters, creator);
} finally {
metadataProvider.getLocks().unlock();
}
@@ -1314,7 +1315,7 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
protected void doCreateIndex(MetadataProvider metadataProvider,
CreateIndexStatement stmtCreateIndex,
String databaseName, DataverseName dataverseName, String
datasetName, IHyracksClientConnection hcc,
- IRequestParameters requestParameters) throws Exception {
+ IRequestParameters requestParameters, Creator creator) throws
Exception {
SourceLocation sourceLoc = stmtCreateIndex.getSourceLocation();
MetadataTransactionContext mdTxnCtx =
MetadataManager.INSTANCE.beginTransaction();
boolean bActiveTxn = true;
@@ -1639,10 +1640,11 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
}
Index newIndex = new Index(databaseName, dataverseName,
datasetName, indexName, indexType, indexDetails,
- stmtCreateIndex.isEnforced(), false,
MetadataUtil.PENDING_ADD_OP);
+ stmtCreateIndex.isEnforced(), false,
MetadataUtil.PENDING_ADD_OP, creator);
bActiveTxn = false; // doCreateIndexImpl() takes over the current
transaction
- doCreateIndexImpl(hcc, metadataProvider, ds, newIndex, jobFlags,
sourceLoc);
+ EntityDetails entityDetails = EntityDetails.newIndex(databaseName,
dataverseName, indexName);
+ doCreateIndexImpl(hcc, metadataProvider, ds, newIndex, jobFlags,
sourceLoc, creator, entityDetails);
} catch (Exception e) {
if (bActiveTxn) {
@@ -1787,7 +1789,8 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
}
private void doCreateIndexImpl(IHyracksClientConnection hcc,
MetadataProvider metadataProvider, Dataset ds,
- Index index, EnumSet<JobFlag> jobFlags, SourceLocation sourceLoc)
throws Exception {
+ Index index, EnumSet<JobFlag> jobFlags, SourceLocation sourceLoc,
Creator creator,
+ EntityDetails entityDetails) throws Exception {
ProgressState progress = ProgressState.NO_PROGRESS;
boolean bActiveTxn = true;
MetadataTransactionContext mdTxnCtx =
metadataProvider.getMetadataTxnContext();
@@ -1866,6 +1869,8 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
"Failed to create job spec for creating index '" +
ds.getDatasetName() + "."
+ index.getIndexName() + "'");
}
+ beforeTxnCommit(metadataProvider, creator, entityDetails);
+
MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
bActiveTxn = false;
progress = ProgressState.ADDED_PENDINGOP_RECORD_TO_METADATA;
@@ -4885,7 +4890,7 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
dsDetails.getKeySourceIndicator(),
dsDetails.getPrimaryKeyType(), sampleCardinalityTarget, 0, 0,
sampleSeed, Collections.emptyMap());
newIndexPendingAdd = new Index(databaseName, dataverseName,
datasetName, newIndexName, sampleIndexType,
- newIndexDetailsPendingAdd, false, false,
MetadataUtil.PENDING_ADD_OP);
+ newIndexDetailsPendingAdd, false, false,
MetadataUtil.PENDING_ADD_OP, Creator.DEFAULT_CREATOR);
// #. add a new index with PendingAddOp
MetadataManager.INSTANCE.addIndex(metadataProvider.getMetadataTxnContext(),
newIndexPendingAdd);
@@ -4927,7 +4932,7 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
dsDetails.getKeySourceIndicator(),
dsDetails.getPrimaryKeyType(), sampleCardinalityTarget,
stats.getCardinality(), stats.getAvgTupleSize(),
sampleSeed, stats.getIndexesStats());
Index newIndexFinal = new Index(databaseName, dataverseName,
datasetName, newIndexName, sampleIndexType,
- newIndexDetailsFinal, false, false,
MetadataUtil.PENDING_NO_OP);
+ newIndexDetailsFinal, false, false,
MetadataUtil.PENDING_NO_OP, Creator.DEFAULT_CREATOR);
// #. begin new metadataTxn
mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
@@ -5191,7 +5196,7 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
MetadataManager.INSTANCE.addIndex(mdTxnCtx,
new Index(databaseName, dataverseName, datasetName,
indexName, index.getIndexType(),
index.getIndexDetails(), index.isEnforced(),
index.isPrimaryIndex(),
- MetadataUtil.PENDING_DROP_OP));
+ MetadataUtil.PENDING_DROP_OP, index.getCreator()));
}
}
diff --git
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
index 7c4c5516cf..aaee17e35f 100644
---
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
+++
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
@@ -747,7 +747,7 @@ public class TestNodeController {
}
index = Index.createPrimaryIndex(dataset.getDatabaseName(),
dataset.getDataverseName(),
dataset.getDatasetName(), keyFieldNames,
primaryKeyIndicators, keyFieldTypes,
- MetadataUtil.PENDING_NO_OP);
+ MetadataUtil.PENDING_NO_OP, dataset.getCreator());
List<String> nodes =
Collections.singletonList(ExecutionTestUtil.integrationUtil.ncs[0].getId());
CcApplicationContext appCtx =
(CcApplicationContext)
ExecutionTestUtil.integrationUtil.cc.getApplicationContext();
diff --git
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/CheckpointInSecondaryIndexTest.java
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/CheckpointInSecondaryIndexTest.java
index 70226c8486..4024ced11d 100644
---
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/CheckpointInSecondaryIndexTest.java
+++
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/CheckpointInSecondaryIndexTest.java
@@ -51,6 +51,7 @@ import org.apache.asterix.metadata.entities.Dataset;
import org.apache.asterix.metadata.entities.Index;
import org.apache.asterix.metadata.entities.InternalDatasetDetails;
import
org.apache.asterix.metadata.entities.InternalDatasetDetails.PartitioningStrategy;
+import org.apache.asterix.metadata.utils.Creator;
import org.apache.asterix.om.types.ARecordType;
import org.apache.asterix.om.types.BuiltinType;
import org.apache.asterix.om.types.IAType;
@@ -174,7 +175,8 @@ public class CheckpointInSecondaryIndexTest {
null, DatasetType.INTERNAL, DATASET_ID, 0);
String database = MetadataUtil.databaseFor(dvName);
secondaryIndex = new Index(database, dvName, DATASET_NAME, INDEX_NAME,
INDEX_TYPE, INDEX_FIELD_NAMES,
- INDEX_FIELD_INDICATORS, INDEX_FIELD_TYPES, false, false,
false, 0, OptionalBoolean.of(false));
+ INDEX_FIELD_INDICATORS, INDEX_FIELD_TYPES, false, false,
false, 0, OptionalBoolean.of(false),
+ Creator.DEFAULT_CREATOR);
taskCtx = null;
primaryIndexDataflowHelper = null;
secondaryIndexDataflowHelper = null;
diff --git
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/ConcurrentInsertTest.java
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/ConcurrentInsertTest.java
index b458874caa..b85cae2e37 100644
---
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/ConcurrentInsertTest.java
+++
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/ConcurrentInsertTest.java
@@ -130,7 +130,7 @@ public class ConcurrentInsertTest {
StorageTestUtils.DATASET.getDataverseName(),
StorageTestUtils.DATASET.getDatasetName(), "TestIndex",
IndexType.BTREE,
Arrays.asList(Arrays.asList(StorageTestUtils.RECORD_TYPE.getFieldNames()[1])),
Arrays.asList(Index.RECORD_INDICATOR),
Arrays.asList(BuiltinType.AINT64), false, false, false, 0,
- OptionalBoolean.of(false));
+ OptionalBoolean.of(false),
StorageTestUtils.DATASET.getCreator());
SecondaryIndexInfo secondaryIndexInfo =
nc.createSecondaryIndex(primaryIndexInfo,
secondaryIndexEntity, StorageTestUtils.STORAGE_MANAGER, 0);
@@ -142,10 +142,10 @@ public class ConcurrentInsertTest {
secondaryIndex = (TestLsmBtree)
secondaryDataflowHelper.getIndexInstance();
secondaryDataflowHelper.close();
- Index primaryKeyIndexEntity =
- new Index(StorageTestUtils.DATASET.getDatabaseName(),
StorageTestUtils.DATASET.getDataverseName(),
- StorageTestUtils.DATASET.getDatasetName(),
"PrimaryKeyIndex", IndexType.BTREE, Arrays.asList(),
- Arrays.asList(), Arrays.asList(), false, false, false,
0, OptionalBoolean.empty());
+ Index primaryKeyIndexEntity = new
Index(StorageTestUtils.DATASET.getDatabaseName(),
+ StorageTestUtils.DATASET.getDataverseName(),
StorageTestUtils.DATASET.getDatasetName(),
+ "PrimaryKeyIndex", IndexType.BTREE, Arrays.asList(),
Arrays.asList(), Arrays.asList(), false, false,
+ false, 0, OptionalBoolean.empty(),
StorageTestUtils.DATASET.getCreator());
SecondaryIndexInfo primaryKeyIndexInfo =
nc.createSecondaryIndex(primaryIndexInfo,
primaryKeyIndexEntity, StorageTestUtils.STORAGE_MANAGER, 0);
diff --git
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/LSMFlushRecoveryTest.java
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/LSMFlushRecoveryTest.java
index b574c1b62e..7c1a534984 100644
---
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/LSMFlushRecoveryTest.java
+++
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/LSMFlushRecoveryTest.java
@@ -189,7 +189,7 @@ public class LSMFlushRecoveryTest {
secondaryIndexEntity = new Index(dataset.getDatabaseName(),
dataset.getDataverseName(),
dataset.getDatasetName(), SECONDARY_INDEX_NAME,
SECONDARY_INDEX_TYPE, SECONDARY_INDEX_FIELD_NAMES,
SECONDARY_INDEX_FIELD_INDICATORS, SECONDARY_INDEX_FIELD_TYPES,
false, false, false, 0,
- OptionalBoolean.of(false));
+ OptionalBoolean.of(false), dataset.getCreator());
primaryIndexInfos = new PrimaryIndexInfo[NUM_PARTITIONS];
secondaryIndexInfo = new SecondaryIndexInfo[NUM_PARTITIONS];
diff --git
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/MultiPartitionLSMIndexTest.java
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/MultiPartitionLSMIndexTest.java
index d9211272b6..cc50f2ac2e 100644
---
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/MultiPartitionLSMIndexTest.java
+++
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/MultiPartitionLSMIndexTest.java
@@ -161,9 +161,9 @@ public class MultiPartitionLSMIndexTest {
NoMergePolicyFactory.NAME, null, new
InternalDatasetDetails(null, PartitioningStrategy.HASH,
partitioningKeys, null, null, null, false, null, null),
null, DatasetType.INTERNAL, DATASET_ID, 0);
- secondaryIndex =
- new Index(dataset.getDatabaseName(), dvName, DATASET_NAME,
INDEX_NAME, INDEX_TYPE, INDEX_FIELD_NAMES,
- INDEX_FIELD_INDICATORS, INDEX_FIELD_TYPES, false,
false, false, 0, OptionalBoolean.of(false));
+ secondaryIndex = new Index(dataset.getDatabaseName(), dvName,
DATASET_NAME, INDEX_NAME, INDEX_TYPE,
+ INDEX_FIELD_NAMES, INDEX_FIELD_INDICATORS, INDEX_FIELD_TYPES,
false, false, false, 0,
+ OptionalBoolean.of(false), dataset.getCreator());
taskCtxs = new IHyracksTaskContext[NUM_PARTITIONS];
primaryIndexDataflowHelpers = new IIndexDataflowHelper[NUM_PARTITIONS];
secondaryIndexDataflowHelpers = new
IIndexDataflowHelper[NUM_PARTITIONS];
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/ddl/create_dataset_with_filter_on_meta/create_dataset_with_filter_on_meta.1.adm
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/ddl/create_dataset_with_filter_on_meta/create_dataset_with_filter_on_meta.1.adm
index e4600609ea..1f0dd69f16 100644
---
a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/ddl/create_dataset_with_filter_on_meta/create_dataset_with_filter_on_meta.1.adm
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/ddl/create_dataset_with_filter_on_meta/create_dataset_with_filter_on_meta.1.adm
@@ -1,3 +1,3 @@
-{ "DatabaseName": "Default", "DataverseName": "KeyVerse", "DatasetName":
"KVStore", "IndexName": "KVStore", "IndexStructure": "BTREE", "SearchKey": [ [
"key" ] ], "IsPrimary": true, "Timestamp": "Sat Sep 30 23:12:54 PDT 2023",
"PendingOp": 0, "SearchKeySourceIndicator": [ 1 ] }
-{ "DatabaseName": "Default", "DataverseName": "KeyVerse", "DatasetName":
"KVStore", "IndexName": "s_location", "IndexStructure": "RTREE", "SearchKey": [
[ "location" ] ], "IsPrimary": false, "Timestamp": "Sat Sep 30 23:12:54 PDT
2023", "PendingOp": 0 }
-{ "DatabaseName": "Default", "DataverseName": "KeyVerse", "DatasetName":
"KVStore", "IndexName": "s_rating", "IndexStructure": "BTREE", "SearchKey": [ [
"area_code" ] ], "IsPrimary": false, "Timestamp": "Sat Sep 30 23:12:54 PDT
2023", "PendingOp": 0, "ExcludeUnknownKey": false }
\ No newline at end of file
+{ "DatabaseName": "Default", "DataverseName": "KeyVerse", "DatasetName":
"KVStore", "IndexName": "KVStore", "IndexStructure": "BTREE", "SearchKey": [ [
"key" ] ], "IsPrimary": true, "Timestamp": "Mon Oct 14 07:37:28 UTC 2024",
"PendingOp": 0, "SearchKeySourceIndicator": [ 1 ], "Creator": { "Name": "@sys",
"Uuid": "97c793f3-bcbf-4595-8bf0-e9d6a5953523" } }
+{ "DatabaseName": "Default", "DataverseName": "KeyVerse", "DatasetName":
"KVStore", "IndexName": "s_location", "IndexStructure": "RTREE", "SearchKey": [
[ "location" ] ], "IsPrimary": false, "Timestamp": "Sat Sep 30 23:12:54 PDT
2023", "PendingOp": 0, "Creator": { "Name": "@sys", "Uuid":
"97c793f3-bcbf-4595-8bf0-e9d6a5953523" } }
+{ "DatabaseName": "Default", "DataverseName": "KeyVerse", "DatasetName":
"KVStore", "IndexName": "s_rating", "IndexStructure": "BTREE", "SearchKey": [ [
"area_code" ] ], "IsPrimary": false, "Timestamp": "Sat Sep 30 23:12:54 PDT
2023", "PendingOp": 0, "ExcludeUnknownKey": false, "Creator": { "Name": "@sys",
"Uuid": "97c793f3-bcbf-4595-8bf0-e9d6a5953523" } }
\ No newline at end of file
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/ddl/index-cast-null/index-cast-null.015.adm
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/ddl/index-cast-null/index-cast-null.015.adm
index 52eaa750f2..797b6a6649 100644
---
a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/ddl/index-cast-null/index-cast-null.015.adm
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/ddl/index-cast-null/index-cast-null.015.adm
@@ -1 +1 @@
-{ "DatabaseName": "Default", "DataverseName": "test", "DatasetName": "ds2",
"IndexName": "ds2_o_idx2", "IndexStructure": "BTREE", "SearchKey": [ [ "o_s_f"
], [ "o_d_f" ] ], "IsPrimary": false, "Timestamp": "Sat Sep 30 23:18:19 PDT
2023", "PendingOp": 0, "SearchKeyType": [ "double", "string" ],
"ExcludeUnknownKey": false, "Cast": { "Default": null } }
\ No newline at end of file
+{ "DatabaseName": "Default", "DataverseName": "test", "DatasetName": "ds2",
"IndexName": "ds2_o_idx2", "IndexStructure": "BTREE", "SearchKey": [ [ "o_s_f"
], [ "o_d_f" ] ], "IsPrimary": false, "Timestamp": "Mon Oct 14 07:37:29 UTC
2024", "PendingOp": 0, "SearchKeyType": [ "double", "string" ],
"ExcludeUnknownKey": false, "Cast": { "Default": null }, "Creator": { "Name":
"@sys", "Uuid": "97c793f3-bcbf-4595-8bf0-e9d6a5953523" } }
\ No newline at end of file
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/fulltext/stopwords-full-text-filter-1/stopwords-full-text-filter-1.7.adm
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/fulltext/stopwords-full-text-filter-1/stopwords-full-text-filter-1.7.adm
index 00038575f2..73c6eb5b87 100644
---
a/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/fulltext/stopwords-full-text-filter-1/stopwords-full-text-filter-1.7.adm
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/results_cloud/fulltext/stopwords-full-text-filter-1/stopwords-full-text-filter-1.7.adm
@@ -1,4 +1,4 @@
-{ "DatabaseName": "Default", "DataverseName": "MyDataVerse", "DatasetName":
"MyMessageDataset", "IndexName": "MyMessageDataset", "IndexStructure": "BTREE",
"SearchKey": [ [ "myMessageId" ] ], "IsPrimary": true, "Timestamp": "Sat Sep 30
23:33:32 PDT 2023", "PendingOp": 0 }
-{ "DatabaseName": "Default", "DataverseName": "MyDataVerse", "DatasetName":
"MyMessageDataset", "IndexName": "message_ft_index_0", "IndexStructure":
"SINGLE_PARTITION_WORD_INVIX", "SearchKey": [ [ "myMessageBody" ] ],
"IsPrimary": false, "Timestamp": "Sat Sep 30 23:33:33 PDT 2023", "PendingOp": 0
}
-{ "DatabaseName": "Default", "DataverseName": "MyDataVerse", "DatasetName":
"MyMessageDataset", "IndexName": "message_ft_index_1", "IndexStructure":
"SINGLE_PARTITION_WORD_INVIX", "SearchKey": [ [ "myMessageBody" ] ],
"IsPrimary": false, "Timestamp": "Sat Sep 30 23:33:34 PDT 2023", "PendingOp":
0, "FullTextConfig": "my_first_stopword_config" }
-{ "DatabaseName": "Default", "DataverseName": "MyDataVerse", "DatasetName":
"MyMessageDataset", "IndexName": "message_ft_index_2", "IndexStructure":
"SINGLE_PARTITION_WORD_INVIX", "SearchKey": [ [ "myMessageBody" ] ],
"IsPrimary": false, "Timestamp": "Sat Sep 30 23:33:34 PDT 2023", "PendingOp":
0, "FullTextConfig": "my_second_stopword_config" }
\ No newline at end of file
+{ "DatabaseName": "Default", "DataverseName": "MyDataVerse", "DatasetName":
"MyMessageDataset", "IndexName": "MyMessageDataset", "IndexStructure": "BTREE",
"SearchKey": [ [ "myMessageId" ] ], "IsPrimary": true, "Timestamp": "Wed Oct 09
14:02:40 IST 2024", "PendingOp": 0, "Creator": { "Name": "@sys", "Uuid":
"97c793f3-bcbf-4595-8bf0-e9d6a5953523" } }
+{ "DatabaseName": "Default", "DataverseName": "MyDataVerse", "DatasetName":
"MyMessageDataset", "IndexName": "message_ft_index_0", "IndexStructure":
"SINGLE_PARTITION_WORD_INVIX", "SearchKey": [ [ "myMessageBody" ] ],
"IsPrimary": false, "Timestamp": "Wed Oct 09 14:04:53 IST 2024", "PendingOp":
0, "Creator": { "Name": "@sys", "Uuid": "97c793f3-bcbf-4595-8bf0-e9d6a5953523"
} }
+{ "DatabaseName": "Default", "DataverseName": "MyDataVerse", "DatasetName":
"MyMessageDataset", "IndexName": "message_ft_index_1", "IndexStructure":
"SINGLE_PARTITION_WORD_INVIX", "SearchKey": [ [ "myMessageBody" ] ],
"IsPrimary": false, "Timestamp": "Wed Oct 09 14:06:04 IST 2024", "PendingOp":
0, "FullTextConfig": "my_first_stopword_config", "Creator": { "Name": "@sys",
"Uuid": "97c793f3-bcbf-4595-8bf0-e9d6a5953523" } }
+{ "DatabaseName": "Default", "DataverseName": "MyDataVerse", "DatasetName":
"MyMessageDataset", "IndexName": "message_ft_index_2", "IndexStructure":
"SINGLE_PARTITION_WORD_INVIX", "SearchKey": [ [ "myMessageBody" ] ],
"IsPrimary": false, "Timestamp": "Wed Oct 09 14:08:21 IST 2024", "PendingOp":
0, "FullTextConfig": "my_second_stopword_config", "Creator": { "Name": "@sys",
"Uuid": "97c793f3-bcbf-4595-8bf0-e9d6a5953523" } }
\ No newline at end of file
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
index 0eb11116d9..8399f96569 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
@@ -451,7 +451,7 @@ public class MetadataNode implements IMetadataNode {
InternalDatasetDetails id = (InternalDatasetDetails)
dataset.getDatasetDetails();
Index primaryIndex =
Index.createPrimaryIndex(dataset.getDatabaseName(), dataset.getDataverseName(),
dataset.getDatasetName(), id.getPrimaryKey(),
id.getKeySourceIndicator(),
- id.getPrimaryKeyType(), dataset.getPendingOp());
+ id.getPrimaryKeyType(), dataset.getPendingOp(),
dataset.getCreator());
addIndex(txnId, primaryIndex);
}
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
index 7ec1b518f1..6077d294c5 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
@@ -172,7 +172,7 @@ public class MetadataTransactionContext extends
MetadataCache {
public void dropIndex(String database, DataverseName dataverseName, String
datasetName, String indexName) {
Index index = new Index(database, dataverseName, datasetName,
indexName, null, null, false, false,
- MetadataUtil.PENDING_NO_OP);
+ MetadataUtil.PENDING_NO_OP, null);
droppedCache.addIndexIfNotExists(index);
logAndApply(new MetadataLogicalOperation(index, false));
}
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/EntityDetails.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/EntityDetails.java
index 1e95d0b7cb..df44ecf62c 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/EntityDetails.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/EntityDetails.java
@@ -32,7 +32,8 @@ public class EntityDetails {
FUNCTION,
DATABASE,
DATAVERSE,
- SYNONYM
+ SYNONYM,
+ INDEX
}
private final String databaseName;
@@ -71,6 +72,10 @@ public class EntityDetails {
return new EntityDetails(databaseName, dataverseName, synonymName,
EntityType.SYNONYM);
}
+ public static EntityDetails newIndex(String databaseName, DataverseName
dataverseName, String indexName) {
+ return new EntityDetails(databaseName, dataverseName, indexName,
EntityType.INDEX);
+ }
+
public String getDatabaseName() {
return databaseName;
}
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Index.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Index.java
index 66192e01fa..4709c138db 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Index.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Index.java
@@ -34,6 +34,7 @@ import org.apache.asterix.common.metadata.DataverseName;
import org.apache.asterix.common.transactions.IRecoveryManager.ResourceType;
import org.apache.asterix.metadata.MetadataCache;
import org.apache.asterix.metadata.api.IMetadataEntity;
+import org.apache.asterix.metadata.utils.Creator;
import org.apache.asterix.metadata.utils.IndexUtil;
import org.apache.asterix.om.types.ARecordType;
import org.apache.asterix.om.types.AUnionType;
@@ -66,10 +67,11 @@ public class Index implements IMetadataEntity<Index>,
Comparable<Index> {
private final boolean isEnforced;
// Type of pending operations with respect to atomic DDL operation
private int pendingOp;
+ private final Creator creator;
public Index(String databaseName, DataverseName dataverseName, String
datasetName, String indexName,
- IndexType indexType, IIndexDetails indexDetails, boolean
isEnforced, boolean isPrimaryIndex,
- int pendingOp) {
+ IndexType indexType, IIndexDetails indexDetails, boolean
isEnforced, boolean isPrimaryIndex, int pendingOp,
+ Creator creator) {
boolean categoryOk = (indexType == null && indexDetails == null) ||
(IndexCategory
.of(Objects.requireNonNull(indexType)) ==
((AbstractIndexDetails) Objects.requireNonNull(indexDetails))
.getIndexCategory());
@@ -85,26 +87,27 @@ public class Index implements IMetadataEntity<Index>,
Comparable<Index> {
this.isPrimaryIndex = isPrimaryIndex;
this.isEnforced = isEnforced;
this.pendingOp = pendingOp;
+ this.creator = creator;
}
@Deprecated
public Index(String database, DataverseName dataverseName, String
datasetName, String indexName,
IndexType indexType, List<List<String>> keyFieldNames,
List<Integer> keyFieldSourceIndicators,
List<IAType> keyFieldTypes, boolean overrideKeyFieldTypes, boolean
isEnforced, boolean isPrimaryIndex,
- int pendingOp, OptionalBoolean excludeUnknownKey) {
+ int pendingOp, OptionalBoolean excludeUnknownKey, Creator creator)
{
this(database, dataverseName, datasetName,
indexName, indexType, createSimpleIndexDetails(indexType,
keyFieldNames, keyFieldSourceIndicators,
keyFieldTypes, overrideKeyFieldTypes,
excludeUnknownKey),
- isEnforced, isPrimaryIndex, pendingOp);
+ isEnforced, isPrimaryIndex, pendingOp, creator);
}
public static Index createPrimaryIndex(String database, DataverseName
dataverseName, String datasetName,
List<List<String>> keyFieldNames, List<Integer>
keyFieldSourceIndicators, List<IAType> keyFieldTypes,
- int pendingOp) {
- return new Index(database, dataverseName, datasetName,
- datasetName, IndexType.BTREE, new
ValueIndexDetails(keyFieldNames, keyFieldSourceIndicators,
- keyFieldTypes, false, OptionalBoolean.empty(),
OptionalBoolean.empty(), null, null, null),
- false, true, pendingOp);
+ int pendingOp, Creator creator) {
+ return new Index(database, dataverseName, datasetName, datasetName,
IndexType.BTREE,
+ new ValueIndexDetails(keyFieldNames, keyFieldSourceIndicators,
keyFieldTypes, false,
+ OptionalBoolean.empty(), OptionalBoolean.empty(),
null, null, null),
+ false, true, pendingOp, creator);
}
public String getDatabaseName() {
@@ -155,6 +158,10 @@ public class Index implements IMetadataEntity<Index>,
Comparable<Index> {
return !isPrimaryIndex();
}
+ public Creator getCreator() {
+ return creator;
+ }
+
public boolean isPrimaryKeyIndex() {
// a primary key index has no key field names
return indexType == IndexType.BTREE && ((ValueIndexDetails)
indexDetails).keyFieldNames.isEmpty();
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java
index 453ccc1b0b..deca260d5d 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java
@@ -42,10 +42,12 @@ import org.apache.asterix.common.transactions.TxnId;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.metadata.MetadataNode;
import org.apache.asterix.metadata.bootstrap.IndexEntity;
+import org.apache.asterix.metadata.bootstrap.MetadataRecordTypes;
import org.apache.asterix.metadata.declared.MetadataManagerUtil;
import org.apache.asterix.metadata.entities.Dataset;
import org.apache.asterix.metadata.entities.Datatype;
import org.apache.asterix.metadata.entities.Index;
+import org.apache.asterix.metadata.utils.Creator;
import org.apache.asterix.metadata.utils.KeyFieldTypeUtil;
import org.apache.asterix.om.base.ABoolean;
import org.apache.asterix.om.base.ACollectionCursor;
@@ -60,6 +62,7 @@ import org.apache.asterix.om.base.ARecord;
import org.apache.asterix.om.base.AString;
import org.apache.asterix.om.base.IACursor;
import org.apache.asterix.om.base.IAObject;
+import org.apache.asterix.om.pointables.base.DefaultOpenFieldType;
import org.apache.asterix.om.types.AOrderedListType;
import org.apache.asterix.om.types.ARecordType;
import org.apache.asterix.om.types.ATypeTag;
@@ -535,9 +538,10 @@ public class IndexTupleTranslator extends
AbstractTupleTranslator<Index> {
isEnforcingKeys = ((ABoolean)
indexRecord.getValueByPos(isEnforcedFieldPos)).getBoolean();
}
int pendingOp = ((AInt32)
indexRecord.getValueByPos(indexEntity.pendingOpIndex())).getIntegerValue();
+ Creator creator = Creator.createOrDefault(indexRecord);
return new Index(databaseName, dataverseName, datasetName, indexName,
indexType, indexDetails, isEnforcingKeys,
- isPrimaryIndex, pendingOp);
+ isPrimaryIndex, pendingOp, creator);
}
@Override
@@ -683,6 +687,7 @@ public class IndexTupleTranslator extends
AbstractTupleTranslator<Index> {
writeExcludeUnknownKey(index);
writeCast(index);
writeSampleDetails(index);
+ writeIndexCreator(index);
}
private void writeComplexSearchKeys(Index.ArrayIndexDetails indexDetails)
throws HyracksDataException {
@@ -1014,4 +1019,35 @@ public class IndexTupleTranslator extends
AbstractTupleTranslator<Index> {
}
}
}
+
+ private void writeIndexCreator(Index index) throws HyracksDataException {
+ if (indexEntity.databaseNameIndex() >= 0) {
+ Creator creatorInfo = index.getCreator();
+ RecordBuilder creatorObject = new RecordBuilder();
+ creatorObject.reset(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
+
+ fieldName.reset();
+ aString.setValue(MetadataRecordTypes.FIELD_NAME_CREATOR_NAME);
+ stringSerde.serialize(aString, fieldName.getDataOutput());
+ fieldValue.reset();
+ aString.setValue(creatorInfo.getName());
+ stringSerde.serialize(aString, fieldValue.getDataOutput());
+ creatorObject.addField(fieldName, fieldValue);
+
+ fieldName.reset();
+ aString.setValue(MetadataRecordTypes.FIELD_NAME_CREATOR_UUID);
+ stringSerde.serialize(aString, fieldName.getDataOutput());
+ fieldValue.reset();
+ aString.setValue(creatorInfo.getUuid());
+ stringSerde.serialize(aString, fieldValue.getDataOutput());
+ creatorObject.addField(fieldName, fieldValue);
+
+ fieldName.reset();
+ aString.setValue(MetadataRecordTypes.CREATOR_ARECORD_FIELD_NAME);
+ stringSerde.serialize(aString, fieldName.getDataOutput());
+ fieldValue.reset();
+ creatorObject.write(fieldValue.getDataOutput(), true);
+ recordBuilder.addField(fieldName, fieldValue);
+ }
+ }
}
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/IndexUtil.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/IndexUtil.java
index 67e4606294..dda2111e2d 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/IndexUtil.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/IndexUtil.java
@@ -94,7 +94,8 @@ public class IndexUtil {
public static Index getPrimaryIndex(Dataset dataset) {
InternalDatasetDetails id = (InternalDatasetDetails)
dataset.getDatasetDetails();
return Index.createPrimaryIndex(dataset.getDatabaseName(),
dataset.getDataverseName(), dataset.getDatasetName(),
- id.getPartitioningKey(), id.getKeySourceIndicator(),
id.getPrimaryKeyType(), dataset.getPendingOp());
+ id.getPartitioningKey(), id.getKeySourceIndicator(),
id.getPrimaryKeyType(), dataset.getPendingOp(),
+ dataset.getCreator());
}
public static int[] getBtreeFieldsIfFiltered(Dataset dataset, Index index)
throws AlgebricksException {
diff --git
a/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslatorTest.java
b/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslatorTest.java
index 507b3bde7c..713518d893 100644
---
a/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslatorTest.java
+++
b/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslatorTest.java
@@ -82,7 +82,8 @@ public class IndexTupleTranslatorTest {
Index index = new Index(dvTestDatabase, dvTest, "d1", "i1",
IndexType.BTREE,
Collections.singletonList(Collections.singletonList("row_id")),
indicator == null ? null :
Collections.singletonList(indicator),
- Collections.singletonList(BuiltinType.AINT64), false,
false, false, 0, OptionalBoolean.of(false));
+ Collections.singletonList(BuiltinType.AINT64), false,
false, false, 0, OptionalBoolean.of(false),
+ null);
MetadataNode mockMetadataNode = mock(MetadataNode.class);
when(mockMetadataNode.getDatatype(any(), anyString(),
any(DataverseName.class), anyString()))