@@ -385,6 +385,71 @@ void transactionRollback() {
385385 });
386386 }
387387
388+ @ Test
389+ void sqlCreateUniqueHash () {
390+ database .command ("sql" , "CREATE DOCUMENT TYPE SqlHashDoc" );
391+ database .command ("sql" , "CREATE PROPERTY SqlHashDoc.code INTEGER" );
392+ database .command ("sql" , "CREATE INDEX ON SqlHashDoc (code) UNIQUE_HASH" );
393+
394+ database .transaction (() -> {
395+ for (int i = 0 ; i < 100 ; ++i ) {
396+ final MutableDocument doc = database .newDocument ("SqlHashDoc" );
397+ doc .set ("code" , i );
398+ doc .save ();
399+ }
400+ });
401+
402+ database .transaction (() -> {
403+ final Index index = database .getSchema ().getIndexByName ("SqlHashDoc[code]" );
404+ assertThat (index .getType ()).isEqualTo (Schema .INDEX_TYPE .HASH );
405+ assertThat (index .isUnique ()).isTrue ();
406+
407+ for (int i = 0 ; i < 100 ; ++i ) {
408+ final IndexCursor cursor = index .get (new Object [] { i });
409+ assertThat (cursor .hasNext ()).isTrue ();
410+ }
411+ });
412+
413+ // Duplicate rejection
414+ assertThatThrownBy (() -> database .transaction (() -> {
415+ final MutableDocument doc = database .newDocument ("SqlHashDoc" );
416+ doc .set ("code" , 0 );
417+ doc .save ();
418+ })).isInstanceOf (DuplicatedKeyException .class );
419+ }
420+
421+ @ Test
422+ void sqlCreateNotUniqueHash () {
423+ database .command ("sql" , "CREATE DOCUMENT TYPE SqlHashNUDoc" );
424+ database .command ("sql" , "CREATE PROPERTY SqlHashNUDoc.tag STRING" );
425+ database .command ("sql" , "CREATE INDEX ON SqlHashNUDoc (tag) NOTUNIQUE_HASH" );
426+
427+ database .transaction (() -> {
428+ for (int i = 0 ; i < 50 ; ++i ) {
429+ final MutableDocument doc = database .newDocument ("SqlHashNUDoc" );
430+ doc .set ("tag" , "group_" + (i % 5 ));
431+ doc .save ();
432+ }
433+ });
434+
435+ database .transaction (() -> {
436+ final Index index = database .getSchema ().getIndexByName ("SqlHashNUDoc[tag]" );
437+ assertThat (index .getType ()).isEqualTo (Schema .INDEX_TYPE .HASH );
438+ assertThat (index .isUnique ()).isFalse ();
439+
440+ // Each group should have 10 entries
441+ for (int g = 0 ; g < 5 ; ++g ) {
442+ final IndexCursor cursor = index .get (new Object [] { "group_" + g });
443+ int count = 0 ;
444+ while (cursor .hasNext ()) {
445+ cursor .next ();
446+ count ++;
447+ }
448+ assertThat (count ).isEqualTo (10 );
449+ }
450+ });
451+ }
452+
388453 @ Override
389454 protected void beginTest () {
390455 database .transaction (() -> {
0 commit comments